fix: 错误对象属性枚举性、toString 标签与构造器调用语义

- message/name 属性改非枚举(CreateNonEnumerableDataPropertyOrThrow),
  Object.keys/for-in/JSON.stringify 不再泄漏错误信息
- 新增 Error 家族对象标签,Object.prototype.toString 输出 [object Error],
  含子类型与用户子类(沿原型链判定)
- Error 家族构造器补 length=1,函数调用忽略 this 一律新建对象
- JSON.stringify 序列化仅含可枚举自身属性(规范 EnumerableOwnPropertyNames)
This commit is contained in:
2026-08-15 21:30:28 +08:00
parent 78976cad0c
commit 528f893e63
7 changed files with 156 additions and 18 deletions
+7 -2
View File
@@ -2,7 +2,7 @@ use std::collections::HashSet;
use std::fmt::Write;
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
use oxide_types::object::JsObject;
use oxide_types::object::{JsObject, PropAttributes};
use oxide_types::private_key::make_int_key;
use oxide_types::value::JsValue;
@@ -361,9 +361,14 @@ fn stringify_object<H: VmHost>(
out.push('{');
let keys = walk_own_keys(vm, obj);
// 预计算 (名称, 槽位) 对,并应用白名单过滤。
// 仅序列化可枚举自身属性(规范 EnumerableOwnPropertyNames)。
let entries: Vec<(String, u32)> = keys
.into_iter()
.filter(|(_si, pos)| {
obj.prop_meta_at(*pos)
.map(|m| m.attributes.enumerable())
.unwrap_or(PropAttributes::DEFAULT_DATA.enumerable())
})
.filter_map(|(si, pos)| {
let name = key_si_to_string(vm, si);
if let Some(whitelist) = replacer_whitelist {