refactor: 正则与缓冲区族符号键改经 realm 维度编码并推进版本

This commit is contained in:
2026-10-07 04:12:09 +00:00
parent c97b0207b4
commit 641e4f6065
6 changed files with 33 additions and 33 deletions
Generated
+18 -18
View File
@@ -1160,7 +1160,7 @@ dependencies = [
[[package]]
name = "oxide_builtins"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"chrono",
"fast-float",
@@ -1185,7 +1185,7 @@ dependencies = [
[[package]]
name = "oxide_bytecode"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"num-bigint",
"oxide_log",
@@ -1193,7 +1193,7 @@ dependencies = [
[[package]]
name = "oxide_cfg"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"oxide_bytecode",
"oxide_emit",
@@ -1204,7 +1204,7 @@ dependencies = [
[[package]]
name = "oxide_cli"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"ansi_term",
"bumpalo",
@@ -1225,7 +1225,7 @@ dependencies = [
[[package]]
name = "oxide_code_cache"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"lru",
"oxide_bytecode",
@@ -1234,7 +1234,7 @@ dependencies = [
[[package]]
name = "oxide_compiler"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"oxide_bytecode",
"oxide_cfg",
@@ -1253,7 +1253,7 @@ dependencies = [
[[package]]
name = "oxide_dce"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"oxide_bytecode",
"oxide_cfg",
@@ -1267,7 +1267,7 @@ dependencies = [
[[package]]
name = "oxide_emit"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"num-bigint",
"oxc_allocator",
@@ -1282,7 +1282,7 @@ dependencies = [
[[package]]
name = "oxide_ir"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"oxide_bytecode",
"oxide_log",
@@ -1291,7 +1291,7 @@ dependencies = [
[[package]]
name = "oxide_kernel"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"bumpalo",
"dashmap",
@@ -1306,7 +1306,7 @@ dependencies = [
[[package]]
name = "oxide_liveness"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"oxide_bytecode",
"oxide_cfg",
@@ -1318,7 +1318,7 @@ dependencies = [
[[package]]
name = "oxide_log"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"tracing",
"tracing-appender",
@@ -1327,7 +1327,7 @@ dependencies = [
[[package]]
name = "oxide_parser"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"oxc_allocator",
"oxc_ast",
@@ -1342,7 +1342,7 @@ dependencies = [
[[package]]
name = "oxide_regalloc"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"oxide_bytecode",
"oxide_cfg",
@@ -1358,7 +1358,7 @@ dependencies = [
[[package]]
name = "oxide_runtime_api"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"num-bigint",
"num-traits",
@@ -1370,7 +1370,7 @@ dependencies = [
[[package]]
name = "oxide_test262"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"oxide_bytecode",
"oxide_compiler",
@@ -1387,7 +1387,7 @@ dependencies = [
[[package]]
name = "oxide_types"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"bumpalo",
"hashbrown 0.14.5",
@@ -1399,7 +1399,7 @@ dependencies = [
[[package]]
name = "oxide_vm"
version = "0.8.54"
version = "0.8.55"
dependencies = [
"bumpalo",
"chrono",
+1 -1
View File
@@ -22,7 +22,7 @@ members = [
]
[workspace.package]
version = "0.8.54"
version = "0.8.55"
edition = "2021"
license = "MIT"
rust-version = "1.80"
+2 -2
View File
@@ -1,6 +1,6 @@
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
use oxide_types::object::{JsObject, NativeFnPtr};
use oxide_types::private_key::{make_well_known_symbol_key, WELL_KNOWN_SYMBOL_SPECIES};
use oxide_types::private_key::{encode_symbol_key, WELL_KNOWN_SYMBOL_SPECIES};
use oxide_types::value::JsValue;
use oxide_runtime_api::{NativeResult, VmHost};
@@ -819,7 +819,7 @@ fn ab_species_constructor<H: VmHost>(vm: &mut H, o_val: JsValue, default_ctor: J
if !c.is_object() {
return Err(crate::error::create_type_error(vm, "buffer constructor is not an object"));
}
let species_key = make_well_known_symbol_key(WELL_KNOWN_SYMBOL_SPECIES);
let species_key = encode_symbol_key(vm.realm_id(), WELL_KNOWN_SYMBOL_SPECIES);
let s = match vm.ordinary_get(unsafe { &*c.as_js_object_ptr() }, species_key, c) {
Ok(v) => v,
Err(msg) => return Err(crate::iterator::engine_error(vm, &msg)),
+2 -2
View File
@@ -242,7 +242,7 @@ fn species_constructor<H: VmHost>(
}
// Get(C, @@species) 的 receiver 是构造器 C 本身:访问器 getter 返回
// receiver,传实例会让返回值错指到接收者本体。
let species_key = oxide_types::private_key::make_well_known_symbol_key(10);
let species_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 10);
let c_val = JsValue::from_js_object(c.as_js_object_ptr());
let s = match vm.ordinary_get(unsafe { &*c.as_js_object_ptr() }, species_key, c_val) {
Ok(v) => v,
@@ -1831,7 +1831,7 @@ pub fn regexp_symbol_match_all<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResu
let is_unicode = flags.contains('u') || flags.contains('v');
// 旧式 IsRegExp:Get(R, @@match) 为布尔取之,否则 true。
let match_key = oxide_types::private_key::make_well_known_symbol_key(1);
let match_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 1);
let matcher_prop = match vm.ordinary_get(unsafe { &*re_ptr }, match_key, this_val) {
Ok(v) => v,
Err(_) => return NativeResult::Err(crate::iterator::engine_error(vm, "cannot read @@match")),
+8 -8
View File
@@ -65,7 +65,7 @@ pub(crate) fn is_regexp_live<H: VmHost>(vm: &mut H, val: JsValue) -> Result<bool
if !val.is_object() {
return Ok(false);
}
let match_key = oxide_types::private_key::make_well_known_symbol_key(1);
let match_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 1);
let ptr = val.as_js_object_ptr();
// SAFETY: val 已校验为非空对象值。
let obj = unsafe { &*ptr };
@@ -86,7 +86,7 @@ pub(crate) fn is_regexp_live<H: VmHost>(vm: &mut H, val: JsValue) -> Result<bool
fn rx_get_replace_method<H: VmHost>(
vm: &mut H, rx: *mut JsObject, this_val: JsValue,
) -> Result<Option<JsValue>, JsValue> {
let replace_key = oxide_types::private_key::make_well_known_symbol_key(2);
let replace_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 2);
// SAFETY: this_val 为对象值,rx 与其同址。
let func = match vm.ordinary_get(unsafe { &*rx }, replace_key, this_val) {
Ok(v) => v,
@@ -166,7 +166,7 @@ fn string_arm_replace<H: VmHost>(
/// GetMethod(sep, @@split):undefined/null 返回 None(落字符串臂),不可调用
/// 抛 TypeError,属性读抛错恢复原异常值。
fn rx_get_split_method<H: VmHost>(vm: &mut H, sep: JsValue) -> Result<Option<JsValue>, JsValue> {
let split_key = oxide_types::private_key::make_well_known_symbol_key(4);
let split_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 4);
let ptr = sep.as_js_object_ptr();
// SAFETY: 调用方已校验 sep 为非空对象值。
let func = match vm.ordinary_get(unsafe { &*ptr }, split_key, sep) {
@@ -569,7 +569,7 @@ pub fn string_match_fn<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
/// GetMethod(rx, @@match):可调用返回之,null/undefined/不可调用抛 TypeError;
/// 属性读抛错恢复原异常值。
fn rx_get_match_method<H: VmHost>(vm: &mut H, rx: *mut JsObject, this_val: JsValue) -> Result<JsValue, JsValue> {
let match_key = oxide_types::private_key::make_well_known_symbol_key(1);
let match_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 1);
let matcher = match vm.ordinary_get(unsafe { &*rx }, match_key, this_val) {
Ok(v) => v,
Err(e) => return Err(crate::iterator::engine_error(vm, &e)),
@@ -585,7 +585,7 @@ fn rx_get_match_method<H: VmHost>(vm: &mut H, rx: *mut JsObject, this_val: JsVal
fn rx_get_match_method_opt<H: VmHost>(
vm: &mut H, rx: *mut JsObject, this_val: JsValue,
) -> Result<Option<JsValue>, JsValue> {
let match_key = oxide_types::private_key::make_well_known_symbol_key(1);
let match_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 1);
let func = match vm.ordinary_get(unsafe { &*rx }, match_key, this_val) {
Ok(v) => v,
Err(e) => return Err(crate::iterator::engine_error(vm, &e)),
@@ -604,7 +604,7 @@ fn rx_get_match_method_opt<H: VmHost>(
fn rx_get_search_method<H: VmHost>(
vm: &mut H, rx: *mut JsObject, this_val: JsValue,
) -> Result<Option<JsValue>, JsValue> {
let search_key = oxide_types::private_key::make_well_known_symbol_key(3);
let search_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 3);
let func = match vm.ordinary_get(unsafe { &*rx }, search_key, this_val) {
Ok(v) => v,
Err(e) => return Err(crate::iterator::engine_error(vm, &e)),
@@ -843,7 +843,7 @@ pub fn string_match_all<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
}
// GetMethod(pattern, @@matchAll) 全链单次 Get:own 命中 undefined/null
// 即停(Get 语义),不回退原型链。
let match_all_key = oxide_types::private_key::make_well_known_symbol_key(7);
let match_all_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 7);
let matcher = match vm.ordinary_get(unsafe { &*pattern_val.as_js_object_ptr() }, match_all_key, pattern_val) {
Ok(v) => v,
Err(e) => return NativeResult::err(crate::iterator::engine_error(vm, &e)),
@@ -944,7 +944,7 @@ fn match_all_construct_invoke<H: VmHost>(vm: &mut H, this_val: JsValue, pattern_
}
// Invoke(regexp, @@matchAll, « string »):产物全链 Get,无 callable 抛 TypeError。
let match_all_key = oxide_types::private_key::make_well_known_symbol_key(7);
let match_all_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 7);
let rx_ptr = rx_val.as_js_object_ptr();
let rx_this = JsValue::from_js_object(rx_ptr);
let matcher = match vm.ordinary_get(unsafe { &*rx_ptr }, match_all_key, rx_this) {
+2 -2
View File
@@ -2,7 +2,7 @@ use num_bigint::BigInt;
use num_traits::ToPrimitive;
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
use oxide_types::object::{JsObject, NativeFnPtr, TypedArrayKind};
use oxide_types::private_key::{int_key_value, is_int_key, make_well_known_symbol_key, WELL_KNOWN_SYMBOL_SPECIES};
use oxide_types::private_key::{encode_symbol_key, int_key_value, is_int_key, WELL_KNOWN_SYMBOL_SPECIES};
use oxide_types::value::JsValue;
use crate::array_buffer::{
@@ -1151,7 +1151,7 @@ fn typed_array_species_create<H: VmHost>(
} else if !c.is_object() {
return Err(type_error(vm, "Species constructor not a constructor"));
} else {
let species_key = make_well_known_symbol_key(WELL_KNOWN_SYMBOL_SPECIES);
let species_key = encode_symbol_key(vm.realm_id(), WELL_KNOWN_SYMBOL_SPECIES);
let s = match vm.ordinary_get(unsafe { &*c.as_js_object_ptr() }, species_key, c) {
Ok(v) => v,
Err(msg) => return Err(crate::iterator::engine_error(vm, &msg)),