diff --git a/crates/oxide_compiler/src/compiler.rs b/crates/oxide_compiler/src/compiler.rs index 6c04788..6d8ca5f 100644 --- a/crates/oxide_compiler/src/compiler.rs +++ b/crates/oxide_compiler/src/compiler.rs @@ -314,6 +314,39 @@ impl Compiler { Err(format!("unsupported unary operator: {:?}", un.operator)) } } + Expression::StaticMemberExpression(member) => { + let obj_reg = self.emit_expression(&member.object, ctx)?; + let prop_name = member.property.name.as_str(); + let idx = ctx.add_constant(Constant::String(prop_name.to_string())); + let key_reg = ctx.alloc_reg(); + ctx.emit(opcode::encode( + OpCode::LOAD_CONST, + key_reg, + (idx & 0xFF) as u8, + ((idx >> 8) & 0xFF) as u8, + )); + let result_reg = ctx.alloc_reg(); + ctx.emit(opcode::encode( + OpCode::IC_GET_PROP, + result_reg, + obj_reg, + key_reg, + )); + ctx.emit(0); + Ok(result_reg) + } + Expression::ComputedMemberExpression(member) => { + let obj_reg = self.emit_expression(&member.object, ctx)?; + let key_reg = self.emit_expression(&member.expression, ctx)?; + let r = ctx.alloc_reg(); + ctx.emit(opcode::encode( + OpCode::GET_PROP_DYNAMIC, + obj_reg, + key_reg, + r, + )); + Ok(r) + } _ => Err(format!( "unsupported expression type: {:?}", std::mem::discriminant(expr) diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index 609d42e..fb505c4 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -250,13 +250,12 @@ impl Vm { } OpCode::IC_GET_PROP => { - let obj_ptr = self.regs[rd].as_object_ptr() as *mut JsObject; + let obj_ptr = self.regs[a].as_object_ptr() as *mut JsObject; if obj_ptr.is_null() { return Err("IC_GET_PROP on non-object".into()); } let obj = unsafe { &*obj_ptr }; - let prop_val = self.constants[opcode::imm16(instr) as usize]; - let prop_name_si = prop_val.as_string_index(); + let prop_name_si = self.regs[b].as_string_index(); let ext = self.bytecode[self.pc]; self.pc += 1; let cached_shape_id = ext & 0x00FF_FFFF; @@ -281,8 +280,7 @@ impl Vm { return Err("IC_SET_PROP on non-object".into()); } let obj = unsafe { &mut *obj_ptr }; - let prop_val = self.constants[opcode::imm16(instr) as usize]; - let prop_name_si = prop_val.as_string_index(); + let prop_name_si = self.regs[b].as_string_index(); let ext = self.bytecode[self.pc]; self.pc += 1; let cached_shape_id = ext & 0x00FF_FFFF;