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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#[macro_export]
macro_rules! rustler_export_nifs {
($name:expr, [$( $exported_nif:tt ),+,], $on_load:expr) => {
rustler_export_nifs!($name, [$( $exported_nif ),*], $on_load);
};
($name:expr, [$( $exported_nif:tt ),*], $on_load:expr) => {
static mut NIF_ENTRY: Option<$crate::codegen_runtime::DEF_NIF_ENTRY> = None;
rustler_export_nifs!(internal_platform_init, ({
extern "C" fn nif_load(
env: $crate::codegen_runtime::NIF_ENV,
_priv_data: *mut *mut $crate::codegen_runtime::c_void,
load_info: $crate::codegen_runtime::NIF_TERM)
-> $crate::codegen_runtime::c_int {
unsafe {
$crate::codegen_runtime::handle_nif_init_call($on_load, env, load_info)
}
}
const FUN_ENTRIES: &'static [$crate::codegen_runtime::DEF_NIF_FUNC] = &[
$(rustler_export_nifs!(internal_item_init, $exported_nif)),*
];
let entry = $crate::codegen_runtime::DEF_NIF_ENTRY {
major: $crate::codegen_runtime::NIF_MAJOR_VERSION,
minor: $crate::codegen_runtime::NIF_MINOR_VERSION,
name: concat!($name, "\x00") as *const str as *const u8,
num_of_funcs: FUN_ENTRIES.len() as $crate::codegen_runtime::c_int,
funcs: FUN_ENTRIES.as_ptr(),
load: Some(nif_load),
reload: None,
upgrade: None,
unload: None,
vm_variant: b"beam.vanilla\x00".as_ptr(),
options: 0,
sizeof_ErlNifResourceTypeInit: $crate::codegen_runtime::get_nif_resource_type_init_size(),
};
unsafe { NIF_ENTRY = Some(entry) };
unsafe { NIF_ENTRY.as_ref().unwrap() }
}));
};
(internal_item_init, ($nif_name:expr, $nif_arity:expr, $nif_fun:path)) => {
rustler_export_nifs!(internal_item_init, ($nif_name, $nif_arity, $nif_fun, $crate::schedule::NifScheduleFlags::Normal))
};
(internal_item_init, ($nif_name:expr, $nif_arity:expr, $nif_fun:path, $nif_flag:expr)) => {
$crate::codegen_runtime::DEF_NIF_FUNC {
name: concat!($nif_name, "\x00") as *const str as *const u8,
arity: $nif_arity,
function: {
extern "C" fn nif_func(
env: $crate::codegen_runtime::NIF_ENV,
argc: $crate::codegen_runtime::c_int,
argv: *const $crate::codegen_runtime::NIF_TERM)
-> $crate::codegen_runtime::NIF_TERM {
unsafe {
$crate::codegen_runtime::handle_nif_call($nif_fun, $nif_arity, env, argc, argv)
}
}
nif_func
},
flags: ($nif_flag as $crate::schedule::NifScheduleFlags) as u32,
}
};
(internal_platform_init, ($inner:expr)) => {
#[cfg(unix)]
#[no_mangle]
pub extern "C" fn nif_init() -> *const $crate::codegen_runtime::DEF_NIF_ENTRY {
$inner
}
#[cfg(windows)]
#[no_mangle]
pub extern "C" fn nif_init(callbacks: *mut $crate::codegen_runtime::TWinDynNifCallbacks) -> *const $crate::codegen_runtime::DEF_NIF_ENTRY {
unsafe {
$crate::codegen_runtime::WIN_DYN_NIF_CALLBACKS = Some(*callbacks);
}
$inner
}
};
}