refactor: 添加 release 兜底逻辑与类型标签检查

This commit is contained in:
爱特每羊队
2026-06-14 09:28:48 +08:00
parent 2940d10a9e
commit ec537cb8b3
7 changed files with 67 additions and 53 deletions
+5 -15
View File
@@ -9,27 +9,16 @@ use crate::native::NativeResult;
use crate::vm::Vm;
fn get_timestamp(obj: &JsObject) -> f64 {
obj.get_prop_at(0).as_double()
let v = obj.get_prop_at(0);
if v.is_double() { v.as_double() } else { f64::NAN }
}
fn set_timestamp(obj: &mut JsObject, ms: f64) {
obj.set_prop_at(0, JsValue::float(ms));
}
fn is_date(vm: &Vm, obj: &JsObject) -> bool {
let date_proto = vm.kernel().builtin_world().date_proto.as_ptr() as *mut JsObject;
if date_proto.is_null() {
return false;
}
let proto_ptr = obj.proto().as_js_object_ptr();
if proto_ptr.is_null() {
return false;
}
std::ptr::eq(proto_ptr, date_proto)
}
fn ensure_date(vm: &mut Vm, obj: &JsObject) -> Result<(), JsValue> {
if !is_date(vm, obj) {
if !obj.is_date_obj() {
return Err(crate::builtins::error::create_type_error(vm, "called on incompatible receiver"));
}
Ok(())
@@ -176,7 +165,7 @@ pub fn date_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
if ptr.is_null() {
false
} else {
is_date(vm, unsafe { &*ptr })
unsafe { &*ptr }.is_date_obj()
}
} {
let obj = unsafe { &*val.as_js_object_ptr() };
@@ -201,6 +190,7 @@ pub fn date_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
EMPTY_SHAPE_ID,
JsValue::from_js_object(vm.kernel().builtin_world().date_proto.as_ptr() as *mut JsObject),
);
obj.type_tag = JsObject::OBJ_TYPE_DATE;
obj.set_prop_at(0, JsValue::float(timestamp));
let ptr = vm.epoch().alloc(obj);