refactor: 拆分 Kernel 中可变 Session 与不可变 Core

This commit is contained in:
2026-06-14 12:58:09 +08:00
parent 1730236eb1
commit 246ad72540
63 changed files with 666 additions and 615 deletions
+20 -20
View File
@@ -10,7 +10,7 @@ fn get_regexp_ptr(vm: &Vm, args: &[u8]) -> Result<*mut JsObject, JsValue> {
let this_val = vm.reg(args[0]);
if !this_val.is_object() {
return Err(JsValue::string(
vm.kernel()
vm.kernel_core()
.string_forge()
.intern("TypeError: RegExp.prototype method called on non-object")
.0,
@@ -19,11 +19,11 @@ fn get_regexp_ptr(vm: &Vm, args: &[u8]) -> Result<*mut JsObject, JsValue> {
}
let ptr = this_val.as_js_object_ptr();
if ptr.is_null() {
return Err(JsValue::string(vm.kernel().string_forge().intern("TypeError: null object").0, 0));
return Err(JsValue::string(vm.kernel_core().string_forge().intern("TypeError: null object").0, 0));
}
if !unsafe { &*ptr }.is_regexp_obj() {
return Err(JsValue::string(
vm.kernel().string_forge().intern("TypeError: RegExp.prototype method called on non-RegExp object").0,
vm.kernel_core().string_forge().intern("TypeError: RegExp.prototype method called on non-RegExp object").0,
0,
));
}
@@ -46,8 +46,8 @@ fn parse_flags(flags: &str) -> (bool, bool, bool) {
}
fn set_prop(obj: &mut JsObject, name: &str, val: JsValue, vm: &Vm) {
let si = vm.kernel().string_forge().intern(name).0;
let shape_id = vm.kernel().shape_forge().make_shape(obj.shape_id(), si);
let si = vm.kernel_core().string_forge().intern(name).0;
let shape_id = vm.kernel_core().shape_forge().make_shape(obj.shape_id(), si);
obj.set_shape_id(shape_id);
obj.ensure_hash_props().push(val);
}
@@ -74,11 +74,11 @@ pub fn regexp_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let (pattern, flags) = if args.len() < 2 {
(String::new(), String::new())
} else if args.len() < 3 {
let pat = coercion::to_string(vm.kernel().string_forge().as_ref(), vm.reg(args[1]));
let pat = coercion::to_string(vm.kernel_core().string_forge().as_ref(), vm.reg(args[1]));
(pat, String::new())
} else {
let pat = coercion::to_string(vm.kernel().string_forge().as_ref(), vm.reg(args[1]));
let fl = coercion::to_string(vm.kernel().string_forge().as_ref(), vm.reg(args[2]));
let pat = coercion::to_string(vm.kernel_core().string_forge().as_ref(), vm.reg(args[1]));
let fl = coercion::to_string(vm.kernel_core().string_forge().as_ref(), vm.reg(args[2]));
(pat, fl)
};
@@ -86,7 +86,7 @@ pub fn regexp_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let mut obj = JsObject::new_empty(
EMPTY_SHAPE_ID,
JsValue::from_js_object(vm.kernel().builtin_world().regexp_proto.as_ptr() as *mut JsObject),
JsValue::from_js_object(vm.session().builtin_world().regexp_proto.as_ptr() as *mut JsObject),
);
let compiled = regex::RegexBuilder::new(&pattern)
@@ -105,7 +105,7 @@ pub fn regexp_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
Err(e) => {
let msg = format!("SyntaxError: Invalid regular expression: {}", e);
return NativeResult::Err(JsValue::string(vm.kernel().string_forge().intern(&msg).0, 0));
return NativeResult::Err(JsValue::string(vm.kernel_core().string_forge().intern(&msg).0, 0));
}
}
@@ -134,7 +134,7 @@ pub fn regexp_test(vm: &mut Vm, args: &[u8]) -> NativeResult {
let fn_ptr = match re.native_fn() {
None => {
return NativeResult::Err(JsValue::string(
vm.kernel().string_forge().intern("TypeError: invalid RegExp").0,
vm.kernel_core().string_forge().intern("TypeError: invalid RegExp").0,
0,
));
}
@@ -144,10 +144,10 @@ pub fn regexp_test(vm: &mut Vm, args: &[u8]) -> NativeResult {
// SAFETY: fn_ptr holds a Box<regex::Regex> pointer stored by regexp_constructor.
let regex = unsafe { &*(fn_ptr.as_ptr() as *const regex::Regex) };
let haystack = coercion::to_string(
vm.kernel().string_forge().as_ref(),
vm.kernel_core().string_forge().as_ref(),
vm.reg(if args.len() > 1 { args[1] } else { args[0] }),
);
let last_index = coercion::to_number(get_prop(re, 0), vm.kernel().string_forge().as_ref()) as usize;
let last_index = coercion::to_number(get_prop(re, 0), vm.kernel_core().string_forge().as_ref()) as usize;
let is_global = get_prop(re, 3).as_bool();
if is_global {
@@ -169,7 +169,7 @@ pub fn regexp_exec(vm: &mut Vm, args: &[u8]) -> NativeResult {
match re.native_fn() {
None => {
return NativeResult::Err(JsValue::string(
vm.kernel().string_forge().intern("TypeError: invalid RegExp").0,
vm.kernel_core().string_forge().intern("TypeError: invalid RegExp").0,
0,
));
}
@@ -180,13 +180,13 @@ pub fn regexp_exec(vm: &mut Vm, args: &[u8]) -> NativeResult {
// SAFETY: fn_ptr holds a Box<regex::Regex> pointer stored by regexp_constructor.
let regex = unsafe { &*(fn_ptr.as_ptr() as *const regex::Regex) };
let haystack = coercion::to_string(
vm.kernel().string_forge().as_ref(),
vm.kernel_core().string_forge().as_ref(),
vm.reg(if args.len() > 1 { args[1] } else { args[0] }),
);
let (last_index, is_global) = {
let re = unsafe { &*re_ptr };
let li = coercion::to_number(get_prop(re, 0), vm.kernel().string_forge().as_ref()) as usize;
let li = coercion::to_number(get_prop(re, 0), vm.kernel_core().string_forge().as_ref()) as usize;
let g = get_prop(re, 3).as_bool();
(li, g)
};
@@ -203,18 +203,18 @@ pub fn regexp_exec(vm: &mut Vm, args: &[u8]) -> NativeResult {
if let Some(m) = match_result {
let mut match_obj = JsObject::new_empty(
EMPTY_SHAPE_ID,
JsValue::from_js_object(vm.kernel().builtin_world().array_proto.as_ptr() as *mut JsObject),
JsValue::from_js_object(vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject),
);
let full_match = &haystack[m.start()..m.end()];
let full_si = vm.kernel().string_forge().intern(full_match).0;
let full_si = vm.kernel_core().string_forge().intern(full_match).0;
match_obj.ensure_hash_props().push(JsValue::string(full_si, 0));
let captures = regex.captures(&haystack[m.start()..m.end()]);
if let Some(caps) = &captures {
for i in 1..caps.len() {
let cap_str = caps.get(i).map(|cm| cm.as_str()).unwrap_or("");
let si = vm.kernel().string_forge().intern(cap_str).0;
let si = vm.kernel_core().string_forge().intern(cap_str).0;
match_obj.ensure_hash_props().push(JsValue::string(si, 0));
}
}
@@ -253,6 +253,6 @@ pub fn regexp_to_string(vm: &mut Vm, args: &[u8]) -> NativeResult {
vm.lookup_str(val).unwrap_or_default()
};
let result = format!("/{}/{}", source, flags);
let si = vm.kernel().string_forge().intern(&result).0;
let si = vm.kernel_core().string_forge().intern(&result).0;
NativeResult::Ok(JsValue::string(si, 0))
}