1use crate::*;
3
4#[inline(always)]
5pub unsafe fn lean_closure_fun(o: *mut lean_object) -> *mut c_void {
6 *raw_field!(lean_to_closure(o), lean_closure_object, m_fun)
7}
8
9#[inline(always)]
10pub unsafe fn lean_closure_arity(o: *mut lean_object) -> c_uint {
11 *raw_field!(lean_to_closure(o), lean_closure_object, m_arity) as u32
12}
13
14#[inline(always)]
15pub unsafe fn lean_closure_num_fixed(o: *mut lean_object) -> c_uint {
16 *raw_field!(lean_to_closure(o), lean_closure_object, m_num_fixed) as u32
17}
18
19#[inline(always)]
20pub unsafe fn lean_closure_arg_cptr(o: *mut lean_object) -> *mut *mut lean_object {
21 raw_field!(lean_to_closure(o), lean_closure_object, m_objs) as *mut _
22}
23
24#[inline]
25pub unsafe fn lean_alloc_closure(
26 fun: *mut c_void,
27 arity: c_uint,
28 num_fixed: c_uint,
29) -> lean_obj_res {
30 debug_assert!(arity > 0);
31 debug_assert!(num_fixed < arity);
32 let o = lean_alloc_small_object(
33 core::mem::size_of::<lean_closure_object>() as c_uint
34 + core::mem::size_of::<*const ()>() as c_uint * num_fixed,
35 );
36 lean_set_st_header(o, LeanClosure as u32, 0);
37 (raw_field!(o, lean_closure_object, m_fun) as *mut *mut c_void).write(fun);
38 (raw_field!(o, lean_closure_object, m_arity) as *mut u16).write(arity as u16);
39 (raw_field!(o, lean_closure_object, m_num_fixed) as *mut u16).write(num_fixed as u16);
40 o
41}
42
43#[inline(always)]
44pub unsafe fn lean_closure_get(o: b_lean_obj_arg, i: c_uint) -> b_lean_obj_res {
45 debug_assert!(i <= lean_closure_num_fixed(o));
46 *(raw_field!(lean_to_closure(o), lean_closure_object, m_objs) as *mut *mut lean_object)
47 .add(i as usize)
48}
49
50#[inline(always)]
51pub unsafe fn lean_closure_set(o: u_lean_obj_arg, i: c_uint, a: lean_obj_arg) {
52 debug_assert!(i <= lean_closure_num_fixed(o));
53 (raw_field!(lean_to_closure(o), lean_closure_object, m_objs) as *mut *mut lean_object)
55 .add(i as usize)
56 .write(a)
57}
58
59extern "C" {
60 pub fn lean_apply_1(f: *mut lean_object, a1: *mut lean_object) -> *mut lean_object;
61 pub fn lean_apply_2(
62 f: *mut lean_object,
63 a1: *mut lean_object,
64 a2: *mut lean_object,
65 ) -> *mut lean_object;
66 pub fn lean_apply_3(
67 f: *mut lean_object,
68 a1: *mut lean_object,
69 a2: *mut lean_object,
70 a3: *mut lean_object,
71 ) -> *mut lean_object;
72 pub fn lean_apply_4(
73 f: *mut lean_object,
74 a1: *mut lean_object,
75 a2: *mut lean_object,
76 a3: *mut lean_object,
77 a4: *mut lean_object,
78 ) -> *mut lean_object;
79 pub fn lean_apply_5(
80 f: *mut lean_object,
81 a1: *mut lean_object,
82 a2: *mut lean_object,
83 a3: *mut lean_object,
84 a4: *mut lean_object,
85 a5: *mut lean_object,
86 ) -> *mut lean_object;
87 pub fn lean_apply_6(
88 f: *mut lean_object,
89 a1: *mut lean_object,
90 a2: *mut lean_object,
91 a3: *mut lean_object,
92 a4: *mut lean_object,
93 a5: *mut lean_object,
94 a6: *mut lean_object,
95 ) -> *mut lean_object;
96 pub fn lean_apply_7(
97 f: *mut lean_object,
98 a1: *mut lean_object,
99 a2: *mut lean_object,
100 a3: *mut lean_object,
101 a4: *mut lean_object,
102 a5: *mut lean_object,
103 a6: *mut lean_object,
104 a7: *mut lean_object,
105 ) -> *mut lean_object;
106 pub fn lean_apply_8(
107 f: *mut lean_object,
108 a1: *mut lean_object,
109 a2: *mut lean_object,
110 a3: *mut lean_object,
111 a4: *mut lean_object,
112 a5: *mut lean_object,
113 a6: *mut lean_object,
114 a7: *mut lean_object,
115 a8: *mut lean_object,
116 ) -> *mut lean_object;
117 pub fn lean_apply_9(
118 f: *mut lean_object,
119 a1: *mut lean_object,
120 a2: *mut lean_object,
121 a3: *mut lean_object,
122 a4: *mut lean_object,
123 a5: *mut lean_object,
124 a6: *mut lean_object,
125 a7: *mut lean_object,
126 a8: *mut lean_object,
127 a9: *mut lean_object,
128 ) -> *mut lean_object;
129 pub fn lean_apply_10(
130 f: *mut lean_object,
131 a1: *mut lean_object,
132 a2: *mut lean_object,
133 a3: *mut lean_object,
134 a4: *mut lean_object,
135 a5: *mut lean_object,
136 a6: *mut lean_object,
137 a7: *mut lean_object,
138 a8: *mut lean_object,
139 a9: *mut lean_object,
140 a10: *mut lean_object,
141 ) -> *mut lean_object;
142 pub fn lean_apply_11(
143 f: *mut lean_object,
144 a1: *mut lean_object,
145 a2: *mut lean_object,
146 a3: *mut lean_object,
147 a4: *mut lean_object,
148 a5: *mut lean_object,
149 a6: *mut lean_object,
150 a7: *mut lean_object,
151 a8: *mut lean_object,
152 a9: *mut lean_object,
153 a10: *mut lean_object,
154 a11: *mut lean_object,
155 ) -> *mut lean_object;
156 pub fn lean_apply_12(
157 f: *mut lean_object,
158 a1: *mut lean_object,
159 a2: *mut lean_object,
160 a3: *mut lean_object,
161 a4: *mut lean_object,
162 a5: *mut lean_object,
163 a6: *mut lean_object,
164 a7: *mut lean_object,
165 a8: *mut lean_object,
166 a9: *mut lean_object,
167 a10: *mut lean_object,
168 a11: *mut lean_object,
169 a12: *mut lean_object,
170 ) -> *mut lean_object;
171 pub fn lean_apply_13(
172 f: *mut lean_object,
173 a1: *mut lean_object,
174 a2: *mut lean_object,
175 a3: *mut lean_object,
176 a4: *mut lean_object,
177 a5: *mut lean_object,
178 a6: *mut lean_object,
179 a7: *mut lean_object,
180 a8: *mut lean_object,
181 a9: *mut lean_object,
182 a10: *mut lean_object,
183 a11: *mut lean_object,
184 a12: *mut lean_object,
185 a13: *mut lean_object,
186 ) -> *mut lean_object;
187 pub fn lean_apply_14(
188 f: *mut lean_object,
189 a1: *mut lean_object,
190 a2: *mut lean_object,
191 a3: *mut lean_object,
192 a4: *mut lean_object,
193 a5: *mut lean_object,
194 a6: *mut lean_object,
195 a7: *mut lean_object,
196 a8: *mut lean_object,
197 a9: *mut lean_object,
198 a10: *mut lean_object,
199 a11: *mut lean_object,
200 a12: *mut lean_object,
201 a13: *mut lean_object,
202 a14: *mut lean_object,
203 ) -> *mut lean_object;
204 pub fn lean_apply_15(
205 f: *mut lean_object,
206 a1: *mut lean_object,
207 a2: *mut lean_object,
208 a3: *mut lean_object,
209 a4: *mut lean_object,
210 a5: *mut lean_object,
211 a6: *mut lean_object,
212 a7: *mut lean_object,
213 a8: *mut lean_object,
214 a9: *mut lean_object,
215 a10: *mut lean_object,
216 a11: *mut lean_object,
217 a12: *mut lean_object,
218 a13: *mut lean_object,
219 a14: *mut lean_object,
220 a15: *mut lean_object,
221 ) -> *mut lean_object;
222 pub fn lean_apply_16(
223 f: *mut lean_object,
224 a1: *mut lean_object,
225 a2: *mut lean_object,
226 a3: *mut lean_object,
227 a4: *mut lean_object,
228 a5: *mut lean_object,
229 a6: *mut lean_object,
230 a7: *mut lean_object,
231 a8: *mut lean_object,
232 a9: *mut lean_object,
233 a10: *mut lean_object,
234 a11: *mut lean_object,
235 a12: *mut lean_object,
236 a13: *mut lean_object,
237 a14: *mut lean_object,
238 a15: *mut lean_object,
239 a16: *mut lean_object,
240 ) -> *mut lean_object;
241 pub fn lean_apply_n(f: *mut lean_object, args: *mut *mut lean_object) -> *mut lean_object;
242 pub fn lean_apply_m(f: *mut lean_object, args: *mut *mut lean_object) -> *mut lean_object;
244}