From c75d6cb61d8a9a75d90014661b1dd387ee079691 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 5 Jun 2026 18:16:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E8=AF=BB=E5=86=99=E5=B9=B6=E6=8B=86=E5=88=86?= =?UTF-8?q?=E5=86=85=E8=81=94=E5=B1=9E=E6=80=A7=E8=AF=BB=E5=86=99=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_compiler/src/compiler.rs | 33 +++++++++++++++++++++++++++ crates/oxide_vm/src/vm.rs | 8 +++---- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/crates/oxide_compiler/src/compiler.rs b/crates/oxide_compiler/src/compiler.rs index 6c047886..6d8ca5f3 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 609d42ef..fb505c4a 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;