From 085900442e644d316131394eb72abd626e6694d9 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Wed, 16 Sep 2026 04:52:36 +0000 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=86=85=E7=BD=AE=20id=20=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E4=B8=8E=E8=84=8F=E9=9B=86=E6=8B=86=E5=87=BA=E7=8B=AC?= =?UTF-8?q?=E7=AB=8B=20builtin=5Fid=20=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_kernel/src/kernel/builtin_id.rs | 323 +++++++++++++++++++ crates/oxide_kernel/src/kernel/mod.rs | 318 +----------------- 2 files changed, 325 insertions(+), 316 deletions(-) create mode 100644 crates/oxide_kernel/src/kernel/builtin_id.rs diff --git a/crates/oxide_kernel/src/kernel/builtin_id.rs b/crates/oxide_kernel/src/kernel/builtin_id.rs new file mode 100644 index 00000000..ba8c8078 --- /dev/null +++ b/crates/oxide_kernel/src/kernel/builtin_id.rs @@ -0,0 +1,323 @@ +//! 内置对象 id 枚举(`BuiltinId` 94 变体 + `ALL` 顺序钉表)、世代快照 +//! (`BuiltinSnapshot`)与按家族划分的脏标记位集(`BuiltinDirtySet`); +//! `NUM_BUILTINS` 文档承载"新增 BuiltinWorld 字段须同步"四处约束注记。 + +use oxide_types::mem::P; +use oxide_types::object::JsObject; + +use crate::builtin::BuiltinWorld; +/// 供 reset 脏检查用的世代快照。 +/// +/// 维护注意:每个新增的 `BuiltinWorld` 对象字段都必须加到这里以及 +/// `KernelSession::dirty_since_snapshot()`,以便选择性重置重建正确的 +/// builtin 家族。 +pub const NUM_BUILTINS: usize = 94; + +/// 内置对象枚举 id,与 `BuiltinWorld` 中的存储槽一一对应。 +/// +/// 覆盖各构造器/原型、Error 家族(含 SuppressedError 原型)、集合类型、 +/// TypedArray 家族与 well-known symbols;`repr(u8)` 使其可直接作为数组下标 +/// (`u8` 值即下标)。 +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[repr(u8)] +pub enum BuiltinId { + ObjectProto = 0, + ArrayProto = 1, + FunctionProto = 2, + StringProto = 3, + NumberProto = 4, + BooleanProto = 5, + ErrorProto = 6, + SymbolProto = 7, + ObjectConstructor = 8, + ArrayConstructor = 9, + FunctionConstructor = 10, + StringConstructor = 11, + NumberConstructor = 12, + BooleanConstructor = 13, + ErrorConstructor = 14, + SymbolConstructor = 15, + TypeErrorProto = 16, + ReferenceErrorProto = 17, + RangeErrorProto = 18, + SyntaxErrorProto = 19, + UriErrorProto = 20, + EvalErrorProto = 21, + MathObject = 22, + JsonObject = 23, + DateConstructor = 24, + DateProto = 25, + SetConstructor = 26, + SetProto = 27, + MapConstructor = 28, + MapProto = 29, + RegExpConstructor = 30, + RegExpProto = 31, + ArrayBufferConstructor = 32, + ArrayBufferProto = 33, + DataViewConstructor = 34, + DataViewProto = 35, + TypedArrayProto = 36, + Int8ArrayConstructor = 37, + Int8ArrayProto = 38, + Uint8ArrayConstructor = 39, + Uint8ArrayProto = 40, + Uint8ClampedArrayConstructor = 41, + Uint8ClampedArrayProto = 42, + Int16ArrayConstructor = 43, + Int16ArrayProto = 44, + Uint16ArrayConstructor = 45, + Uint16ArrayProto = 46, + Int32ArrayConstructor = 47, + Int32ArrayProto = 48, + Uint32ArrayConstructor = 49, + Uint32ArrayProto = 50, + Float32ArrayConstructor = 51, + Float32ArrayProto = 52, + Float64ArrayConstructor = 53, + Float64ArrayProto = 54, + BigInt64ArrayConstructor = 55, + BigInt64ArrayProto = 56, + BigUint64ArrayConstructor = 57, + BigUint64ArrayProto = 58, + SymMatch = 59, + SymReplace = 60, + SymSearch = 61, + SymSplit = 62, + SymIterator = 63, + SymToPrimitive = 64, + SymHasInstance = 65, + SymMatchAll = 66, + SymAsyncIterator = 67, + TemporalObject = 68, + TemporalNowObject = 69, + InstantConstructor = 70, + InstantProto = 71, + PlainDateConstructor = 72, + PlainDateProto = 73, + PlainTimeConstructor = 74, + PlainTimeProto = 75, + BigIntConstructor = 76, + BigIntProto = 77, + DurationConstructor = 78, + DurationProto = 79, + SymToStringTag = 80, + SymSpecies = 85, + ZonedDateTimeConstructor = 81, + ZonedDateTimeProto = 82, + PlainDateTimeConstructor = 83, + PlainDateTimeProto = 84, + SymAsyncDispose = 86, + SymDispose = 87, + SuppressedErrorProto = 88, + Console = 89, + PlainMonthDayConstructor = 90, + PlainMonthDayProto = 91, + PlainYearMonthConstructor = 92, + PlainYearMonthProto = 93, +} + +impl BuiltinId { + /// 全部内置对象的 id 常量表,供快照/脏检查按序遍历。 + /// 顺序必须与枚举判别值一致(`ALL[i]` 的 `u8` 值 == `i`): + /// 快照数组按下标填充,脏检查按下标回读,错位会误判 builtin 家族永久脏。 + pub const ALL: [BuiltinId; NUM_BUILTINS] = [ + BuiltinId::ObjectProto, + BuiltinId::ArrayProto, + BuiltinId::FunctionProto, + BuiltinId::StringProto, + BuiltinId::NumberProto, + BuiltinId::BooleanProto, + BuiltinId::ErrorProto, + BuiltinId::SymbolProto, + BuiltinId::ObjectConstructor, + BuiltinId::ArrayConstructor, + BuiltinId::FunctionConstructor, + BuiltinId::StringConstructor, + BuiltinId::NumberConstructor, + BuiltinId::BooleanConstructor, + BuiltinId::ErrorConstructor, + BuiltinId::SymbolConstructor, + BuiltinId::TypeErrorProto, + BuiltinId::ReferenceErrorProto, + BuiltinId::RangeErrorProto, + BuiltinId::SyntaxErrorProto, + BuiltinId::UriErrorProto, + BuiltinId::EvalErrorProto, + BuiltinId::MathObject, + BuiltinId::JsonObject, + BuiltinId::DateConstructor, + BuiltinId::DateProto, + BuiltinId::SetConstructor, + BuiltinId::SetProto, + BuiltinId::MapConstructor, + BuiltinId::MapProto, + BuiltinId::RegExpConstructor, + BuiltinId::RegExpProto, + BuiltinId::ArrayBufferConstructor, + BuiltinId::ArrayBufferProto, + BuiltinId::DataViewConstructor, + BuiltinId::DataViewProto, + BuiltinId::TypedArrayProto, + BuiltinId::Int8ArrayConstructor, + BuiltinId::Int8ArrayProto, + BuiltinId::Uint8ArrayConstructor, + BuiltinId::Uint8ArrayProto, + BuiltinId::Uint8ClampedArrayConstructor, + BuiltinId::Uint8ClampedArrayProto, + BuiltinId::Int16ArrayConstructor, + BuiltinId::Int16ArrayProto, + BuiltinId::Uint16ArrayConstructor, + BuiltinId::Uint16ArrayProto, + BuiltinId::Int32ArrayConstructor, + BuiltinId::Int32ArrayProto, + BuiltinId::Uint32ArrayConstructor, + BuiltinId::Uint32ArrayProto, + BuiltinId::Float32ArrayConstructor, + BuiltinId::Float32ArrayProto, + BuiltinId::Float64ArrayConstructor, + BuiltinId::Float64ArrayProto, + BuiltinId::BigInt64ArrayConstructor, + BuiltinId::BigInt64ArrayProto, + BuiltinId::BigUint64ArrayConstructor, + BuiltinId::BigUint64ArrayProto, + BuiltinId::SymMatch, + BuiltinId::SymReplace, + BuiltinId::SymSearch, + BuiltinId::SymSplit, + BuiltinId::SymIterator, + BuiltinId::SymToPrimitive, + BuiltinId::SymHasInstance, + BuiltinId::SymMatchAll, + BuiltinId::SymAsyncIterator, + BuiltinId::TemporalObject, + BuiltinId::TemporalNowObject, + BuiltinId::InstantConstructor, + BuiltinId::InstantProto, + BuiltinId::PlainDateConstructor, + BuiltinId::PlainDateProto, + BuiltinId::PlainTimeConstructor, + BuiltinId::PlainTimeProto, + BuiltinId::BigIntConstructor, + BuiltinId::BigIntProto, + BuiltinId::DurationConstructor, + BuiltinId::DurationProto, + BuiltinId::SymToStringTag, + BuiltinId::ZonedDateTimeConstructor, + BuiltinId::ZonedDateTimeProto, + BuiltinId::PlainDateTimeConstructor, + BuiltinId::PlainDateTimeProto, + BuiltinId::SymSpecies, + BuiltinId::SymAsyncDispose, + BuiltinId::SymDispose, + BuiltinId::SuppressedErrorProto, + BuiltinId::Console, + BuiltinId::PlainMonthDayConstructor, + BuiltinId::PlainMonthDayProto, + BuiltinId::PlainYearMonthConstructor, + BuiltinId::PlainYearMonthProto, + ]; +} + +// 顺序钉:ALL 与判别值 0..NUM_BUILTINS 严格同序(无换序、无重复、无遗漏); +// 错位即快照/脏检查按下标误读,钉成编译失败。 +const _: () = { + let mut i = 0; + while i < BuiltinId::ALL.len() { + if BuiltinId::ALL[i] as usize != i { + panic!("BuiltinId::ALL 顺序与判别值不一致"); + } + i += 1; + } +}; + +/// 内置对象世代(generation)快照:记录构造时各对象及其 stub 的世代号与数量。 +/// +/// 供 [`KernelSession::dirty_since_snapshot`] 对比,判断哪些 builtin 家族在运行期被污染。 +#[derive(Clone, Debug)] +pub struct BuiltinSnapshot { + pub generations: [u32; NUM_BUILTINS], + pub global_object_generation: u32, + pub stub_objects_len: usize, + pub stub_object_generations: Vec, +} + +impl BuiltinSnapshot { + pub(crate) fn gen(obj: &P) -> u32 { + obj.generation() + } + + /// 对给定 builtin world 与 global object 采集一份世代快照。 + pub fn new(world: &BuiltinWorld, global_object: &P) -> Self { + let mut generations = [0u32; NUM_BUILTINS]; + for (i, id) in BuiltinId::ALL.iter().enumerate() { + generations[i] = Self::gen(world.get_by_id(*id)); + } + debug_assert_eq!(generations.len(), NUM_BUILTINS); + Self { + generations, + global_object_generation: Self::gen(global_object), + stub_objects_len: world.stub_objects.len(), + stub_object_generations: world.stub_objects.iter().map(Self::gen).collect(), + } + } +} + +/// 按 builtin 家族划分的脏标记位集合:运行期哪些内置对象被用户代码修改过。 +/// +/// `any_builtin_dirty` 只关注 builtin world 内部对象,`any` 额外包含 global object。 +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub struct BuiltinDirtySet { + pub object: bool, + pub array: bool, + pub function: bool, + pub string: bool, + pub number: bool, + pub boolean: bool, + pub error_family: bool, + pub symbol_family: bool, + pub math: bool, + pub json: bool, + pub date: bool, + pub set: bool, + pub map: bool, + pub regexp: bool, + pub array_buffer: bool, + pub data_view: bool, + pub typed_array_family: bool, + pub temporal: bool, + pub stubs: bool, + pub global: bool, + pub console: bool, +} + +impl BuiltinDirtySet { + /// 是否存在任何 builtin world 内部对象被污染(不含 global object)。 + pub fn any_builtin_dirty(&self) -> bool { + self.object + || self.array + || self.function + || self.string + || self.number + || self.boolean + || self.error_family + || self.symbol_family + || self.math + || self.json + || self.date + || self.set + || self.map + || self.regexp + || self.array_buffer + || self.data_view + || self.typed_array_family + || self.temporal + || self.stubs + || self.console + } + + /// 是否存在任何污染(builtin world 或 global object)。 + pub fn any(&self) -> bool { + self.any_builtin_dirty() || self.global + } +} diff --git a/crates/oxide_kernel/src/kernel/mod.rs b/crates/oxide_kernel/src/kernel/mod.rs index e6a76340..7be53cb3 100644 --- a/crates/oxide_kernel/src/kernel/mod.rs +++ b/crates/oxide_kernel/src/kernel/mod.rs @@ -16,8 +16,10 @@ use crate::shape_forge::{ShapeForge, EMPTY_SHAPE_ID}; use crate::string_forge::PermInterner; use oxide_log; +mod builtin_id; mod config; +pub use builtin_id::{BuiltinDirtySet, BuiltinId, BuiltinSnapshot, NUM_BUILTINS}; pub use config::KernelConfig; /// 不可变、跨所有 VM 实例永久共享的状态。 @@ -206,322 +208,6 @@ pub struct KernelSession { pub builtin_snapshot: BuiltinSnapshot, } -/// 供 reset 脏检查用的世代快照。 -/// -/// 维护注意:每个新增的 `BuiltinWorld` 对象字段都必须加到这里以及 -/// `KernelSession::dirty_since_snapshot()`,以便选择性重置重建正确的 -/// builtin 家族。 -pub const NUM_BUILTINS: usize = 94; - -/// 内置对象枚举 id,与 `BuiltinWorld` 中的存储槽一一对应。 -/// -/// 覆盖各构造器/原型、Error 家族(含 SuppressedError 原型)、集合类型、 -/// TypedArray 家族与 well-known symbols;`repr(u8)` 使其可直接作为数组下标 -/// (`u8` 值即下标)。 -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -#[repr(u8)] -pub enum BuiltinId { - ObjectProto = 0, - ArrayProto = 1, - FunctionProto = 2, - StringProto = 3, - NumberProto = 4, - BooleanProto = 5, - ErrorProto = 6, - SymbolProto = 7, - ObjectConstructor = 8, - ArrayConstructor = 9, - FunctionConstructor = 10, - StringConstructor = 11, - NumberConstructor = 12, - BooleanConstructor = 13, - ErrorConstructor = 14, - SymbolConstructor = 15, - TypeErrorProto = 16, - ReferenceErrorProto = 17, - RangeErrorProto = 18, - SyntaxErrorProto = 19, - UriErrorProto = 20, - EvalErrorProto = 21, - MathObject = 22, - JsonObject = 23, - DateConstructor = 24, - DateProto = 25, - SetConstructor = 26, - SetProto = 27, - MapConstructor = 28, - MapProto = 29, - RegExpConstructor = 30, - RegExpProto = 31, - ArrayBufferConstructor = 32, - ArrayBufferProto = 33, - DataViewConstructor = 34, - DataViewProto = 35, - TypedArrayProto = 36, - Int8ArrayConstructor = 37, - Int8ArrayProto = 38, - Uint8ArrayConstructor = 39, - Uint8ArrayProto = 40, - Uint8ClampedArrayConstructor = 41, - Uint8ClampedArrayProto = 42, - Int16ArrayConstructor = 43, - Int16ArrayProto = 44, - Uint16ArrayConstructor = 45, - Uint16ArrayProto = 46, - Int32ArrayConstructor = 47, - Int32ArrayProto = 48, - Uint32ArrayConstructor = 49, - Uint32ArrayProto = 50, - Float32ArrayConstructor = 51, - Float32ArrayProto = 52, - Float64ArrayConstructor = 53, - Float64ArrayProto = 54, - BigInt64ArrayConstructor = 55, - BigInt64ArrayProto = 56, - BigUint64ArrayConstructor = 57, - BigUint64ArrayProto = 58, - SymMatch = 59, - SymReplace = 60, - SymSearch = 61, - SymSplit = 62, - SymIterator = 63, - SymToPrimitive = 64, - SymHasInstance = 65, - SymMatchAll = 66, - SymAsyncIterator = 67, - TemporalObject = 68, - TemporalNowObject = 69, - InstantConstructor = 70, - InstantProto = 71, - PlainDateConstructor = 72, - PlainDateProto = 73, - PlainTimeConstructor = 74, - PlainTimeProto = 75, - BigIntConstructor = 76, - BigIntProto = 77, - DurationConstructor = 78, - DurationProto = 79, - SymToStringTag = 80, - SymSpecies = 85, - ZonedDateTimeConstructor = 81, - ZonedDateTimeProto = 82, - PlainDateTimeConstructor = 83, - PlainDateTimeProto = 84, - SymAsyncDispose = 86, - SymDispose = 87, - SuppressedErrorProto = 88, - Console = 89, - PlainMonthDayConstructor = 90, - PlainMonthDayProto = 91, - PlainYearMonthConstructor = 92, - PlainYearMonthProto = 93, -} - -impl BuiltinId { - /// 全部内置对象的 id 常量表,供快照/脏检查按序遍历。 - /// 顺序必须与枚举判别值一致(`ALL[i]` 的 `u8` 值 == `i`): - /// 快照数组按下标填充,脏检查按下标回读,错位会误判 builtin 家族永久脏。 - pub const ALL: [BuiltinId; NUM_BUILTINS] = [ - BuiltinId::ObjectProto, - BuiltinId::ArrayProto, - BuiltinId::FunctionProto, - BuiltinId::StringProto, - BuiltinId::NumberProto, - BuiltinId::BooleanProto, - BuiltinId::ErrorProto, - BuiltinId::SymbolProto, - BuiltinId::ObjectConstructor, - BuiltinId::ArrayConstructor, - BuiltinId::FunctionConstructor, - BuiltinId::StringConstructor, - BuiltinId::NumberConstructor, - BuiltinId::BooleanConstructor, - BuiltinId::ErrorConstructor, - BuiltinId::SymbolConstructor, - BuiltinId::TypeErrorProto, - BuiltinId::ReferenceErrorProto, - BuiltinId::RangeErrorProto, - BuiltinId::SyntaxErrorProto, - BuiltinId::UriErrorProto, - BuiltinId::EvalErrorProto, - BuiltinId::MathObject, - BuiltinId::JsonObject, - BuiltinId::DateConstructor, - BuiltinId::DateProto, - BuiltinId::SetConstructor, - BuiltinId::SetProto, - BuiltinId::MapConstructor, - BuiltinId::MapProto, - BuiltinId::RegExpConstructor, - BuiltinId::RegExpProto, - BuiltinId::ArrayBufferConstructor, - BuiltinId::ArrayBufferProto, - BuiltinId::DataViewConstructor, - BuiltinId::DataViewProto, - BuiltinId::TypedArrayProto, - BuiltinId::Int8ArrayConstructor, - BuiltinId::Int8ArrayProto, - BuiltinId::Uint8ArrayConstructor, - BuiltinId::Uint8ArrayProto, - BuiltinId::Uint8ClampedArrayConstructor, - BuiltinId::Uint8ClampedArrayProto, - BuiltinId::Int16ArrayConstructor, - BuiltinId::Int16ArrayProto, - BuiltinId::Uint16ArrayConstructor, - BuiltinId::Uint16ArrayProto, - BuiltinId::Int32ArrayConstructor, - BuiltinId::Int32ArrayProto, - BuiltinId::Uint32ArrayConstructor, - BuiltinId::Uint32ArrayProto, - BuiltinId::Float32ArrayConstructor, - BuiltinId::Float32ArrayProto, - BuiltinId::Float64ArrayConstructor, - BuiltinId::Float64ArrayProto, - BuiltinId::BigInt64ArrayConstructor, - BuiltinId::BigInt64ArrayProto, - BuiltinId::BigUint64ArrayConstructor, - BuiltinId::BigUint64ArrayProto, - BuiltinId::SymMatch, - BuiltinId::SymReplace, - BuiltinId::SymSearch, - BuiltinId::SymSplit, - BuiltinId::SymIterator, - BuiltinId::SymToPrimitive, - BuiltinId::SymHasInstance, - BuiltinId::SymMatchAll, - BuiltinId::SymAsyncIterator, - BuiltinId::TemporalObject, - BuiltinId::TemporalNowObject, - BuiltinId::InstantConstructor, - BuiltinId::InstantProto, - BuiltinId::PlainDateConstructor, - BuiltinId::PlainDateProto, - BuiltinId::PlainTimeConstructor, - BuiltinId::PlainTimeProto, - BuiltinId::BigIntConstructor, - BuiltinId::BigIntProto, - BuiltinId::DurationConstructor, - BuiltinId::DurationProto, - BuiltinId::SymToStringTag, - BuiltinId::ZonedDateTimeConstructor, - BuiltinId::ZonedDateTimeProto, - BuiltinId::PlainDateTimeConstructor, - BuiltinId::PlainDateTimeProto, - BuiltinId::SymSpecies, - BuiltinId::SymAsyncDispose, - BuiltinId::SymDispose, - BuiltinId::SuppressedErrorProto, - BuiltinId::Console, - BuiltinId::PlainMonthDayConstructor, - BuiltinId::PlainMonthDayProto, - BuiltinId::PlainYearMonthConstructor, - BuiltinId::PlainYearMonthProto, - ]; -} - -// 顺序钉:ALL 与判别值 0..NUM_BUILTINS 严格同序(无换序、无重复、无遗漏); -// 错位即快照/脏检查按下标误读,钉成编译失败。 -const _: () = { - let mut i = 0; - while i < BuiltinId::ALL.len() { - if BuiltinId::ALL[i] as usize != i { - panic!("BuiltinId::ALL 顺序与判别值不一致"); - } - i += 1; - } -}; - -/// 内置对象世代(generation)快照:记录构造时各对象及其 stub 的世代号与数量。 -/// -/// 供 [`KernelSession::dirty_since_snapshot`] 对比,判断哪些 builtin 家族在运行期被污染。 -#[derive(Clone, Debug)] -pub struct BuiltinSnapshot { - pub generations: [u32; NUM_BUILTINS], - pub global_object_generation: u32, - pub stub_objects_len: usize, - pub stub_object_generations: Vec, -} - -impl BuiltinSnapshot { - fn gen(obj: &P) -> u32 { - obj.generation() - } - - /// 对给定 builtin world 与 global object 采集一份世代快照。 - pub fn new(world: &BuiltinWorld, global_object: &P) -> Self { - let mut generations = [0u32; NUM_BUILTINS]; - for (i, id) in BuiltinId::ALL.iter().enumerate() { - generations[i] = Self::gen(world.get_by_id(*id)); - } - debug_assert_eq!(generations.len(), NUM_BUILTINS); - Self { - generations, - global_object_generation: Self::gen(global_object), - stub_objects_len: world.stub_objects.len(), - stub_object_generations: world.stub_objects.iter().map(Self::gen).collect(), - } - } -} - -/// 按 builtin 家族划分的脏标记位集合:运行期哪些内置对象被用户代码修改过。 -/// -/// `any_builtin_dirty` 只关注 builtin world 内部对象,`any` 额外包含 global object。 -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -pub struct BuiltinDirtySet { - pub object: bool, - pub array: bool, - pub function: bool, - pub string: bool, - pub number: bool, - pub boolean: bool, - pub error_family: bool, - pub symbol_family: bool, - pub math: bool, - pub json: bool, - pub date: bool, - pub set: bool, - pub map: bool, - pub regexp: bool, - pub array_buffer: bool, - pub data_view: bool, - pub typed_array_family: bool, - pub temporal: bool, - pub stubs: bool, - pub global: bool, - pub console: bool, -} - -impl BuiltinDirtySet { - /// 是否存在任何 builtin world 内部对象被污染(不含 global object)。 - pub fn any_builtin_dirty(&self) -> bool { - self.object - || self.array - || self.function - || self.string - || self.number - || self.boolean - || self.error_family - || self.symbol_family - || self.math - || self.json - || self.date - || self.set - || self.map - || self.regexp - || self.array_buffer - || self.data_view - || self.typed_array_family - || self.temporal - || self.stubs - || self.console - } - - /// 是否存在任何污染(builtin world 或 global object)。 - pub fn any(&self) -> bool { - self.any_builtin_dirty() || self.global - } -} - impl KernelSession { fn new_global_object(core: &KernelCore) -> P { let mut global_obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null());