fix(vm): REST_OBJECT 对原始类型 ToObject(number/boolean/symbol 空对象,string 索引字符)
This commit is contained in:
@@ -563,7 +563,28 @@ impl Vm {
|
|||||||
vm_trace!("REST_OBJECT rd={}", rd);
|
vm_trace!("REST_OBJECT rd={}", rd);
|
||||||
let src = self.regs[a];
|
let src = self.regs[a];
|
||||||
if !src.is_object() {
|
if !src.is_object() {
|
||||||
return self.raise_type_error("Cannot destructure property of null/undefined");
|
// ToObject:null/undefined 抛;number/boolean/symbol 无自有属性 → 空对象;
|
||||||
|
// string 的索引字符(UTF-16 code unit)是可枚举自有属性。
|
||||||
|
if src.is_null() || src.is_undefined() {
|
||||||
|
return self.raise_type_error("Cannot destructure property of null/undefined");
|
||||||
|
}
|
||||||
|
let proto_ptr = self.session.builtin_world().object_proto.as_ptr() as *mut JsObject;
|
||||||
|
let rest_ptr = self.alloc_object(JsObject::new_empty(
|
||||||
|
oxide_kernel::shape_forge::EMPTY_SHAPE_ID,
|
||||||
|
JsValue::from_js_object(proto_ptr),
|
||||||
|
));
|
||||||
|
if src.is_string() {
|
||||||
|
let code_units: Vec<u16> = unsafe { (*src.as_string_ptr()).data.encode_utf16().collect() };
|
||||||
|
for (i, unit) in code_units.iter().enumerate() {
|
||||||
|
let s = char::from_u32(*unit as u32).map(|c| c.to_string()).unwrap_or_default();
|
||||||
|
let si = self.kernel_core.perm_interner().intern(&i.to_string()).0;
|
||||||
|
let ch_val = self.new_string(&s);
|
||||||
|
let rest = unsafe { &mut *rest_ptr };
|
||||||
|
self.set_or_create_prop_value(rest, si, ch_val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.regs[rd] = JsValue::from_js_object(rest_ptr);
|
||||||
|
return Ok(());
|
||||||
}
|
}
|
||||||
let excluded_idx = self.bytecode[self.pc] as usize;
|
let excluded_idx = self.bytecode[self.pc] as usize;
|
||||||
self.pc += 1;
|
self.pc += 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user