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

This commit is contained in:
爱特每羊队
2026-06-14 12:58:09 +08:00
parent ec537cb8b3
commit d242d08e6d
63 changed files with 666 additions and 615 deletions
+23 -23
View File
@@ -39,7 +39,7 @@ fn get_this_array_ref(val: JsValue) -> Result<*mut JsObject, JsValue> {
}
fn create_new_array(vm: &mut Vm, n: usize) -> *mut JsObject {
let proto = vm.kernel().builtin_world().array_proto.as_ptr() as *mut JsObject;
let proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
vm.epoch()
.alloc(JsObject::new_array(EMPTY_SHAPE_ID, JsValue::from_js_object(proto), n, vm.epoch().bump()))
}
@@ -74,7 +74,7 @@ fn invoke_native_callback(vm: &mut Vm, callback_val: JsValue, this_val: JsValue,
}
pub fn array_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let proto = vm.kernel().builtin_world().array_proto.as_ptr() as *mut JsObject;
let proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
let proto_val = JsValue::from_js_object(proto);
if args.len() == 2 {
@@ -155,12 +155,12 @@ pub fn array_slice(vm: &mut Vm, args: &[u8]) -> NativeResult {
let arr = unsafe { &*arr_ptr };
let n = arr.prop_count() as usize;
let start = if args.len() > 1 {
(coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as i32) as usize
(coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as i32) as usize
} else {
0
};
let end = if args.len() > 2 {
(coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as i32) as usize
(coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as i32) as usize
} else {
n
};
@@ -184,7 +184,7 @@ pub fn array_splice(vm: &mut Vm, args: &[u8]) -> NativeResult {
let n = arr.prop_count() as usize;
let start = if args.len() > 1 {
let v = coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref());
let v = coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref());
let s = v as i32;
if s < 0 {
(n as i32 + s).max(0) as usize
@@ -196,7 +196,7 @@ pub fn array_splice(vm: &mut Vm, args: &[u8]) -> NativeResult {
};
let delete_count = if args.len() > 2 {
let v = coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref());
let v = coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref());
(v as usize).min(n - start)
} else {
n - start
@@ -280,11 +280,11 @@ pub fn array_join(vm: &mut Vm, args: &[u8]) -> NativeResult {
let arr = unsafe { &*arr_ptr };
let n = arr.prop_count() as usize;
let sep = if args.len() > 1 {
coercion::to_string(vm.kernel().string_forge().as_ref(), vm.reg(args[1]))
coercion::to_string(vm.kernel_core().string_forge().as_ref(), vm.reg(args[1]))
} else {
",".to_string()
};
let sf = vm.kernel().string_forge().as_ref();
let sf = vm.kernel_core().string_forge().as_ref();
let parts: Vec<String> = (0..n)
.map(|i| {
let v = arr.get_prop_at(i);
@@ -361,7 +361,7 @@ pub fn array_flat(vm: &mut Vm, args: &[u8]) -> NativeResult {
let arr = unsafe { &*arr_ptr };
let n = arr.prop_count() as usize;
let depth = if args.len() > 1 {
(coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as i32).max(1) as usize
(coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as i32).max(1) as usize
} else {
1
};
@@ -457,7 +457,7 @@ pub fn array_filter(vm: &mut Vm, args: &[u8]) -> NativeResult {
let elem = unsafe { (*arr_ptr).get_prop_at(i) };
match invoke_native_callback(vm, callback_val, this_val, &[elem, JsValue::int(i as i32), vm.reg(args[0])]) {
NativeResult::Ok(result_val) => {
let sf = vm.kernel().string_forge().as_ref();
let sf = vm.kernel_core().string_forge().as_ref();
if coercion::to_boolean(result_val, sf) {
kept.push(elem);
}
@@ -527,7 +527,7 @@ pub fn array_find(vm: &mut Vm, args: &[u8]) -> NativeResult {
let elem = unsafe { (*arr_ptr).get_prop_at(i) };
match invoke_native_callback(vm, callback_val, this_val, &[elem, JsValue::int(i as i32), vm.reg(args[0])]) {
NativeResult::Ok(result_val) => {
let sf = vm.kernel().string_forge().as_ref();
let sf = vm.kernel_core().string_forge().as_ref();
if coercion::to_boolean(result_val, sf) {
return NativeResult::Ok(elem);
}
@@ -552,7 +552,7 @@ pub fn array_some(vm: &mut Vm, args: &[u8]) -> NativeResult {
let elem = unsafe { (*arr_ptr).get_prop_at(i) };
match invoke_native_callback(vm, callback_val, this_val, &[elem, JsValue::int(i as i32), vm.reg(args[0])]) {
NativeResult::Ok(result_val) => {
let sf = vm.kernel().string_forge().as_ref();
let sf = vm.kernel_core().string_forge().as_ref();
if coercion::to_boolean(result_val, sf) {
return NativeResult::Ok(JsValue::bool(true));
}
@@ -577,7 +577,7 @@ pub fn array_every(vm: &mut Vm, args: &[u8]) -> NativeResult {
let elem = unsafe { (*arr_ptr).get_prop_at(i) };
match invoke_native_callback(vm, callback_val, this_val, &[elem, JsValue::int(i as i32), vm.reg(args[0])]) {
NativeResult::Ok(result_val) => {
let sf = vm.kernel().string_forge().as_ref();
let sf = vm.kernel_core().string_forge().as_ref();
if !coercion::to_boolean(result_val, sf) {
return NativeResult::Ok(JsValue::bool(false));
}
@@ -670,12 +670,12 @@ pub fn array_fill(vm: &mut Vm, args: &[u8]) -> NativeResult {
let len = arr.prop_count() as usize;
let value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
let start = if args.len() > 2 {
(coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as i32).max(0) as usize
(coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as i32).max(0) as usize
} else {
0
};
let end = if args.len() > 3 {
let e = coercion::to_number(vm.reg(args[3]), vm.kernel().string_forge().as_ref()) as i32;
let e = coercion::to_number(vm.reg(args[3]), vm.kernel_core().string_forge().as_ref()) as i32;
(e as usize).min(len)
} else {
len
@@ -694,17 +694,17 @@ pub fn array_copy_within(vm: &mut Vm, args: &[u8]) -> NativeResult {
return NativeResult::Ok(vm.reg(args[0]));
}
let target = if args.len() > 1 {
(coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as i32) as usize
(coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as i32) as usize
} else {
0
};
let start = if args.len() > 2 {
(coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as i32) as usize
(coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as i32) as usize
} else {
0
};
let end = if args.len() > 3 {
(coercion::to_number(vm.reg(args[3]), vm.kernel().string_forge().as_ref()) as i32 as usize).min(len)
(coercion::to_number(vm.reg(args[3]), vm.kernel_core().string_forge().as_ref()) as i32 as usize).min(len)
} else {
len
};
@@ -725,7 +725,7 @@ pub fn array_at(vm: &mut Vm, args: &[u8]) -> NativeResult {
let arr = unsafe { &*arr_ptr };
let len = arr.prop_count() as i32;
let mut index = if args.len() > 1 {
coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as i32
coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as i32
} else {
0
};
@@ -762,7 +762,7 @@ pub fn array_find_index(vm: &mut Vm, args: &[u8]) -> NativeResult {
let elem = unsafe { (*arr_ptr).get_prop_at(i) };
match invoke_native_callback(vm, callback_val, this_val, &[elem, JsValue::int(i as i32), vm.reg(args[0])]) {
NativeResult::Ok(r) => {
if coercion::to_boolean(r, vm.kernel().string_forge().as_ref()) {
if coercion::to_boolean(r, vm.kernel_core().string_forge().as_ref()) {
return NativeResult::Ok(JsValue::int(i as i32));
}
}
@@ -786,7 +786,7 @@ pub fn array_find_last(vm: &mut Vm, args: &[u8]) -> NativeResult {
let elem = unsafe { (*arr_ptr).get_prop_at(i) };
match invoke_native_callback(vm, callback_val, this_val, &[elem, JsValue::int(i), vm.reg(args[0])]) {
NativeResult::Ok(r) => {
if coercion::to_boolean(r, vm.kernel().string_forge().as_ref()) {
if coercion::to_boolean(r, vm.kernel_core().string_forge().as_ref()) {
return NativeResult::Ok(elem);
}
}
@@ -831,8 +831,8 @@ pub fn array_sort(vm: &mut Vm, _args: &[u8]) -> NativeResult {
let len = arr.prop_count() as usize;
let mut vals: Vec<JsValue> = (0..len).map(|i| arr.get_prop_at(i)).collect();
vals.sort_by(|a, b| {
let sa = coercion::to_string(vm.kernel().string_forge().as_ref(), *a);
let sb = coercion::to_string(vm.kernel().string_forge().as_ref(), *b);
let sa = coercion::to_string(vm.kernel_core().string_forge().as_ref(), *a);
let sb = coercion::to_string(vm.kernel_core().string_forge().as_ref(), *b);
sa.cmp(&sb)
});
for (i, &v) in vals.iter().enumerate() {
+2 -2
View File
@@ -13,7 +13,7 @@ pub fn boolean_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
} else if arg.is_bool() {
arg.as_bool()
} else if arg.is_string() {
let s = vm.kernel().string_forge().lookup(arg.as_string_index()).unwrap_or_default();
let s = vm.kernel_core().string_forge().lookup(arg.as_string_index()).unwrap_or_default();
!s.is_empty()
} else if arg.is_object() {
true
@@ -28,7 +28,7 @@ pub fn boolean_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
false
};
let boolean_proto = vm.kernel().builtin_world().boolean_proto.as_ptr() as *mut JsObject;
let boolean_proto = vm.session().builtin_world().boolean_proto.as_ptr() as *mut JsObject;
let is_ctor = if this_val.is_object() {
let ptr = this_val.as_js_object_ptr();
if ptr.is_null() {
+20 -20
View File
@@ -82,7 +82,7 @@ pub fn date_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
if ptr.is_null() {
false
} else {
let date_proto = vm.kernel().builtin_world().date_proto.as_ptr() as *mut JsObject;
let date_proto = vm.session().builtin_world().date_proto.as_ptr() as *mut JsObject;
if date_proto.is_null() {
false
} else {
@@ -100,30 +100,30 @@ pub fn date_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let timestamp = if args.len() < 2 {
Utc::now().timestamp_millis() as f64
} else if args.len() > 2 {
let y = coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as i32;
let m = coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as u32;
let y = coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as i32;
let m = coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as u32;
let d = if args.len() > 3 {
coercion::to_number(vm.reg(args[3]), vm.kernel().string_forge().as_ref()) as u32
coercion::to_number(vm.reg(args[3]), vm.kernel_core().string_forge().as_ref()) as u32
} else {
1
};
let h = if args.len() > 4 {
coercion::to_number(vm.reg(args[4]), vm.kernel().string_forge().as_ref()) as u32
coercion::to_number(vm.reg(args[4]), vm.kernel_core().string_forge().as_ref()) as u32
} else {
0
};
let min = if args.len() > 5 {
coercion::to_number(vm.reg(args[5]), vm.kernel().string_forge().as_ref()) as u32
coercion::to_number(vm.reg(args[5]), vm.kernel_core().string_forge().as_ref()) as u32
} else {
0
};
let sec = if args.len() > 6 {
coercion::to_number(vm.reg(args[6]), vm.kernel().string_forge().as_ref()) as u32
coercion::to_number(vm.reg(args[6]), vm.kernel_core().string_forge().as_ref()) as u32
} else {
0
};
let ms = if args.len() > 7 {
coercion::to_number(vm.reg(args[7]), vm.kernel().string_forge().as_ref()) as u32
coercion::to_number(vm.reg(args[7]), vm.kernel_core().string_forge().as_ref()) as u32
} else {
0
};
@@ -137,7 +137,7 @@ pub fn date_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
} else {
let val = vm.reg(args[1]);
if val.is_string() {
let s = vm.kernel().string_forge().lookup(val.as_string_index()).unwrap_or_default();
let s = vm.kernel_core().string_forge().lookup(val.as_string_index()).unwrap_or_default();
let formats = ["%Y-%m-%dT%H:%M:%S%.fZ", "%Y-%m-%dT%H:%M:%S%.f"];
let mut ts = f64::NAN;
for fmt in &formats {
@@ -188,7 +188,7 @@ pub fn date_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let mut obj = JsObject::new_empty(
EMPTY_SHAPE_ID,
JsValue::from_js_object(vm.kernel().builtin_world().date_proto.as_ptr() as *mut JsObject),
JsValue::from_js_object(vm.session().builtin_world().date_proto.as_ptr() as *mut JsObject),
);
obj.type_tag = JsObject::OBJ_TYPE_DATE;
obj.set_prop_at(0, JsValue::float(timestamp));
@@ -209,7 +209,7 @@ pub fn date_parse(vm: &mut Vm, args: &[u8]) -> NativeResult {
if !val.is_string() {
return NativeResult::Ok(JsValue::float(f64::NAN));
}
let s = vm.kernel().string_forge().lookup(val.as_string_index()).unwrap_or_default();
let s = vm.kernel_core().string_forge().lookup(val.as_string_index()).unwrap_or_default();
let formats = ["%Y-%m-%dT%H:%M:%S%.fZ", "%Y-%m-%dT%H:%M:%S%.f"];
let mut ts = f64::NAN;
for fmt in &formats {
@@ -303,7 +303,7 @@ fn local_offset_minutes() -> i32 {
fn get_opt_arg(vm: &Vm, args: &[u8], idx: usize, default: u32) -> u32 {
if args.len() > idx {
coercion::to_number(vm.reg(args[idx]), vm.kernel().string_forge().as_ref()) as u32
coercion::to_number(vm.reg(args[idx]), vm.kernel_core().string_forge().as_ref()) as u32
} else {
default
}
@@ -312,7 +312,7 @@ fn get_opt_arg(vm: &Vm, args: &[u8], idx: usize, default: u32) -> u32 {
pub fn date_set_time(vm: &mut Vm, args: &[u8]) -> NativeResult {
let obj = unsafe { &mut *native_try!(date_this_mut(vm, args)) };
let val = if args.len() > 1 {
coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref())
coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref())
} else {
f64::NAN
};
@@ -322,7 +322,7 @@ pub fn date_set_time(vm: &mut Vm, args: &[u8]) -> NativeResult {
pub fn date_set_full_year(vm: &mut Vm, args: &[u8]) -> NativeResult {
let val = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
let v = coercion::to_number(val, vm.kernel().string_forge().as_ref());
let v = coercion::to_number(val, vm.kernel_core().string_forge().as_ref());
let obj = unsafe { &mut *native_try!(date_this_mut(vm, args)) };
let ms = get_timestamp(obj);
if !ms.is_finite() {
@@ -345,7 +345,7 @@ pub fn date_set_full_year(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
pub fn date_set_month(vm: &mut Vm, args: &[u8]) -> NativeResult {
let val = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
let v = coercion::to_number(val, vm.kernel().string_forge().as_ref());
let v = coercion::to_number(val, vm.kernel_core().string_forge().as_ref());
let obj = unsafe { &mut *native_try!(date_this_mut(vm, args)) };
let ms = get_timestamp(obj);
if !ms.is_finite() {
@@ -363,7 +363,7 @@ pub fn date_set_month(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
pub fn date_set_date(vm: &mut Vm, args: &[u8]) -> NativeResult {
let val = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
let v = coercion::to_number(val, vm.kernel().string_forge().as_ref());
let v = coercion::to_number(val, vm.kernel_core().string_forge().as_ref());
let obj = unsafe { &mut *native_try!(date_this_mut(vm, args)) };
let ms = get_timestamp(obj);
if !ms.is_finite() {
@@ -380,7 +380,7 @@ pub fn date_set_date(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
pub fn date_set_hours(vm: &mut Vm, args: &[u8]) -> NativeResult {
let val = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
let v = coercion::to_number(val, vm.kernel().string_forge().as_ref());
let v = coercion::to_number(val, vm.kernel_core().string_forge().as_ref());
let obj = unsafe { &mut *native_try!(date_this_mut(vm, args)) };
let ms = get_timestamp(obj);
if !ms.is_finite() {
@@ -405,7 +405,7 @@ pub fn date_set_hours(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
pub fn date_set_minutes(vm: &mut Vm, args: &[u8]) -> NativeResult {
let val = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
let v = coercion::to_number(val, vm.kernel().string_forge().as_ref());
let v = coercion::to_number(val, vm.kernel_core().string_forge().as_ref());
let obj = unsafe { &mut *native_try!(date_this_mut(vm, args)) };
let ms = get_timestamp(obj);
if !ms.is_finite() {
@@ -428,7 +428,7 @@ pub fn date_set_minutes(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
pub fn date_set_seconds(vm: &mut Vm, args: &[u8]) -> NativeResult {
let val = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
let v = coercion::to_number(val, vm.kernel().string_forge().as_ref());
let v = coercion::to_number(val, vm.kernel_core().string_forge().as_ref());
let obj = unsafe { &mut *native_try!(date_this_mut(vm, args)) };
let ms = get_timestamp(obj);
if !ms.is_finite() {
@@ -449,7 +449,7 @@ pub fn date_set_seconds(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
pub fn date_set_milliseconds(vm: &mut Vm, args: &[u8]) -> NativeResult {
let val = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
let v = coercion::to_number(val, vm.kernel().string_forge().as_ref());
let v = coercion::to_number(val, vm.kernel_core().string_forge().as_ref());
let obj = unsafe { &mut *native_try!(date_this_mut(vm, args)) };
let ms = get_timestamp(obj);
if !ms.is_finite() {
+20 -20
View File
@@ -14,8 +14,8 @@ fn create_error_object(vm: &mut Vm, error_proto_ptr: *mut JsObject, name: &str,
.epoch()
.alloc(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(error_proto_ptr)));
let sf = Arc::clone(vm.kernel().string_forge());
let sh = Arc::clone(vm.kernel().shape_forge());
let sf = Arc::clone(vm.kernel_core().string_forge());
let sh = Arc::clone(vm.kernel_core().shape_forge());
let si_message = sf.intern("message").0;
let sh_message = sh.make_shape(EMPTY_SHAPE_ID, si_message);
@@ -37,33 +37,33 @@ fn create_error_object(vm: &mut Vm, error_proto_ptr: *mut JsObject, name: &str,
}
pub fn create_type_error(vm: &mut Vm, msg: &str) -> JsValue {
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().type_error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().type_error_proto) as *mut JsObject;
create_error_object(vm, proto_ptr, "TypeError", msg)
}
pub fn create_error(vm: &mut Vm, msg: &str) -> JsValue {
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().error_proto) as *mut JsObject;
create_error_object(vm, proto_ptr, "Error", msg)
}
pub fn create_reference_error(vm: &mut Vm, msg: &str) -> JsValue {
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().reference_error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().reference_error_proto) as *mut JsObject;
create_error_object(vm, proto_ptr, "ReferenceError", msg)
}
pub fn create_range_error(vm: &mut Vm, msg: &str) -> JsValue {
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().range_error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().range_error_proto) as *mut JsObject;
create_error_object(vm, proto_ptr, "RangeError", msg)
}
pub fn create_syntax_error(vm: &mut Vm, msg: &str) -> JsValue {
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().syntax_error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().syntax_error_proto) as *mut JsObject;
create_error_object(vm, proto_ptr, "SyntaxError", msg)
}
fn get_msg(vm: &mut Vm, args: &[u8]) -> String {
if args.len() > 1 {
coercion::to_string(vm.kernel().string_forge().as_ref(), vm.reg(args[1]))
coercion::to_string(vm.kernel_core().string_forge().as_ref(), vm.reg(args[1]))
} else {
String::new()
}
@@ -71,43 +71,43 @@ fn get_msg(vm: &mut Vm, args: &[u8]) -> String {
pub fn error_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let msg = get_msg(vm, args);
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().error_proto) as *mut JsObject;
NativeResult::Ok(create_error_object(vm, proto_ptr, "Error", &msg))
}
pub fn type_error_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let msg = get_msg(vm, args);
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().type_error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().type_error_proto) as *mut JsObject;
NativeResult::Ok(create_error_object(vm, proto_ptr, "TypeError", &msg))
}
pub fn reference_error_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let msg = get_msg(vm, args);
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().reference_error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().reference_error_proto) as *mut JsObject;
NativeResult::Ok(create_error_object(vm, proto_ptr, "ReferenceError", &msg))
}
pub fn range_error_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let msg = get_msg(vm, args);
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().range_error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().range_error_proto) as *mut JsObject;
NativeResult::Ok(create_error_object(vm, proto_ptr, "RangeError", &msg))
}
pub fn syntax_error_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let msg = get_msg(vm, args);
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().syntax_error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().syntax_error_proto) as *mut JsObject;
NativeResult::Ok(create_error_object(vm, proto_ptr, "SyntaxError", &msg))
}
pub fn uri_error_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let msg = get_msg(vm, args);
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().uri_error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().uri_error_proto) as *mut JsObject;
NativeResult::Ok(create_error_object(vm, proto_ptr, "URIError", &msg))
}
pub fn eval_error_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let msg = get_msg(vm, args);
let proto_ptr = P::as_ptr(&vm.kernel().builtin_world().eval_error_proto) as *mut JsObject;
let proto_ptr = P::as_ptr(&vm.session().builtin_world().eval_error_proto) as *mut JsObject;
NativeResult::Ok(create_error_object(vm, proto_ptr, "EvalError", &msg))
}
@@ -133,7 +133,7 @@ pub fn error_to_string(vm: &mut Vm, args: &[u8]) -> NativeResult {
("Error".to_string(), String::new())
};
let result = if msg.is_empty() { name } else { format!("{}: {}", name, msg) };
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))
}
@@ -141,7 +141,7 @@ pub fn error_stack_getter(vm: &mut Vm, _args: &[u8]) -> NativeResult {
let mut lines = vec![];
for frame in vm.frames.iter().rev() {
let func_name = vm
.kernel()
.kernel_core()
.string_forge()
.lookup(frame.function_name)
.unwrap_or_else(|| "<anonymous>".to_string());
@@ -149,7 +149,7 @@ pub fn error_stack_getter(vm: &mut Vm, _args: &[u8]) -> NativeResult {
}
lines.push(" at <anonymous> (native)".to_string());
let result = lines.join("\n");
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))
}
@@ -162,7 +162,7 @@ mod tests {
#[test]
fn error_stack_uses_call_frame_function_name() {
let mut vm = Vm::new();
let name_si = vm.kernel().string_forge().intern("foo").0;
let name_si = vm.kernel_core().string_forge().intern("foo").0;
vm.frames.push(CallFrame {
return_addr: 0,
function_name: name_si,
@@ -178,7 +178,7 @@ mod tests {
});
let stack = error_stack_getter(&mut vm, &[0]).unwrap();
let stack_str = vm.kernel().string_forge().lookup(stack.as_string_index()).unwrap_or_default();
let stack_str = vm.kernel_core().string_forge().lookup(stack.as_string_index()).unwrap_or_default();
assert!(stack_str.contains("foo"), "expected function name in stack: {stack_str}");
}
}
+3 -3
View File
@@ -121,12 +121,12 @@ pub fn function_to_string(vm: &mut Vm, args: &[u8]) -> NativeResult {
));
}
let name_si = vm.kernel().string_forge().intern("name").0;
let name_si = vm.kernel_core().string_forge().intern("name").0;
let name = vm
.resolve_property(func, name_si)
.and_then(|v| {
if v.is_string() {
vm.kernel().string_forge().lookup(v.as_string_index())
vm.kernel_core().string_forge().lookup(v.as_string_index())
} else {
None
}
@@ -146,6 +146,6 @@ pub fn function_to_string(vm: &mut Vm, args: &[u8]) -> NativeResult {
} else {
format!("function {name}() {{ {body} }}")
};
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))
}
+2 -2
View File
@@ -1,7 +1,7 @@
use std::sync::Arc;
use oxide_kernel::kernel::OxideKernel;
use oxide_kernel::kernel::KernelCore;
pub fn register_global_properties(_kernel: &Arc<OxideKernel>, _bump: &bumpalo::Bump) -> Result<(), String> {
pub fn register_global_properties(_kernel: &Arc<KernelCore>, _bump: &bumpalo::Bump) -> Result<(), String> {
Ok(())
}
+7 -7
View File
@@ -22,7 +22,7 @@ pub fn json_parse(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
let text = {
let si = val.as_string_index();
vm.kernel().string_forge().lookup(si).unwrap_or_default()
vm.kernel_core().string_forge().lookup(si).unwrap_or_default()
};
let parsed: serde_json::Value = match serde_json::from_str(&text) {
@@ -46,7 +46,7 @@ fn value_to_jsvalue(vm: &mut Vm, val: &serde_json::Value) -> JsValue {
}
serde_json::Value::String(s) => vm.intern(s),
serde_json::Value::Array(arr) => {
let array_proto = vm.kernel().builtin_world().array_proto.as_ptr() as *mut JsObject;
let array_proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
let n = arr.len();
let array_obj = vm.epoch().alloc(JsObject::new_array(
EMPTY_SHAPE_ID,
@@ -63,12 +63,12 @@ fn value_to_jsvalue(vm: &mut Vm, val: &serde_json::Value) -> JsValue {
JsValue::from_js_object(array_obj)
}
serde_json::Value::Object(map) => {
let object_proto = vm.kernel().builtin_world().object_proto.as_ptr() as *mut JsObject;
let object_proto = vm.session().builtin_world().object_proto.as_ptr() as *mut JsObject;
let mut obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(object_proto));
for (key, val) in map {
let si = vm.kernel().string_forge().intern(key).0;
let si = vm.kernel_core().string_forge().intern(key).0;
let jsv = value_to_jsvalue(vm, val);
let new_shape = vm.kernel().shape_forge().make_shape(obj.shape_id(), si);
let new_shape = vm.kernel_core().shape_forge().make_shape(obj.shape_id(), si);
obj.set_shape_id(new_shape);
obj.ensure_hash_props().push(jsv);
}
@@ -114,7 +114,7 @@ fn jsvalue_to_json(vm: &Vm, val: JsValue, visited: &mut HashSet<*const u8>, out:
}
} else if val.is_string() {
let si = val.as_string_index();
let s = vm.kernel().string_forge().lookup(si).unwrap_or_default();
let s = vm.kernel_core().string_forge().lookup(si).unwrap_or_default();
stringify_string(&s, out);
} else if val.is_object() {
let obj_ptr = val.as_js_object_ptr();
@@ -184,7 +184,7 @@ fn stringify_object(vm: &Vm, obj: &JsObject, visited: &mut HashSet<*const u8>, o
out.push(',');
}
first = false;
let name = vm.kernel().string_forge().lookup(si).unwrap_or_default();
let name = vm.kernel_core().string_forge().lookup(si).unwrap_or_default();
stringify_string(&name, out);
out.push(':');
jsvalue_to_json(vm, val, visited, out)?;
+1 -1
View File
@@ -69,7 +69,7 @@ fn new_map_inner() -> *mut indexmap::IndexMap<SetKey, JsValue> {
}
fn alloc_map(vm: &mut Vm) -> *mut JsObject {
let map_proto = vm.kernel().builtin_world().map_proto.as_ptr() as *mut JsObject;
let map_proto = vm.session().builtin_world().map_proto.as_ptr() as *mut JsObject;
let mut obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(map_proto));
obj.set_map(true);
// SAFETY: new_map_inner() returns a valid Box<IndexMap> pointer; stored as a JsValue
+1 -1
View File
@@ -5,7 +5,7 @@ use crate::native::NativeResult;
use crate::vm::Vm;
fn num(vm: &Vm, reg: u8) -> f64 {
coercion::to_number(vm.reg(reg), vm.kernel().string_forge().as_ref())
coercion::to_number(vm.reg(reg), vm.kernel_core().string_forge().as_ref())
}
fn arg1(vm: &Vm, args: &[u8]) -> f64 {
+14 -14
View File
@@ -6,7 +6,7 @@ use crate::vm::Vm;
pub fn number_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let n = if args.len() > 1 {
coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref())
coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref())
} else {
0.0
};
@@ -40,7 +40,7 @@ pub fn number_is_finite(vm: &mut Vm, args: &[u8]) -> NativeResult {
if val.is_double() {
return NativeResult::Ok(JsValue::bool(val.as_double().is_finite()));
}
let n = coercion::to_number(val, vm.kernel().string_forge().as_ref());
let n = coercion::to_number(val, vm.kernel_core().string_forge().as_ref());
NativeResult::Ok(JsValue::bool(n.is_finite()))
}
@@ -48,7 +48,7 @@ pub fn number_parse_int(vm: &mut Vm, args: &[u8]) -> NativeResult {
if args.len() < 2 {
return NativeResult::Ok(JsValue::float(f64::NAN));
}
let sf = vm.kernel().string_forge().as_ref();
let sf = vm.kernel_core().string_forge().as_ref();
let s = coercion::to_string(sf, vm.reg(args[1]));
let s = s.trim();
@@ -90,7 +90,7 @@ pub fn number_parse_float(vm: &mut Vm, args: &[u8]) -> NativeResult {
if args.len() < 2 {
return NativeResult::Ok(JsValue::float(f64::NAN));
}
let sf = vm.kernel().string_forge().as_ref();
let sf = vm.kernel_core().string_forge().as_ref();
let s = coercion::to_string(sf, vm.reg(args[1]));
let s = s.trim();
@@ -105,9 +105,9 @@ pub fn number_parse_float(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
pub fn number_to_string(vm: &mut Vm, args: &[u8]) -> NativeResult {
let n = coercion::to_number(vm.reg(args[0]), vm.kernel().string_forge().as_ref());
let n = coercion::to_number(vm.reg(args[0]), vm.kernel_core().string_forge().as_ref());
let radix = if args.len() > 1 {
let r = coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as u32;
let r = coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as u32;
r.clamp(2, 36)
} else {
10u32
@@ -156,9 +156,9 @@ pub fn number_to_string(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
pub fn number_to_fixed(vm: &mut Vm, args: &[u8]) -> NativeResult {
let n = coercion::to_number(vm.reg(args[0]), vm.kernel().string_forge().as_ref());
let n = coercion::to_number(vm.reg(args[0]), vm.kernel_core().string_forge().as_ref());
let digits = if args.len() > 1 {
coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as usize
coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as usize
} else {
0usize
}
@@ -170,21 +170,21 @@ pub fn number_to_fixed(vm: &mut Vm, args: &[u8]) -> NativeResult {
pub fn number_is_integer(vm: &mut Vm, args: &[u8]) -> NativeResult {
let val = vm.reg(if args.len() > 1 { args[1] } else { args[0] });
let n = coercion::to_number(val, vm.kernel().string_forge().as_ref());
let n = coercion::to_number(val, vm.kernel_core().string_forge().as_ref());
NativeResult::Ok(JsValue::bool(n.trunc() == n && n.is_finite()))
}
pub fn number_is_safe_integer(vm: &mut Vm, args: &[u8]) -> NativeResult {
let val = vm.reg(if args.len() > 1 { args[1] } else { args[0] });
let n = coercion::to_number(val, vm.kernel().string_forge().as_ref());
let n = coercion::to_number(val, vm.kernel_core().string_forge().as_ref());
let safe = n.trunc() == n && n.is_finite() && n >= -9007199254740991i64 as f64 && n <= 9007199254740991i64 as f64;
NativeResult::Ok(JsValue::bool(safe))
}
pub fn number_to_exponential(vm: &mut Vm, args: &[u8]) -> NativeResult {
let n = coercion::to_number(vm.reg(args[0]), vm.kernel().string_forge().as_ref());
let n = coercion::to_number(vm.reg(args[0]), vm.kernel_core().string_forge().as_ref());
let digits = if args.len() > 1 {
coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as usize
coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as usize
} else {
0usize
}
@@ -200,9 +200,9 @@ pub fn number_to_exponential(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
pub fn number_to_precision(vm: &mut Vm, args: &[u8]) -> NativeResult {
let n = coercion::to_number(vm.reg(args[0]), vm.kernel().string_forge().as_ref());
let n = coercion::to_number(vm.reg(args[0]), vm.kernel_core().string_forge().as_ref());
let precision = if args.len() > 1 {
coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as usize
coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as usize
} else {
0usize
}
+27 -27
View File
@@ -17,7 +17,7 @@ pub(crate) fn walk_own_keys(vm: &Vm, obj: &JsObject) -> Vec<(u32, u32)> {
if id == EMPTY_SHAPE_ID {
break;
}
if let Some(shape) = vm.kernel().shape_forge().get_shape(id) {
if let Some(shape) = vm.kernel_core().shape_forge().get_shape(id) {
cursor = shape.parent;
if shape.property_name != u32::MAX {
shape_ids.push(id);
@@ -27,7 +27,7 @@ pub(crate) fn walk_own_keys(vm: &Vm, obj: &JsObject) -> Vec<(u32, u32)> {
}
}
for id in shape_ids.iter().rev() {
if let Some(shape) = vm.kernel().shape_forge().get_shape(*id) {
if let Some(shape) = vm.kernel_core().shape_forge().get_shape(*id) {
if shape.property_name != 0 {
keys.push((shape.property_name, pos));
}
@@ -61,12 +61,12 @@ pub fn object_keys(vm: &mut Vm, args: &[u8]) -> NativeResult {
let keys = walk_own_keys(vm, obj);
key_names = keys
.iter()
.map(|(si, _offset)| vm.kernel().string_forge().lookup(*si).unwrap_or_default())
.map(|(si, _offset)| vm.kernel_core().string_forge().lookup(*si).unwrap_or_default())
.collect();
}
let n = key_names.len();
let array_proto = vm.kernel().builtin_world().array_proto.as_ptr() as *mut JsObject;
let array_proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
let arr = vm.epoch().alloc(JsObject::new_array(
EMPTY_SHAPE_ID,
JsValue::from_js_object(array_proto),
@@ -158,15 +158,15 @@ pub fn object_define_property(vm: &mut Vm, args: &[u8]) -> NativeResult {
if desc_ptr.is_null() {
return NativeResult::Err(JsValue::undefined());
}
let prop_name_str = coercion::to_string(vm.kernel().string_forge().as_ref(), vm.reg(args[2]));
let si = vm.kernel().string_forge().intern(&prop_name_str).0;
let prop_name_str = coercion::to_string(vm.kernel_core().string_forge().as_ref(), vm.reg(args[2]));
let si = vm.kernel_core().string_forge().intern(&prop_name_str).0;
let value_si = vm.kernel().string_forge().intern("value").0;
let get_si = vm.kernel().string_forge().intern("get").0;
let set_si = vm.kernel().string_forge().intern("set").0;
let writable_si = vm.kernel().string_forge().intern("writable").0;
let enumerable_si = vm.kernel().string_forge().intern("enumerable").0;
let configurable_si = vm.kernel().string_forge().intern("configurable").0;
let value_si = vm.kernel_core().string_forge().intern("value").0;
let get_si = vm.kernel_core().string_forge().intern("get").0;
let set_si = vm.kernel_core().string_forge().intern("set").0;
let writable_si = vm.kernel_core().string_forge().intern("writable").0;
let enumerable_si = vm.kernel_core().string_forge().intern("enumerable").0;
let configurable_si = vm.kernel_core().string_forge().intern("configurable").0;
let desc = unsafe { &*desc_ptr };
let value_field = own_field(vm, desc, value_si);
@@ -174,10 +174,10 @@ pub fn object_define_property(vm: &mut Vm, args: &[u8]) -> NativeResult {
let set_field = own_field(vm, desc, set_si);
let writable_field = own_field(vm, desc, writable_si);
let enumerable = own_field(vm, desc, enumerable_si)
.map(|v| coercion::to_boolean(v, vm.kernel().string_forge().as_ref()))
.map(|v| coercion::to_boolean(v, vm.kernel_core().string_forge().as_ref()))
.unwrap_or(false);
let configurable = own_field(vm, desc, configurable_si)
.map(|v| coercion::to_boolean(v, vm.kernel().string_forge().as_ref()))
.map(|v| coercion::to_boolean(v, vm.kernel_core().string_forge().as_ref()))
.unwrap_or(false);
let has_data = value_field.is_some() || writable_field.is_some();
@@ -208,7 +208,7 @@ pub fn object_define_property(vm: &mut Vm, args: &[u8]) -> NativeResult {
} else {
let value = value_field.unwrap_or(JsValue::undefined());
let writable = writable_field
.map(|v| coercion::to_boolean(v, vm.kernel().string_forge().as_ref()))
.map(|v| coercion::to_boolean(v, vm.kernel_core().string_forge().as_ref()))
.unwrap_or(false);
if vm
.define_data_property(obj, si, value, PropAttributes::new(writable, enumerable, configurable))
@@ -232,8 +232,8 @@ pub fn object_get_own_property_descriptor(vm: &mut Vm, args: &[u8]) -> NativeRes
if obj_ptr.is_null() {
return NativeResult::Ok(JsValue::undefined());
}
let prop_name_str = coercion::to_string(vm.kernel().string_forge().as_ref(), vm.reg(args[2]));
let si = vm.kernel().string_forge().intern(&prop_name_str).0;
let prop_name_str = coercion::to_string(vm.kernel_core().string_forge().as_ref(), vm.reg(args[2]));
let si = vm.kernel_core().string_forge().intern(&prop_name_str).0;
let (found_value, found_meta, found) = {
let obj = unsafe { &*obj_ptr };
@@ -256,9 +256,9 @@ pub fn object_get_own_property_descriptor(vm: &mut Vm, args: &[u8]) -> NativeRes
return NativeResult::Ok(JsValue::undefined());
}
let sf_ptr = vm.kernel().string_forge().as_ref() as *const StringForge;
let sh_ptr = vm.kernel().shape_forge().as_ref() as *const ShapeForge;
let desc_proto = vm.kernel().builtin_world().object_proto.as_ptr() as *mut JsObject;
let sf_ptr = vm.kernel_core().string_forge().as_ref() as *const StringForge;
let sh_ptr = vm.kernel_core().shape_forge().as_ref() as *const ShapeForge;
let desc_proto = vm.session().builtin_world().object_proto.as_ptr() as *mut JsObject;
let desc = vm
.epoch()
.alloc(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(desc_proto)));
@@ -283,7 +283,7 @@ pub fn object_get_own_property_descriptor(vm: &mut Vm, args: &[u8]) -> NativeRes
}
fn own_field(vm: &Vm, obj: &JsObject, prop_si: u32) -> Option<JsValue> {
vm.kernel()
vm.kernel_core()
.shape_forge()
.lookup_position(obj.shape_id(), prop_si)
.and_then(|pos| {
@@ -405,12 +405,12 @@ pub fn object_get_own_property_names(vm: &mut Vm, args: &[u8]) -> NativeResult {
let obj = unsafe { &*obj_ptr };
let keys = walk_own_keys(vm, obj);
keys.iter()
.map(|(si, _)| vm.kernel().string_forge().lookup(*si).unwrap_or_default())
.map(|(si, _)| vm.kernel_core().string_forge().lookup(*si).unwrap_or_default())
.collect()
};
let n = key_names.len();
let array_proto = vm.kernel().builtin_world().array_proto.as_ptr() as *mut JsObject;
let array_proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
let arr = vm.epoch().alloc(JsObject::new_array(
EMPTY_SHAPE_ID,
JsValue::from_js_object(array_proto),
@@ -451,7 +451,7 @@ pub fn object_from_entries(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
let obj_ptr = vm.epoch().alloc(JsObject::new_empty(
EMPTY_SHAPE_ID,
JsValue::from_js_object(vm.kernel().builtin_world().object_proto.as_ptr() as *mut JsObject),
JsValue::from_js_object(vm.session().builtin_world().object_proto.as_ptr() as *mut JsObject),
));
NativeResult::Ok(JsValue::from_js_object(obj_ptr))
}
@@ -515,7 +515,7 @@ pub fn object_entries(vm: &mut Vm, args: &[u8]) -> NativeResult {
let obj = unsafe { &*obj_ptr };
let keys = walk_own_keys(vm, obj);
let n = keys.len();
let array_proto = vm.kernel().builtin_world().array_proto.as_ptr() as *mut JsObject;
let array_proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
let arr = vm.epoch().alloc(JsObject::new_array(
EMPTY_SHAPE_ID,
JsValue::from_js_object(array_proto),
@@ -523,7 +523,7 @@ pub fn object_entries(vm: &mut Vm, args: &[u8]) -> NativeResult {
vm.epoch().bump(),
));
for (i, (si, offset)) in keys.iter().enumerate() {
let key_str = vm.kernel().string_forge().lookup(*si).unwrap_or_default();
let key_str = vm.kernel_core().string_forge().lookup(*si).unwrap_or_default();
let key_val = vm.intern(&key_str);
let val = obj.get_prop_at(*offset);
let pair = vm.epoch().alloc(JsObject::new_array(
@@ -550,7 +550,7 @@ pub fn object_values(vm: &mut Vm, args: &[u8]) -> NativeResult {
let obj = unsafe { &*obj_ptr };
let keys = walk_own_keys(vm, obj);
let n = keys.len();
let array_proto = vm.kernel().builtin_world().array_proto.as_ptr() as *mut JsObject;
let array_proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
let arr = vm.epoch().alloc(JsObject::new_array(
EMPTY_SHAPE_ID,
JsValue::from_js_object(array_proto),
+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))
}
+1 -1
View File
@@ -109,7 +109,7 @@ fn new_set_inner() -> *mut indexmap::IndexSet<SetKey> {
}
fn alloc_set(vm: &mut Vm) -> *mut JsObject {
let set_proto = vm.kernel().builtin_world().set_proto.as_ptr() as *mut JsObject;
let set_proto = vm.session().builtin_world().set_proto.as_ptr() as *mut JsObject;
let mut obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(set_proto));
obj.set_set(true);
// SAFETY: new_set_inner() returns a valid Box<IndexSet> pointer; stored as a JsValue
+20 -20
View File
@@ -8,7 +8,7 @@ use crate::vm::Vm;
use memchr::memchr;
fn this_string(vm: &Vm, args: &[u8]) -> String {
coercion::to_string(vm.kernel().string_forge().as_ref(), vm.reg(args[0]))
coercion::to_string(vm.kernel_core().string_forge().as_ref(), vm.reg(args[0]))
}
pub fn string_value_of(vm: &mut Vm, args: &[u8]) -> NativeResult {
@@ -32,7 +32,7 @@ pub fn string_value_of(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
fn make_string_array(vm: &mut Vm, parts: &[String]) -> JsValue {
let proto = vm.kernel().builtin_world().array_proto.as_ptr() as *mut JsObject;
let proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject;
let n = parts.len();
let arr =
vm.epoch()
@@ -48,7 +48,7 @@ fn make_string_array(vm: &mut Vm, parts: &[String]) -> JsValue {
}
fn as_string(vm: &Vm, val: JsValue) -> String {
coercion::to_string(vm.kernel().string_forge().as_ref(), val)
coercion::to_string(vm.kernel_core().string_forge().as_ref(), val)
}
fn char_len(s: &str) -> usize {
@@ -89,7 +89,7 @@ fn is_regexp_obj(val: JsValue, vm: &Vm) -> bool {
if proto_ptr.is_null() {
return false;
}
let rp = vm.kernel().builtin_world().regexp_proto.as_ptr() as *mut JsObject;
let rp = vm.session().builtin_world().regexp_proto.as_ptr() as *mut JsObject;
std::ptr::eq(proto_ptr, rp)
}
@@ -101,7 +101,7 @@ pub fn string_index_of(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
let search = as_string(vm, vm.reg(args[1]));
let pos = if args.len() > 2 {
(coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as usize).min(n)
(coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as usize).min(n)
} else {
0
};
@@ -132,7 +132,7 @@ pub fn string_includes(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
let search = as_string(vm, vm.reg(args[1]));
let pos = if args.len() > 2 {
(coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as usize).min(n)
(coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as usize).min(n)
} else {
0
};
@@ -157,7 +157,7 @@ pub fn string_char_at(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
return NativeResult::Ok(vm.intern(&take_chars(&s, 1)));
}
let idx = coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as i32;
let idx = coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as i32;
if idx < 0 || idx as usize >= char_len(&s) {
return NativeResult::Ok(vm.intern(""));
}
@@ -173,7 +173,7 @@ pub fn string_char_code_at(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
return NativeResult::Ok(JsValue::int(s.chars().next().unwrap() as i32));
}
let idx = coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as i32;
let idx = coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as i32;
if idx < 0 || idx as usize >= char_len(&s) {
return NativeResult::Ok(JsValue::float(f64::NAN));
}
@@ -182,7 +182,7 @@ pub fn string_char_code_at(vm: &mut Vm, args: &[u8]) -> NativeResult {
pub fn string_concat(vm: &mut Vm, args: &[u8]) -> NativeResult {
let mut result = this_string(vm, args);
let sf = vm.kernel().string_forge().as_ref();
let sf = vm.kernel_core().string_forge().as_ref();
for &arg_reg in args.iter().skip(1) {
result.push_str(&coercion::to_string(sf, vm.reg(arg_reg)));
}
@@ -193,7 +193,7 @@ pub fn string_slice(vm: &mut Vm, args: &[u8]) -> NativeResult {
let s = this_string(vm, args);
let n = char_len(&s) as i32;
let start = if args.len() > 1 {
let v = coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as i32;
let v = coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as i32;
if v < 0 {
(n + v).max(0)
} else {
@@ -203,7 +203,7 @@ pub fn string_slice(vm: &mut Vm, args: &[u8]) -> NativeResult {
0
};
let end = if args.len() > 2 {
let v = coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as i32;
let v = coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as i32;
if v < 0 {
(n + v).max(0)
} else {
@@ -222,14 +222,14 @@ pub fn string_substring(vm: &mut Vm, args: &[u8]) -> NativeResult {
let s = this_string(vm, args);
let n = char_len(&s) as i32;
let mut start = if args.len() > 1 {
(coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as i32)
(coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as i32)
.max(0)
.min(n)
} else {
0
};
let mut end = if args.len() > 2 {
(coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as i32)
(coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as i32)
.max(0)
.min(n)
} else {
@@ -260,7 +260,7 @@ pub fn string_trim(vm: &mut Vm, args: &[u8]) -> NativeResult {
pub fn string_repeat(vm: &mut Vm, args: &[u8]) -> NativeResult {
let s = this_string(vm, args);
let n = if args.len() > 1 {
(coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as usize).min(10000)
(coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as usize).min(10000)
} else {
1
};
@@ -271,7 +271,7 @@ pub fn string_pad_start(vm: &mut Vm, args: &[u8]) -> NativeResult {
let s = this_string(vm, args);
let s_len = char_len(&s);
let target = if args.len() > 1 {
coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as usize
coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as usize
} else {
s_len
};
@@ -291,7 +291,7 @@ pub fn string_pad_end(vm: &mut Vm, args: &[u8]) -> NativeResult {
let s = this_string(vm, args);
let s_len = char_len(&s);
let target = if args.len() > 1 {
coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as usize
coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as usize
} else {
s_len
};
@@ -315,7 +315,7 @@ pub fn string_starts_with(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
let search = as_string(vm, vm.reg(args[1]));
let pos = if args.len() > 2 {
(coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as usize).min(n)
(coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as usize).min(n)
} else {
0
};
@@ -330,7 +330,7 @@ pub fn string_ends_with(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
let search = as_string(vm, vm.reg(args[1]));
let end_pos = if args.len() > 2 {
(coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as usize).min(n)
(coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as usize).min(n)
} else {
n
};
@@ -345,7 +345,7 @@ pub fn string_split(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
let sep_val = vm.reg(args[1]);
let limit = if args.len() > 2 {
coercion::to_number(vm.reg(args[2]), vm.kernel().string_forge().as_ref()) as usize
coercion::to_number(vm.reg(args[2]), vm.kernel_core().string_forge().as_ref()) as usize
} else {
usize::MAX
};
@@ -471,7 +471,7 @@ pub fn string_trim_end(vm: &mut Vm, args: &[u8]) -> NativeResult {
pub fn string_code_point_at(vm: &mut Vm, args: &[u8]) -> NativeResult {
let s = this_string(vm, args);
let pos = if args.len() > 1 {
coercion::to_number(vm.reg(args[1]), vm.kernel().string_forge().as_ref()) as usize
coercion::to_number(vm.reg(args[1]), vm.kernel_core().string_forge().as_ref()) as usize
} else {
0
};
+5 -5
View File
@@ -15,10 +15,10 @@ pub fn symbol_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
if proto.is_object() {
let proto_ptr = proto.as_js_object_ptr();
if !proto_ptr.is_null() {
let sp = vm.kernel().builtin_world().symbol_proto.as_ptr() as *mut JsObject;
let sp = vm.session().builtin_world().symbol_proto.as_ptr() as *mut JsObject;
if std::ptr::eq(proto_ptr, sp) {
return NativeResult::Err(JsValue::string(
vm.kernel().string_forge().intern("TypeError: Symbol is not a constructor").0,
vm.kernel_core().string_forge().intern("TypeError: Symbol is not a constructor").0,
0,
));
}
@@ -28,7 +28,7 @@ pub fn symbol_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
let description = if args.len() > 1 {
coercion::to_string(vm.kernel().string_forge().as_ref(), vm.reg(args[1]))
coercion::to_string(vm.kernel_core().string_forge().as_ref(), vm.reg(args[1]))
} else {
String::new()
};
@@ -43,7 +43,7 @@ pub fn symbol_to_string(vm: &mut Vm, args: &[u8]) -> NativeResult {
let this_val = vm.reg(args[0]);
if !this_val.is_symbol() {
return NativeResult::Err(JsValue::string(
vm.kernel()
vm.kernel_core()
.string_forge()
.intern("TypeError: Symbol.prototype.toString requires a Symbol")
.0,
@@ -54,6 +54,6 @@ pub fn symbol_to_string(vm: &mut Vm, args: &[u8]) -> NativeResult {
let idx = this_val.as_symbol_index();
let desc = vm.symbol_descriptions.get(idx as usize).cloned().unwrap_or_default();
let result = format!("Symbol({})", desc);
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))
}