1use crate::tag::Tag;
3
4pub type Value = isize;
6
7pub type Intnat = isize;
9
10pub type Uintnat = usize;
12
13pub type Size = Uintnat;
15pub type Color = Uintnat;
16pub type Mark = Uintnat;
17
18pub type Header = Uintnat;
41
42#[cfg(target_endian = "big")]
48#[inline]
49pub const unsafe fn tag_val(val: Value) -> Tag {
50 *(val as *const u8).offset(-1)
51}
52
53#[cfg(target_endian = "little")]
54#[inline]
55pub unsafe fn tag_val(val: Value) -> Tag {
56 *(val as *const u8).offset(-(core::mem::size_of::<Value>() as isize))
57}
58
59#[inline]
60pub unsafe fn hd_val(val: Value) -> Header {
61 *(val as *const Header).offset(-1)
62}
63
64#[inline]
65pub unsafe fn wosize_val(val: Value) -> Size {
66 hd_val(val) >> 10
67}
68
69pub const unsafe fn val_int(i: isize) -> Value {
71 (i << 1) + 1
72}
73
74pub const unsafe fn int_val(val: Value) -> isize {
75 val >> 1
76}
77
78pub fn is_block(v: Value) -> bool {
79 (v & 1) == 0
80}
81
82pub const fn is_long(v: Value) -> bool {
83 (v & 1) != 0
84}
85
86pub const MAX_FIXNUM: Intnat = (1 << (8 * core::mem::size_of::<Intnat>() - 2)) - 1;
91
92pub const MIN_FIXNUM: Intnat = -(1 << (8 * core::mem::size_of::<Intnat>() - 2));
94
95pub unsafe fn field(block: Value, index: usize) -> *mut Value {
101 (block as *mut Value).add(index)
102}
103
104pub const UNIT: Value = unsafe { val_int(0) };
106
107pub const NONE: Value = unsafe { val_int(0) };
109
110pub const EMPTY_LIST: Value = unsafe { val_int(0) };
112
113pub const TRUE: Value = unsafe { val_int(1) };
115
116pub const FALSE: Value = unsafe { val_int(0) };
118
119pub const TAG_CONS: Tag = 0;
121
122pub const TAG_SOME: Tag = 0;
124
125#[inline]
127pub const unsafe fn bp_val(val: Value) -> *const u8 {
128 val as *const u8
129}
130
131#[inline]
133pub const unsafe fn string_val(val: Value) -> *mut u8 {
134 val as *mut u8
135}
136
137extern "C" {
138 pub fn caml_string_length(value: Value) -> Size;
140 pub fn caml_array_length(value: Value) -> Size;
141 pub fn caml_hash_variant(tag: *const u8) -> Value;
142 pub fn caml_get_public_method(obj: Value, tag: Value) -> Value;
143 pub fn caml_sys_store_double_val(x: Value, f: f64);
144 pub fn caml_sys_double_val(x: Value) -> f64;
145 pub fn caml_sys_double_field(x: Value, i: Size) -> f64;
146 pub fn caml_sys_store_double_field(x: Value, index: Size, d: f64);
147}