script/dom/bindings/
function.rs1#[macro_export]
11macro_rules! native_fn {
12 ($call:expr, $name:expr, $nargs:expr, $flags:expr) => {{
13 let cx = $crate::dom::types::GlobalScope::get_cx();
14 let fun_obj = $crate::native_raw_obj_fn!(cx, $call, $name, $nargs, $flags);
15 #[allow(unsafe_code)]
16 unsafe {
17 Function::new(cx, fun_obj)
18 }
19 }};
20}
21
22#[macro_export]
28macro_rules! native_raw_obj_fn {
29 ($cx:expr, $call:expr, $name:expr, $nargs:expr, $flags:expr) => {{
30 #[allow(unsafe_code)]
31 #[allow(clippy::macro_metavars_in_unsafe)]
32 unsafe extern "C" fn wrapper(cx: *mut JSContext, argc: u32, vp: *mut JSVal) -> bool {
33 $call(cx, argc, vp)
34 }
35 #[allow(unsafe_code)]
36 #[allow(clippy::macro_metavars_in_unsafe)]
37 unsafe {
38 let name: &std::ffi::CStr = $name;
39 let raw_fun = js::jsapi::JS_NewFunction(
40 *$cx,
41 Some(wrapper),
42 $nargs,
43 $flags,
44 name.as_ptr() as *const std::ffi::c_char,
45 );
46 assert!(!raw_fun.is_null());
47 js::jsapi::JS_GetFunctionObject(raw_fun)
48 }
49 }};
50}