mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
refactor: 删 VmHost 旧内核访问器与 runtime_api 对 kernel 依赖
This commit is contained in:
Generated
+19
-20
@@ -1160,7 +1160,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_builtins"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"fast-float",
|
||||
@@ -1185,7 +1185,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_bytecode"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"oxide_log",
|
||||
@@ -1193,7 +1193,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_cfg"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_emit",
|
||||
@@ -1204,7 +1204,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_cli"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"ansi_term",
|
||||
"bumpalo",
|
||||
@@ -1226,7 +1226,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_code_cache"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"lru",
|
||||
"oxide_bytecode",
|
||||
@@ -1235,7 +1235,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_compiler"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_cfg",
|
||||
@@ -1255,7 +1255,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_dce"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_cfg",
|
||||
@@ -1269,7 +1269,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_emit"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"oxc_allocator",
|
||||
@@ -1284,7 +1284,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_engine"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_compiler",
|
||||
@@ -1296,7 +1296,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_ir"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_log",
|
||||
@@ -1305,7 +1305,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_kernel"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"dashmap",
|
||||
@@ -1319,7 +1319,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_liveness"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_cfg",
|
||||
@@ -1331,7 +1331,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_log"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"tracing",
|
||||
"tracing-appender",
|
||||
@@ -1340,7 +1340,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_parser"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"oxc_allocator",
|
||||
"oxc_ast",
|
||||
@@ -1355,7 +1355,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_regalloc"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_cfg",
|
||||
@@ -1371,12 +1371,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_runtime_api"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-traits",
|
||||
"oxide_bytecode",
|
||||
"oxide_kernel",
|
||||
"oxide_log",
|
||||
"oxide_types",
|
||||
"ryu",
|
||||
@@ -1384,7 +1383,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_test262"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"oxide_bytecode",
|
||||
"oxide_compiler",
|
||||
@@ -1402,7 +1401,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_types"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"dashmap",
|
||||
@@ -1415,7 +1414,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "oxide_vm"
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"chrono",
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ members = [
|
||||
]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.8.77"
|
||||
version = "0.8.78"
|
||||
edition = "2021"
|
||||
license = "MIT"
|
||||
rust-version = "1.80"
|
||||
|
||||
@@ -11,6 +11,5 @@ oxide_bytecode = { path = "../oxide_bytecode" }
|
||||
oxide_types = { path = "../oxide_types" }
|
||||
num-bigint = "0.4"
|
||||
num-traits = "0.2"
|
||||
oxide_kernel = { path = "../oxide_kernel" }
|
||||
oxide_log = { path = "../oxide_log" }
|
||||
ryu.workspace = true
|
||||
|
||||
@@ -7,13 +7,12 @@
|
||||
use std::cmp::Ordering;
|
||||
|
||||
use num_traits::{ToPrimitive, Zero};
|
||||
use oxide_types::mem::P;
|
||||
use oxide_types::object::{JsObject, PropAttributes};
|
||||
use oxide_types::private_key::make_int_key;
|
||||
use oxide_types::shape::EMPTY_SHAPE_ID;
|
||||
use oxide_types::value::{JsType, JsValue};
|
||||
|
||||
use crate::host::VmHost;
|
||||
use crate::host::{ProtoKind, VmHost};
|
||||
|
||||
/// 拼接 JS 错误消息,格式为 `"{name}: {msg}"`;任一段为空时只取非空段。
|
||||
pub fn format_error_message(name: &str, msg: &str) -> String {
|
||||
@@ -774,17 +773,14 @@ pub fn materialize_string_box<H: VmHost>(host: &mut H, obj: &mut JsObject, str_v
|
||||
let len = units.len();
|
||||
obj.set_boxed_value(str_val);
|
||||
for (i, &unit) in units.iter().enumerate() {
|
||||
let shape_id = host
|
||||
.kernel_core()
|
||||
.shape_forge()
|
||||
.make_shape(obj.shape_id(), make_int_key(i as u32));
|
||||
let shape_id = host.make_shape(obj.shape_id(), make_int_key(i as u32));
|
||||
obj.set_shape_id(shape_id);
|
||||
let ch = host.single_unit(unit).unwrap_or_else(|| host.new_string_units(&[unit]));
|
||||
obj.push_prop(ch);
|
||||
obj.set_data_meta(i as u32, PropAttributes::new(false, true, false));
|
||||
}
|
||||
let length_si = host.kernel_core().perm_interner().intern("length").0;
|
||||
let shape_id = host.kernel_core().shape_forge().make_shape(obj.shape_id(), length_si);
|
||||
let length_si = host.perm_intern("length");
|
||||
let shape_id = host.make_shape(obj.shape_id(), length_si);
|
||||
obj.set_shape_id(shape_id);
|
||||
obj.push_prop(JsValue::int(len as i32));
|
||||
obj.set_data_meta(len as u32, PropAttributes::new(false, false, false));
|
||||
@@ -803,22 +799,18 @@ pub fn to_object<H: VmHost>(val: JsValue, host: &mut H) -> Result<JsValue, Strin
|
||||
if val.is_null() || val.is_undefined() {
|
||||
return Err(host.error_message_text("TypeError", "Cannot convert null or undefined to object"));
|
||||
}
|
||||
let (proto_ptr, type_tag) = {
|
||||
let session = host.session();
|
||||
let world = session.builtin_world();
|
||||
if val.is_string() {
|
||||
(P::as_ptr(&world.string_proto) as *mut JsObject, JsObject::OBJ_TYPE_STRING_OBJ)
|
||||
} else if val.is_int() || val.is_double() {
|
||||
(P::as_ptr(&world.number_proto) as *mut JsObject, JsObject::OBJ_TYPE_NUMBER_OBJ)
|
||||
} else if val.is_bool() {
|
||||
(P::as_ptr(&world.boolean_proto) as *mut JsObject, JsObject::OBJ_TYPE_BOOLEAN_OBJ)
|
||||
} else if val.is_bigint() {
|
||||
(P::as_ptr(&world.bigint_proto) as *mut JsObject, JsObject::OBJ_TYPE_PLAIN)
|
||||
} else if val.is_symbol() {
|
||||
(P::as_ptr(&world.symbol_proto) as *mut JsObject, JsObject::OBJ_TYPE_SYMBOL_OBJ)
|
||||
} else {
|
||||
(P::as_ptr(&world.object_proto) as *mut JsObject, JsObject::OBJ_TYPE_PLAIN)
|
||||
}
|
||||
let (proto_ptr, type_tag) = if val.is_string() {
|
||||
(host.builtin_proto(ProtoKind::StringProto), JsObject::OBJ_TYPE_STRING_OBJ)
|
||||
} else if val.is_int() || val.is_double() {
|
||||
(host.builtin_proto(ProtoKind::NumberProto), JsObject::OBJ_TYPE_NUMBER_OBJ)
|
||||
} else if val.is_bool() {
|
||||
(host.builtin_proto(ProtoKind::BooleanProto), JsObject::OBJ_TYPE_BOOLEAN_OBJ)
|
||||
} else if val.is_bigint() {
|
||||
(host.builtin_proto(ProtoKind::BigIntProto), JsObject::OBJ_TYPE_PLAIN)
|
||||
} else if val.is_symbol() {
|
||||
(host.builtin_proto(ProtoKind::SymbolProto), JsObject::OBJ_TYPE_SYMBOL_OBJ)
|
||||
} else {
|
||||
(host.builtin_proto(ProtoKind::ObjectProto), JsObject::OBJ_TYPE_PLAIN)
|
||||
};
|
||||
let proto_val = JsValue::from_js_object(proto_ptr);
|
||||
let obj = host.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, proto_val));
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
//! `VmHost` trait:builtins 依赖的 `Vm` 能力集合,trait 面向泛型而非对象安全。
|
||||
|
||||
use std::ffi::c_void;
|
||||
use std::sync::Arc;
|
||||
|
||||
use oxide_kernel::kernel::{KernelCore, KernelSession};
|
||||
use oxide_types::mem::P;
|
||||
use oxide_types::object::{Cell, JsObject, PropAttributes};
|
||||
use oxide_types::value::JsValue;
|
||||
@@ -204,14 +202,6 @@ pub trait VmHost {
|
||||
/// 读取 BigInt 值;调用方须保证 `val.is_bigint()`。
|
||||
fn bigint_value(&mut self, val: JsValue) -> &num_bigint::BigInt;
|
||||
|
||||
// 内核访问器
|
||||
fn kernel_core(&self) -> &Arc<KernelCore>;
|
||||
/// 只读访问当前 session(builtin world 与 global object)。
|
||||
///
|
||||
/// 返回 `Ref` 守卫(session 入 `RefCell` 后无法再给稳定 `&`):调用方
|
||||
/// 在单表达式内消费,不跨 `borrow_mut` 长存。
|
||||
fn session(&self) -> std::cell::Ref<'_, KernelSession>;
|
||||
|
||||
// 内核能力面(perm interner / shape forge / builtin world / global object)
|
||||
/// intern 字符串键,返回其 si(perm interner,零分配共享键空间)。
|
||||
fn perm_intern(&self, s: &str) -> u32;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
//! 实现 `VmHost`。这打破了 builtins crate 与 `oxide_vm` 之间本会形成的
|
||||
//! 循环依赖:
|
||||
//!
|
||||
//! `oxide_types ← oxide_kernel ← oxide_runtime_api ← oxide_builtins ← oxide_vm`
|
||||
//! `oxide_types ← oxide_runtime_api ← oxide_builtins ← oxide_vm`
|
||||
//!
|
||||
//! trait 面向泛型而非对象安全:单态化 `H = Vm` 使每个 `host.*()` 调用内联,
|
||||
//! 相对 builtins 直接位于 `oxide_vm` 内部没有运行时开销。
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
use std::ffi::c_void;
|
||||
use std::sync::Arc;
|
||||
|
||||
use oxide_kernel::kernel::{KernelCore, KernelSession};
|
||||
use oxide_runtime_api::{ProtoKind, ShapeNode};
|
||||
use oxide_types::mem::P;
|
||||
use oxide_types::object::{Cell, JsObject, PropAttributes};
|
||||
@@ -45,12 +44,6 @@ impl oxide_runtime_api::VmHost for Vm {
|
||||
fn bigint_value(&mut self, val: JsValue) -> &num_bigint::BigInt {
|
||||
Vm::bigint_value(self, val)
|
||||
}
|
||||
fn kernel_core(&self) -> &Arc<KernelCore> {
|
||||
self.kernel_core()
|
||||
}
|
||||
fn session(&self) -> std::cell::Ref<'_, KernelSession> {
|
||||
self.session()
|
||||
}
|
||||
fn perm_intern(&self, s: &str) -> u32 {
|
||||
self.kernel_core.perm_interner().intern(s).0
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user