mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-25 11:11:11 +08:00
feat: Reflect.has 切统一数值键门并修 2^32 索引边界
This commit is contained in:
@@ -11,12 +11,12 @@ use oxide_runtime_api::{NativeResult, VmHost};
|
||||
|
||||
use crate::builtins_debug;
|
||||
|
||||
/// 判断字符串是否为规范整数索引:非空、无前导零、全数字且值 < 2^32-1。
|
||||
/// 判断字符串是否为规范整数索引:非空、无前导零、全数字且值 < 2^32。
|
||||
fn is_integer_index(key: &str) -> bool {
|
||||
if key.is_empty() || key.len() > 1 && key.as_bytes()[0] == b'0' {
|
||||
return false;
|
||||
}
|
||||
key.bytes().all(|b| b.is_ascii_digit()) && key.parse::<u64>().unwrap_or(u64::MAX) < (1u64 << 32) - 1
|
||||
key.bytes().all(|b| b.is_ascii_digit()) && key.parse::<u64>().unwrap_or(u64::MAX) < (1u64 << 32)
|
||||
}
|
||||
|
||||
/// 收集对象全部自身属性(数组元素区 + shape 链),按规范顺序排列:整数索引在前
|
||||
|
||||
@@ -154,14 +154,19 @@ pub fn reflect_get_prototype_of<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeRes
|
||||
NativeResult::Ok(unsafe { &*target_ptr }.proto())
|
||||
}
|
||||
|
||||
/// `Reflect.has(target, key)`:属性是否存在(含原型链)。
|
||||
/// `Reflect.has(target, key)`:属性存在性判定(规范 HasProperty,含原型链)。
|
||||
///
|
||||
/// TypedArray 经统一数值键门(exotic [[HasProperty]]):界内整数索引判存在;
|
||||
/// 数字无效键(负/分数/±Infinity/NaN/越界,含 "-0" 特例)立即 false,不查
|
||||
/// 自身命名属性也不走原型链;非规范数字串落普通路径。原型链上的 TA 按同口径
|
||||
/// 经门判定。
|
||||
pub fn reflect_has<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let target_val = arg(vm, args, 1);
|
||||
let Some(target_ptr) = object_ptr(target_val) else {
|
||||
return type_error(vm, "Reflect.has target is not an object");
|
||||
};
|
||||
let key_si = vm.property_key_si(arg(vm, args, 2));
|
||||
NativeResult::Ok(JsValue::bool(vm.resolve_property(unsafe { &*target_ptr }, key_si).is_some()))
|
||||
NativeResult::Ok(JsValue::bool(vm.has_property(unsafe { &*target_ptr }, key_si)))
|
||||
}
|
||||
|
||||
/// `Reflect.isExtensible(target)`:对象是否可扩展。
|
||||
|
||||
Reference in New Issue
Block a user