(&mut self, ty: &Type)
| 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<_>>(); |
no test coverage detected