mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-24 10:41:11 +08:00
95 lines
4.9 KiB
Rust
95 lines
4.9 KiB
Rust
use std::sync::Arc;
|
||
|
||
use oxide_kernel::bind_methods;
|
||
use oxide_kernel::kernel::{KernelCore, KernelSession};
|
||
use oxide_types::object::{JsObject, PropAttributes};
|
||
use oxide_types::value::JsValue;
|
||
|
||
/// 把 Math 单例对象及其方法(abs/floor/max/random 等)绑定到 global。
|
||
pub fn bind_math(core: &Arc<KernelCore>, session: &KernelSession, global: &mut JsObject) {
|
||
let math_ptr = session.builtin_world().math_object.as_ptr() as *mut JsObject;
|
||
let math = unsafe { &mut *math_ptr };
|
||
|
||
let bw = session.builtin_world();
|
||
let sf = core.perm_interner().as_ref();
|
||
let sh = core.shape_forge().as_ref();
|
||
|
||
bind_methods!(
|
||
bw,
|
||
math,
|
||
sf,
|
||
sh,
|
||
("abs", oxide_builtins::math::math_abs::<crate::vm::Vm>, 1),
|
||
("acos", oxide_builtins::math::math_acos::<crate::vm::Vm>, 1),
|
||
("asin", oxide_builtins::math::math_asin::<crate::vm::Vm>, 1),
|
||
("atan", oxide_builtins::math::math_atan::<crate::vm::Vm>, 1),
|
||
("atan2", oxide_builtins::math::math_atan2::<crate::vm::Vm>, 2),
|
||
("cbrt", oxide_builtins::math::math_cbrt::<crate::vm::Vm>, 1),
|
||
("ceil", oxide_builtins::math::math_ceil::<crate::vm::Vm>, 1),
|
||
("cos", oxide_builtins::math::math_cos::<crate::vm::Vm>, 1),
|
||
("cosh", oxide_builtins::math::math_cosh::<crate::vm::Vm>, 1),
|
||
("exp", oxide_builtins::math::math_exp::<crate::vm::Vm>, 1),
|
||
("floor", oxide_builtins::math::math_floor::<crate::vm::Vm>, 1),
|
||
("hypot", oxide_builtins::math::math_hypot::<crate::vm::Vm>, 2),
|
||
("imul", oxide_builtins::math::math_imul::<crate::vm::Vm>, 2),
|
||
("log", oxide_builtins::math::math_log::<crate::vm::Vm>, 1),
|
||
("log10", oxide_builtins::math::math_log10::<crate::vm::Vm>, 1),
|
||
("log2", oxide_builtins::math::math_log2::<crate::vm::Vm>, 1),
|
||
("max", oxide_builtins::math::math_max::<crate::vm::Vm>, 2),
|
||
("min", oxide_builtins::math::math_min::<crate::vm::Vm>, 2),
|
||
("pow", oxide_builtins::math::math_pow::<crate::vm::Vm>, 2),
|
||
("random", oxide_builtins::math::math_random::<crate::vm::Vm>, 0),
|
||
("round", oxide_builtins::math::math_round::<crate::vm::Vm>, 1),
|
||
("sign", oxide_builtins::math::math_sign::<crate::vm::Vm>, 1),
|
||
("sin", oxide_builtins::math::math_sin::<crate::vm::Vm>, 1),
|
||
("sinh", oxide_builtins::math::math_sinh::<crate::vm::Vm>, 1),
|
||
("sqrt", oxide_builtins::math::math_sqrt::<crate::vm::Vm>, 1),
|
||
("tan", oxide_builtins::math::math_tan::<crate::vm::Vm>, 1),
|
||
("tanh", oxide_builtins::math::math_tanh::<crate::vm::Vm>, 1),
|
||
("trunc", oxide_builtins::math::math_trunc::<crate::vm::Vm>, 1),
|
||
("acosh", oxide_builtins::math::math_acosh::<crate::vm::Vm>, 1),
|
||
("asinh", oxide_builtins::math::math_asinh::<crate::vm::Vm>, 1),
|
||
("atanh", oxide_builtins::math::math_atanh::<crate::vm::Vm>, 1),
|
||
("clz32", oxide_builtins::math::math_clz32::<crate::vm::Vm>, 1),
|
||
("expm1", oxide_builtins::math::math_expm1::<crate::vm::Vm>, 1),
|
||
("f16round", oxide_builtins::math::math_f16round::<crate::vm::Vm>, 1),
|
||
("fround", oxide_builtins::math::math_fround::<crate::vm::Vm>, 1),
|
||
("log1p", oxide_builtins::math::math_log1p::<crate::vm::Vm>, 1),
|
||
);
|
||
|
||
for (name, val) in [
|
||
("PI", std::f64::consts::PI),
|
||
("E", std::f64::consts::E),
|
||
("LN10", std::f64::consts::LN_10),
|
||
("LN2", std::f64::consts::LN_2),
|
||
("LOG10E", std::f64::consts::LOG10_E),
|
||
("LOG2E", std::f64::consts::LOG2_E),
|
||
("SQRT1_2", std::f64::consts::FRAC_1_SQRT_2),
|
||
("SQRT2", std::f64::consts::SQRT_2),
|
||
] {
|
||
let si = core.perm_interner().as_ref().intern(name).0;
|
||
let sh_c = core.shape_forge().as_ref().make_shape(math.shape_id(), si);
|
||
math.set_shape_id(sh_c);
|
||
math.ensure_hash_props().push(JsValue::float(val));
|
||
// Math 常量描述符:{ writable:false, enumerable:false, configurable:false },
|
||
// 保证 Object.keys(Math) 为空(与 Number 常量同款收口)。
|
||
let pos = math.prop_vec_len().saturating_sub(1) as u32;
|
||
math.set_data_meta(pos, PropAttributes::new(false, false, false));
|
||
}
|
||
|
||
// 全局 Math 槽位既有槽原位更新(旧对象指针不得滞留在属性 vec),无槽时
|
||
// 开新槽;描述符非枚举(规范全局命名空间对象属性均 enumerable:false)。
|
||
let si_m = core.perm_interner().intern("Math").0;
|
||
let m_val = JsValue::from_js_object(session.builtin_world().math_object.as_ptr() as *mut JsObject);
|
||
if let Some(pos) = core.shape_forge().lookup_position(global.shape_id(), si_m) {
|
||
global.set_prop_at(pos, m_val);
|
||
} else {
|
||
let m_shape = core.shape_forge().make_shape(global.shape_id(), si_m);
|
||
global.set_shape_id(m_shape);
|
||
global.ensure_hash_props().push(m_val);
|
||
let pos = global.prop_vec_len().saturating_sub(1) as u32;
|
||
global.set_data_meta(pos, PropAttributes::new(true, false, true));
|
||
global.bump_generation();
|
||
}
|
||
}
|