use std::sync::Arc; use crate::bindings::{apply_binding_table, bind_accessor_getter, bind_global_value, configure_native_constructor}; use oxide_kernel::kernel::{KernelCore, KernelSession}; use oxide_types::object::JsObject; use oxide_types::value::JsValue; /// 把 Temporal 命名空间及其子对象绑定到 global。 pub fn bind_temporal(core: &Arc, session: &KernelSession, global: &mut JsObject) { let world = session.builtin_world(); let temporal_ptr = world.temporal_object.as_ptr() as *mut JsObject; let temporal = unsafe { &mut *temporal_ptr }; // Temporal.Now:非构造器命名空间,方法直接绑定。 let now_ptr = world.temporal_now_object.as_ptr() as *mut JsObject; let now = unsafe { &mut *now_ptr }; apply_binding_table( world, now, core, &[ ("instant", oxide_builtins::temporal::now_instant:: as *const (), 0), ("timeZoneId", oxide_builtins::temporal::now_time_zone_id:: as *const (), 0), ], ); // Temporal.Instant:构造器 + 静态方法 + 原型 getter 与 toString/valueOf。 let instant_ctor_ptr = world.instant_constructor.as_ptr() as *mut JsObject; let instant_ctor = unsafe { &mut *instant_ctor_ptr }; configure_native_constructor( instant_ctor, oxide_builtins::temporal::instant_constructor:: as *const (), 1, ); apply_binding_table( world, instant_ctor, core, &[ ("from", oxide_builtins::temporal::instant_from:: as *const (), 1), ("compare", oxide_builtins::temporal::instant_compare:: as *const (), 2), ( "fromEpochMilliseconds", oxide_builtins::temporal::instant_from_epoch_milliseconds:: as *const (), 1, ), ( "fromEpochNanoseconds", oxide_builtins::temporal::instant_from_epoch_nanoseconds:: as *const (), 1, ), ], ); let instant_proto_ptr = world.instant_proto.as_ptr() as *mut JsObject; let instant_proto = unsafe { &mut *instant_proto_ptr }; bind_accessor_getter( core, session, instant_proto, "epochSeconds", oxide_builtins::temporal::instant_epoch_seconds:: as *const (), ); bind_accessor_getter( core, session, instant_proto, "epochMilliseconds", oxide_builtins::temporal::instant_epoch_milliseconds:: as *const (), ); bind_accessor_getter( core, session, instant_proto, "epochMicroseconds", oxide_builtins::temporal::instant_epoch_microseconds:: as *const (), ); bind_accessor_getter( core, session, instant_proto, "epochNanoseconds", oxide_builtins::temporal::instant_epoch_nanoseconds:: as *const (), ); apply_binding_table( world, instant_proto, core, &[ ("add", oxide_builtins::temporal::instant_add:: as *const (), 1), ("equals", oxide_builtins::temporal::instant_equals:: as *const (), 1), ("round", oxide_builtins::temporal::instant_round:: as *const (), 1), ("subtract", oxide_builtins::temporal::instant_subtract:: as *const (), 1), ("toString", oxide_builtins::temporal::instant_to_string:: as *const (), 0), ("valueOf", oxide_builtins::temporal::instant_value_of:: as *const (), 0), ], ); // Temporal.PlainDate:构造器 + from 静态方法 + year/month/day getter 与 toString。 let plain_date_ctor_ptr = world.plain_date_constructor.as_ptr() as *mut JsObject; let plain_date_ctor = unsafe { &mut *plain_date_ctor_ptr }; configure_native_constructor( plain_date_ctor, oxide_builtins::temporal::plain_date_constructor:: as *const (), 3, ); apply_binding_table( world, plain_date_ctor, core, &[ ("from", oxide_builtins::temporal::plain_date_from:: as *const (), 1), ("compare", oxide_builtins::temporal::plain_date_compare:: as *const (), 2), ], ); let plain_date_proto_ptr = world.plain_date_proto.as_ptr() as *mut JsObject; let plain_date_proto = unsafe { &mut *plain_date_proto_ptr }; bind_accessor_getter( core, session, plain_date_proto, "year", oxide_builtins::temporal::plain_date_year:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "month", oxide_builtins::temporal::plain_date_month:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "day", oxide_builtins::temporal::plain_date_day:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "dayOfWeek", oxide_builtins::temporal::plain_date_day_of_week:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "dayOfYear", oxide_builtins::temporal::plain_date_day_of_year:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "daysInMonth", oxide_builtins::temporal::plain_date_days_in_month:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "daysInWeek", oxide_builtins::temporal::plain_date_days_in_week:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "daysInYear", oxide_builtins::temporal::plain_date_days_in_year:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "monthsInYear", oxide_builtins::temporal::plain_date_months_in_year:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "inLeapYear", oxide_builtins::temporal::plain_date_in_leap_year:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "weekOfYear", oxide_builtins::temporal::plain_date_week_of_year:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "yearOfWeek", oxide_builtins::temporal::plain_date_year_of_week:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "monthCode", oxide_builtins::temporal::plain_date_month_code:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "era", oxide_builtins::temporal::plain_date_era:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "eraYear", oxide_builtins::temporal::plain_date_era_year:: as *const (), ); bind_accessor_getter( core, session, plain_date_proto, "calendarId", oxide_builtins::temporal::plain_date_calendar_id:: as *const (), ); apply_binding_table( world, plain_date_proto, core, &[ ( "toString", oxide_builtins::temporal::plain_date_to_string:: as *const (), 0, ), ("toJSON", oxide_builtins::temporal::plain_date_to_json:: as *const (), 0), ("valueOf", oxide_builtins::temporal::plain_date_value_of:: as *const (), 0), ("equals", oxide_builtins::temporal::plain_date_equals:: as *const (), 1), ("add", oxide_builtins::temporal::plain_date_add:: as *const (), 1), ("subtract", oxide_builtins::temporal::plain_date_subtract:: as *const (), 1), ("until", oxide_builtins::temporal::plain_date_until:: as *const (), 1), ("since", oxide_builtins::temporal::plain_date_since:: as *const (), 1), ], ); // Temporal.PlainTime:构造器 + 6 个分量 getter 与 toString。 let plain_time_ctor_ptr = world.plain_time_constructor.as_ptr() as *mut JsObject; let plain_time_ctor = unsafe { &mut *plain_time_ctor_ptr }; configure_native_constructor( plain_time_ctor, oxide_builtins::temporal::plain_time_constructor:: as *const (), 6, ); let plain_time_proto_ptr = world.plain_time_proto.as_ptr() as *mut JsObject; let plain_time_proto = unsafe { &mut *plain_time_proto_ptr }; bind_accessor_getter( core, session, plain_time_proto, "hour", oxide_builtins::temporal::plain_time_hour:: as *const (), ); bind_accessor_getter( core, session, plain_time_proto, "minute", oxide_builtins::temporal::plain_time_minute:: as *const (), ); bind_accessor_getter( core, session, plain_time_proto, "second", oxide_builtins::temporal::plain_time_second:: as *const (), ); bind_accessor_getter( core, session, plain_time_proto, "millisecond", oxide_builtins::temporal::plain_time_millisecond:: as *const (), ); bind_accessor_getter( core, session, plain_time_proto, "microsecond", oxide_builtins::temporal::plain_time_microsecond:: as *const (), ); bind_accessor_getter( core, session, plain_time_proto, "nanosecond", oxide_builtins::temporal::plain_time_nanosecond:: as *const (), ); apply_binding_table( world, plain_time_proto, core, &[( "toString", oxide_builtins::temporal::plain_time_to_string:: as *const (), 0, )], ); // Temporal.Duration:构造器、from、分量 getter 与 ISO 字符串转换。 let duration_ctor_ptr = world.duration_constructor.as_ptr() as *mut JsObject; let duration_ctor = unsafe { &mut *duration_ctor_ptr }; configure_native_constructor( duration_ctor, oxide_builtins::temporal::duration_constructor:: as *const (), 10, ); apply_binding_table( world, duration_ctor, core, &[("from", oxide_builtins::temporal::duration_from:: as *const (), 1)], ); let duration_proto_ptr = world.duration_proto.as_ptr() as *mut JsObject; let duration_proto = unsafe { &mut *duration_proto_ptr }; for (name, getter) in [ ("years", oxide_builtins::temporal::duration_years:: as *const ()), ("months", oxide_builtins::temporal::duration_months:: as *const ()), ("weeks", oxide_builtins::temporal::duration_weeks:: as *const ()), ("days", oxide_builtins::temporal::duration_days:: as *const ()), ("hours", oxide_builtins::temporal::duration_hours:: as *const ()), ("minutes", oxide_builtins::temporal::duration_minutes:: as *const ()), ("seconds", oxide_builtins::temporal::duration_seconds:: as *const ()), ( "milliseconds", oxide_builtins::temporal::duration_milliseconds:: as *const (), ), ( "microseconds", oxide_builtins::temporal::duration_microseconds:: as *const (), ), ( "nanoseconds", oxide_builtins::temporal::duration_nanoseconds:: as *const (), ), ] { bind_accessor_getter(core, session, duration_proto, name, getter); } apply_binding_table( world, duration_proto, core, &[ ("abs", oxide_builtins::temporal::duration_abs:: as *const (), 0), ("negated", oxide_builtins::temporal::duration_negated:: as *const (), 0), ("with", oxide_builtins::temporal::duration_with:: as *const (), 1), ("total", oxide_builtins::temporal::duration_total:: as *const (), 1), ("toString", oxide_builtins::temporal::duration_to_string:: as *const (), 0), ("valueOf", oxide_builtins::temporal::duration_value_of:: as *const (), 0), ], ); // 把子对象挂到 Temporal 命名空间对象上,再把 Temporal 挂到 global。 bind_global_value(core, temporal, "Now", JsValue::from_js_object(now_ptr)); bind_global_value(core, temporal, "Instant", JsValue::from_js_object(instant_ctor_ptr)); bind_global_value(core, temporal, "PlainDate", JsValue::from_js_object(plain_date_ctor_ptr)); bind_global_value(core, temporal, "PlainTime", JsValue::from_js_object(plain_time_ctor_ptr)); bind_global_value(core, temporal, "Duration", JsValue::from_js_object(duration_ctor_ptr)); bind_global_value(core, global, "Temporal", JsValue::from_js_object(temporal_ptr)); }