feat: 新增 Intl 特性域骨架实现

This commit is contained in:
2026-10-16 05:08:58 +00:00
parent 5e7808bb08
commit 04b991f5d8
17 changed files with 2417 additions and 31 deletions
+50 -5
View File
@@ -1,4 +1,4 @@
//! 内置对象 id 枚举(`BuiltinId` 98 变体 + `ALL` 顺序钉表)、世代快照
//! 内置对象 id 枚举(`BuiltinId` 119 变体 + `ALL` 顺序钉表)、世代快照
//! (`BuiltinSnapshot`)与按家族划分的脏标记位集(`BuiltinDirtySet`);
//! `NUM_BUILTINS` 文档承载"新增 BuiltinWorld 字段须同步"四处约束注记。
@@ -11,7 +11,7 @@ use crate::builtin::BuiltinWorld;
/// 维护注意:每个新增的 `BuiltinWorld` 对象字段都必须加到这里以及
/// `KernelSession::dirty_since_snapshot()`,以便选择性重置重建正确的
/// builtin 家族。
pub const NUM_BUILTINS: usize = 98;
pub const NUM_BUILTINS: usize = 119;
/// 内置对象枚举 id,与 `BuiltinWorld` 中的存储槽一一对应。
///
@@ -118,6 +118,27 @@ pub enum BuiltinId {
CustomEventProto = 95,
CustomEventCtor = 96,
EventTargetProto = 97,
IntlObject = 98,
NumberFormatConstructor = 99,
NumberFormatProto = 100,
DateTimeFormatConstructor = 101,
DateTimeFormatProto = 102,
CollatorConstructor = 103,
CollatorProto = 104,
PluralRulesConstructor = 105,
PluralRulesProto = 106,
ListFormatConstructor = 107,
ListFormatProto = 108,
RelativeTimeFormatConstructor = 109,
RelativeTimeFormatProto = 110,
DisplayNamesConstructor = 111,
DisplayNamesProto = 112,
SegmenterConstructor = 113,
SegmenterProto = 114,
LocaleConstructor = 115,
LocaleProto = 116,
DurationFormatConstructor = 117,
DurationFormatProto = 118,
}
impl BuiltinId {
@@ -223,6 +244,27 @@ impl BuiltinId {
BuiltinId::CustomEventProto,
BuiltinId::CustomEventCtor,
BuiltinId::EventTargetProto,
BuiltinId::IntlObject,
BuiltinId::NumberFormatConstructor,
BuiltinId::NumberFormatProto,
BuiltinId::DateTimeFormatConstructor,
BuiltinId::DateTimeFormatProto,
BuiltinId::CollatorConstructor,
BuiltinId::CollatorProto,
BuiltinId::PluralRulesConstructor,
BuiltinId::PluralRulesProto,
BuiltinId::ListFormatConstructor,
BuiltinId::ListFormatProto,
BuiltinId::RelativeTimeFormatConstructor,
BuiltinId::RelativeTimeFormatProto,
BuiltinId::DisplayNamesConstructor,
BuiltinId::DisplayNamesProto,
BuiltinId::SegmenterConstructor,
BuiltinId::SegmenterProto,
BuiltinId::LocaleConstructor,
BuiltinId::LocaleProto,
BuiltinId::DurationFormatConstructor,
BuiltinId::DurationFormatProto,
];
}
@@ -301,6 +343,7 @@ pub struct BuiltinDirtySet {
pub message_channel: bool,
pub broadcast_channel: bool,
pub event: bool,
pub intl: bool,
}
impl BuiltinDirtySet {
@@ -337,6 +380,7 @@ impl BuiltinDirtySet {
message_channel: true,
broadcast_channel: true,
event: true,
intl: true,
}
}
@@ -367,6 +411,7 @@ impl BuiltinDirtySet {
|| self.message_channel
|| self.broadcast_channel
|| self.event
|| self.intl
}
/// 是否存在任何污染(builtin world 或 global object)。
@@ -379,13 +424,13 @@ impl BuiltinDirtySet {
mod tests {
use super::*;
/// 槽对齐面:ALL 表与判别值 0..97 严格同序,快照数组随 NUM_BUILTINS
/// 槽对齐面:ALL 表与判别值 0..118 严格同序,快照数组随 NUM_BUILTINS
/// 自动扩维、逐槽对齐。
#[test]
fn builtin_snapshot_all_slots_aligned() {
assert_eq!(NUM_BUILTINS, 98);
assert_eq!(NUM_BUILTINS, 119);
assert_eq!(BuiltinId::ALL.len(), NUM_BUILTINS);
for i in 0..97usize {
for i in 0..118usize {
assert_eq!(BuiltinId::ALL[i] as usize, i);
}
assert_eq!(BuiltinId::ALL[81], BuiltinId::SharedArrayBufferProto);
+21
View File
@@ -209,6 +209,27 @@ impl KernelSession {
|| gen(BuiltinId::CustomEventProto) != snap(BuiltinId::CustomEventProto)
|| gen(BuiltinId::CustomEventCtor) != snap(BuiltinId::CustomEventCtor)
|| gen(BuiltinId::EventTargetProto) != snap(BuiltinId::EventTargetProto),
intl: gen(BuiltinId::IntlObject) != snap(BuiltinId::IntlObject)
|| gen(BuiltinId::NumberFormatConstructor) != snap(BuiltinId::NumberFormatConstructor)
|| gen(BuiltinId::NumberFormatProto) != snap(BuiltinId::NumberFormatProto)
|| gen(BuiltinId::DateTimeFormatConstructor) != snap(BuiltinId::DateTimeFormatConstructor)
|| gen(BuiltinId::DateTimeFormatProto) != snap(BuiltinId::DateTimeFormatProto)
|| gen(BuiltinId::CollatorConstructor) != snap(BuiltinId::CollatorConstructor)
|| gen(BuiltinId::CollatorProto) != snap(BuiltinId::CollatorProto)
|| gen(BuiltinId::PluralRulesConstructor) != snap(BuiltinId::PluralRulesConstructor)
|| gen(BuiltinId::PluralRulesProto) != snap(BuiltinId::PluralRulesProto)
|| gen(BuiltinId::ListFormatConstructor) != snap(BuiltinId::ListFormatConstructor)
|| gen(BuiltinId::ListFormatProto) != snap(BuiltinId::ListFormatProto)
|| gen(BuiltinId::RelativeTimeFormatConstructor) != snap(BuiltinId::RelativeTimeFormatConstructor)
|| gen(BuiltinId::RelativeTimeFormatProto) != snap(BuiltinId::RelativeTimeFormatProto)
|| gen(BuiltinId::DisplayNamesConstructor) != snap(BuiltinId::DisplayNamesConstructor)
|| gen(BuiltinId::DisplayNamesProto) != snap(BuiltinId::DisplayNamesProto)
|| gen(BuiltinId::SegmenterConstructor) != snap(BuiltinId::SegmenterConstructor)
|| gen(BuiltinId::SegmenterProto) != snap(BuiltinId::SegmenterProto)
|| gen(BuiltinId::LocaleConstructor) != snap(BuiltinId::LocaleConstructor)
|| gen(BuiltinId::LocaleProto) != snap(BuiltinId::LocaleProto)
|| gen(BuiltinId::DurationFormatConstructor) != snap(BuiltinId::DurationFormatConstructor)
|| gen(BuiltinId::DurationFormatProto) != snap(BuiltinId::DurationFormatProto),
};
// wrapper 本体被写不落在任何家族位上(写的是 wrapper 自身而非所属 P
// 对象):收缩为全脏,强制重建全部家族与 global,使被写的可复用