feat: 支持对象进行完整 ES 属性解析

This commit is contained in:
2026-06-05 19:10:44 +08:00
parent 89a9ec8b4a
commit 11f2a2e7cb
3 changed files with 71 additions and 21 deletions
+23 -2
View File
@@ -1,3 +1,5 @@
use crate::object::JsObject;
use crate::shape::EMPTY_SHAPE_ID;
use crate::value::JsValue;
use crate::vm::Vm;
@@ -184,6 +186,25 @@ pub fn string_concat(lhs: &str, rhs: &str) -> String {
s
}
fn panic_to_object() {
panic!("ToObject not yet implemented (Phase 6)")
fn panic_to_object() -> ! {
panic!("ToObject failed: null or undefined cannot be converted to object")
}
pub fn to_object(val: JsValue, vm: &mut Vm) -> Result<JsValue, &'static str> {
if val.is_object() {
return Ok(val);
}
if val.is_null() || val.is_undefined() {
return Err("TypeError: Cannot convert null or undefined to object");
}
let proto_ptr = &*vm.object_prototype as *const JsObject as *mut JsObject;
let proto_val = JsValue::from_js_object(proto_ptr);
let obj = vm
.epoch
.alloc(JsObject::new_empty(EMPTY_SHAPE_ID, proto_val));
let obj_val = JsValue::from_js_object(obj);
let obj_ref = unsafe { &mut *obj };
obj_ref.set_inline_prop(0, val);
obj_ref.set_prop_count(1);
Ok(obj_val)
}