mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
refactor: 内置八文件续迁内核访问器调用至能力方法
This commit is contained in:
Generated
+19
-19
@@ -1160,7 +1160,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_builtins"
|
name = "oxide_builtins"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"fast-float",
|
"fast-float",
|
||||||
@@ -1185,7 +1185,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_bytecode"
|
name = "oxide_bytecode"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"oxide_log",
|
"oxide_log",
|
||||||
@@ -1193,7 +1193,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_cfg"
|
name = "oxide_cfg"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_emit",
|
"oxide_emit",
|
||||||
@@ -1204,7 +1204,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_cli"
|
name = "oxide_cli"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term",
|
"ansi_term",
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
@@ -1226,7 +1226,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_code_cache"
|
name = "oxide_code_cache"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lru",
|
"lru",
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
@@ -1235,7 +1235,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_compiler"
|
name = "oxide_compiler"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1255,7 +1255,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_dce"
|
name = "oxide_dce"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1269,7 +1269,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_emit"
|
name = "oxide_emit"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"oxc_allocator",
|
"oxc_allocator",
|
||||||
@@ -1284,7 +1284,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_engine"
|
name = "oxide_engine"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_compiler",
|
"oxide_compiler",
|
||||||
@@ -1296,7 +1296,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_ir"
|
name = "oxide_ir"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_log",
|
"oxide_log",
|
||||||
@@ -1305,7 +1305,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_kernel"
|
name = "oxide_kernel"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
@@ -1319,7 +1319,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_liveness"
|
name = "oxide_liveness"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1331,7 +1331,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_log"
|
name = "oxide_log"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-appender",
|
"tracing-appender",
|
||||||
@@ -1340,7 +1340,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_parser"
|
name = "oxide_parser"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxc_allocator",
|
"oxc_allocator",
|
||||||
"oxc_ast",
|
"oxc_ast",
|
||||||
@@ -1355,7 +1355,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_regalloc"
|
name = "oxide_regalloc"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1371,7 +1371,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_runtime_api"
|
name = "oxide_runtime_api"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
@@ -1384,7 +1384,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_test262"
|
name = "oxide_test262"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_compiler",
|
"oxide_compiler",
|
||||||
@@ -1402,7 +1402,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_types"
|
name = "oxide_types"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
@@ -1415,7 +1415,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_vm"
|
name = "oxide_vm"
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ members = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.8.74"
|
version = "0.8.75"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
rust-version = "1.80"
|
rust-version = "1.80"
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
|
|||||||
use oxide_types::object::{JsObject, MAX_DENSE_PROPS};
|
use oxide_types::object::{JsObject, MAX_DENSE_PROPS};
|
||||||
use oxide_types::value::JsValue;
|
use oxide_types::value::JsValue;
|
||||||
|
|
||||||
use oxide_runtime_api::{NativeResult, VmHost};
|
use oxide_runtime_api::{NativeResult, ProtoKind, VmHost};
|
||||||
|
|
||||||
use super::from::from_engine_error;
|
use super::from::from_engine_error;
|
||||||
|
|
||||||
@@ -262,7 +262,7 @@ pub(crate) fn require_callback<H: VmHost>(vm: &mut H, callback_val: JsValue) ->
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn create_new_array<H: VmHost>(vm: &mut H, n: usize) -> *mut JsObject {
|
pub(crate) fn create_new_array<H: VmHost>(vm: &mut H, n: usize) -> *mut JsObject {
|
||||||
let proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
|
let proto = vm.builtin_proto(ProtoKind::ArrayProto);
|
||||||
vm.alloc_object(JsObject::new_array(
|
vm.alloc_object(JsObject::new_array(
|
||||||
EMPTY_SHAPE_ID,
|
EMPTY_SHAPE_ID,
|
||||||
JsValue::from_js_object(proto),
|
JsValue::from_js_object(proto),
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use num_traits::ToPrimitive;
|
|||||||
|
|
||||||
use crate::array_buffer::{buffer_payload, ArrayBufferPayload};
|
use crate::array_buffer::{buffer_payload, ArrayBufferPayload};
|
||||||
|
|
||||||
use oxide_runtime_api::{NativeResult, VmHost};
|
use oxide_runtime_api::{NativeResult, ProtoKind, VmHost};
|
||||||
|
|
||||||
/// DataView 视图状态盒。`byte_length` 语义随 `length_is_auto` 分流:
|
/// DataView 视图状态盒。`byte_length` 语义随 `length_is_auto` 分流:
|
||||||
/// 定长视图存静态长;auto 视图(构造时 byteLength 缺省且构造期缓冲可 resize)
|
/// 定长视图存静态长;auto 视图(构造时 byteLength 缺省且构造期缓冲可 resize)
|
||||||
@@ -205,7 +205,7 @@ fn has_data_view_proto<H: VmHost>(vm: &mut H, this_val: JsValue) -> bool {
|
|||||||
if !this_val.is_object() {
|
if !this_val.is_object() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
let target = vm.session().builtin_world().data_view_proto.as_ptr() as *mut JsObject;
|
let target = vm.builtin_proto(ProtoKind::DataViewProto);
|
||||||
let mut cursor = this_val;
|
let mut cursor = this_val;
|
||||||
for _ in 0..1024 {
|
for _ in 0..1024 {
|
||||||
if !cursor.is_object() {
|
if !cursor.is_object() {
|
||||||
@@ -290,11 +290,11 @@ pub fn data_view_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult
|
|||||||
// GetPrototypeFromConstructor:普通读触发原型链上的访问器 getter,
|
// GetPrototypeFromConstructor:普通读触发原型链上的访问器 getter,
|
||||||
// 读期用户异常经原值槽恢复后重抛。NewTarget 非对象(直调/缺省面)时
|
// 读期用户异常经原值槽恢复后重抛。NewTarget 非对象(直调/缺省面)时
|
||||||
// 回落默认原型,不抛错。
|
// 回落默认原型,不抛错。
|
||||||
let default_proto = JsValue::from_js_object(vm.session().builtin_world().data_view_proto.as_ptr() as *mut JsObject);
|
let default_proto = JsValue::from_js_object(vm.builtin_proto(ProtoKind::DataViewProto));
|
||||||
let proto = if new_target.is_object() {
|
let proto = if new_target.is_object() {
|
||||||
let nt_ptr = new_target.as_js_object_ptr();
|
let nt_ptr = new_target.as_js_object_ptr();
|
||||||
let nt_obj = unsafe { &*nt_ptr };
|
let nt_obj = unsafe { &*nt_ptr };
|
||||||
let proto_si = vm.kernel_core().perm_interner().intern("prototype").0;
|
let proto_si = vm.perm_intern("prototype");
|
||||||
let proto_val = match vm.ordinary_get(nt_obj, proto_si, new_target) {
|
let proto_val = match vm.ordinary_get(nt_obj, proto_si, new_target) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(e) => return NativeResult::Err(crate::iterator::engine_error(vm, &e)),
|
Err(e) => return NativeResult::Err(crate::iterator::engine_error(vm, &e)),
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
|
|||||||
use oxide_types::object::JsObject;
|
use oxide_types::object::JsObject;
|
||||||
use oxide_types::value::JsValue;
|
use oxide_types::value::JsValue;
|
||||||
|
|
||||||
use oxide_runtime_api::{NativeResult, VmHost};
|
use oxide_runtime_api::{NativeResult, ProtoKind, VmHost};
|
||||||
|
|
||||||
fn get_timestamp(obj: &JsObject) -> f64 {
|
fn get_timestamp(obj: &JsObject) -> f64 {
|
||||||
let v = obj.get_prop_at(0);
|
let v = obj.get_prop_at(0);
|
||||||
@@ -345,7 +345,7 @@ pub fn date_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
if ptr.is_null() {
|
if ptr.is_null() {
|
||||||
false
|
false
|
||||||
} else {
|
} else {
|
||||||
let date_proto = vm.session().builtin_world().date_proto.as_ptr() as *mut JsObject;
|
let date_proto = vm.builtin_proto(ProtoKind::DateProto);
|
||||||
if date_proto.is_null() {
|
if date_proto.is_null() {
|
||||||
false
|
false
|
||||||
} else {
|
} else {
|
||||||
@@ -435,10 +435,7 @@ pub fn date_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut obj = JsObject::new_empty(
|
let mut obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(vm.builtin_proto(ProtoKind::DateProto)));
|
||||||
EMPTY_SHAPE_ID,
|
|
||||||
JsValue::from_js_object(vm.session().builtin_world().date_proto.as_ptr() as *mut JsObject),
|
|
||||||
);
|
|
||||||
obj.type_tag = JsObject::OBJ_TYPE_DATE;
|
obj.type_tag = JsObject::OBJ_TYPE_DATE;
|
||||||
obj.set_prop_at(0, JsValue::float(timestamp));
|
obj.set_prop_at(0, JsValue::float(timestamp));
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ use oxide_types::object::JsObject;
|
|||||||
use oxide_types::private_key::encode_symbol_key;
|
use oxide_types::private_key::encode_symbol_key;
|
||||||
use oxide_types::value::JsValue;
|
use oxide_types::value::JsValue;
|
||||||
|
|
||||||
use oxide_runtime_api::{NativeResult, VmHost};
|
use oxide_runtime_api::{NativeResult, ProtoKind, VmHost};
|
||||||
|
|
||||||
/// 分配空状态盒并存入新资源栈对象(proto 与 type_tag 按栈类型传入)。
|
/// 分配空状态盒并存入新资源栈对象(proto 与 type_tag 按栈类型传入)。
|
||||||
fn alloc_disposable_stack<H: VmHost>(vm: &mut H, proto_val: JsValue, type_tag: u8) -> *mut JsObject {
|
fn alloc_disposable_stack<H: VmHost>(vm: &mut H, proto_val: JsValue, type_tag: u8) -> *mut JsObject {
|
||||||
@@ -122,7 +122,7 @@ fn stack_constructor_impl<H: VmHost>(vm: &mut H, args: &[u8], proto_val: JsValue
|
|||||||
let nt_ptr = new_target.as_js_object_ptr();
|
let nt_ptr = new_target.as_js_object_ptr();
|
||||||
// SAFETY: is_object 保证指针非空且对象本 session 存活。
|
// SAFETY: is_object 保证指针非空且对象本 session 存活。
|
||||||
let nt_obj = unsafe { &*nt_ptr };
|
let nt_obj = unsafe { &*nt_ptr };
|
||||||
let proto_si = vm.kernel_core().perm_interner().intern("prototype").0;
|
let proto_si = vm.perm_intern("prototype");
|
||||||
let proto = match vm.ordinary_get(nt_obj, proto_si, new_target) {
|
let proto = match vm.ordinary_get(nt_obj, proto_si, new_target) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(err) => return NativeResult::Err(crate::iterator::engine_error(vm, &err)),
|
Err(err) => return NativeResult::Err(crate::iterator::engine_error(vm, &err)),
|
||||||
@@ -141,15 +141,13 @@ fn stack_constructor_impl<H: VmHost>(vm: &mut H, args: &[u8], proto_val: JsValue
|
|||||||
|
|
||||||
/// `DisposableStack` 构造函数:创建带空状态盒的 DisposableStack 对象。
|
/// `DisposableStack` 构造函数:创建带空状态盒的 DisposableStack 对象。
|
||||||
pub fn disposable_stack_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
pub fn disposable_stack_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||||
let proto_val =
|
let proto_val = JsValue::from_js_object(vm.builtin_proto(ProtoKind::DisposableStackProto));
|
||||||
JsValue::from_js_object(vm.session().builtin_world().disposable_stack_proto.as_ptr() as *mut JsObject);
|
|
||||||
stack_constructor_impl(vm, args, proto_val, JsObject::OBJ_TYPE_DISPOSABLE_STACK)
|
stack_constructor_impl(vm, args, proto_val, JsObject::OBJ_TYPE_DISPOSABLE_STACK)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `AsyncDisposableStack` 构造函数:创建带空状态盒的 AsyncDisposableStack 对象。
|
/// `AsyncDisposableStack` 构造函数:创建带空状态盒的 AsyncDisposableStack 对象。
|
||||||
pub fn async_disposable_stack_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
pub fn async_disposable_stack_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||||
let proto_val =
|
let proto_val = JsValue::from_js_object(vm.builtin_proto(ProtoKind::AsyncDisposableStackProto));
|
||||||
JsValue::from_js_object(vm.session().builtin_world().async_disposable_stack_proto.as_ptr() as *mut JsObject);
|
|
||||||
stack_constructor_impl(vm, args, proto_val, JsObject::OBJ_TYPE_ASYNC_DISPOSABLE_STACK)
|
stack_constructor_impl(vm, args, proto_val, JsObject::OBJ_TYPE_ASYNC_DISPOSABLE_STACK)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,8 +462,7 @@ fn stack_move_impl<H: VmHost>(vm: &mut H, this_val: JsValue, proto_val: JsValue,
|
|||||||
/// `DisposableStack.prototype.move()`:把全部 entries 转移到新 DisposableStack。
|
/// `DisposableStack.prototype.move()`:把全部 entries 转移到新 DisposableStack。
|
||||||
pub fn disposable_stack_move<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
pub fn disposable_stack_move<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||||
let this_val = vm.reg(if args.is_empty() { 0 } else { args[0] });
|
let this_val = vm.reg(if args.is_empty() { 0 } else { args[0] });
|
||||||
let proto_val =
|
let proto_val = JsValue::from_js_object(vm.builtin_proto(ProtoKind::DisposableStackProto));
|
||||||
JsValue::from_js_object(vm.session().builtin_world().disposable_stack_proto.as_ptr() as *mut JsObject);
|
|
||||||
stack_move_impl(vm, this_val, proto_val, JsObject::OBJ_TYPE_DISPOSABLE_STACK)
|
stack_move_impl(vm, this_val, proto_val, JsObject::OBJ_TYPE_DISPOSABLE_STACK)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -473,8 +470,7 @@ pub fn disposable_stack_move<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult
|
|||||||
/// AsyncDisposableStack(proto 固定为 AsyncDisposableStack.prototype,非子类)。
|
/// AsyncDisposableStack(proto 固定为 AsyncDisposableStack.prototype,非子类)。
|
||||||
pub fn async_disposable_stack_move<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
pub fn async_disposable_stack_move<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
||||||
let this_val = vm.reg(if args.is_empty() { 0 } else { args[0] });
|
let this_val = vm.reg(if args.is_empty() { 0 } else { args[0] });
|
||||||
let proto_val =
|
let proto_val = JsValue::from_js_object(vm.builtin_proto(ProtoKind::AsyncDisposableStackProto));
|
||||||
JsValue::from_js_object(vm.session().builtin_world().async_disposable_stack_proto.as_ptr() as *mut JsObject);
|
|
||||||
stack_move_impl(vm, this_val, proto_val, JsObject::OBJ_TYPE_ASYNC_DISPOSABLE_STACK)
|
stack_move_impl(vm, this_val, proto_val, JsObject::OBJ_TYPE_ASYNC_DISPOSABLE_STACK)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use oxide_types::value::JsValue;
|
use oxide_types::value::JsValue;
|
||||||
|
|
||||||
use oxide_runtime_api::{NativeResult, VmHost};
|
use oxide_runtime_api::{NativeResult, ProtoKind, VmHost};
|
||||||
|
|
||||||
/// 整值且 i32 域内的有限数转 int 表示;-0 排除
|
/// 整值且 i32 域内的有限数转 int 表示;-0 排除
|
||||||
/// (int 表示丢符号,规范要求 `Number(-0)` 得 -0)。
|
/// (int 表示丢符号,规范要求 `Number(-0)` 得 -0)。
|
||||||
@@ -46,7 +46,7 @@ pub fn number_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
} else {
|
} else {
|
||||||
0.0
|
0.0
|
||||||
};
|
};
|
||||||
let number_proto = vm.session().builtin_world().number_proto.as_ptr() as *mut oxide_types::object::JsObject;
|
let number_proto = vm.builtin_proto(ProtoKind::NumberProto);
|
||||||
let is_ctor = if let Some(this_reg) = args.first().copied() {
|
let is_ctor = if let Some(this_reg) = args.first().copied() {
|
||||||
let this_val = vm.reg(this_reg);
|
let this_val = vm.reg(this_reg);
|
||||||
if this_val.is_object() {
|
if this_val.is_object() {
|
||||||
@@ -345,7 +345,7 @@ fn this_number_value<H: VmHost>(vm: &mut H, this_val: JsValue) -> Result<f64, Js
|
|||||||
if !ptr.is_null() {
|
if !ptr.is_null() {
|
||||||
// Number.prototype 本身即 [[NumberData]] = +0 的 Number 对象;
|
// Number.prototype 本身即 [[NumberData]] = +0 的 Number 对象;
|
||||||
// 与 number_value_of 的 proto 特判同形。
|
// 与 number_value_of 的 proto 特判同形。
|
||||||
let number_proto = vm.session().builtin_world().number_proto.as_ptr() as *mut oxide_types::object::JsObject;
|
let number_proto = vm.builtin_proto(ProtoKind::NumberProto);
|
||||||
if std::ptr::eq(ptr, number_proto) {
|
if std::ptr::eq(ptr, number_proto) {
|
||||||
return Ok(0.0);
|
return Ok(0.0);
|
||||||
}
|
}
|
||||||
@@ -942,7 +942,7 @@ pub fn number_value_of<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
let ptr = this_val.as_js_object_ptr();
|
let ptr = this_val.as_js_object_ptr();
|
||||||
if !ptr.is_null() {
|
if !ptr.is_null() {
|
||||||
// Number.prototype 本身是 Number 对象,其 [[NumberData]] 为 +0。
|
// Number.prototype 本身是 Number 对象,其 [[NumberData]] 为 +0。
|
||||||
let number_proto = vm.session().builtin_world().number_proto.as_ptr() as *mut oxide_types::object::JsObject;
|
let number_proto = vm.builtin_proto(ProtoKind::NumberProto);
|
||||||
if ptr == number_proto {
|
if ptr == number_proto {
|
||||||
return NativeResult::Ok(JsValue::int(0));
|
return NativeResult::Ok(JsValue::int(0));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use oxide_types::value::JsValue;
|
|||||||
use crate::array::{arraylike_get, from_engine_error, is_constructor_value};
|
use crate::array::{arraylike_get, from_engine_error, is_constructor_value};
|
||||||
use crate::object::{delete_own_property, key_si_to_js_value, own_symbol_key_values, walk_own_keys};
|
use crate::object::{delete_own_property, key_si_to_js_value, own_symbol_key_values, walk_own_keys};
|
||||||
|
|
||||||
use oxide_runtime_api::{to_length, NativeResult, VmHost};
|
use oxide_runtime_api::{to_length, NativeResult, ProtoKind, VmHost};
|
||||||
|
|
||||||
/// 原型链深度上限(与引擎原型链深度上限同值)。
|
/// 原型链深度上限(与引擎原型链深度上限同值)。
|
||||||
const MAX_PROTO_CHAIN_DEPTH: usize = 1024;
|
const MAX_PROTO_CHAIN_DEPTH: usize = 1024;
|
||||||
@@ -32,7 +32,7 @@ pub fn reflect_apply<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
let arg_list_obj = unsafe { &*arg_list_ptr };
|
let arg_list_obj = unsafe { &*arg_list_ptr };
|
||||||
|
|
||||||
// CreateListFromArrayLike:规范读 length(访问器异常原值传播),ToLength 纯函数不抛。
|
// CreateListFromArrayLike:规范读 length(访问器异常原值传播),ToLength 纯函数不抛。
|
||||||
let length_si = vm.kernel_core().perm_interner().intern("length").0;
|
let length_si = vm.perm_intern("length");
|
||||||
let len_val = match vm.ordinary_get(arg_list_obj, length_si, arg_list) {
|
let len_val = match vm.ordinary_get(arg_list_obj, length_si, arg_list) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(msg) => return NativeResult::Err(from_engine_error(vm, &msg)),
|
Err(msg) => return NativeResult::Err(from_engine_error(vm, &msg)),
|
||||||
@@ -82,7 +82,7 @@ pub fn reflect_construct<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
let arg_list_obj = unsafe { &*arg_list_ptr };
|
let arg_list_obj = unsafe { &*arg_list_ptr };
|
||||||
|
|
||||||
// CreateListFromArrayLike:规范读 length(访问器异常原值传播),ToLength 纯函数不抛。
|
// CreateListFromArrayLike:规范读 length(访问器异常原值传播),ToLength 纯函数不抛。
|
||||||
let length_si = vm.kernel_core().perm_interner().intern("length").0;
|
let length_si = vm.perm_intern("length");
|
||||||
let len_val = match vm.ordinary_get(arg_list_obj, length_si, arg_list) {
|
let len_val = match vm.ordinary_get(arg_list_obj, length_si, arg_list) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(msg) => return NativeResult::Err(from_engine_error(vm, &msg)),
|
Err(msg) => return NativeResult::Err(from_engine_error(vm, &msg)),
|
||||||
@@ -248,14 +248,14 @@ pub fn reflect_own_keys<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
// (创建序第一枚字符串键),存储下标哨兵 u32::MAX = 无槽位(消费端只读
|
// (创建序第一枚字符串键),存储下标哨兵 u32::MAX = 无槽位(消费端只读
|
||||||
// si,不读存储下标)。
|
// si,不读存储下标)。
|
||||||
if target.is_array() {
|
if target.is_array() {
|
||||||
let length_si = vm.kernel_core().perm_interner().intern("length").0;
|
let length_si = vm.perm_intern("length");
|
||||||
let insert_at = keys.iter().position(|(si, _)| !is_int_key(*si)).unwrap_or(keys.len());
|
let insert_at = keys.iter().position(|(si, _)| !is_int_key(*si)).unwrap_or(keys.len());
|
||||||
keys.insert(insert_at, (length_si, u32::MAX));
|
keys.insert(insert_at, (length_si, u32::MAX));
|
||||||
}
|
}
|
||||||
let symbols = own_symbol_key_values(vm, target);
|
let symbols = own_symbol_key_values(vm, target);
|
||||||
let n = keys.len() + symbols.len();
|
let n = keys.len() + symbols.len();
|
||||||
|
|
||||||
let array_proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
|
let array_proto = vm.builtin_proto(ProtoKind::ArrayProto);
|
||||||
let arr = vm.alloc_object(JsObject::new_array(EMPTY_SHAPE_ID, JsValue::from_js_object(array_proto), n));
|
let arr = vm.alloc_object(JsObject::new_array(EMPTY_SHAPE_ID, JsValue::from_js_object(array_proto), n));
|
||||||
for (i, (si, _)) in keys.iter().enumerate() {
|
for (i, (si, _)) in keys.iter().enumerate() {
|
||||||
let key_val = key_si_to_js_value(vm, *si);
|
let key_val = key_si_to_js_value(vm, *si);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
use oxide_types::object::JsObject;
|
|
||||||
use oxide_types::value::JsValue;
|
use oxide_types::value::JsValue;
|
||||||
|
|
||||||
use oxide_runtime_api::{NativeResult, VmHost};
|
use oxide_runtime_api::{NativeResult, ProtoKind, VmHost};
|
||||||
|
|
||||||
/// JS `Symbol()` 构造逻辑:以可选 description 创建一个新的唯一 Symbol。
|
/// JS `Symbol()` 构造逻辑:以可选 description 创建一个新的唯一 Symbol。
|
||||||
/// 当以 new 语义调用(this 原型链指向 Symbol.prototype)时抛 TypeError,与规范一致。
|
/// 当以 new 语义调用(this 原型链指向 Symbol.prototype)时抛 TypeError,与规范一致。
|
||||||
@@ -15,7 +14,7 @@ pub fn symbol_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
if proto.is_object() {
|
if proto.is_object() {
|
||||||
let proto_ptr = proto.as_js_object_ptr();
|
let proto_ptr = proto.as_js_object_ptr();
|
||||||
if !proto_ptr.is_null() {
|
if !proto_ptr.is_null() {
|
||||||
let sp = vm.session().builtin_world().symbol_proto.as_ptr() as *mut JsObject;
|
let sp = vm.builtin_proto(ProtoKind::SymbolProto);
|
||||||
if std::ptr::eq(proto_ptr, sp) {
|
if std::ptr::eq(proto_ptr, sp) {
|
||||||
return NativeResult::Err(crate::error::create_type_error(vm, "Symbol is not a constructor"));
|
return NativeResult::Err(crate::error::create_type_error(vm, "Symbol is not a constructor"));
|
||||||
}
|
}
|
||||||
@@ -64,8 +63,7 @@ fn this_symbol_value<H: VmHost>(vm: &mut H, this_val: JsValue) -> Result<JsValue
|
|||||||
let obj = unsafe { &*ptr };
|
let obj = unsafe { &*ptr };
|
||||||
if obj.proto().is_object() {
|
if obj.proto().is_object() {
|
||||||
let proto_ptr = obj.proto().as_js_object_ptr();
|
let proto_ptr = obj.proto().as_js_object_ptr();
|
||||||
let symbol_proto =
|
let symbol_proto = vm.builtin_proto(ProtoKind::SymbolProto);
|
||||||
vm.session().builtin_world().symbol_proto.as_ptr() as *mut oxide_types::object::JsObject;
|
|
||||||
if !proto_ptr.is_null() && std::ptr::eq(proto_ptr, symbol_proto) {
|
if !proto_ptr.is_null() && std::ptr::eq(proto_ptr, symbol_proto) {
|
||||||
let v = obj.boxed_value();
|
let v = obj.boxed_value();
|
||||||
if v.is_symbol() {
|
if v.is_symbol() {
|
||||||
|
|||||||
@@ -237,11 +237,11 @@ pub fn weak_map_insert(obj: &mut JsObject, key: JsValue, value: JsValue) {
|
|||||||
/// `prototype` 槽现值读取(弱族不占 BuiltinWorld 槽,重绑原位更新全局槽,
|
/// `prototype` 槽现值读取(弱族不占 BuiltinWorld 槽,重绑原位更新全局槽,
|
||||||
/// 经全局路径读恒为当前值)。
|
/// 经全局路径读恒为当前值)。
|
||||||
fn weak_map_proto_ptr<H: VmHost>(vm: &mut H) -> Result<*const JsObject, JsValue> {
|
fn weak_map_proto_ptr<H: VmHost>(vm: &mut H) -> Result<*const JsObject, JsValue> {
|
||||||
let global_ptr = vm.session().global_object().as_ptr();
|
let global_ptr = vm.global_object().as_ptr();
|
||||||
// SAFETY: 全局对象为 session 级根,本调用内有效。
|
// SAFETY: 全局对象为 session 级根,本调用内有效。
|
||||||
let global = unsafe { &*global_ptr };
|
let global = unsafe { &*global_ptr };
|
||||||
let global_val = JsValue::from_js_object(global_ptr as *mut JsObject);
|
let global_val = JsValue::from_js_object(global_ptr as *mut JsObject);
|
||||||
let si_weakmap = vm.kernel_core().perm_interner().intern("WeakMap").0;
|
let si_weakmap = vm.perm_intern("WeakMap");
|
||||||
let ctor_val = vm
|
let ctor_val = vm
|
||||||
.ordinary_get(global, si_weakmap, global_val)
|
.ordinary_get(global, si_weakmap, global_val)
|
||||||
.map_err(|e| crate::iterator::engine_error(vm, &e))?;
|
.map_err(|e| crate::iterator::engine_error(vm, &e))?;
|
||||||
@@ -249,7 +249,7 @@ fn weak_map_proto_ptr<H: VmHost>(vm: &mut H) -> Result<*const JsObject, JsValue>
|
|||||||
if ctor_ptr.is_null() {
|
if ctor_ptr.is_null() {
|
||||||
return Err(crate::error::create_type_error(vm, "WeakMap constructor unavailable"));
|
return Err(crate::error::create_type_error(vm, "WeakMap constructor unavailable"));
|
||||||
}
|
}
|
||||||
let si_prototype = vm.kernel_core().perm_interner().intern("prototype").0;
|
let si_prototype = vm.perm_intern("prototype");
|
||||||
let proto_val = vm
|
let proto_val = vm
|
||||||
.ordinary_get(unsafe { &*ctor_ptr }, si_prototype, ctor_val)
|
.ordinary_get(unsafe { &*ctor_ptr }, si_prototype, ctor_val)
|
||||||
.map_err(|e| crate::iterator::engine_error(vm, &e))?;
|
.map_err(|e| crate::iterator::engine_error(vm, &e))?;
|
||||||
@@ -327,7 +327,7 @@ pub fn weak_map_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult
|
|||||||
let iterable = vm.reg(args[1]);
|
let iterable = vm.reg(args[1]);
|
||||||
if !iterable.is_undefined() && !iterable.is_null() {
|
if !iterable.is_undefined() && !iterable.is_null() {
|
||||||
let map_ref = unsafe { &*map_obj };
|
let map_ref = unsafe { &*map_obj };
|
||||||
let set_si = vm.kernel_core().perm_interner().intern("set").0;
|
let set_si = vm.perm_intern("set");
|
||||||
let adder = match vm.ordinary_get(map_ref, set_si, map_val) {
|
let adder = match vm.ordinary_get(map_ref, set_si, map_val) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(err) => return NativeResult::Err(crate::iterator::engine_error(vm, &err)),
|
Err(err) => return NativeResult::Err(crate::iterator::engine_error(vm, &err)),
|
||||||
|
|||||||
Reference in New Issue
Block a user