1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#[inline]
pub unsafe fn JS_VALUE_GET_TAG(v: JSValue) -> i32 {
    v.tag as _
}

#[inline]
pub unsafe fn JS_VALUE_GET_NORM_TAG(v: JSValue) -> i32 {
    JS_VALUE_GET_TAG(v)
}

#[inline]
pub unsafe fn JS_VALUE_GET_INT(v: JSValue) -> i32 {
    v.u.int32
}

#[inline]
pub unsafe fn JS_VALUE_GET_BOOL(v: JSValue) -> bool {
    v.u.int32 != 0
}

#[inline]
pub unsafe fn JS_VALUE_GET_FLOAT64(v: JSValue) -> f64 {
    v.u.float64
}

#[inline]
pub unsafe fn JS_VALUE_GET_PTR(v: JSValue) -> *mut c_void {
    v.u.ptr
}

#[inline]
pub const fn JS_MKVAL(tag: i32, val: i32) -> JSValue {
    JSValue {
        u: JSValueUnion { int32: val },
        tag: tag as _,
    }
}

#[inline]
pub fn JS_MKPTR(tag: i32, ptr: *mut c_void) -> JSValue {
    JSValue {
        u: JSValueUnion { ptr },
        tag: tag as _,
    }
}

#[inline]
pub unsafe fn JS_TAG_IS_FLOAT64(tag: i32) -> bool {
    tag == JS_TAG_FLOAT64
}

pub const JS_NAN: JSValue = JSValue {
    tag: JS_TAG_FLOAT64 as _,
    u: JSValueUnion { float64: f64::NAN },
};

#[inline]
pub fn __JS_NewFloat64(d: f64) -> JSValue {
    JSValue {
        tag: JS_TAG_FLOAT64 as _,
        u: JSValueUnion { float64: d },
    }
}

#[inline]
pub unsafe fn JS_VALUE_IS_NAN(v: JSValue) -> bool {
    union U {
        d: f64,
        u: u64,
    }
    if v.tag != JS_TAG_FLOAT64 as _ {
        return false;
    }
    let u = U { d: v.u.float64 };
    (u.u & 0x7fffffffffffffff) > 0x7ff0000000000000
}