deft_rquickjs_sys/inlines/
ptr_32_nan_boxing.rs1#[inline]
2pub unsafe fn JS_VALUE_GET_TAG(v: JSValue) -> i32 {
3 (v >> 32) as _
4}
5
6#[inline]
7pub unsafe fn JS_VALUE_GET_INT(v: JSValue) -> i32 {
8 v as i32
9}
10
11#[inline]
12pub unsafe fn JS_VALUE_GET_BOOL(v: JSValue) -> bool {
13 v as i32 != 0
14}
15
16#[inline]
17pub unsafe fn JS_VALUE_GET_PTR(v: JSValue) -> *mut c_void {
18 v as isize as *mut c_void
19}
20
21#[inline]
22pub const fn JS_MKVAL(tag: i32, val: i32) -> JSValue {
23 ((tag as u64) << 32) | (val as u32 as u64)
24}
25
26#[inline]
27pub fn JS_MKPTR(tag: i32, ptr: *mut c_void) -> JSValue {
28 ((tag as u64) << 32) | (ptr as usize as u64)
29}
30
31const JS_FLOAT64_TAG_ADDEND: i32 = 0x7ff80000 - JS_TAG_FIRST + 1;
33
34#[cfg(test)]
35#[test]
36fn test_JS_FLOAT64_TAG_ADDEND() {
37 assert_eq!(JS_FLOAT64_TAG_ADDEND, 0x7ff8000a);
38}
39
40#[inline]
41pub unsafe fn JS_VALUE_GET_FLOAT64(v: JSValue) -> f64 {
42 union U {
43 v: JSValue,
44 d: f64,
45 }
46 let u = U {
47 v: v.wrapping_add((JS_FLOAT64_TAG_ADDEND as u64) << 32),
48 };
49 u.d
50}
51
52pub const JS_NAN: JSValue =
53 (0x7ff8000000000000i64 - ((JS_FLOAT64_TAG_ADDEND as i64) << 32)) as JSValue;
54#[cfg(test)]
57#[test]
58fn test_JS_NAN() {
59 assert_eq!(JS_NAN, 0xfffffff600000000);
60}
61
62#[inline]
63pub fn __JS_NewFloat64(d: f64) -> JSValue {
64 union U {
65 v: JSValue,
66 d: f64,
67 }
68 let u = U { d };
69 unsafe {
70 if (u.v & 0x7fffffffffffffff) > 0x7ff0000000000000 {
72 JS_NAN
73 } else {
74 u.v.wrapping_sub((JS_FLOAT64_TAG_ADDEND as u64) << 32)
75 }
76 }
77}
78
79#[inline]
80pub unsafe fn JS_TAG_IS_FLOAT64(tag: i32) -> bool {
81 (tag - JS_TAG_FIRST) as c_uint >= (JS_TAG_FLOAT64 - JS_TAG_FIRST) as c_uint
82}
83
84#[inline]
85pub unsafe fn JS_VALUE_GET_NORM_TAG(v: JSValue) -> i32 {
86 let tag = JS_VALUE_GET_TAG(v);
87 if JS_TAG_IS_FLOAT64(tag) {
88 JS_TAG_FLOAT64
89 } else {
90 tag
91 }
92}
93
94#[inline]
95pub unsafe fn JS_VALUE_IS_NAN(v: JSValue) -> bool {
96 let tag = JS_VALUE_GET_TAG(v);
97 tag == (JS_NAN >> 32) as i32
98}