(&mut self, expr: E)
| 592 | } |
| 593 | |
| 594 | fn generate_expr<E: Into<Expr<'gc>>>(&mut self, expr: E) -> Result<(), VmError> { |
| 595 | let expr = expr.into(); |
| 596 | self.current_line = expr.line(); |
| 597 | match expr { |
| 598 | Expr::EnvLookup { expr, .. } => { |
| 599 | // Generate code to evaluate the name first |
| 600 | self.generate_expr(*expr)?; |
| 601 | // Then emit env lookup instruction |
| 602 | self.emit(OpCode::EnvLookup); |
| 603 | } |
| 604 | Expr::List { elements, kind, .. } => { |
| 605 | let len = elements.len(); |
| 606 | // Generate code for each element |
| 607 | for element in elements { |
| 608 | self.generate_expr(element)?; |
| 609 | } |
| 610 | self.emit(OpCode::MakeList { |
| 611 | size_constant: len as u8, |
| 612 | kind, |
| 613 | }); |
| 614 | } |
| 615 | Expr::EnumVariant { |
| 616 | enum_name, variant, .. |
| 617 | } => { |
| 618 | self.validate_enum_variant(enum_name, variant); |
| 619 | self.named_variable(enum_name, false)?; |
| 620 | |
| 621 | let name_constant = self.identifier_constant(variant.lexeme) as u8; |
| 622 | self.emit(OpCode::EnumVariant { |
| 623 | name_constant, |
| 624 | evaluate: false, |
| 625 | }); |
| 626 | } |
| 627 | Expr::Object { properties, .. } => { |
| 628 | let len = properties.len(); |
| 629 | // For each property, first emit key and value onto stack |
| 630 | for property in properties { |
| 631 | match property { |
| 632 | ObjectProperty::Literal { key, value } => { |
| 633 | // For literal key, emit as constant string |
| 634 | let key_constant = self.identifier_constant(key.lexeme); |
| 635 | self.emit(OpCode::Constant(key_constant as u8)); |
| 636 | |
| 637 | // Generate value code |
| 638 | self.generate_expr(value)?; |
| 639 | } |
| 640 | ObjectProperty::Computed { key_expr, value } => { |
| 641 | // Generate key expression code |
| 642 | self.generate_expr(key_expr)?; |
| 643 | |
| 644 | // Generate value code |
| 645 | self.generate_expr(value)?; |
| 646 | } |
| 647 | } |
| 648 | } |
| 649 | |
| 650 | // Now create object with all properties |
| 651 | // Stack has pairs of [key1, value1, key2, value2, ...] |
no test coverage detected