fix: 修复对 Object.prototype 非 null 赋值问题
This commit is contained in:
@@ -98,6 +98,11 @@ impl Vm {
|
|||||||
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.string_forge().lookup(prop_name_si).as_deref() == Some("__proto__") {
|
if self.kernel.string_forge().lookup(prop_name_si).as_deref() == Some("__proto__") {
|
||||||
let obj = unsafe { &mut *obj_ptr };
|
let obj = unsafe { &mut *obj_ptr };
|
||||||
|
if self.is_object_prototype(obj_ptr) && !self.regs[a].is_null() {
|
||||||
|
self.raise_type_error("Object.prototype.__proto__ is immutable")?;
|
||||||
|
self.pc += 3;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
obj.set_proto(self.regs[a]).map_err(|e| e.to_string())?;
|
obj.set_proto(self.regs[a]).map_err(|e| e.to_string())?;
|
||||||
self.pc += 3;
|
self.pc += 3;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@@ -171,6 +176,10 @@ impl Vm {
|
|||||||
let obj = unsafe { &mut *obj_ptr };
|
let obj = unsafe { &mut *obj_ptr };
|
||||||
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.string_forge().lookup(prop_name_si).as_deref() == Some("__proto__") {
|
if self.kernel.string_forge().lookup(prop_name_si).as_deref() == Some("__proto__") {
|
||||||
|
if self.is_object_prototype(obj_ptr) && !self.regs[a].is_null() {
|
||||||
|
self.raise_type_error("Object.prototype.__proto__ is immutable")?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
obj.set_proto(self.regs[a]).map_err(|e| e.to_string())?;
|
obj.set_proto(self.regs[a]).map_err(|e| e.to_string())?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
@@ -199,6 +208,10 @@ impl Vm {
|
|||||||
let obj = unsafe { &mut *obj_ptr };
|
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]);
|
||||||
if self.kernel.string_forge().lookup(prop_name_si).as_deref() == Some("__proto__") {
|
if self.kernel.string_forge().lookup(prop_name_si).as_deref() == Some("__proto__") {
|
||||||
|
if self.is_object_prototype(obj_ptr) && !self.regs[b].is_null() {
|
||||||
|
self.raise_type_error("Object.prototype.__proto__ is immutable")?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
obj.set_proto(self.regs[b]).map_err(|e| e.to_string())?;
|
obj.set_proto(self.regs[b]).map_err(|e| e.to_string())?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -198,6 +198,11 @@ impl Vm {
|
|||||||
&self.kernel
|
&self.kernel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn is_object_prototype(&self, ptr: *const JsObject) -> bool {
|
||||||
|
let proto_ptr = self.kernel.builtin_world().object_proto.as_ptr();
|
||||||
|
std::ptr::eq(ptr, proto_ptr)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn reg(&self, idx: u8) -> JsValue {
|
pub fn reg(&self, idx: u8) -> JsValue {
|
||||||
self.regs[idx as usize]
|
self.regs[idx as usize]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user