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    }
220}
221
222/// Functions from libjulia used by jlrs
223pub mod functions {
224    #[cfg_attr(
225        any(windows, target_os = "windows", feature = "windows"),
226        link(name = "libjulia", kind = "raw-dylib")
227    )]
228    unsafe extern "C" {
229        pub fn jl_gc_enable(on: std::ffi::c_int) -> std::ffi::c_int;
230
231        pub fn jl_gc_is_enabled() -> std::ffi::c_int;
232
233        pub fn jl_get_pgcstack() -> *mut *mut crate::types::jl_gcframe_t;
234
235        pub fn jl_gc_collect(arg0: crate::types::jl_gc_collection_t);
236
237        pub fn jl_gc_add_finalizer(
238            v: *mut crate::types::jl_value_t,
239            f: *mut crate::types::jl_value_t,
240        );
241
242        pub fn jl_gc_add_ptr_finalizer(
243            ptls: *mut crate::types::jl_tls_states_t,
244            v: *mut crate::types::jl_value_t,
245            f: *mut std::ffi::c_void,
246        );
247
248        pub fn jl_subtype(
249            a: *mut crate::types::jl_value_t,
250            b: *mut crate::types::jl_value_t,
251        ) -> std::ffi::c_int;
252
253        pub fn jl_object_id(v: *mut crate::types::jl_value_t) -> usize;
254
255        pub fn jl_has_free_typevars(v: *mut crate::types::jl_value_t) -> std::ffi::c_int;
256
257        pub fn jl_has_typevar(
258            t: *mut crate::types::jl_value_t,
259            v: *mut crate::types::jl_tvar_t,
260        ) -> std::ffi::c_int;
261
262        pub fn jl_isa(
263            a: *mut crate::types::jl_value_t,
264            t: *mut crate::types::jl_value_t,
265        ) -> std::ffi::c_int;
266
267        pub fn jl_type_union(
268            ts: *mut *mut crate::types::jl_value_t,
269            n: usize,
270        ) -> *mut crate::types::jl_value_t;
271
272        pub fn jl_type_unionall(
273            v: *mut crate::types::jl_tvar_t,
274            body: *mut crate::types::jl_value_t,
275        ) -> *mut crate::types::jl_value_t;
276
277        pub fn jl_typename_str(v: *mut crate::types::jl_value_t) -> *const std::ffi::c_char;
278
279        pub fn jl_typeof_str(v: *mut crate::types::jl_value_t) -> *const std::ffi::c_char;
280
281        pub fn jl_new_typevar(
282            name: *mut crate::types::jl_sym_t,
283            lb: *mut crate::types::jl_value_t,
284            ub: *mut crate::types::jl_value_t,
285        ) -> *mut crate::types::jl_tvar_t;
286
287        pub fn jl_apply_type(
288            tc: *mut crate::types::jl_value_t,
289            params: *mut *mut crate::types::jl_value_t,
290            n: usize,
291        ) -> *mut crate::types::jl_value_t;
292
293        pub fn jl_new_datatype(
294            name: *mut crate::types::jl_sym_t,
295            module: *mut crate::types::jl_module_t,
296            sup: *mut crate::types::jl_datatype_t,
297            parameters: *mut crate::types::jl_svec_t,
298            fnames: *mut crate::types::jl_svec_t,
299            ftypes: *mut crate::types::jl_svec_t,
300            fattrs: *mut crate::types::jl_svec_t,
301            abstr: std::ffi::c_int,
302            mutabl: std::ffi::c_int,
303            ninitialized: std::ffi::c_int,
304        ) -> *mut crate::types::jl_datatype_t;
305
306        pub fn jl_new_structv(
307            ty: *mut crate::types::jl_datatype_t,
308            args: *mut *mut crate::types::jl_value_t,
309            na: u32,
310        ) -> *mut crate::types::jl_value_t;
311
312        pub fn jl_new_struct_uninit(
313            ty: *mut crate::types::jl_datatype_t,
314        ) -> *mut crate::types::jl_value_t;
315
316        pub fn jl_alloc_svec(n: usize) -> *mut crate::types::jl_svec_t;
317
318        pub fn jl_alloc_svec_uninit(n: usize) -> *mut crate::types::jl_svec_t;
319
320        pub fn jl_svec_copy(a: *mut crate::types::jl_svec_t) -> *mut crate::types::jl_svec_t;
321
322        pub fn jl_symbol_n(str: *const std::ffi::c_char, len: usize)
323        -> *mut crate::types::jl_sym_t;
324
325        pub fn jl_gensym() -> *mut crate::types::jl_sym_t;
326
327        pub fn jl_tagged_gensym(
328            str: *const std::ffi::c_char,
329            len: usize,
330        ) -> *mut crate::types::jl_sym_t;
331
332        pub fn jl_box_bool(x: i8) -> *mut crate::types::jl_value_t;
333
334        pub fn jl_box_int8(x: i8) -> *mut crate::types::jl_value_t;
335
336        pub fn jl_box_uint8(x: u8) -> *mut crate::types::jl_value_t;
337
338        pub fn jl_box_int16(x: i16) -> *mut crate::types::jl_value_t;
339
340        pub fn jl_box_uint16(x: u16) -> *mut crate::types::jl_value_t;
341
342        pub fn jl_box_int32(x: i32) -> *mut crate::types::jl_value_t;
343
344        pub fn jl_box_uint32(x: u32) -> *mut crate::types::jl_value_t;
345
346        pub fn jl_box_char(x: u32) -> *mut crate::types::jl_value_t;
347
348        pub fn jl_box_int64(x: i64) -> *mut crate::types::jl_value_t;
349
350        pub fn jl_box_uint64(x: u64) -> *mut crate::types::jl_value_t;
351
352        pub fn jl_box_float32(x: f32) -> *mut crate::types::jl_value_t;
353
354        pub fn jl_box_float64(x: f64) -> *mut crate::types::jl_value_t;
355
356        pub fn jl_box_voidpointer(x: *mut std::ffi::c_void) -> *mut crate::types::jl_value_t;
357
358        pub fn jl_unbox_bool(v: *mut crate::types::jl_value_t) -> i8;
359
360        pub fn jl_unbox_int8(v: *mut crate::types::jl_value_t) -> i8;
361
362        pub fn jl_unbox_uint8(v: *mut crate::types::jl_value_t) -> u8;
363
364        pub fn jl_unbox_int16(v: *mut crate::types::jl_value_t) -> i16;
365
366        pub fn jl_unbox_uint16(v: *mut crate::types::jl_value_t) -> u16;
367
368        pub fn jl_unbox_int32(v: *mut crate::types::jl_value_t) -> i32;
369
370        pub fn jl_unbox_uint32(v: *mut crate::types::jl_value_t) -> u32;
371
372        pub fn jl_unbox_int64(v: *mut crate::types::jl_value_t) -> i64;
373
374        pub fn jl_unbox_uint64(v: *mut crate::types::jl_value_t) -> u64;
375
376        pub fn jl_unbox_float32(v: *mut crate::types::jl_value_t) -> f32;
377
378        pub fn jl_unbox_float64(v: *mut crate::types::jl_value_t) -> f64;
379
380        pub fn jl_unbox_voidpointer(v: *mut crate::types::jl_value_t) -> *mut std::ffi::c_void;
381
382        pub fn jl_field_index(
383            t: *mut crate::types::jl_datatype_t,
384            fld: *mut crate::types::jl_sym_t,
385            err: std::ffi::c_int,
386        ) -> std::ffi::c_int;
387
388        pub fn jl_get_nth_field(
389            v: *mut crate::types::jl_value_t,
390            i: usize,
391        ) -> *mut crate::types::jl_value_t;
392
393        pub fn jl_get_nth_field_noalloc(
394            v: *mut crate::types::jl_value_t,
395            i: usize,
396        ) -> *mut crate::types::jl_value_t;
397
398        pub fn jl_set_nth_field(
399            v: *mut crate::types::jl_value_t,
400            i: usize,
401            rhs: *mut crate::types::jl_value_t,
402        );
403
404        pub fn jl_islayout_inline(
405            eltype: *mut crate::types::jl_value_t,
406            fsz: *mut usize,
407            al: *mut usize,
408        ) -> std::ffi::c_int;
409
410        pub fn jl_ptr_to_array_1d(
411            atype: *mut crate::types::jl_value_t,
412            data: *mut std::ffi::c_void,
413            nel: usize,
414            own_buffer: std::ffi::c_int,
415        ) -> *mut crate::types::jl_array_t;
416
417        pub fn jl_ptr_to_array(
418            atype: *mut crate::types::jl_value_t,
419            data: *mut std::ffi::c_void,
420            dims: *mut crate::types::jl_value_t,
421            own_buffer: std::ffi::c_int,
422        ) -> *mut crate::types::jl_array_t;
423
424        pub fn jl_alloc_array_1d(
425            atype: *mut crate::types::jl_value_t,
426            nr: usize,
427        ) -> *mut crate::types::jl_array_t;
428
429        pub fn jl_alloc_array_2d(
430            atype: *mut crate::types::jl_value_t,
431            nr: usize,
432            nc: usize,
433        ) -> *mut crate::types::jl_array_t;
434
435        pub fn jl_alloc_array_3d(
436            atype: *mut crate::types::jl_value_t,
437            nr: usize,
438            nc: usize,
439            z: usize,
440        ) -> *mut crate::types::jl_array_t;
441
442        pub fn jl_pchar_to_array(
443            str: *const std::ffi::c_char,
444            len: usize,
445        ) -> *mut crate::types::jl_array_t;
446
447        pub fn jl_pchar_to_string(
448            str: *const std::ffi::c_char,
449            len: usize,
450        ) -> *mut crate::types::jl_value_t;
451
452        pub fn jl_array_to_string(
453            a: *mut crate::types::jl_array_t,
454        ) -> *mut crate::types::jl_value_t;
455
456        pub fn jl_alloc_vec_any(n: usize) -> *mut crate::types::jl_array_t;
457
458        pub fn jl_array_grow_end(a: *mut crate::types::jl_array_t, inc: usize);
459
460        pub fn jl_array_del_end(a: *mut crate::types::jl_array_t, dec: usize);
461
462        pub fn jl_array_ptr_1d_push(
463            a: *mut crate::types::jl_array_t,
464            item: *mut crate::types::jl_value_t,
465        );
466
467        pub fn jl_array_ptr_1d_append(
468            a: *mut crate::types::jl_array_t,
469            a2: *mut crate::types::jl_array_t,
470        );
471
472        pub fn jl_apply_array_type(
473            ty: *mut crate::types::jl_value_t,
474            dim: usize,
475        ) -> *mut crate::types::jl_value_t;
476
477        pub fn jl_array_eltype(a: *mut crate::types::jl_value_t) -> *mut std::ffi::c_void;
478
479        pub fn jl_array_rank(a: *mut crate::types::jl_value_t) -> std::ffi::c_int;
480
481        pub fn jl_string_ptr(s: *mut crate::types::jl_value_t) -> *const std::ffi::c_char;
482
483        pub fn jl_is_const(
484            m: *mut crate::types::jl_module_t,
485            var: *mut crate::types::jl_sym_t,
486        ) -> std::ffi::c_int;
487
488        pub fn jl_get_global(
489            m: *mut crate::types::jl_module_t,
490            var: *mut crate::types::jl_sym_t,
491        ) -> *mut crate::types::jl_value_t;
492
493        pub fn jl_set_global(
494            m: *mut crate::types::jl_module_t,
495            var: *mut crate::types::jl_sym_t,
496            val: *mut crate::types::jl_value_t,
497        );
498
499        pub fn jl_cpu_threads() -> std::ffi::c_int;
500
501        pub fn jl_is_debugbuild() -> std::ffi::c_int;
502
503        pub fn jl_get_UNAME() -> *mut crate::types::jl_sym_t;
504
505        pub fn jl_exception_occurred() -> *mut crate::types::jl_value_t;
506
507        pub fn jl_is_initialized() -> std::ffi::c_int;
508
509        pub fn jl_atexit_hook(status: std::ffi::c_int);
510
511        pub fn jl_eval_string(str: *const std::ffi::c_char) -> *mut crate::types::jl_value_t;
512
513        pub fn jl_call(
514            f: *mut crate::types::jl_value_t,
515            args: *mut *mut crate::types::jl_value_t,
516            nargs: u32,
517        ) -> *mut crate::types::jl_value_t;
518
519        pub fn jl_call0(f: *mut crate::types::jl_value_t) -> *mut crate::types::jl_value_t;
520
521        pub fn jl_call1(
522            f: *mut crate::types::jl_value_t,
523            a: *mut crate::types::jl_value_t,
524        ) -> *mut crate::types::jl_value_t;
525
526        pub fn jl_call2(
527            f: *mut crate::types::jl_value_t,
528            a: *mut crate::types::jl_value_t,
529            b: *mut crate::types::jl_value_t,
530        ) -> *mut crate::types::jl_value_t;
531
532        pub fn jl_call3(
533            f: *mut crate::types::jl_value_t,
534            a: *mut crate::types::jl_value_t,
535            b: *mut crate::types::jl_value_t,
536            c: *mut crate::types::jl_value_t,
537        ) -> *mut crate::types::jl_value_t;
538
539        pub fn jl_throw(e: *mut crate::types::jl_value_t) -> !;
540
541        pub fn jl_rethrow() -> !;
542
543        pub fn jl_print_backtrace();
544
545        pub fn jl_rethrow_other(e: *mut crate::types::jl_value_t) -> !;
546
547        pub fn jl_stdout_stream() -> *mut crate::types::JL_STREAM;
548
549        pub fn jl_stderr_stream() -> *mut crate::types::JL_STREAM;
550
551        pub fn jl_stderr_obj() -> *mut crate::types::jl_value_t;
552
553        pub fn jl_static_show(
554            out: *mut crate::types::JL_STREAM,
555            v: *mut crate::types::jl_value_t,
556        ) -> usize;
557
558        pub fn jl_ver_major() -> std::ffi::c_int;
559
560        pub fn jl_ver_minor() -> std::ffi::c_int;
561
562        pub fn jl_ver_patch() -> std::ffi::c_int;
563
564        pub fn jl_ver_is_release() -> std::ffi::c_int;
565
566        pub fn jl_ver_string() -> *const std::ffi::c_char;
567
568        pub fn jl_new_foreign_type(
569            name: *mut crate::types::jl_sym_t,
570            module: *mut crate::types::jl_module_t,
571            sup: *mut crate::types::jl_datatype_t,
572            markfunc: crate::types::jl_markfunc_t,
573            sweepfunc: crate::types::jl_sweepfunc_t,
574            haspointers: std::ffi::c_int,
575            large: std::ffi::c_int,
576        ) -> *mut crate::types::jl_datatype_t;
577
578        pub fn jl_gc_alloc_typed(
579            ptls: *mut crate::types::jl_tls_states_t,
580            sz: usize,
581            ty: *mut std::ffi::c_void,
582        ) -> *mut std::ffi::c_void;
583
584        pub fn jl_gc_mark_queue_obj(
585            ptls: *mut crate::types::jl_tls_states_t,
586            obj: *mut crate::types::jl_value_t,
587        ) -> std::ffi::c_int;
588
589        pub fn jl_gc_mark_queue_objarray(
590            ptls: *mut crate::types::jl_tls_states_t,
591            parent: *mut crate::types::jl_value_t,
592            objs: *mut *mut crate::types::jl_value_t,
593            nobjs: usize,
594        );
595
596        pub fn jl_gc_schedule_foreign_sweepfunc(
597            ptls: *mut crate::types::jl_tls_states_t,
598            bj: *mut crate::types::jl_value_t,
599        );
600
601        pub fn jl_gc_set_cb_root_scanner(
602            cb: crate::types::jl_gc_cb_root_scanner_t,
603            enable: std::ffi::c_int,
604        );
605
606        pub fn jl_dlopen(
607            filename: *const std::ffi::c_char,
608            flags: std::ffi::c_uint,
609        ) -> *mut std::ffi::c_void;
610
611        pub fn jl_dlclose(handle: *mut std::ffi::c_void) -> std::ffi::c_int;
612
613        pub fn jl_gc_safepoint();
614
615        pub fn jl_init();
616
617        pub fn jl_symbol(str: *const std::ffi::c_char) -> *mut crate::types::jl_sym_t;
618
619        pub fn jl_egal(
620            a: *const crate::types::jl_value_t,
621            b: *const crate::types::jl_value_t,
622        ) -> std::ffi::c_int;
623
624        pub fn jl_adopt_thread() -> *mut *mut crate::types::jl_gcframe_t;
625
626        pub fn jl_reinit_foreign_type(
627            dt: *mut crate::types::jl_datatype_t,
628            markfunc: crate::types::jl_markfunc_t,
629            sweepfunc: crate::types::jl_sweepfunc_t,
630        ) -> std::ffi::c_int;
631
632        pub fn jl_enter_threaded_region();
633
634        pub fn jl_exit_threaded_region();
635
636        // Removed in Julia 1.11
637
638        #[cfg(julia_1_10)]
639        pub fn jl_new_array(
640            atype: *mut crate::types::jl_value_t,
641            dims: *mut crate::types::jl_value_t,
642        ) -> *mut crate::types::jl_array_t;
643
644        // Added in Julia 1.11
645
646        #[cfg(not(julia_1_10))]
647        pub fn jl_alloc_array_nd(
648            atype: *mut crate::types::jl_value_t,
649            dims: *mut usize,
650            ndims: usize,
651        ) -> *mut crate::types::jl_array_t;
652
653        // Removed in Julia 1.12
654
655        #[cfg(any(julia_1_10, julia_1_11))]
656        pub fn jl_set_const(
657            m: *mut crate::types::jl_module_t,
658            var: *mut crate::types::jl_sym_t,
659            val: *mut crate::types::jl_value_t,
660        );
661
662        #[cfg(any(julia_1_10, julia_1_11))]
663        pub fn jl_init_with_image(
664            julia_bindir: *const std::ffi::c_char,
665            image_path: *const std::ffi::c_char,
666        );
667
668        // Added in Julia 1.12
669
670        #[cfg(not(any(julia_1_10, julia_1_11)))]
671        pub fn jl_declare_constant_val(
672            b: *mut crate::types::jl_binding_t,
673            m: *mut crate::types::jl_module_t,
674            var: *mut crate::types::jl_sym_t,
675            val: *mut crate::types::jl_value_t,
676        ) -> *mut crate::types::jl_binding_partition_t;
677
678        #[cfg(not(any(julia_1_10, julia_1_11)))]
679        pub fn jl_init_with_image_file(
680            julia_bindir: *const std::ffi::c_char,
681            image_path: *const std::ffi::c_char,
682        );
683    }
684}
685
686/// On Windows we use raw dylib linkage to avoid having to create an import lib for Julia. If a
687/// symbol is used in jlrs_cc, either directly or inside a macro or static inline function, we
688/// need to mention them.
689#[cfg(any(windows, target_os = "windows", feature = "windows"))]
690mod indirect {
691    #[link(name = "libjulia", kind = "raw-dylib")]
692    unsafe extern "C" {
693        #![allow(unused)]
694
695        // TODO: is this ok? It's unused, but compiling with BinaryBuilder complains
696        // about jl_options being undefined.
697        pub static mut jl_options: [u8; 0];
698
699        pub static mut jl_small_typeof: *mut std::ffi::c_void;
700
701        pub static mut jl_excstack_state: *mut std::ffi::c_void;
702
703        pub static mut jl_enter_handler: *mut std::ffi::c_void;
704
705        pub static mut jl_eh_restore_state: *mut std::ffi::c_void;
706
707        pub static mut jl_eh_restore_state_noexcept: *mut std::ffi::c_void;
708
709        pub static mut jl_apply_generic: *mut std::ffi::c_void;
710
711        pub static mut jl_gc_queue_multiroot: *mut std::ffi::c_void;
712
713        pub static mut jl_gc_queue_root: *mut std::ffi::c_void;
714
715        pub static mut jl_compute_fieldtypes: *mut std::ffi::c_void;
716
717        pub static mut jl_setjmp: *mut std::ffi::c_void;
718
719        pub static mut jl_current_exception: *mut std::ffi::c_void;
720
721        pub static mut jl_get_world_counter: *mut std::ffi::c_void;
722
723        pub static mut jl_egal__bitstag: *mut std::ffi::c_void;
724
725        pub static mut jl_error: *mut std::ffi::c_void;
726
727        pub static mut jl_restore_excstack: *mut std::ffi::c_void;
728
729        pub static mut jl_dlsym: *mut std::ffi::c_void;
730
731        // Removed in Julia 1.11
732
733        #[cfg(julia_1_10)]
734        pub static mut jl_arrayref: *mut std::ffi::c_void;
735
736        #[cfg(julia_1_10)]
737        pub static mut jl_arrayset: *mut std::ffi::c_void;
738
739        #[cfg(julia_1_10)]
740        pub static mut jl_array_typetagdata: *mut std::ffi::c_void;
741
742        // Added in Julia 1.11
743
744        #[cfg(not(julia_1_10))]
745        pub static mut jl_unwrap_unionall: *mut std::ffi::c_void;
746
747        #[cfg(not(julia_1_10))]
748        pub static mut jl_genericmemoryref: *mut std::ffi::c_void;
749    }
750}