MCPcopy Index your code
hub / github.com/aiscriptdev/aiscript / generate_expr

Method generate_expr

aiscript-vm/src/compiler/codegen.rs:594–923  ·  view source on GitHub ↗
(&mut self, expr: E)

Source from the content-addressed store, hash-verified

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, ...]

Callers 7

generate_stmtMethod · 0.80
generate_keyword_argsMethod · 0.80
generate_matchMethod · 0.80
generate_lambdaMethod · 0.80
generate_callMethod · 0.80
generate_invokeMethod · 0.80
generate_classMethod · 0.80

Calls 15

RuntimeErrorClass · 0.85
emitMethod · 0.80
lenMethod · 0.80
validate_enum_variantMethod · 0.80
named_variableMethod · 0.80
identifier_constantMethod · 0.80
emit_constantMethod · 0.80
emit_build_stringMethod · 0.80
generate_block_exprMethod · 0.80
generate_lambdaMethod · 0.80
generate_callMethod · 0.80
generate_invokeMethod · 0.80

Tested by

no test coverage detected