mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-27 04:01:11 +08:00
fix: fmt 收口与 clippy ptr_eq 收敛,padStart 测试期望对齐码元口径
This commit is contained in:
@@ -44,9 +44,7 @@ pub fn async_generator_function_constructor<H: VmHost>(vm: &mut H, args: &[u8])
|
|||||||
/// 无实参时函数体为空串。实参转单元序列后经 `source_escape` 源码域转义再
|
/// 无实参时函数体为空串。实参转单元序列后经 `source_escape` 源码域转义再
|
||||||
/// 动态编译(`is_generator` / `is_async` 决定 wrap 源码函数形态)。
|
/// 动态编译(`is_generator` / `is_async` 决定 wrap 源码函数形态)。
|
||||||
/// 编译成功返回函数对象,语法错误抛 SyntaxError,实参 ToPrimitive 失败抛 TypeError。
|
/// 编译成功返回函数对象,语法错误抛 SyntaxError,实参 ToPrimitive 失败抛 TypeError。
|
||||||
fn dynamic_function_core<H: VmHost>(
|
fn dynamic_function_core<H: VmHost>(vm: &mut H, arg_regs: &[u8], is_generator: bool, is_async: bool) -> NativeResult {
|
||||||
vm: &mut H, arg_regs: &[u8], is_generator: bool, is_async: bool,
|
|
||||||
) -> NativeResult {
|
|
||||||
let (param_regs, body_reg) = if arg_regs.is_empty() {
|
let (param_regs, body_reg) = if arg_regs.is_empty() {
|
||||||
(vec![], None)
|
(vec![], None)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -172,11 +172,7 @@ struct JsonNode {
|
|||||||
/// (进入时先计入再判定,防深嵌套在递归展开前耗尽栈)。
|
/// (进入时先计入再判定,防深嵌套在递归展开前耗尽栈)。
|
||||||
/// - 重复对象键:末写胜(键序由 build_js_value 统一)。
|
/// - 重复对象键:末写胜(键序由 build_js_value 统一)。
|
||||||
fn parse_json(text: &str) -> Result<JsonNode, String> {
|
fn parse_json(text: &str) -> Result<JsonNode, String> {
|
||||||
let mut p = JsonParser {
|
let mut p = JsonParser { text, pos: 0, depth: 0 };
|
||||||
text,
|
|
||||||
pos: 0,
|
|
||||||
depth: 0,
|
|
||||||
};
|
|
||||||
p.skip_ws();
|
p.skip_ws();
|
||||||
let node = p.parse_value()?;
|
let node = p.parse_value()?;
|
||||||
p.skip_ws();
|
p.skip_ws();
|
||||||
|
|||||||
@@ -405,10 +405,10 @@ pub(crate) fn init_async_intrinsics(vm: &mut Vm) {
|
|||||||
let af_ctor_label = sf.intern("AsyncFunctionCtor").0;
|
let af_ctor_label = sf.intern("AsyncFunctionCtor").0;
|
||||||
let af_reuse_key = oxide_kernel::builtin::FnWrapperKey::new(0, af_ctor_label, 0, 0);
|
let af_reuse_key = oxide_kernel::builtin::FnWrapperKey::new(0, af_ctor_label, 0, 0);
|
||||||
// SAFETY: async_function_constructor 是 NativeFn 函数项。
|
// SAFETY: async_function_constructor 是 NativeFn 函数项。
|
||||||
let af_ctor_fn_ptr = unsafe {
|
let af_ctor_fn_ptr =
|
||||||
NativeFnPtr::from_raw(oxide_builtins::function::async_function_constructor::<Vm> as *const ())
|
unsafe { NativeFnPtr::from_raw(oxide_builtins::function::async_function_constructor::<Vm> as *const ()) };
|
||||||
};
|
let (af_ctor_ptr, af_ctor_is_new) =
|
||||||
let (af_ctor_ptr, af_ctor_is_new) = match vm.session.builtin_world().find_fn_wrapper(af_reuse_key, af_ctor_fn_ptr, 1) {
|
match vm.session.builtin_world().find_fn_wrapper(af_reuse_key, af_ctor_fn_ptr, 1) {
|
||||||
Some(ptr) => (ptr, false),
|
Some(ptr) => (ptr, false),
|
||||||
None => {
|
None => {
|
||||||
// [[Prototype]] = Function 构造器本体(与 Function 构造器同链,
|
// [[Prototype]] = Function 构造器本体(与 Function 构造器同链,
|
||||||
@@ -431,8 +431,9 @@ pub(crate) fn init_async_intrinsics(vm: &mut Vm) {
|
|||||||
let proto_si = sf.intern("prototype").0;
|
let proto_si = sf.intern("prototype").0;
|
||||||
let proto_shape = sh.make_shape(af_ctor.shape_id(), proto_si);
|
let proto_shape = sh.make_shape(af_ctor.shape_id(), proto_si);
|
||||||
af_ctor.set_shape_id(proto_shape);
|
af_ctor.set_shape_id(proto_shape);
|
||||||
let tag_key =
|
let tag_key = oxide_types::private_key::make_well_known_symbol_key(
|
||||||
oxide_types::private_key::make_well_known_symbol_key(oxide_types::private_key::WELL_KNOWN_SYMBOL_TO_STRING_TAG);
|
oxide_types::private_key::WELL_KNOWN_SYMBOL_TO_STRING_TAG,
|
||||||
|
);
|
||||||
let tag_shape = sh.make_shape(af_ctor.shape_id(), tag_key);
|
let tag_shape = sh.make_shape(af_ctor.shape_id(), tag_key);
|
||||||
af_ctor.set_shape_id(tag_shape);
|
af_ctor.set_shape_id(tag_shape);
|
||||||
let af_ctor_ptr = Box::into_raw(af_ctor);
|
let af_ctor_ptr = Box::into_raw(af_ctor);
|
||||||
|
|||||||
@@ -932,9 +932,7 @@ pub(crate) fn init_async_generator_intrinsics(vm: &mut Vm) {
|
|||||||
let agf_reuse_key = oxide_kernel::builtin::FnWrapperKey::new(0, agf_ctor_label, 0, 0);
|
let agf_reuse_key = oxide_kernel::builtin::FnWrapperKey::new(0, agf_ctor_label, 0, 0);
|
||||||
// SAFETY: async_generator_function_constructor 是 NativeFn 函数项。
|
// SAFETY: async_generator_function_constructor 是 NativeFn 函数项。
|
||||||
let agf_ctor_fn_ptr = unsafe {
|
let agf_ctor_fn_ptr = unsafe {
|
||||||
NativeFnPtr::from_raw(
|
NativeFnPtr::from_raw(oxide_builtins::function::async_generator_function_constructor::<Vm> as *const ())
|
||||||
oxide_builtins::function::async_generator_function_constructor::<Vm> as *const (),
|
|
||||||
)
|
|
||||||
};
|
};
|
||||||
let (agf_ctor_ptr, agf_ctor_is_new) = match world.find_fn_wrapper(agf_reuse_key, agf_ctor_fn_ptr, 1) {
|
let (agf_ctor_ptr, agf_ctor_is_new) = match world.find_fn_wrapper(agf_reuse_key, agf_ctor_fn_ptr, 1) {
|
||||||
Some(ptr) => (ptr, false),
|
Some(ptr) => (ptr, false),
|
||||||
@@ -955,8 +953,9 @@ pub(crate) fn init_async_generator_intrinsics(vm: &mut Vm) {
|
|||||||
let proto_si = sf.intern("prototype").0;
|
let proto_si = sf.intern("prototype").0;
|
||||||
let proto_shape = sh.make_shape(agf_ctor.shape_id(), proto_si);
|
let proto_shape = sh.make_shape(agf_ctor.shape_id(), proto_si);
|
||||||
agf_ctor.set_shape_id(proto_shape);
|
agf_ctor.set_shape_id(proto_shape);
|
||||||
let tag_key =
|
let tag_key = oxide_types::private_key::make_well_known_symbol_key(
|
||||||
oxide_types::private_key::make_well_known_symbol_key(oxide_types::private_key::WELL_KNOWN_SYMBOL_TO_STRING_TAG);
|
oxide_types::private_key::WELL_KNOWN_SYMBOL_TO_STRING_TAG,
|
||||||
|
);
|
||||||
let tag_shape = sh.make_shape(agf_ctor.shape_id(), tag_key);
|
let tag_shape = sh.make_shape(agf_ctor.shape_id(), tag_key);
|
||||||
agf_ctor.set_shape_id(tag_shape);
|
agf_ctor.set_shape_id(tag_shape);
|
||||||
let agf_ctor_ptr = Box::into_raw(agf_ctor);
|
let agf_ctor_ptr = Box::into_raw(agf_ctor);
|
||||||
|
|||||||
@@ -100,7 +100,9 @@ fn bind_function_proto_restricted(core: &Arc<KernelCore>, session: &KernelSessio
|
|||||||
thrower.set_native_arg_count(0);
|
thrower.set_native_arg_count(0);
|
||||||
let name_shape = shape_forge.make_shape(thrower.shape_id(), si_name);
|
let name_shape = shape_forge.make_shape(thrower.shape_id(), si_name);
|
||||||
thrower.set_shape_id(name_shape);
|
thrower.set_shape_id(name_shape);
|
||||||
thrower.ensure_hash_props().push(JsValue::perm_string(string_forge.string_ptr(si_label)));
|
thrower
|
||||||
|
.ensure_hash_props()
|
||||||
|
.push(JsValue::perm_string(string_forge.string_ptr(si_label)));
|
||||||
let name_pos = thrower.hash_props_vec().map_or(0, |v| v.len() as u32).saturating_sub(1);
|
let name_pos = thrower.hash_props_vec().map_or(0, |v| v.len() as u32).saturating_sub(1);
|
||||||
thrower.set_data_meta(name_pos, PropAttributes::new(false, false, true));
|
thrower.set_data_meta(name_pos, PropAttributes::new(false, false, true));
|
||||||
let length_shape = shape_forge.make_shape(thrower.shape_id(), si_length);
|
let length_shape = shape_forge.make_shape(thrower.shape_id(), si_length);
|
||||||
|
|||||||
@@ -772,11 +772,8 @@ pub(crate) fn init_generator_intrinsics(vm: &mut Vm) {
|
|||||||
let gf_ctor_label = sf.intern("GeneratorFunctionCtor").0;
|
let gf_ctor_label = sf.intern("GeneratorFunctionCtor").0;
|
||||||
let gf_reuse_key = oxide_kernel::builtin::FnWrapperKey::new(0, gf_ctor_label, 0, 0);
|
let gf_reuse_key = oxide_kernel::builtin::FnWrapperKey::new(0, gf_ctor_label, 0, 0);
|
||||||
// SAFETY: generator_function_constructor 是 NativeFn 函数项。
|
// SAFETY: generator_function_constructor 是 NativeFn 函数项。
|
||||||
let gf_ctor_fn_ptr = unsafe {
|
let gf_ctor_fn_ptr =
|
||||||
NativeFnPtr::from_raw(
|
unsafe { NativeFnPtr::from_raw(oxide_builtins::function::generator_function_constructor::<Vm> as *const ()) };
|
||||||
oxide_builtins::function::generator_function_constructor::<Vm> as *const (),
|
|
||||||
)
|
|
||||||
};
|
|
||||||
let (gf_ctor_ptr, gf_ctor_is_new) = match world.find_fn_wrapper(gf_reuse_key, gf_ctor_fn_ptr, 1) {
|
let (gf_ctor_ptr, gf_ctor_is_new) = match world.find_fn_wrapper(gf_reuse_key, gf_ctor_fn_ptr, 1) {
|
||||||
Some(ptr) => (ptr, false),
|
Some(ptr) => (ptr, false),
|
||||||
None => {
|
None => {
|
||||||
@@ -796,8 +793,9 @@ pub(crate) fn init_generator_intrinsics(vm: &mut Vm) {
|
|||||||
let proto_si = sf.intern("prototype").0;
|
let proto_si = sf.intern("prototype").0;
|
||||||
let proto_shape = sh.make_shape(gf_ctor.shape_id(), proto_si);
|
let proto_shape = sh.make_shape(gf_ctor.shape_id(), proto_si);
|
||||||
gf_ctor.set_shape_id(proto_shape);
|
gf_ctor.set_shape_id(proto_shape);
|
||||||
let tag_key =
|
let tag_key = oxide_types::private_key::make_well_known_symbol_key(
|
||||||
oxide_types::private_key::make_well_known_symbol_key(oxide_types::private_key::WELL_KNOWN_SYMBOL_TO_STRING_TAG);
|
oxide_types::private_key::WELL_KNOWN_SYMBOL_TO_STRING_TAG,
|
||||||
|
);
|
||||||
let tag_shape = sh.make_shape(gf_ctor.shape_id(), tag_key);
|
let tag_shape = sh.make_shape(gf_ctor.shape_id(), tag_key);
|
||||||
gf_ctor.set_shape_id(tag_shape);
|
gf_ctor.set_shape_id(tag_shape);
|
||||||
let gf_ctor_ptr = Box::into_raw(gf_ctor);
|
let gf_ctor_ptr = Box::into_raw(gf_ctor);
|
||||||
|
|||||||
@@ -44,7 +44,11 @@ impl Vm {
|
|||||||
// 函数形态按生成器 / 异步标志分流,编译标志(is_generator / is_async)
|
// 函数形态按生成器 / 异步标志分流,编译标志(is_generator / is_async)
|
||||||
// 由 emit 层从 AST 读回,函数对象原型与 prototype 属性面随之自动分流。
|
// 由 emit 层从 AST 读回,函数对象原型与 prototype 属性面随之自动分流。
|
||||||
let prefix = if is_async {
|
let prefix = if is_async {
|
||||||
if is_generator { "async function*" } else { "async function" }
|
if is_generator {
|
||||||
|
"async function*"
|
||||||
|
} else {
|
||||||
|
"async function"
|
||||||
|
}
|
||||||
} else if is_generator {
|
} else if is_generator {
|
||||||
"function*"
|
"function*"
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -189,10 +189,10 @@ impl oxide_runtime_api::VmHost for Vm {
|
|||||||
if !proto.is_object() {
|
if !proto.is_object() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
let p = proto.as_js_object_ptr();
|
let p = proto.as_js_object_ptr() as *const JsObject;
|
||||||
p == self.generator_function_proto.as_ptr() as *mut JsObject
|
std::ptr::eq(p, self.generator_function_proto.as_ptr())
|
||||||
|| p == self.async_function_proto.as_ptr() as *mut JsObject
|
|| std::ptr::eq(p, self.async_function_proto.as_ptr())
|
||||||
|| p == self.async_generator_function_proto.as_ptr() as *mut JsObject
|
|| std::ptr::eq(p, self.async_generator_function_proto.as_ptr())
|
||||||
}
|
}
|
||||||
fn promote_if_needed_for_write_ptr(&mut self, target_ptr: *mut JsObject, value: JsValue) -> JsValue {
|
fn promote_if_needed_for_write_ptr(&mut self, target_ptr: *mut JsObject, value: JsValue) -> JsValue {
|
||||||
self.promote_if_needed_for_write_ptr(target_ptr, value)
|
self.promote_if_needed_for_write_ptr(target_ptr, value)
|
||||||
|
|||||||
@@ -1111,8 +1111,9 @@ fn string_slice_astral_character_indices() {
|
|||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert!(r.as_bool());
|
assert!(r.as_bool());
|
||||||
|
// padStart 按码元口径:😀 占 2 单元,距目标 3 仅差 1 单元,补 1 个 x。
|
||||||
let s = eval(&mut vm, "'\\u{1F600}'.padStart(3, 'x')").unwrap();
|
let s = eval(&mut vm, "'\\u{1F600}'.padStart(3, 'x')").unwrap();
|
||||||
assert_eq!(to_str(&vm, s), "xx\u{1F600}");
|
assert_eq!(to_str(&vm, s), "x\u{1F600}");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user