feat: implement Temporal Instant zoned conversion

This commit is contained in:
爱特每羊队
2026-08-11 20:54:25 +08:00
parent a9e194f2c6
commit 5ec0dc2b7d
12 changed files with 333 additions and 43 deletions
+20 -26
View File
@@ -2,7 +2,8 @@ use oxide_kernel::shape_forge::{ShapeForge, EMPTY_SHAPE_ID};
use oxide_kernel::string_forge::PermInterner;
use oxide_types::object::{JsObject, PropAttributes, PropMetaEntry};
use oxide_types::private_key::{
is_private_name_key, is_symbol_key, symbol_index_from_key, well_known_symbol_id_from_key,
is_private_name_key, is_symbol_key, make_well_known_symbol_key, symbol_index_from_key,
well_known_symbol_id_from_key,
};
use oxide_types::value::JsValue;
@@ -110,7 +111,8 @@ fn decode_symbol_key<H: VmHost>(vm: &H, key: u32) -> JsValue {
5 => world.sym_to_primitive.as_ptr(),
6 => world.sym_has_instance.as_ptr(),
7 => world.sym_match_all.as_ptr(),
_ => world.sym_async_iterator.as_ptr(),
8 => world.sym_async_iterator.as_ptr(),
_ => world.sym_to_string_tag.as_ptr(),
};
return JsValue::from_js_object(ptr as *mut JsObject);
}
@@ -643,29 +645,13 @@ pub fn object_get_own_property_descriptor<H: VmHost>(vm: &mut H, args: &[u8]) ->
Err(msg) => return NativeResult::Err(crate::error::create_type_error(vm, &msg)),
};
let obj_ptr = obj_val.as_js_object_ptr();
let prop_name_str = oxide_runtime_api::to_string(vm.reg(args[2]));
let si = vm.kernel_core().perm_interner().intern(&prop_name_str).0;
let (found_value, found_meta, found) = {
let obj = unsafe { &*obj_ptr };
let keys = walk_own_keys(vm, obj);
let mut found_value = JsValue::undefined();
let mut found_meta = None;
let mut found = false;
for (prop_si, offset) in keys {
if prop_si == si {
found_value = obj.get_prop_at(offset);
found_meta = obj.prop_meta_at(offset);
found = true;
break;
}
}
(found_value, found_meta, found)
};
if !found {
let key = vm.property_key_si(vm.reg(args[2]));
let obj = unsafe { &*obj_ptr };
let Some(offset) = vm.get_own_property_slot(obj, key) else {
return NativeResult::Ok(JsValue::undefined());
}
};
let found_value = obj.get_prop_at(offset);
let found_meta = obj.prop_meta_at(offset);
let sf_ptr = vm.kernel_core().perm_interner().as_ref() as *const PermInterner;
let sh_ptr = vm.kernel_core().shape_forge().as_ref() as *const ShapeForge;
@@ -1029,8 +1015,16 @@ pub fn object_proto_to_string<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResul
"Object"
};
// @@toStringTag 为字符串时覆盖内置标签;getter 抛错透传原异常。
let tag_si = vm.kernel_core().perm_interner().intern("@@toStringTag").0;
match vm.ordinary_get(obj, tag_si, this_val) {
let tag_key = make_well_known_symbol_key(9);
let tag_value = match vm.ordinary_get(obj, tag_key, this_val) {
Ok(value) if !value.is_undefined() => Ok(value),
Ok(_) => {
let legacy_key = vm.kernel_core().perm_interner().intern("@@toStringTag").0;
vm.ordinary_get(obj, legacy_key, this_val)
}
Err(err) => Err(err),
};
match tag_value {
Ok(v) => match vm.lookup_str(v) {
Some(s) => return NativeResult::Ok(vm.new_string(&format!("[object {s}]"))),
None => builtin,