MCPcopy Create free account
hub / github.com/bytecodealliance/wit-bindgen / lower

Method lower

crates/core/src/abi.rs:1515–1680  ·  view source on GitHub ↗
(&mut self, ty: &Type)

Source from the content-addressed store, hash-verified

1513 }
1514
1515 fn lower(&mut self, ty: &Type) {
1516 use Instruction::*;
1517
1518 match *ty {
1519 Type::Bool => self.emit(&I32FromBool),
1520 Type::S8 => self.emit(&I32FromS8),
1521 Type::U8 => self.emit(&I32FromU8),
1522 Type::S16 => self.emit(&I32FromS16),
1523 Type::U16 => self.emit(&I32FromU16),
1524 Type::S32 => self.emit(&I32FromS32),
1525 Type::U32 => self.emit(&I32FromU32),
1526 Type::S64 => self.emit(&I64FromS64),
1527 Type::U64 => self.emit(&I64FromU64),
1528 Type::Char => self.emit(&I32FromChar),
1529 Type::F32 => self.emit(&CoreF32FromF32),
1530 Type::F64 => self.emit(&CoreF64FromF64),
1531 Type::String => {
1532 let realloc = self.list_realloc();
1533 self.emit(&StringLower { realloc });
1534 }
1535 Type::ErrorContext => self.emit(&ErrorContextLower),
1536 Type::Id(id) => match &self.resolve.types[id].kind {
1537 TypeDefKind::Type(t) => self.lower(t),
1538 TypeDefKind::List(element) => {
1539 let realloc = self.list_realloc();
1540 if self.bindgen.is_list_canonical(self.resolve, element) {
1541 self.emit(&ListCanonLower { element, realloc });
1542 } else {
1543 self.push_block();
1544 self.emit(&IterElem { element });
1545 self.emit(&IterBasePointer);
1546 let addr = self.stack.pop().unwrap();
1547 self.write_to_memory(element, addr, Default::default());
1548 self.finish_block(0);
1549 self.emit(&ListLower { element, realloc });
1550 }
1551 }
1552 TypeDefKind::Handle(handle) => {
1553 let (Handle::Own(ty) | Handle::Borrow(ty)) = handle;
1554 self.emit(&HandleLower {
1555 handle,
1556 ty: id,
1557 name: self.resolve.types[*ty].name.as_deref().unwrap(),
1558 });
1559 }
1560 TypeDefKind::Resource => {
1561 todo!();
1562 }
1563 TypeDefKind::Record(record) => {
1564 self.emit(&RecordLower {
1565 record,
1566 ty: id,
1567 name: self.resolve.types[id].name.as_deref().unwrap(),
1568 });
1569 let values = self
1570 .stack
1571 .drain(self.stack.len() - record.fields.len()..)
1572 .collect::<Vec<_>>();

Callers 6

lower_flatFunction · 0.45
callMethod · 0.45
lower_variant_armsMethod · 0.45
write_to_memoryMethod · 0.45
write_list_to_memoryMethod · 0.45
lower_and_emitMethod · 0.45

Calls 11

list_reallocMethod · 0.80
write_to_memoryMethod · 0.80
lower_variant_armsMethod · 0.80
mapMethod · 0.80
emitMethod · 0.45
is_list_canonicalMethod · 0.45
push_blockMethod · 0.45
finish_blockMethod · 0.45
iterMethod · 0.45
pushMethod · 0.45
sizesMethod · 0.45

Tested by

no test coverage detected