mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-26 11:41:13 +08:00
refactor: 提取 Realm 组合类型,session 与 GC 及原型槽归 realm
This commit is contained in:
@@ -28,7 +28,7 @@ impl Vm {
|
||||
/// 创建聚合静态方法(all/race/allSettled/any)的共享记录对象:剩余计数
|
||||
/// 初始 1,结果数组(race 无)与能力 resolve/reject 闭包全部存为自身属性。
|
||||
fn make_agg_record(&mut self, values: JsValue, resolve: JsValue, reject: JsValue) -> JsValue {
|
||||
let proto_val = JsValue::from_js_object(self.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
let proto_val = JsValue::from_js_object(self.realm.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
let ptr = self.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, proto_val));
|
||||
// SAFETY: ptr 由 alloc_object 新建,返回非空 arena 指针;本次 native 调用内不搬移,借出期间无别名。
|
||||
let obj = unsafe { &mut *ptr };
|
||||
@@ -46,7 +46,7 @@ impl Vm {
|
||||
/// 创建 keyed 聚合静态方法的共享记录对象:剩余计数(初始 1)、结果平行数组、
|
||||
/// 键平行数组与能力 resolve/reject 闭包存为自身属性。
|
||||
fn make_agg_record_keyed(&mut self, values: JsValue, keys: JsValue, resolve: JsValue, reject: JsValue) -> JsValue {
|
||||
let proto_val = JsValue::from_js_object(self.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
let proto_val = JsValue::from_js_object(self.realm.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
let ptr = self.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, proto_val));
|
||||
// SAFETY: ptr 由 alloc_object 新建,返回非空 arena 指针;本次 native 调用内不搬移,借出期间无别名。
|
||||
let obj = unsafe { &mut *ptr };
|
||||
@@ -67,7 +67,7 @@ impl Vm {
|
||||
/// 初始 false。内部状态属性非枚举且追加在 length/name 之后,保持内建函数
|
||||
/// "length 先于 name" 的属性序。
|
||||
fn make_agg_element_fn(&mut self, native_fn: NativeFn, record: JsValue, index: i32) -> JsValue {
|
||||
let fn_proto = self.session.builtin_world().fn_proto_val();
|
||||
let fn_proto = self.realm.session.builtin_world().fn_proto_val();
|
||||
let mut func = JsObject::new_empty(EMPTY_SHAPE_ID, fn_proto);
|
||||
func.set_function(true);
|
||||
// SAFETY: native_fn 是 NativeFn 函数项。
|
||||
@@ -99,7 +99,7 @@ impl Vm {
|
||||
|
||||
/// 构造 allSettled 的结算记录 `{status, <value_field>: value}` 普通对象。
|
||||
fn make_settled_record(&mut self, status: &str, value_field: &str, value: JsValue) -> JsValue {
|
||||
let proto_val = JsValue::from_js_object(self.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
let proto_val = JsValue::from_js_object(self.realm.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
let ptr = self.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, proto_val));
|
||||
// SAFETY: ptr 由 alloc_object 新建,返回非空 arena 指针;写 status/value 属性(含 new_string 分配)期间不搬移,借出期间无别名。
|
||||
let obj = unsafe { &mut *ptr };
|
||||
@@ -114,7 +114,7 @@ impl Vm {
|
||||
/// 构造 AggregateError 实例(proto = %AggregateError.prototype%):message 非
|
||||
/// undefined 时 ToString 建自身属性,errors 存为数据属性。
|
||||
fn make_aggregate_error(&mut self, errors: JsValue, message: JsValue) -> JsValue {
|
||||
let proto_val = JsValue::from_js_object(self.aggregate_error_proto.as_ptr() as *mut JsObject);
|
||||
let proto_val = JsValue::from_js_object(self.realm.aggregate_error_proto.as_ptr() as *mut JsObject);
|
||||
let ptr = self.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, proto_val));
|
||||
// SAFETY: ptr 由 alloc_object 新建,返回非空 arena 指针;写 message/errors 数据属性期间不搬移,借出期间无别名。
|
||||
let obj = unsafe { &mut *ptr };
|
||||
@@ -135,7 +135,7 @@ impl Vm {
|
||||
|
||||
/// 把 errors 可迭代值收集为新数组(IterableToList)。不可迭代抛 TypeError。
|
||||
fn aggregate_errors_to_list(&mut self, errors: JsValue) -> Result<JsValue, JsValue> {
|
||||
let array_proto = JsValue::from_js_object(self.session.builtin_world().array_proto.as_ptr() as *mut JsObject);
|
||||
let array_proto = JsValue::from_js_object(self.realm.session.builtin_world().array_proto.as_ptr() as *mut JsObject);
|
||||
let ptr = self.alloc_object(JsObject::new_array(EMPTY_SHAPE_ID, array_proto, 0));
|
||||
let list = JsValue::from_js_object(ptr);
|
||||
let mut index = 0usize;
|
||||
@@ -151,7 +151,7 @@ impl Vm {
|
||||
|
||||
/// 建普通数组对象并依次写入元素(Promise.try 转发实参的承载)。
|
||||
fn make_plain_array(&mut self, elements: Vec<JsValue>) -> JsValue {
|
||||
let array_proto = JsValue::from_js_object(self.session.builtin_world().array_proto.as_ptr() as *mut JsObject);
|
||||
let array_proto = JsValue::from_js_object(self.realm.session.builtin_world().array_proto.as_ptr() as *mut JsObject);
|
||||
let ptr = self.alloc_object(JsObject::new_array(EMPTY_SHAPE_ID, array_proto, 0));
|
||||
// SAFETY: ptr 由 alloc_object 新建,返回非空 arena 指针;元素写入不搬移对象。
|
||||
let obj = unsafe { &mut *ptr };
|
||||
@@ -165,7 +165,7 @@ impl Vm {
|
||||
/// 自身属性(GC 边走属性区,免 native_data 接线);W 被构造器以
|
||||
/// (resolve, reject) 实参调用。
|
||||
fn make_try_wrapper(&mut self, executor: JsValue, call_args: Vec<JsValue>) -> JsValue {
|
||||
let fn_proto = self.session.builtin_world().fn_proto_val();
|
||||
let fn_proto = self.realm.session.builtin_world().fn_proto_val();
|
||||
let mut func = JsObject::new_empty(EMPTY_SHAPE_ID, fn_proto);
|
||||
func.set_function(true);
|
||||
// SAFETY: promise_try_wrapper 是 NativeFn 函数项。
|
||||
@@ -192,7 +192,7 @@ impl Vm {
|
||||
let sf = self.kernel_core.perm_interner().as_ref();
|
||||
let sh = self.kernel_core.shape_forge().as_ref();
|
||||
let error_proto_val =
|
||||
JsValue::from_js_object(self.session.builtin_world().error_proto.as_ptr() as *mut JsObject);
|
||||
JsValue::from_js_object(self.realm.session.builtin_world().error_proto.as_ptr() as *mut JsObject);
|
||||
|
||||
// %AggregateError.prototype%:proto = %Error.prototype%,constructor/name/message 数据属性。
|
||||
let mut proto = Box::new(JsObject::new_empty(EMPTY_SHAPE_ID, error_proto_val));
|
||||
@@ -214,7 +214,7 @@ impl Vm {
|
||||
|
||||
// %AggregateError% 构造器:proto = %Error%(NativeError 构造器继承 Error 构造器),length 2。
|
||||
let error_ctor_val =
|
||||
JsValue::from_js_object(self.session.builtin_world().error_constructor.as_ptr() as *mut JsObject);
|
||||
JsValue::from_js_object(self.realm.session.builtin_world().error_constructor.as_ptr() as *mut JsObject);
|
||||
let mut ctor = Box::new(JsObject::new_empty(EMPTY_SHAPE_ID, error_ctor_val));
|
||||
ctor.set_function(true);
|
||||
ctor.type_tag = JsObject::OBJ_TYPE_CONSTRUCTOR;
|
||||
@@ -238,22 +238,22 @@ impl Vm {
|
||||
ctor.set_data_meta(2u32, PropAttributes::new(false, false, false));
|
||||
|
||||
// 固定地址后互相接线:proto.constructor ↔ ctor.prototype。
|
||||
Self::swap_intrinsic_proto(&mut self.aggregate_error_proto, *proto);
|
||||
Self::swap_intrinsic_proto(&mut self.aggregate_error_constructor, *ctor);
|
||||
Self::swap_intrinsic_proto(&mut self.realm.aggregate_error_proto, *proto);
|
||||
Self::swap_intrinsic_proto(&mut self.realm.aggregate_error_constructor, *ctor);
|
||||
// SAFETY: aggregate_error_proto 为堆址固定的 P<JsObject>(Arc 透明包装),本行前刚经 swap_intrinsic_proto 落地;与 ctor_mut 分属不同对象,无别名。
|
||||
let proto_mut = unsafe { &mut *self.aggregate_error_proto.as_mut_ptr() };
|
||||
let proto_mut = unsafe { &mut *self.realm.aggregate_error_proto.as_mut_ptr() };
|
||||
proto_mut
|
||||
.set_prop_at(0u32, JsValue::from_js_object(self.aggregate_error_constructor.as_ptr() as *mut JsObject));
|
||||
.set_prop_at(0u32, JsValue::from_js_object(self.realm.aggregate_error_constructor.as_ptr() as *mut JsObject));
|
||||
// SAFETY: aggregate_error_constructor 同为堆址固定的 P<JsObject>(Arc 透明包装);此处写 prototype 槽位(下标 2),与 proto_mut 分属不同对象,无别名。
|
||||
let ctor_mut = unsafe { &mut *self.aggregate_error_constructor.as_mut_ptr() };
|
||||
ctor_mut.set_prop_at(2u32, JsValue::from_js_object(self.aggregate_error_proto.as_ptr() as *mut JsObject));
|
||||
let ctor_mut = unsafe { &mut *self.realm.aggregate_error_constructor.as_mut_ptr() };
|
||||
ctor_mut.set_prop_at(2u32, JsValue::from_js_object(self.realm.aggregate_error_proto.as_ptr() as *mut JsObject));
|
||||
|
||||
// 绑定 global(槽已存在则更新)。
|
||||
let global_ptr = self.session.global_object().as_ptr() as *mut JsObject;
|
||||
let global_ptr = self.realm.session.global_object().as_ptr() as *mut JsObject;
|
||||
// SAFETY: global 对象由 session 持有,存活整个 session;本函数内只改其 shape/属性区,期间无 reset 或对象搬移。
|
||||
let global = unsafe { &mut *global_ptr };
|
||||
let si = self.kernel_core.perm_interner().intern("AggregateError").0;
|
||||
let ctor_val = JsValue::from_js_object(self.aggregate_error_constructor.as_ptr() as *mut JsObject);
|
||||
let ctor_val = JsValue::from_js_object(self.realm.aggregate_error_constructor.as_ptr() as *mut JsObject);
|
||||
if let Some(pos) = self.kernel_core.shape_forge().lookup_position(global.shape_id(), si) {
|
||||
global.set_prop_at(pos, ctor_val);
|
||||
} else {
|
||||
@@ -356,7 +356,7 @@ pub(super) fn promise_static_with_resolvers(vm: &mut Vm, args: &[u8]) -> NativeR
|
||||
Ok(t) => t,
|
||||
Err(err) => return NativeResult::Err(err),
|
||||
};
|
||||
let object_proto = JsValue::from_js_object(vm.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
let object_proto = JsValue::from_js_object(vm.realm.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
let ptr = vm.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, object_proto));
|
||||
// SAFETY: ptr 由 alloc_object 新建,返回非空 arena 指针;写 promise/resolve/reject 属性期间不搬移,借出期间无别名。
|
||||
let obj = unsafe { &mut *ptr };
|
||||
@@ -481,7 +481,7 @@ fn perform_promise_combine(
|
||||
let values = if kind == AggregateKind::Race {
|
||||
JsValue::undefined()
|
||||
} else {
|
||||
let array_proto = JsValue::from_js_object(vm.session.builtin_world().array_proto.as_ptr() as *mut JsObject);
|
||||
let array_proto = JsValue::from_js_object(vm.realm.session.builtin_world().array_proto.as_ptr() as *mut JsObject);
|
||||
let ptr = vm.alloc_object(JsObject::new_array(EMPTY_SHAPE_ID, array_proto, 0));
|
||||
JsValue::from_js_object(ptr)
|
||||
};
|
||||
@@ -1049,7 +1049,7 @@ fn aggregate_error_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
||||
let this = if this_val.is_object() && new_target.is_object() {
|
||||
this_val.as_js_object_ptr()
|
||||
} else {
|
||||
let proto_val = JsValue::from_js_object(vm.aggregate_error_proto.as_ptr() as *mut JsObject);
|
||||
let proto_val = JsValue::from_js_object(vm.realm.aggregate_error_proto.as_ptr() as *mut JsObject);
|
||||
vm.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, proto_val))
|
||||
};
|
||||
// SAFETY: this 来自构造路径预分配或 alloc_object 新建,均存活且本段无别名。
|
||||
|
||||
@@ -22,7 +22,7 @@ use super::{is_constructor_value, PromiseState, PromiseStateKind};
|
||||
impl Vm {
|
||||
/// 创建空 Promise 对象(proto = `%Promise.prototype%`),状态盒为 Pending。
|
||||
pub(super) fn create_promise_object(&mut self) -> JsValue {
|
||||
let proto_val = JsValue::from_js_object(self.promise_proto.as_ptr() as *mut JsObject);
|
||||
let proto_val = JsValue::from_js_object(self.realm.promise_proto.as_ptr() as *mut JsObject);
|
||||
let ptr = self.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, proto_val));
|
||||
// SAFETY: `alloc_object` 返回非空 arena 指针;此处写 type_tag 与 native_data
|
||||
// (Box<PromiseState> 由 Box::into_raw 分配,随对象释放),无别名。
|
||||
@@ -114,11 +114,11 @@ impl Vm {
|
||||
// 的 receiver 原型链判定通过。
|
||||
let is_data_view = std::ptr::eq(
|
||||
ctor.as_js_object_ptr(),
|
||||
self.session.builtin_world().data_view_constructor.as_ptr() as *mut JsObject,
|
||||
self.realm.session.builtin_world().data_view_constructor.as_ptr() as *mut JsObject,
|
||||
);
|
||||
let this_val = if is_data_view {
|
||||
let data_view_proto_val =
|
||||
JsValue::from_js_object(self.session.builtin_world().data_view_proto.as_ptr() as *mut JsObject);
|
||||
JsValue::from_js_object(self.realm.session.builtin_world().data_view_proto.as_ptr() as *mut JsObject);
|
||||
JsValue::from_js_object(self.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, data_view_proto_val)))
|
||||
} else {
|
||||
let this_ptr = self.alloc_ctor_this(nt_obj, ctor_obj, new_target)?;
|
||||
@@ -156,7 +156,7 @@ impl Vm {
|
||||
&mut self, nt_obj: &JsObject, ctor_obj: &JsObject, nt_val: JsValue,
|
||||
) -> Result<*mut JsObject, JsValue> {
|
||||
let proto_si = self.kernel_core.perm_interner().intern("prototype").0;
|
||||
let object_proto = JsValue::from_js_object(self.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
let object_proto = JsValue::from_js_object(self.realm.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
let is_native_ctor = ctor_obj.native_fn().is_some() && ctor_obj.type_tag == JsObject::OBJ_TYPE_CONSTRUCTOR;
|
||||
let proto_val = if is_native_ctor {
|
||||
match self.resolve_property(nt_obj, proto_si) {
|
||||
@@ -257,10 +257,10 @@ impl Vm {
|
||||
pub(crate) fn init_promise_intrinsics(&mut self) {
|
||||
let sf = self.kernel_core.perm_interner().as_ref();
|
||||
let sh = self.kernel_core.shape_forge().as_ref();
|
||||
let fn_proto_val = self.session.builtin_world().fn_proto_val();
|
||||
let world = self.session.builtin_world();
|
||||
let fn_proto_val = self.realm.session.builtin_world().fn_proto_val();
|
||||
let world = self.realm.session.builtin_world();
|
||||
let object_proto_val =
|
||||
JsValue::from_js_object(self.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
JsValue::from_js_object(self.realm.session.builtin_world().object_proto.as_ptr() as *mut JsObject);
|
||||
|
||||
// %Promise.prototype%:proto = Object.prototype,方法 then/catch/finally + @@toStringTag。
|
||||
let mut proto = Box::new(JsObject::new_empty(EMPTY_SHAPE_ID, object_proto_val));
|
||||
@@ -327,23 +327,23 @@ impl Vm {
|
||||
);
|
||||
|
||||
// 固定地址后互相接线:proto.constructor ↔ ctor.prototype。
|
||||
Self::swap_intrinsic_proto(&mut self.promise_proto, *proto);
|
||||
Self::swap_intrinsic_proto(&mut self.promise_constructor, *ctor);
|
||||
Self::swap_intrinsic_proto(&mut self.realm.promise_proto, *proto);
|
||||
Self::swap_intrinsic_proto(&mut self.realm.promise_constructor, *ctor);
|
||||
// SAFETY: `promise_proto` 为 `P<JsObject>`(Arc 透明包装),堆址固定且本行前刚经
|
||||
// swap_intrinsic_proto 落地;与下一处 ctor_mut 指向不同对象,无别名。
|
||||
let proto_mut = unsafe { &mut *self.promise_proto.as_mut_ptr() };
|
||||
proto_mut.set_prop_at(0u32, JsValue::from_js_object(self.promise_constructor.as_ptr() as *mut JsObject));
|
||||
let proto_mut = unsafe { &mut *self.realm.promise_proto.as_mut_ptr() };
|
||||
proto_mut.set_prop_at(0u32, JsValue::from_js_object(self.realm.promise_constructor.as_ptr() as *mut JsObject));
|
||||
// SAFETY: `promise_constructor` 同为堆址固定的存活 `P<JsObject>`(Arc 透明包装);
|
||||
// 此处写 prototype 槽位(下标 2),与 proto_mut 分属不同对象,无别名。
|
||||
let ctor_mut = unsafe { &mut *self.promise_constructor.as_mut_ptr() };
|
||||
let ctor_mut = unsafe { &mut *self.realm.promise_constructor.as_mut_ptr() };
|
||||
// prototype 槽位在 length/name 之后(下标 2)。
|
||||
ctor_mut.set_prop_at(2u32, JsValue::from_js_object(self.promise_proto.as_ptr() as *mut JsObject));
|
||||
ctor_mut.set_prop_at(2u32, JsValue::from_js_object(self.realm.promise_proto.as_ptr() as *mut JsObject));
|
||||
|
||||
// Promise[Symbol.species] 访问器:getter 返回 receiver,派生类沿静态原型链
|
||||
// 解析 @@species 得自身构造器。ctor 经本函数每次调用全新构造,同键槽不累积。
|
||||
crate::bindings::bind_accessor_getter_key(
|
||||
&self.kernel_core,
|
||||
&self.session,
|
||||
&self.realm.session,
|
||||
ctor_mut,
|
||||
oxide_types::private_key::make_well_known_symbol_key(oxide_types::private_key::WELL_KNOWN_SYMBOL_SPECIES),
|
||||
"get [Symbol.species]",
|
||||
@@ -351,12 +351,12 @@ impl Vm {
|
||||
);
|
||||
|
||||
// 绑定 global:槽已存在则更新(full_reset 未重建 global 时旧槽指向已弃 ctor)。
|
||||
let global_ptr = self.session.global_object().as_ptr() as *mut JsObject;
|
||||
let global_ptr = self.realm.session.global_object().as_ptr() as *mut JsObject;
|
||||
// SAFETY: global 对象由 session 持有,存活整个 session;本函数内只改其
|
||||
// shape/属性区,期间无 reset 或对象搬移。
|
||||
let global = unsafe { &mut *global_ptr };
|
||||
let si = self.kernel_core.perm_interner().intern("Promise").0;
|
||||
let ctor_val = JsValue::from_js_object(self.promise_constructor.as_ptr() as *mut JsObject);
|
||||
let ctor_val = JsValue::from_js_object(self.realm.promise_constructor.as_ptr() as *mut JsObject);
|
||||
if let Some(pos) = self.kernel_core.shape_forge().lookup_position(global.shape_id(), si) {
|
||||
global.set_prop_at(pos, ctor_val);
|
||||
} else {
|
||||
@@ -392,7 +392,7 @@ fn promise_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
||||
return NativeResult::Err(oxide_builtins::error::create_type_error(vm, "Promise executor is not a function"));
|
||||
}
|
||||
// GetPrototypeFromConstructor:异常原值上抛;非对象结果回落内建原型。
|
||||
let promise_proto_val = JsValue::from_js_object(vm.promise_proto.as_ptr() as *mut JsObject);
|
||||
let promise_proto_val = JsValue::from_js_object(vm.realm.promise_proto.as_ptr() as *mut JsObject);
|
||||
let new_target = vm.reg(255);
|
||||
let proto = if new_target.is_object() {
|
||||
let nt_ptr = new_target.as_js_object_ptr();
|
||||
|
||||
@@ -145,7 +145,7 @@ impl Vm {
|
||||
}
|
||||
};
|
||||
if ctor.is_undefined() {
|
||||
return Ok(JsValue::from_js_object(self.promise_constructor.as_ptr() as *mut JsObject));
|
||||
return Ok(JsValue::from_js_object(self.realm.promise_constructor.as_ptr() as *mut JsObject));
|
||||
}
|
||||
if !ctor.is_object() {
|
||||
return Err(oxide_builtins::error::create_type_error(
|
||||
@@ -287,7 +287,7 @@ impl Vm {
|
||||
/// 调 onFinally 后经 PromiseResolve(ctor, 返回值) 解包,再以直通 thunk
|
||||
/// 调 Invoke(p, "then")——fulfill 角色透传原值,reject 角色重抛原拒绝原因。
|
||||
fn make_finally_handler(&mut self, on_finally: JsValue, ctor: JsValue, reject_role: bool) -> JsValue {
|
||||
let fn_proto = self.session.builtin_world().fn_proto_val();
|
||||
let fn_proto = self.realm.session.builtin_world().fn_proto_val();
|
||||
let mut func = JsObject::new_empty(EMPTY_SHAPE_ID, fn_proto);
|
||||
func.set_function(true);
|
||||
// SAFETY: promise_finally_handler 是 NativeFn 函数项。
|
||||
@@ -309,7 +309,7 @@ impl Vm {
|
||||
/// 构造 finally 直通 thunk(CreateBuiltinFunction(closure, 0, "")):
|
||||
/// fulfill 角色返回携带值,reject 角色抛携带的拒绝原因。
|
||||
fn make_finally_thunk(&mut self, reject_role: bool, value: JsValue) -> JsValue {
|
||||
let fn_proto = self.session.builtin_world().fn_proto_val();
|
||||
let fn_proto = self.realm.session.builtin_world().fn_proto_val();
|
||||
let mut func = JsObject::new_empty(EMPTY_SHAPE_ID, fn_proto);
|
||||
func.set_function(true);
|
||||
// SAFETY: finally_thunk 是 NativeFn 函数项。
|
||||
@@ -360,7 +360,7 @@ fn promise_finally_handler(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
||||
let c_si = vm.kernel_core.perm_interner().intern(FINALLY_CTOR_PROP).0;
|
||||
let ctor = vm
|
||||
.resolve_property(callee_obj, c_si)
|
||||
.unwrap_or_else(|| JsValue::from_js_object(vm.promise_constructor.as_ptr() as *mut JsObject));
|
||||
.unwrap_or_else(|| JsValue::from_js_object(vm.realm.promise_constructor.as_ptr() as *mut JsObject));
|
||||
let rj_si = vm.kernel_core.perm_interner().intern(FINALLY_REJECT_PROP).0;
|
||||
let is_reject = vm
|
||||
.resolve_property(callee_obj, rj_si)
|
||||
|
||||
@@ -36,7 +36,7 @@ impl Vm {
|
||||
pub(super) fn new_promise_capability_with_ctor(
|
||||
&mut self, ctor: JsValue,
|
||||
) -> Result<(JsValue, JsValue, JsValue), JsValue> {
|
||||
let intrinsic = JsValue::from_js_object(self.promise_constructor.as_ptr() as *mut JsObject);
|
||||
let intrinsic = JsValue::from_js_object(self.realm.promise_constructor.as_ptr() as *mut JsObject);
|
||||
if oxide_runtime_api::same_value(ctor, intrinsic) {
|
||||
return Ok(self.new_promise_capability());
|
||||
}
|
||||
@@ -71,7 +71,7 @@ impl Vm {
|
||||
|
||||
/// 构造 GetCapabilitiesExecutor:调用时把 resolve/reject 存入自身 prop。
|
||||
fn make_capability_executor(&mut self) -> JsValue {
|
||||
let fn_proto = self.session.builtin_world().fn_proto_val();
|
||||
let fn_proto = self.realm.session.builtin_world().fn_proto_val();
|
||||
let mut func = JsObject::new_empty(EMPTY_SHAPE_ID, fn_proto);
|
||||
func.set_function(true);
|
||||
// SAFETY: capability_executor 是 NativeFn 函数项。
|
||||
@@ -90,7 +90,7 @@ impl Vm {
|
||||
/// 仍阻止二次结算。
|
||||
pub(super) fn make_resolve_reject_fn(&mut self, promise: JsValue, reject_role: bool, delegated: bool) -> JsValue {
|
||||
let native_fn: NativeFn = if reject_role { promise_reject_closure } else { promise_resolve_closure };
|
||||
let fn_proto = self.session.builtin_world().fn_proto_val();
|
||||
let fn_proto = self.realm.session.builtin_world().fn_proto_val();
|
||||
let mut func = JsObject::new_empty(EMPTY_SHAPE_ID, fn_proto);
|
||||
func.set_function(true);
|
||||
// SAFETY: native_fn 是 NativeFn 函数项。
|
||||
@@ -314,7 +314,7 @@ impl Vm {
|
||||
return Err(exc);
|
||||
}
|
||||
};
|
||||
let intrinsic = JsValue::from_js_object(self.promise_constructor.as_ptr() as *mut JsObject);
|
||||
let intrinsic = JsValue::from_js_object(self.realm.promise_constructor.as_ptr() as *mut JsObject);
|
||||
if oxide_runtime_api::same_value(ctor, intrinsic) {
|
||||
return Ok(value);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user