From 82db4f27a393b15f65bdca15eb87b1f5b59d7141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=E7=89=B9=E6=AF=8F=E7=BE=8A=E9=98=9F?= Date: Fri, 5 Jun 2026 18:42:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9B=E5=BB=BA=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E5=8E=9F=E5=9E=8B=E9=93=BE=E6=9C=80=E5=B0=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_vm/src/vm.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index a2fba9c..6c6b9b2 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -5,7 +5,7 @@ use oxide_compiler::module::CompiledModule; use oxide_compiler::opcode::{self, OpCode}; use crate::coercion; -use crate::mem::Epoch; +use crate::mem::{Epoch, P}; use crate::object::JsObject; use crate::shape::{self, EMPTY_SHAPE_ID}; use crate::value::JsValue; @@ -25,6 +25,7 @@ pub struct Vm { string_table: HashMap, string_reverse: Vec, pub epoch: Epoch, + pub object_prototype: P, } impl Vm { @@ -38,6 +39,7 @@ impl Vm { string_table: HashMap::with_capacity(64), string_reverse: Vec::with_capacity(64), epoch: Epoch::new(), + object_prototype: P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), } } @@ -382,17 +384,22 @@ impl Vm { } OpCode::NEW_OBJECT => { - let obj = self - .epoch - .alloc(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())); + let proto_ptr = &*self.object_prototype as *const JsObject as *mut JsObject; + let obj = self.epoch.alloc(JsObject::new_empty( + EMPTY_SHAPE_ID, + JsValue::from_js_object(proto_ptr), + )); self.regs[rd] = JsValue::object(obj as *mut u8); } OpCode::NEW_ARRAY => { + let proto_ptr = &*self.object_prototype as *const JsObject as *mut JsObject; let n = opcode::imm16(instr) as usize; - let obj = - self.epoch - .alloc(JsObject::new_array(EMPTY_SHAPE_ID, JsValue::null(), n)); + let obj = self.epoch.alloc(JsObject::new_array( + EMPTY_SHAPE_ID, + JsValue::from_js_object(proto_ptr), + n, + )); self.regs[rd] = JsValue::object(obj as *mut u8); }