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)
| 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 }); |
no test coverage detected