mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-24 02:31:13 +08:00
refactor: 内置八文件续迁内核访问器调用至 VmHost 能力方法
This commit is contained in:
@@ -5,7 +5,7 @@ use oxide_types::object::{JsObject, PropAttributes, MAX_DENSE_PROPS};
|
||||
use oxide_types::private_key::encode_symbol_key;
|
||||
use oxide_types::value::JsValue;
|
||||
|
||||
use oxide_runtime_api::{NativeResult, VmHost};
|
||||
use oxide_runtime_api::{NativeResult, ProtoKind, VmHost};
|
||||
|
||||
use super::common::{
|
||||
array_length_arg, array_type_error, arraylike_get, arraylike_get_or_err, create_new_array, invoke_native_callback,
|
||||
@@ -15,7 +15,7 @@ use super::common::{
|
||||
|
||||
/// JS `Array()` 构造逻辑:单个数字参数创建指定长度空数组,其余情况把参数作为元素。
|
||||
pub fn array_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
let proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
|
||||
let proto = vm.builtin_proto(ProtoKind::ArrayProto);
|
||||
let proto_val = JsValue::from_js_object(proto);
|
||||
|
||||
if args.len() == 2 {
|
||||
@@ -65,7 +65,7 @@ pub fn array_is_array<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
if ptr.is_null() {
|
||||
return NativeResult::Ok(JsValue::bool(false));
|
||||
}
|
||||
let array_proto = vm.session().builtin_world().array_proto.as_ptr();
|
||||
let array_proto = vm.builtin_proto(ProtoKind::ArrayProto);
|
||||
NativeResult::Ok(JsValue::bool(unsafe { &*ptr }.is_array() || std::ptr::eq(ptr, array_proto)))
|
||||
}
|
||||
|
||||
@@ -159,9 +159,9 @@ pub fn array_from<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
Ok(it) => it,
|
||||
Err(err) => return NativeResult::Err(err),
|
||||
};
|
||||
let next_si = vm.kernel_core().perm_interner().intern("next").0;
|
||||
let done_si = vm.kernel_core().perm_interner().intern("done").0;
|
||||
let value_si = vm.kernel_core().perm_interner().intern("value").0;
|
||||
let next_si = vm.perm_intern("next");
|
||||
let done_si = vm.perm_intern("done");
|
||||
let value_si = vm.perm_intern("value");
|
||||
let mut k = 0usize;
|
||||
let iter_result: Result<(), JsValue> = (|| {
|
||||
loop {
|
||||
@@ -289,7 +289,7 @@ pub(crate) fn from_engine_error<H: VmHost>(vm: &mut H, err: &str) -> JsValue {
|
||||
fn construct_array_from_result<H: VmHost>(
|
||||
vm: &mut H, c: JsValue, args: &[JsValue],
|
||||
) -> Result<(*mut JsObject, bool), JsValue> {
|
||||
let proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
|
||||
let proto = vm.builtin_proto(ProtoKind::ArrayProto);
|
||||
let proto_val = JsValue::from_js_object(proto);
|
||||
let mut fallback_array = || {
|
||||
let arr = vm.alloc_object(JsObject::new_array(EMPTY_SHAPE_ID, proto_val, 0));
|
||||
@@ -319,7 +319,7 @@ pub(crate) fn array_species_create<H: VmHost>(
|
||||
}
|
||||
let o_ptr = o_val.as_js_object_ptr();
|
||||
let o_obj = unsafe { &*o_ptr };
|
||||
let ctor_key = vm.kernel_core().perm_interner().intern("constructor").0;
|
||||
let ctor_key = vm.perm_intern("constructor");
|
||||
let c = match vm.ordinary_get(o_obj, ctor_key, o_val) {
|
||||
Ok(v) => v,
|
||||
Err(msg) => return Err(from_engine_error(vm, &msg)),
|
||||
@@ -417,7 +417,7 @@ fn close_iterator<H: VmHost>(vm: &mut H, iterator: JsValue) {
|
||||
return;
|
||||
}
|
||||
let iter_obj = unsafe { &*iterator.as_js_object_ptr() };
|
||||
let return_si = vm.kernel_core().perm_interner().intern("return").0;
|
||||
let return_si = vm.perm_intern("return");
|
||||
if let Ok(ret) = vm.ordinary_get(iter_obj, return_si, iterator) {
|
||||
if ret.is_object() && unsafe { &*ret.as_js_object_ptr() }.is_function() {
|
||||
// return() 的抛错被忽略,其值不得外泄进槽覆盖在途异常。
|
||||
|
||||
@@ -4,7 +4,7 @@ use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
|
||||
use oxide_types::object::JsObject;
|
||||
use oxide_types::value::JsValue;
|
||||
|
||||
use oxide_runtime_api::{NativeResult, VmHost};
|
||||
use oxide_runtime_api::{NativeResult, ProtoKind, VmHost};
|
||||
|
||||
use crate::builtins_debug;
|
||||
use crate::builtins_error;
|
||||
@@ -150,11 +150,11 @@ pub(crate) fn make_array_iterator<H: VmHost>(vm: &mut H, this_val: JsValue, kind
|
||||
Ok(v) => v,
|
||||
Err(msg) => return Err(array_type_error(vm, &msg)),
|
||||
};
|
||||
let array_iter_proto = vm.session().builtin_world().array_iterator_proto.as_ptr() as *mut JsObject;
|
||||
let array_iter_proto = vm.builtin_proto(ProtoKind::ArrayIteratorProto);
|
||||
let iter = vm.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(array_iter_proto)));
|
||||
let target_si = vm.kernel_core().perm_interner().intern(ARRAY_ITER_TARGET_PROP).0;
|
||||
let index_si = vm.kernel_core().perm_interner().intern(ARRAY_ITER_INDEX_PROP).0;
|
||||
let kind_si = vm.kernel_core().perm_interner().intern(ARRAY_ITER_KIND_PROP).0;
|
||||
let target_si = vm.perm_intern(ARRAY_ITER_TARGET_PROP);
|
||||
let index_si = vm.perm_intern(ARRAY_ITER_INDEX_PROP);
|
||||
let kind_si = vm.perm_intern(ARRAY_ITER_KIND_PROP);
|
||||
let iter_ref = unsafe { &mut *iter };
|
||||
vm.set_or_create_prop_value(iter_ref, target_si, target);
|
||||
vm.set_or_create_prop_value(iter_ref, index_si, JsValue::int(0));
|
||||
@@ -189,9 +189,9 @@ pub fn array_iterator_next<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||
return NativeResult::Err(array_type_error(vm, "Array Iterator next called on non-object"));
|
||||
}
|
||||
let iter = unsafe { &mut *this_val.as_js_object_ptr() };
|
||||
let target_si = vm.kernel_core().perm_interner().intern(ARRAY_ITER_TARGET_PROP).0;
|
||||
let index_si = vm.kernel_core().perm_interner().intern(ARRAY_ITER_INDEX_PROP).0;
|
||||
let kind_si = vm.kernel_core().perm_interner().intern(ARRAY_ITER_KIND_PROP).0;
|
||||
let target_si = vm.perm_intern(ARRAY_ITER_TARGET_PROP);
|
||||
let index_si = vm.perm_intern(ARRAY_ITER_INDEX_PROP);
|
||||
let kind_si = vm.perm_intern(ARRAY_ITER_KIND_PROP);
|
||||
// 内部槽守卫:无 own __target__ 槽的对象(如 Object.create 产物)不是数组
|
||||
// 迭代器,不得沿原型链读底层迭代器的槽;三槽同批写入,查一槽即全查。
|
||||
if vm.get_own_property_slot(&*iter, target_si).is_none() {
|
||||
|
||||
Reference in New Issue
Block a user