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

Method lift

crates/core/src/abi.rs:1743–1890  ·  view source on GitHub ↗

Note that in general everything in this function is the opposite of the `lower` function above. This is intentional and should be kept this way!

(&mut self, ty: &Type)

Source from the content-addressed store, hash-verified

1741 /// Note that in general everything in this function is the opposite of the
1742 /// `lower` function above. This is intentional and should be kept this way!
1743 fn lift(&mut self, ty: &Type) {
1744 use Instruction::*;
1745
1746 match *ty {
1747 Type::Bool => self.emit(&BoolFromI32),
1748 Type::S8 => self.emit(&S8FromI32),
1749 Type::U8 => self.emit(&U8FromI32),
1750 Type::S16 => self.emit(&S16FromI32),
1751 Type::U16 => self.emit(&U16FromI32),
1752 Type::S32 => self.emit(&S32FromI32),
1753 Type::U32 => self.emit(&U32FromI32),
1754 Type::S64 => self.emit(&S64FromI64),
1755 Type::U64 => self.emit(&U64FromI64),
1756 Type::Char => self.emit(&CharFromI32),
1757 Type::F32 => self.emit(&F32FromCoreF32),
1758 Type::F64 => self.emit(&F64FromCoreF64),
1759 Type::String => self.emit(&StringLift),
1760 Type::ErrorContext => self.emit(&ErrorContextLift),
1761 Type::Id(id) => match &self.resolve.types[id].kind {
1762 TypeDefKind::Type(t) => self.lift(t),
1763 TypeDefKind::List(element) => {
1764 if self.bindgen.is_list_canonical(self.resolve, element) {
1765 self.emit(&ListCanonLift { element, ty: id });
1766 } else {
1767 self.push_block();
1768 self.emit(&IterBasePointer);
1769 let addr = self.stack.pop().unwrap();
1770 self.read_from_memory(element, addr, Default::default());
1771 self.finish_block(1);
1772 self.emit(&ListLift { element, ty: id });
1773 }
1774 }
1775 TypeDefKind::Handle(handle) => {
1776 let (Handle::Own(ty) | Handle::Borrow(ty)) = handle;
1777 self.emit(&HandleLift {
1778 handle,
1779 ty: id,
1780 name: self.resolve.types[*ty].name.as_deref().unwrap(),
1781 });
1782 }
1783 TypeDefKind::Resource => {
1784 todo!();
1785 }
1786 TypeDefKind::Record(record) => {
1787 self.flat_for_each_record_type(
1788 ty,
1789 record.fields.iter().map(|f| &f.ty),
1790 Self::lift,
1791 );
1792 self.emit(&RecordLift {
1793 record,
1794 ty: id,
1795 name: self.resolve.types[id].name.as_deref().unwrap(),
1796 });
1797 }
1798 TypeDefKind::Tuple(tuple) => {
1799 self.flat_for_each_record_type(ty, tuple.types.iter(), Self::lift);
1800 self.emit(&TupleLift { tuple, ty: id });

Callers 5

callMethod · 0.45
read_from_memoryMethod · 0.45
read_list_from_memoryMethod · 0.45
emit_and_liftMethod · 0.45
deallocateMethod · 0.45

Calls 12

flat_typesFunction · 0.85
read_from_memoryMethod · 0.80
mapMethod · 0.80
extendMethod · 0.80
emitMethod · 0.45
is_list_canonicalMethod · 0.45
push_blockMethod · 0.45
finish_blockMethod · 0.45
iterMethod · 0.45
sizesMethod · 0.45

Tested by

no test coverage detected