From e62a9f0a10adbc4b69f3158bdf731f795f990cdf Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Mon, 8 Jun 2026 23:17:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B0=86=20delete=20=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=94=B9=E4=B8=BA=E6=98=BE=E5=BC=8F=20TypeEr?= =?UTF-8?q?ror?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_vm/src/vm.rs | 47 +++-------------------- crates/oxide_vm/tests/regression_tests.rs | 24 ++++++++++++ 2 files changed, 30 insertions(+), 41 deletions(-) diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index eaa8e63a..c86ea8a2 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -1368,50 +1368,15 @@ impl Vm { } OpCode::DELETE_PROP_STATIC => { - let obj_val = self.regs[a]; - if !obj_val.is_object() { - self.regs[rd] = JsValue::bool(true); - } else { - let obj_ptr = obj_val.as_js_object_ptr(); - let obj = unsafe { &mut *obj_ptr }; - let ext = self.bytecode[self.pc]; - self.pc += 1; - let const_idx = ext as usize; - let prop_name_val = self.constants[const_idx]; - if !prop_name_val.is_string() { - self.regs[rd] = JsValue::bool(true); - continue; - } - let prop_name_si = prop_name_val.as_string_index(); - if let Some(pos) = self - .kernel - .shape_forge() - .lookup_position(obj.shape_id(), prop_name_si) - { - obj.set_prop_at(pos, JsValue::undefined()); - } - self.regs[rd] = JsValue::bool(true); - } + let _ = self.bytecode[self.pc]; + self.pc += 1; + throw_err!(self, TypeError, "property deletion not supported"); } OpCode::DELETE_PROP_DYNAMIC => { - let obj_val = self.regs[a]; - if !obj_val.is_object() { - self.regs[rd] = JsValue::bool(true); - } else { - let key_val = self.regs[b]; - let prop_name_si = self.property_key_si(key_val); - let obj_ptr = obj_val.as_js_object_ptr(); - let obj = unsafe { &mut *obj_ptr }; - if let Some(pos) = self - .kernel - .shape_forge() - .lookup_position(obj.shape_id(), prop_name_si) - { - obj.set_prop_at(pos, JsValue::undefined()); - } - self.regs[rd] = JsValue::bool(true); - } + let _ = self.regs[a]; + let _ = self.regs[b]; + throw_err!(self, TypeError, "property deletion not supported"); } OpCode::INSTANCEOF => { diff --git a/crates/oxide_vm/tests/regression_tests.rs b/crates/oxide_vm/tests/regression_tests.rs index 1a9d04bd..d1a63ab8 100644 --- a/crates/oxide_vm/tests/regression_tests.rs +++ b/crates/oxide_vm/tests/regression_tests.rs @@ -152,3 +152,27 @@ fn regression_new_expression_bytecode_constructor_error_is_catchable() { "expected bytecode constructor capability error to enter catch" ); } + +#[test] +fn regression_delete_static_property_throws_type_error() { + assert_eq!( + eval("try { var o={x:1}; delete o.x; 0 } catch (e) { e.name == 'TypeError' }"), + "true" + ); + assert_eq!( + eval("var o={x:1}; delete o.x"), + "vm error: uncaught TypeError: {object}" + ); +} + +#[test] +fn regression_delete_dynamic_property_throws_type_error() { + assert_eq!( + eval("try { var o={x:1}; delete o['x']; 0 } catch (e) { e.name == 'TypeError' }"), + "true" + ); + assert_eq!( + eval("var o={x:1}; var k='x'; delete o[k]"), + "vm error: uncaught TypeError: {object}" + ); +}