Files
OxideJS-New/crates/oxide_vm/src/bindings/bind_math.rs
T

96 lines
5.0 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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),
("sumPrecise", oxide_builtins::math::math_sum_precise::<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();
}
}