This repository has been archived on 2026-09-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
OxideJS/crates/oxide_vm/src/bindings/bind_bigint.rs
T
爱特每羊队 998327aa7e feat: BigInt.prototype[Symbol.toStringTag] = "BigInt"
Adds the well-known @@toStringTag data property (writable:false,
enumerable:false, configurable:true) so Object.prototype.toString and
property descriptors match the spec. Remaining built-ins/BigInt failure
(Symbol.toStringTag.js verifyProperty) is blocked on String(Symbol)
support in the Symbol track.
2026-08-12 03:41:22 +08:00

67 lines
3.1 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
use std::sync::Arc;
use crate::bindings::{apply_binding_table, bind_global_value, bind_well_known_data_property, configure_native_constructor};
use oxide_kernel::kernel::{KernelCore, KernelSession};
use oxide_types::object::{JsObject, PropAttributes};
use oxide_types::value::JsValue;
/// 把 BigInt 构造器与原型方法绑定到 global。
///
/// 构造器/原型对象由 `BuiltinWorld` 创建(含 name/prototype/constructor 互指),
/// 这里只配置 native 实现并挂方法。`BigInt(value)` 当函数调用时返回 BigInt 值;
/// `new BigInt()` 抛 TypeError(BigInt 不可 new)。
pub fn bind_bigint(core: &Arc<KernelCore>, session: &KernelSession, global: &mut JsObject) {
let world = session.builtin_world();
let ctor_ptr = world.bigint_constructor.as_ptr() as *mut JsObject;
let ctor = unsafe { &mut *ctor_ptr };
let proto_ptr = world.bigint_proto.as_ptr() as *mut JsObject;
let proto = unsafe { &mut *proto_ptr };
configure_native_constructor(ctor, oxide_builtins::bigint::bigint_constructor::<crate::vm::Vm> as *const (), 1);
// BigInt.length = 1,属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。
let length_si = core.perm_interner().intern("length").0;
let length_shape = core.shape_forge().make_shape(ctor.shape_id(), length_si);
ctor.set_shape_id(length_shape);
ctor.ensure_hash_props().push(JsValue::int(1));
let length_pos = ctor.hash_props_vec().map_or(0, |v| v.len() as u32).saturating_sub(1);
ctor.set_data_meta(length_pos, PropAttributes::new(false, false, true));
// 静态方法:asIntN / asUintN(length 均为 2)。
apply_binding_table(
world,
ctor,
core,
&[
("asIntN", oxide_builtins::bigint::bigint_as_int_n::<crate::vm::Vm> as *const (), 2),
("asUintN", oxide_builtins::bigint::bigint_as_uint_n::<crate::vm::Vm> as *const (), 2),
],
);
apply_binding_table(
world,
proto,
core,
&[
("toString", oxide_builtins::bigint::bigint_to_string::<crate::vm::Vm> as *const (), 0),
(
"toLocaleString",
oxide_builtins::bigint::bigint_to_locale_string::<crate::vm::Vm> as *const (),
0,
),
("valueOf", oxide_builtins::bigint::bigint_value_of::<crate::vm::Vm> as *const (), 0),
],
);
// BigInt.prototype[@@toStringTag] = "BigInt",属性 { writable:false, enumerable:false, configurable:true }。
let tag_si = core.perm_interner().intern("BigInt").0;
let tag_value = JsValue::perm_string(core.perm_interner().string_ptr(tag_si));
bind_well_known_data_property(core, proto, 9, tag_value, PropAttributes::new(false, false, true));
bind_global_value(core, global, "BigInt", JsValue::from_js_object(ctor_ptr));
// 全局 BigInt 属性描述符:{ writable: true, enumerable: false, configurable: true }。
let bigint_si = core.perm_interner().intern("BigInt").0;
if let Some(pos) = core.shape_forge().lookup_position(global.shape_id(), bigint_si) {
global.set_data_meta(pos, PropAttributes::new(true, false, true));
}
}