feat: ToPropertyKey 改走 ToPrimitive,Symbol 键与描述符,转换错误可捕获

This commit is contained in:
2026-08-12 09:59:56 +08:00
parent c287708ddc
commit af61dcf6fc
16 changed files with 265 additions and 86 deletions
+1 -1
View File
@@ -570,7 +570,7 @@ impl Vm {
pub(crate) fn dispatch_super_get_prop(&mut self, rd: usize, a: usize, b: usize) -> Result<bool, String> {
vm_trace!("SUPER_GET_PROP rd={} a={} b={}", rd, a, b);
let key_val = self.regs[b];
let prop_name_si = self.property_key_si(key_val);
let prop_name_si = self.property_key_si(key_val)?;
let Some(frame) = self.frames.last() else {
self.raise_error_kind("ReferenceError", "super property used outside function")?;
return Ok(true);
+3 -3
View File
@@ -115,7 +115,7 @@ impl Vm {
let Some(obj_ptr) = self.checked_object_ptr(self.regs[rd], error_msg)? else {
return Err(String::new());
};
let prop_name_si = self.property_key_si(self.regs[b]);
let prop_name_si = self.property_key_si(self.regs[b])?;
Ok((obj_ptr, prop_name_si))
}
@@ -156,7 +156,7 @@ impl Vm {
};
let receiver = self.regs[rd];
let obj = unsafe { &mut *obj_ptr };
let prop_name_si = self.property_key_si(self.regs[a]);
let prop_name_si = self.property_key_si(self.regs[a])?;
let prop_val = self.ordinary_get(obj, prop_name_si, receiver)?;
let n = self.coerce_number_bounded(prop_val)?;
let new_val = JsValue::float(n + 1.0);
@@ -172,7 +172,7 @@ impl Vm {
};
let receiver = self.regs[rd];
let obj = unsafe { &mut *obj_ptr };
let prop_name_si = self.property_key_si(self.regs[a]);
let prop_name_si = self.property_key_si(self.regs[a])?;
let prop_val = self.ordinary_get(obj, prop_name_si, receiver)?;
let n = self.coerce_number_bounded(prop_val)?;
let new_val = JsValue::float(n - 1.0);
+9 -9
View File
@@ -292,7 +292,7 @@ impl Vm {
let val = self.regs[a];
let obj_ptr = val.as_object_ptr() as *mut JsObject;
if obj_ptr.is_null() {
let prop_name_si = self.property_key_si(self.regs[b]);
let prop_name_si = self.property_key_si(self.regs[b])?;
if let Some(resolved) = self.primitive_property_get(val, prop_name_si)? {
self.regs[a] = resolved;
self.pc += 3;
@@ -308,7 +308,7 @@ impl Vm {
}
let obj = unsafe { &*obj_ptr };
let prop_name_si = self.property_key_si(self.regs[b]);
let prop_name_si = self.property_key_si(self.regs[b])?;
let (cached_shape_id, cached_slot, cached_depth) = ic_helper::read_ic_entry(&self.bytecode, &mut self.pc);
let ic_pc = self.pc;
if obj.has_prop_meta() {
@@ -390,7 +390,7 @@ impl Vm {
return Ok(());
};
let prop_name_si = self.property_key_si(self.regs[b]);
let prop_name_si = self.property_key_si(self.regs[b])?;
if self.kernel_core.perm_interner().lookup(prop_name_si) == Some("__proto__") {
let proto_value = self.promote_if_needed_for_write_ptr(obj_ptr, self.regs[a]);
if self.is_object_prototype(obj_ptr) && !proto_value.is_null() {
@@ -450,7 +450,7 @@ impl Vm {
fn dispatch_get_prop(&mut self, rd: usize, a: usize, b: usize) -> Result<(), String> {
vm_trace!("GET_PROP rd={} a={} b={}", rd, a, b);
let prop_name_si = self.property_key_si(self.regs[b]);
let prop_name_si = self.property_key_si(self.regs[b])?;
if let Some(value) = self.primitive_property_get(self.regs[rd], prop_name_si)? {
self.regs[a] = value;
return Ok(());
@@ -471,7 +471,7 @@ impl Vm {
let Some(obj_ptr) = self.checked_object_ptr(self.regs[rd], "Cannot create property on non-object")? else {
return Ok(());
};
let prop_name_si = self.property_key_si(self.regs[b]);
let prop_name_si = self.property_key_si(self.regs[b])?;
if self.kernel_core.perm_interner().lookup(prop_name_si) == Some("__proto__") {
let proto_value = self.promote_if_needed_for_write_ptr(obj_ptr, self.regs[a]);
if self.is_object_prototype(obj_ptr) && !proto_value.is_null() {
@@ -490,7 +490,7 @@ impl Vm {
fn dispatch_get_prop_dynamic(&mut self, rd: usize, a: usize, b: usize) -> Result<(), String> {
vm_trace!("GET_PROP_DYNAMIC rd={} a={} b={}", rd, a, b);
let prop_name_si = self.property_key_si(self.regs[a]);
let prop_name_si = self.property_key_si(self.regs[a])?;
if let Some(value) = self.primitive_property_get(self.regs[rd], prop_name_si)? {
self.regs[b] = value;
return Ok(());
@@ -511,7 +511,7 @@ impl Vm {
let Some(obj_ptr) = self.checked_object_ptr(self.regs[rd], "Cannot create property on non-object")? else {
return Ok(());
};
let prop_name_si = self.property_key_si(self.regs[a]);
let prop_name_si = self.property_key_si(self.regs[a])?;
if self.kernel_core.perm_interner().lookup(prop_name_si) == Some("__proto__") {
let proto_value = self.promote_if_needed_for_write_ptr(obj_ptr, self.regs[b]);
if self.is_object_prototype(obj_ptr) && !proto_value.is_null() {
@@ -553,7 +553,7 @@ impl Vm {
let prop_idx = self.bytecode[self.pc] as usize;
self.pc += 1;
let key_val = self.immutables().get(prop_idx).copied().unwrap_or_else(JsValue::undefined);
let prop_name_si = self.property_key_si(key_val);
let prop_name_si = self.property_key_si(key_val)?;
let Some(obj_ptr) = self.checked_object_ptr(self.regs[rd], "delete on non-object")? else {
self.regs[rd] = JsValue::bool(true);
return Ok(false);
@@ -567,7 +567,7 @@ impl Vm {
pub(crate) fn dispatch_delete_prop_dynamic(&mut self, rd: usize, b: usize) -> Result<bool, String> {
vm_trace!("DELETE_PROP_DYNAMIC rd={}", rd);
let prop_name_si = self.property_key_si(self.regs[b]);
let prop_name_si = self.property_key_si(self.regs[b])?;
let Some(obj_ptr) = self.checked_object_ptr(self.regs[rd], "delete on non-object")? else {
self.regs[rd] = JsValue::bool(true);
return Ok(false);