Skip to main content

jl_sys/
bindings.rs

1pub use functions::*;
2pub use globals::*;
3
4/// Globals from libjulia used by jlrs
5pub mod globals {
6    #[cfg_attr(
7        any(windows, target_os = "windows", feature = "windows"),
8        link(name = "libjulia", kind = "raw-dylib")
9    )]
10    unsafe extern "C" {
11        pub static mut jl_typeofbottom_type: *mut crate::types::jl_datatype_t;
12
13        pub static mut jl_datatype_type: *mut crate::types::jl_datatype_t;
14
15        pub static mut jl_uniontype_type: *mut crate::types::jl_datatype_t;
16
17        pub static mut jl_unionall_type: *mut crate::types::jl_datatype_t;
18
19        pub static mut jl_tvar_type: *mut crate::types::jl_datatype_t;
20
21        pub static mut jl_any_type: *mut crate::types::jl_datatype_t;
22
23        pub static mut jl_type_type: *mut crate::types::jl_unionall_t;
24
25        pub static mut jl_typename_type: *mut crate::types::jl_datatype_t;
26
27        pub static mut jl_type_typename: *mut crate::types::jl_typename_t;
28
29        pub static mut jl_symbol_type: *mut crate::types::jl_datatype_t;
30
31        pub static mut jl_const_type: *mut crate::types::jl_datatype_t;
32
33        pub static mut jl_simplevector_type: *mut crate::types::jl_datatype_t;
34
35        pub static mut jl_tuple_typename: *mut crate::types::jl_typename_t;
36
37        pub static mut jl_vecelement_typename: *mut crate::types::jl_typename_t;
38
39        pub static mut jl_anytuple_type: *mut crate::types::jl_datatype_t;
40
41        pub static mut jl_emptytuple_type: *mut crate::types::jl_datatype_t;
42
43        pub static mut jl_anytuple_type_type: *mut crate::types::jl_unionall_t;
44
45        pub static mut jl_function_type: *mut crate::types::jl_datatype_t;
46
47        pub static mut jl_bottom_type: *mut crate::types::jl_value_t;
48
49        pub static mut jl_module_type: *mut crate::types::jl_datatype_t;
50
51        pub static mut jl_abstractarray_type: *mut crate::types::jl_unionall_t;
52
53        pub static mut jl_densearray_type: *mut crate::types::jl_unionall_t;
54
55        pub static mut jl_array_type: *mut crate::types::jl_unionall_t;
56
57        pub static mut jl_array_typename: *mut crate::types::jl_typename_t;
58
59        pub static mut jl_abstractstring_type: *mut crate::types::jl_datatype_t;
60
61        pub static mut jl_string_type: *mut crate::types::jl_datatype_t;
62
63        pub static mut jl_errorexception_type: *mut crate::types::jl_datatype_t;
64
65        pub static mut jl_argumenterror_type: *mut crate::types::jl_datatype_t;
66
67        pub static mut jl_loaderror_type: *mut crate::types::jl_datatype_t;
68
69        pub static mut jl_initerror_type: *mut crate::types::jl_datatype_t;
70
71        pub static mut jl_typeerror_type: *mut crate::types::jl_datatype_t;
72
73        pub static mut jl_methoderror_type: *mut crate::types::jl_datatype_t;
74
75        pub static mut jl_undefvarerror_type: *mut crate::types::jl_datatype_t;
76
77        pub static mut jl_stackovf_exception: *mut crate::types::jl_value_t;
78
79        pub static mut jl_memory_exception: *mut crate::types::jl_value_t;
80
81        pub static mut jl_readonlymemory_exception: *mut crate::types::jl_value_t;
82
83        pub static mut jl_diverror_exception: *mut crate::types::jl_value_t;
84
85        pub static mut jl_undefref_exception: *mut crate::types::jl_value_t;
86
87        pub static mut jl_interrupt_exception: *mut crate::types::jl_value_t;
88
89        pub static mut jl_boundserror_type: *mut crate::types::jl_datatype_t;
90
91        pub static mut jl_an_empty_vec_any: *mut crate::types::jl_value_t;
92
93        pub static mut jl_an_empty_string: *mut crate::types::jl_value_t;
94
95        pub static mut jl_bool_type: *mut crate::types::jl_datatype_t;
96
97        pub static mut jl_char_type: *mut crate::types::jl_datatype_t;
98
99        pub static mut jl_int8_type: *mut crate::types::jl_datatype_t;
100
101        pub static mut jl_uint8_type: *mut crate::types::jl_datatype_t;
102
103        pub static mut jl_int16_type: *mut crate::types::jl_datatype_t;
104
105        pub static mut jl_uint16_type: *mut crate::types::jl_datatype_t;
106
107        pub static mut jl_int32_type: *mut crate::types::jl_datatype_t;
108
109        pub static mut jl_uint32_type: *mut crate::types::jl_datatype_t;
110
111        pub static mut jl_int64_type: *mut crate::types::jl_datatype_t;
112
113        pub static mut jl_uint64_type: *mut crate::types::jl_datatype_t;
114
115        pub static mut jl_float16_type: *mut crate::types::jl_datatype_t;
116
117        pub static mut jl_float32_type: *mut crate::types::jl_datatype_t;
118
119        pub static mut jl_float64_type: *mut crate::types::jl_datatype_t;
120
121        pub static mut jl_floatingpoint_type: *mut crate::types::jl_datatype_t;
122
123        pub static mut jl_number_type: *mut crate::types::jl_datatype_t;
124
125        pub static mut jl_nothing_type: *mut crate::types::jl_datatype_t;
126
127        pub static mut jl_signed_type: *mut crate::types::jl_datatype_t;
128
129        pub static mut jl_voidpointer_type: *mut crate::types::jl_datatype_t;
130
131        pub static mut jl_uint8pointer_type: *mut crate::types::jl_datatype_t;
132
133        pub static mut jl_pointer_type: *mut crate::types::jl_unionall_t;
134
135        pub static mut jl_llvmpointer_type: *mut crate::types::jl_unionall_t;
136
137        pub static mut jl_ref_type: *mut crate::types::jl_unionall_t;
138
139        pub static mut jl_pointer_typename: *mut crate::types::jl_typename_t;
140
141        pub static mut jl_llvmpointer_typename: *mut crate::types::jl_typename_t;
142
143        pub static mut jl_namedtuple_typename: *mut crate::types::jl_typename_t;
144
145        pub static mut jl_namedtuple_type: *mut crate::types::jl_unionall_t;
146
147        pub static mut jl_task_type: *mut crate::types::jl_datatype_t;
148
149        pub static mut jl_array_uint8_type: *mut crate::types::jl_value_t;
150
151        pub static mut jl_array_any_type: *mut crate::types::jl_value_t;
152
153        pub static mut jl_array_symbol_type: *mut crate::types::jl_value_t;
154
155        pub static mut jl_array_int32_type: *mut crate::types::jl_value_t;
156
157        pub static mut jl_expr_type: *mut crate::types::jl_datatype_t;
158
159        pub static mut jl_emptysvec: *mut crate::types::jl_svec_t;
160
161        pub static mut jl_emptytuple: *mut crate::types::jl_value_t;
162
163        pub static mut jl_true: *mut crate::types::jl_value_t;
164
165        pub static mut jl_false: *mut crate::types::jl_value_t;
166
167        pub static mut jl_nothing: *mut crate::types::jl_value_t;
168
169        pub static mut jl_main_module: *mut crate::types::jl_module_t;
170
171        pub static mut jl_core_module: *mut crate::types::jl_module_t;
172
173        pub static mut jl_base_module: *mut crate::types::jl_module_t;
174
175        pub static mut jl_vararg_type: *mut crate::types::jl_datatype_t;
176
177        pub static mut jl_atomicerror_type: *mut crate::types::jl_datatype_t;
178
179        pub static mut jl_pair_type: *mut crate::types::jl_value_t;
180
181        pub static mut jl_array_uint64_type: *mut crate::types::jl_value_t;
182
183        pub static jl_n_threads: std::sync::atomic::AtomicI32;
184
185        pub static jl_n_threadpools: std::cell::UnsafeCell<std::ffi::c_int>;
186
187        pub static jl_n_threads_per_pool: std::cell::UnsafeCell<*mut std::ffi::c_int>;
188
189        pub static mut jl_n_gcthreads: std::ffi::c_int;
190
191        // Added in Julia 1.11
192
193        #[cfg(not(julia_1_10))]
194        pub static mut jl_genericmemory_type: *mut crate::types::jl_unionall_t;
195
196        #[cfg(not(julia_1_10))]
197        pub static mut jl_genericmemory_typename: *mut crate::types::jl_typename_t;
198
199        #[cfg(not(julia_1_10))]
200        pub static mut jl_genericmemoryref_type: *mut crate::types::jl_unionall_t;
201
202        #[cfg(not(julia_1_10))]
203        pub static mut jl_genericmemoryref_typename: *mut crate::types::jl_typename_t;
204
205        #[cfg(not(julia_1_10))]
206        pub static mut jl_an_empty_memory_any: *mut crate::types::jl_value_t;
207
208        #[cfg(not(julia_1_10))]
209        pub static mut jl_bfloat16_type: *mut crate::types::jl_datatype_t;
210
211        #[cfg(not(julia_1_10))]
212        pub static mut jl_array_uint32_type: *mut crate::types::jl_value_t;
213
214        // Removed in Julia 1.12
215
216        #[cfg(any(julia_1_10, julia_1_11))]
217        pub static mut jl_kwcall_func: *mut crate::types::jl_value_t;
218
219        // Added in Julia 1.14
220        #[cfg(not(any(julia_1_10, julia_1_11, julia_1_12, julia_1_13)))]
221        pub static mut jl_typeeq_type: *mut crate::types::jl_datatype_t;
222    }
223}
224
225/// Functions from libjulia used by jlrs
226pub mod functions {
227    #[cfg_attr(
228        any(windows, target_os = "windows", feature = "windows"),
229        link(name = "libjulia", kind = "raw-dylib")
230    )]
231    unsafe extern "C" {
232        pub fn jl_gc_enable(on: std::ffi::c_int) -> std::ffi::c_int;
233
234        pub fn jl_gc_is_enabled() -> std::ffi::c_int;
235
236        pub fn jl_get_pgcstack() -> *mut *mut crate::types::jl_gcframe_t;
237
238        pub fn jl_gc_collect(arg0: crate::types::jl_gc_collection_t);
239
240        pub fn jl_gc_add_finalizer(
241            v: *mut crate::types::jl_value_t,
242            f: *mut crate::types::jl_value_t,
243        );
244
245        pub fn jl_gc_add_ptr_finalizer(
246            ptls: *mut crate::types::jl_tls_states_t,
247            v: *mut crate::types::jl_value_t,
248            f: *mut std::ffi::c_void,
249        );
250
251        pub fn jl_subtype(
252            a: *mut crate::types::jl_value_t,
253            b: *mut crate::types::jl_value_t,
254        ) -> std::ffi::c_int;
255
256        pub fn jl_object_id(v: *mut crate::types::jl_value_t) -> usize;
257
258        pub fn jl_has_free_typevars(v: *mut crate::types::jl_value_t) -> std::ffi::c_int;
259
260        pub fn jl_has_typevar(
261            t: *mut crate::types::jl_value_t,
262            v: *mut crate::types::jl_tvar_t,
263        ) -> std::ffi::c_int;
264
265        pub fn jl_isa(
266            a: *mut crate::types::jl_value_t,
267            t: *mut crate::types::jl_value_t,
268        ) -> std::ffi::c_int;
269
270        pub fn jl_type_union(
271            ts: *mut *mut crate::types::jl_value_t,
272            n: usize,
273        ) -> *mut crate::types::jl_value_t;
274
275        pub fn jl_type_unionall(
276            v: *mut crate::types::jl_tvar_t,
277            body: *mut crate::types::jl_value_t,
278        ) -> *mut crate::types::jl_value_t;
279
280        pub fn jl_typename_str(v: *mut crate::types::jl_value_t) -> *const std::ffi::c_char;
281
282        pub fn jl_typeof_str(v: *mut crate::types::jl_value_t) -> *const std::ffi::c_char;
283
284        pub fn jl_new_typevar(
285            name: *mut crate::types::jl_sym_t,
286            lb: *mut crate::types::jl_value_t,
287            ub: *mut crate::types::jl_value_t,
288        ) -> *mut crate::types::jl_tvar_t;
289
290        pub fn jl_apply_type(
291            tc: *mut crate::types::jl_value_t,
292            params: *mut *mut crate::types::jl_value_t,
293            n: usize,
294        ) -> *mut crate::types::jl_value_t;
295
296        pub fn jl_new_datatype(
297            name: *mut crate::types::jl_sym_t,
298            module: *mut crate::types::jl_module_t,
299            sup: *mut crate::types::jl_datatype_t,
300            parameters: *mut crate::types::jl_svec_t,
301            fnames: *mut crate::types::jl_svec_t,
302            ftypes: *mut crate::types::jl_svec_t,
303            fattrs: *mut crate::types::jl_svec_t,
304            abstr: std::ffi::c_int,
305            mutabl: std::ffi::c_int,
306            ninitialized: std::ffi::c_int,
307        ) -> *mut crate::types::jl_datatype_t;
308
309        pub fn jl_new_structv(
310            ty: *mut crate::types::jl_datatype_t,
311            args: *mut *mut crate::types::jl_value_t,
312            na: u32,
313        ) -> *mut crate::types::jl_value_t;
314
315        pub fn jl_new_struct_uninit(
316            ty: *mut crate::types::jl_datatype_t,
317        ) -> *mut crate::types::jl_value_t;
318
319        pub fn jl_alloc_svec(n: usize) -> *mut crate::types::jl_svec_t;
320
321        pub fn jl_alloc_svec_uninit(n: usize) -> *mut crate::types::jl_svec_t;
322
323        pub fn jl_svec_copy(a: *mut crate::types::jl_svec_t) -> *mut crate::types::jl_svec_t;
324
325        pub fn jl_symbol_n(str: *const std::ffi::c_char, len: usize)
326        -> *mut crate::types::jl_sym_t;
327
328        pub fn jl_gensym() -> *mut crate::types::jl_sym_t;
329
330        pub fn jl_tagged_gensym(
331            str: *const std::ffi::c_char,
332            len: usize,
333        ) -> *mut crate::types::jl_sym_t;
334
335        pub fn jl_box_bool(x: i8) -> *mut crate::types::jl_value_t;
336
337        pub fn jl_box_int8(x: i8) -> *mut crate::types::jl_value_t;
338
339        pub fn jl_box_uint8(x: u8) -> *mut crate::types::jl_value_t;
340
341        pub fn jl_box_int16(x: i16) -> *mut crate::types::jl_value_t;
342
343        pub fn jl_box_uint16(x: u16) -> *mut crate::types::jl_value_t;
344
345        pub fn jl_box_int32(x: i32) -> *mut crate::types::jl_value_t;
346
347        pub fn jl_box_uint32(x: u32) -> *mut crate::types::jl_value_t;
348
349        pub fn jl_box_char(x: u32) -> *mut crate::types::jl_value_t;
350
351        pub fn jl_box_int64(x: i64) -> *mut crate::types::jl_value_t;
352
353        pub fn jl_box_uint64(x: u64) -> *mut crate::types::jl_value_t;
354
355        pub fn jl_box_float32(x: f32) -> *mut crate::types::jl_value_t;
356
357        pub fn jl_box_float64(x: f64) -> *mut crate::types::jl_value_t;
358
359        pub fn jl_box_voidpointer(x: *mut std::ffi::c_void) -> *mut crate::types::jl_value_t;
360
361        pub fn jl_unbox_bool(v: *mut crate::types::jl_value_t) -> i8;
362
363        pub fn jl_unbox_int8(v: *mut crate::types::jl_value_t) -> i8;
364
365        pub fn jl_unbox_uint8(v: *mut crate::types::jl_value_t) -> u8;
366
367        pub fn jl_unbox_int16(v: *mut crate::types::jl_value_t) -> i16;
368
369        pub fn jl_unbox_uint16(v: *mut crate::types::jl_value_t) -> u16;
370
371        pub fn jl_unbox_int32(v: *mut crate::types::jl_value_t) -> i32;
372
373        pub fn jl_unbox_uint32(v: *mut crate::types::jl_value_t) -> u32;
374
375        pub fn jl_unbox_int64(v: *mut crate::types::jl_value_t) -> i64;
376
377        pub fn jl_unbox_uint64(v: *mut crate::types::jl_value_t) -> u64;
378
379        pub fn jl_unbox_float32(v: *mut crate::types::jl_value_t) -> f32;
380
381        pub fn jl_unbox_float64(v: *mut crate::types::jl_value_t) -> f64;
382
383        pub fn jl_unbox_voidpointer(v: *mut crate::types::jl_value_t) -> *mut std::ffi::c_void;
384
385        pub fn jl_field_index(
386            t: *mut crate::types::jl_datatype_t,
387            fld: *mut crate::types::jl_sym_t,
388            err: std::ffi::c_int,
389        ) -> std::ffi::c_int;
390
391        pub fn jl_get_nth_field(
392            v: *mut crate::types::jl_value_t,
393            i: usize,
394        ) -> *mut crate::types::jl_value_t;
395
396        pub fn jl_get_nth_field_noalloc(
397            v: *mut crate::types::jl_value_t,
398            i: usize,
399        ) -> *mut crate::types::jl_value_t;
400
401        pub fn jl_set_nth_field(
402            v: *mut crate::types::jl_value_t,
403            i: usize,
404            rhs: *mut crate::types::jl_value_t,
405        );
406
407        pub fn jl_islayout_inline(
408            eltype: *mut crate::types::jl_value_t,
409            fsz: *mut usize,
410            al: *mut usize,
411        ) -> std::ffi::c_int;
412
413        pub fn jl_ptr_to_array_1d(
414            atype: *mut crate::types::jl_value_t,
415            data: *mut std::ffi::c_void,
416            nel: usize,
417            own_buffer: std::ffi::c_int,
418        ) -> *mut crate::types::jl_array_t;
419
420        pub fn jl_ptr_to_array(
421            atype: *mut crate::types::jl_value_t,
422            data: *mut std::ffi::c_void,
423            dims: *mut crate::types::jl_value_t,
424            own_buffer: std::ffi::c_int,
425        ) -> *mut crate::types::jl_array_t;
426
427        pub fn jl_alloc_array_1d(
428            atype: *mut crate::types::jl_value_t,
429            nr: usize,
430        ) -> *mut crate::types::jl_array_t;
431
432        pub fn jl_alloc_array_2d(
433            atype: *mut crate::types::jl_value_t,
434            nr: usize,
435            nc: usize,
436        ) -> *mut crate::types::jl_array_t;
437
438        pub fn jl_alloc_array_3d(
439            atype: *mut crate::types::jl_value_t,
440            nr: usize,
441            nc: usize,
442            z: usize,
443        ) -> *mut crate::types::jl_array_t;
444
445        pub fn jl_pchar_to_array(
446            str: *const std::ffi::c_char,
447            len: usize,
448        ) -> *mut crate::types::jl_array_t;
449
450        pub fn jl_pchar_to_string(
451            str: *const std::ffi::c_char,
452            len: usize,
453        ) -> *mut crate::types::jl_value_t;
454
455        pub fn jl_array_to_string(
456            a: *mut crate::types::jl_array_t,
457        ) -> *mut crate::types::jl_value_t;
458
459        pub fn jl_alloc_vec_any(n: usize) -> *mut crate::types::jl_array_t;
460
461        pub fn jl_array_grow_end(a: *mut crate::types::jl_array_t, inc: usize);
462
463        pub fn jl_array_del_end(a: *mut crate::types::jl_array_t, dec: usize);
464
465        pub fn jl_array_ptr_1d_push(
466            a: *mut crate::types::jl_array_t,
467            item: *mut crate::types::jl_value_t,
468        );
469
470        pub fn jl_array_ptr_1d_append(
471            a: *mut crate::types::jl_array_t,
472            a2: *mut crate::types::jl_array_t,
473        );
474
475        pub fn jl_apply_array_type(
476            ty: *mut crate::types::jl_value_t,
477            dim: usize,
478        ) -> *mut crate::types::jl_value_t;
479
480        pub fn jl_array_eltype(a: *mut crate::types::jl_value_t) -> *mut std::ffi::c_void;
481
482        pub fn jl_array_rank(a: *mut crate::types::jl_value_t) -> std::ffi::c_int;
483
484        pub fn jl_string_ptr(s: *mut crate::types::jl_value_t) -> *const std::ffi::c_char;
485
486        pub fn jl_is_const(
487            m: *mut crate::types::jl_module_t,
488            var: *mut crate::types::jl_sym_t,
489        ) -> std::ffi::c_int;
490
491        pub fn jl_get_global(
492            m: *mut crate::types::jl_module_t,
493            var: *mut crate::types::jl_sym_t,
494        ) -> *mut crate::types::jl_value_t;
495
496        pub fn jl_set_global(
497            m: *mut crate::types::jl_module_t,
498            var: *mut crate::types::jl_sym_t,
499            val: *mut crate::types::jl_value_t,
500        );
501
502        pub fn jl_cpu_threads() -> std::ffi::c_int;
503
504        pub fn jl_is_debugbuild() -> std::ffi::c_int;
505
506        pub fn jl_get_UNAME() -> *mut crate::types::jl_sym_t;
507
508        pub fn jl_exception_occurred() -> *mut crate::types::jl_value_t;
509
510        pub fn jl_is_initialized() -> std::ffi::c_int;
511
512        pub fn jl_atexit_hook(status: std::ffi::c_int);
513
514        pub fn jl_eval_string(str: *const std::ffi::c_char) -> *mut crate::types::jl_value_t;
515
516        pub fn jl_call(
517            f: *mut crate::types::jl_value_t,
518            args: *mut *mut crate::types::jl_value_t,
519            nargs: u32,
520        ) -> *mut crate::types::jl_value_t;
521
522        pub fn jl_call0(f: *mut crate::types::jl_value_t) -> *mut crate::types::jl_value_t;
523
524        pub fn jl_call1(
525            f: *mut crate::types::jl_value_t,
526            a: *mut crate::types::jl_value_t,
527        ) -> *mut crate::types::jl_value_t;
528
529        pub fn jl_call2(
530            f: *mut crate::types::jl_value_t,
531            a: *mut crate::types::jl_value_t,
532            b: *mut crate::types::jl_value_t,
533        ) -> *mut crate::types::jl_value_t;
534
535        pub fn jl_call3(
536            f: *mut crate::types::jl_value_t,
537            a: *mut crate::types::jl_value_t,
538            b: *mut crate::types::jl_value_t,
539            c: *mut crate::types::jl_value_t,
540        ) -> *mut crate::types::jl_value_t;
541
542        pub fn jl_throw(e: *mut crate::types::jl_value_t) -> !;
543
544        pub fn jl_rethrow() -> !;
545
546        pub fn jl_print_backtrace();
547
548        pub fn jl_rethrow_other(e: *mut crate::types::jl_value_t) -> !;
549
550        pub fn jl_stdout_stream() -> *mut crate::types::JL_STREAM;
551
552        pub fn jl_stderr_stream() -> *mut crate::types::JL_STREAM;
553
554        pub fn jl_stderr_obj() -> *mut crate::types::jl_value_t;
555
556        pub fn jl_static_show(
557            out: *mut crate::types::JL_STREAM,
558            v: *mut crate::types::jl_value_t,
559        ) -> usize;
560
561        pub fn jl_ver_major() -> std::ffi::c_int;
562
563        pub fn jl_ver_minor() -> std::ffi::c_int;
564
565        pub fn jl_ver_patch() -> std::ffi::c_int;
566
567        pub fn jl_ver_is_release() -> std::ffi::c_int;
568
569        pub fn jl_ver_string() -> *const std::ffi::c_char;
570
571        pub fn jl_new_foreign_type(
572            name: *mut crate::types::jl_sym_t,
573            module: *mut crate::types::jl_module_t,
574            sup: *mut crate::types::jl_datatype_t,
575            markfunc: crate::types::jl_markfunc_t,
576            sweepfunc: crate::types::jl_sweepfunc_t,
577            haspointers: std::ffi::c_int,
578            large: std::ffi::c_int,
579        ) -> *mut crate::types::jl_datatype_t;
580
581        pub fn jl_gc_alloc_typed(
582            ptls: *mut crate::types::jl_tls_states_t,
583            sz: usize,
584            ty: *mut std::ffi::c_void,
585        ) -> *mut std::ffi::c_void;
586
587        pub fn jl_gc_mark_queue_obj(
588            ptls: *mut crate::types::jl_tls_states_t,
589            obj: *mut crate::types::jl_value_t,
590        ) -> std::ffi::c_int;
591
592        pub fn jl_gc_mark_queue_objarray(
593            ptls: *mut crate::types::jl_tls_states_t,
594            parent: *mut crate::types::jl_value_t,
595            objs: *mut *mut crate::types::jl_value_t,
596            nobjs: usize,
597        );
598
599        pub fn jl_gc_schedule_foreign_sweepfunc(
600            ptls: *mut crate::types::jl_tls_states_t,
601            bj: *mut crate::types::jl_value_t,
602        );
603
604        pub fn jl_gc_set_cb_root_scanner(
605            cb: crate::types::jl_gc_cb_root_scanner_t,
606            enable: std::ffi::c_int,
607        );
608
609        pub fn jl_dlopen(
610            filename: *const std::ffi::c_char,
611            flags: std::ffi::c_uint,
612        ) -> *mut std::ffi::c_void;
613
614        pub fn jl_dlclose(handle: *mut std::ffi::c_void) -> std::ffi::c_int;
615
616        pub fn jl_gc_safepoint();
617
618        pub fn jl_init();
619
620        pub fn jl_symbol(str: *const std::ffi::c_char) -> *mut crate::types::jl_sym_t;
621
622        pub fn jl_egal(
623            a: *const crate::types::jl_value_t,
624            b: *const crate::types::jl_value_t,
625        ) -> std::ffi::c_int;
626
627        pub fn jl_adopt_thread() -> *mut *mut crate::types::jl_gcframe_t;
628
629        pub fn jl_reinit_foreign_type(
630            dt: *mut crate::types::jl_datatype_t,
631            markfunc: crate::types::jl_markfunc_t,
632            sweepfunc: crate::types::jl_sweepfunc_t,
633        ) -> std::ffi::c_int;
634
635        pub fn jl_enter_threaded_region();
636
637        pub fn jl_exit_threaded_region();
638
639        // Removed in Julia 1.11
640
641        #[cfg(julia_1_10)]
642        pub fn jl_new_array(
643            atype: *mut crate::types::jl_value_t,
644            dims: *mut crate::types::jl_value_t,
645        ) -> *mut crate::types::jl_array_t;
646
647        // Added in Julia 1.11
648
649        #[cfg(not(julia_1_10))]
650        pub fn jl_alloc_array_nd(
651            atype: *mut crate::types::jl_value_t,
652            dims: *mut usize,
653            ndims: usize,
654        ) -> *mut crate::types::jl_array_t;
655
656        // Removed in Julia 1.12
657
658        #[cfg(any(julia_1_10, julia_1_11))]
659        pub fn jl_set_const(
660            m: *mut crate::types::jl_module_t,
661            var: *mut crate::types::jl_sym_t,
662            val: *mut crate::types::jl_value_t,
663        );
664
665        #[cfg(any(julia_1_10, julia_1_11))]
666        pub fn jl_init_with_image(
667            julia_bindir: *const std::ffi::c_char,
668            image_path: *const std::ffi::c_char,
669        );
670
671        // Added in Julia 1.12
672
673        #[cfg(not(any(julia_1_10, julia_1_11)))]
674        pub fn jl_declare_constant_val(
675            b: *mut crate::types::jl_binding_t,
676            m: *mut crate::types::jl_module_t,
677            var: *mut crate::types::jl_sym_t,
678            val: *mut crate::types::jl_value_t,
679        ) -> *mut crate::types::jl_binding_partition_t;
680
681        #[cfg(not(any(julia_1_10, julia_1_11)))]
682        pub fn jl_init_with_image_file(
683            julia_bindir: *const std::ffi::c_char,
684            image_path: *const std::ffi::c_char,
685        );
686    }
687}
688
689/// On Windows we use raw dylib linkage to avoid having to create an import lib for Julia. If a
690/// symbol is used in jlrs_cc, either directly or inside a macro or static inline function, we
691/// need to mention them.
692#[cfg(any(windows, target_os = "windows", feature = "windows"))]
693mod indirect {
694    #[link(name = "libjulia", kind = "raw-dylib")]
695    unsafe extern "C" {
696        #![allow(unused)]
697
698        // TODO: is this ok? It's unused, but compiling with BinaryBuilder complains
699        // about jl_options being undefined.
700        pub static mut jl_options: [u8; 0];
701
702        pub static mut jl_small_typeof: *mut std::ffi::c_void;
703
704        pub static mut jl_excstack_state: *mut std::ffi::c_void;
705
706        pub static mut jl_enter_handler: *mut std::ffi::c_void;
707
708        pub static mut jl_eh_restore_state: *mut std::ffi::c_void;
709
710        pub static mut jl_eh_restore_state_noexcept: *mut std::ffi::c_void;
711
712        pub static mut jl_apply_generic: *mut std::ffi::c_void;
713
714        pub static mut jl_gc_queue_multiroot: *mut std::ffi::c_void;
715
716        pub static mut jl_gc_queue_root: *mut std::ffi::c_void;
717
718        pub static mut jl_compute_fieldtypes: *mut std::ffi::c_void;
719
720        pub static mut jl_setjmp: *mut std::ffi::c_void;
721
722        pub static mut jl_current_exception: *mut std::ffi::c_void;
723
724        pub static mut jl_get_world_counter: *mut std::ffi::c_void;
725
726        pub static mut jl_egal__bitstag: *mut std::ffi::c_void;
727
728        pub static mut jl_error: *mut std::ffi::c_void;
729
730        pub static mut jl_restore_excstack: *mut std::ffi::c_void;
731
732        pub static mut jl_dlsym: *mut std::ffi::c_void;
733
734        pub static mut jl_binding_type: *mut std::ffi::c_void;
735
736        // Removed in Julia 1.11
737
738        #[cfg(julia_1_10)]
739        pub static mut jl_arrayref: *mut std::ffi::c_void;
740
741        #[cfg(julia_1_10)]
742        pub static mut jl_arrayset: *mut std::ffi::c_void;
743
744        #[cfg(julia_1_10)]
745        pub static mut jl_array_typetagdata: *mut std::ffi::c_void;
746
747        // Added in Julia 1.11
748
749        #[cfg(not(julia_1_10))]
750        pub static mut jl_unwrap_unionall: *mut std::ffi::c_void;
751
752        #[cfg(not(julia_1_10))]
753        pub static mut jl_genericmemoryref: *mut std::ffi::c_void;
754    }
755}