mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-25 03:01:12 +08:00
feat: 落地原型面七方法 trait 路由与内建入口改接
This commit is contained in:
@@ -1911,7 +1911,7 @@ fn seal_own_prop_meta(obj: &mut JsObject, store: u32) {
|
||||
/// trap 以(target)调用,结果经 ToBoolean 投影后须与 target 实际可扩展状态
|
||||
/// 一致(不一致抛 TypeError);trap 缺失落穿 target 的普通 preventExtensions
|
||||
/// (置不可扩展标志,返 true)。
|
||||
fn proxy_prevent_extensions<H: VmHost>(vm: &mut H, obj: &JsObject) -> Result<bool, JsValue> {
|
||||
pub fn proxy_prevent_extensions<H: VmHost>(vm: &mut H, obj: &JsObject) -> Result<bool, JsValue> {
|
||||
let target = crate::proxy::proxy_state_ref(obj).expect("状态盒").target;
|
||||
// SAFETY: target 由构造器校验为非空对象指针。
|
||||
let target_obj = unsafe { &*target.as_js_object_ptr() };
|
||||
@@ -2326,7 +2326,11 @@ pub fn object_from_entries<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
/// `Object.getPrototypeOf(obj)`:返回对象的 prototype。
|
||||
pub fn object_get_prototype_of<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let obj_ptr = native_try!(require_obj_arg(vm, args, "getPrototypeOf"));
|
||||
NativeResult::Ok(unsafe { (*obj_ptr).proto() })
|
||||
match vm.get_prototype_of(unsafe { &*obj_ptr }) {
|
||||
Ok(proto) => NativeResult::Ok(proto),
|
||||
// 代理 trap 异常原值传播(ReturnIfAbrupt)。
|
||||
Err(err) => NativeResult::Err(crate::array::from_engine_error(vm, &err)),
|
||||
}
|
||||
}
|
||||
|
||||
/// `Object.setPrototypeOf(obj, proto)`:设置对象的 prototype,返回原值。
|
||||
@@ -2360,19 +2364,17 @@ pub fn object_set_prototype_of<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResu
|
||||
return NativeResult::Ok(target_val);
|
||||
}
|
||||
let target_ptr = target_val.as_js_object_ptr();
|
||||
let target = unsafe { &mut *target_ptr };
|
||||
// OrdinarySetPrototypeOf 步 2-4:新旧原型 SameValue 时直接成功,可扩展标志
|
||||
// 不参与判断;不可扩展且新旧不同才失败。set_proto 是裸写槽操作,不含该判定。
|
||||
if !target.is_extensible() && target.proto() != proto {
|
||||
return NativeResult::Err(crate::error::create_type_error(
|
||||
// OrdinarySetPrototypeOf 步 2-4 语义在 trait 方法内承载:新旧 SameValue
|
||||
// 直接成功,不可扩展且新旧不同或成环返回 false(此处按规范抛 TypeError)。
|
||||
match vm.set_prototype_of(unsafe { &mut *target_ptr }, proto) {
|
||||
Ok(true) => NativeResult::Ok(target_val),
|
||||
Ok(false) => NativeResult::Err(crate::error::create_type_error(
|
||||
vm,
|
||||
"Object.setPrototypeOf: cannot set prototype of non-extensible object",
|
||||
));
|
||||
)),
|
||||
// 代理 trap 异常原值传播(ReturnIfAbrupt)。
|
||||
Err(err) => NativeResult::Err(crate::array::from_engine_error(vm, &err)),
|
||||
}
|
||||
if target.set_proto(proto).is_err() {
|
||||
return NativeResult::Err(crate::error::create_type_error(vm, "Object.setPrototypeOf: cannot set prototype"));
|
||||
}
|
||||
NativeResult::Ok(target_val)
|
||||
}
|
||||
|
||||
/// `Object.hasOwn(obj, key)`:对象是否有指定自身属性。
|
||||
|
||||
@@ -202,7 +202,11 @@ pub fn reflect_get_prototype_of<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeRes
|
||||
let Some(target_ptr) = object_ptr(target_val) else {
|
||||
return type_error(vm, "Reflect.getPrototypeOf target is not an object");
|
||||
};
|
||||
NativeResult::Ok(unsafe { &*target_ptr }.proto())
|
||||
match vm.get_prototype_of(unsafe { &*target_ptr }) {
|
||||
Ok(proto) => NativeResult::Ok(proto),
|
||||
// 代理 trap 异常原值传播(ReturnIfAbrupt)。
|
||||
Err(err) => NativeResult::Err(from_engine_error(vm, &err)),
|
||||
}
|
||||
}
|
||||
|
||||
/// `Reflect.has(target, key)`:属性存在性判定(规范 HasProperty,含原型链)。
|
||||
@@ -475,11 +479,13 @@ pub fn reflect_set_prototype_of<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeRes
|
||||
return type_error(vm, "Reflect.setPrototypeOf prototype must be an object or null");
|
||||
}
|
||||
let target = unsafe { &mut *target_ptr };
|
||||
// OrdinarySetPrototypeOf 步 2-4:新旧相同先于可扩展判定,直接成功。
|
||||
if !target.is_extensible() && target.proto() != proto {
|
||||
return NativeResult::Ok(JsValue::bool(false));
|
||||
// OrdinarySetPrototypeOf 步 2-4 语义在 trait 方法内承载:新旧 SameValue
|
||||
// 直接成功,不可扩展且新旧不同或成环返回 false。
|
||||
match vm.set_prototype_of(target, proto) {
|
||||
Ok(set) => NativeResult::Ok(JsValue::bool(set)),
|
||||
// 代理 trap 异常原值传播(ReturnIfAbrupt)。
|
||||
Err(err) => NativeResult::Err(from_engine_error(vm, &err)),
|
||||
}
|
||||
NativeResult::Ok(JsValue::bool(target.set_proto(proto).is_ok()))
|
||||
}
|
||||
|
||||
fn arg<H: VmHost>(vm: &H, args: &[u8], idx: usize) -> JsValue {
|
||||
|
||||
Reference in New Issue
Block a user