ring-lang-rs 0.1.17

Rust bindings for the Ring programming language
Documentation
use crate::RingState;
use crate::ffi;
use std::sync::Mutex;

type ExtensionInitFn = extern "C" fn(RingState);

static EXTENSION_INITS: Mutex<Vec<ExtensionInitFn>> = Mutex::new(Vec::new());

pub fn ring_register_extension(f: ExtensionInitFn) {
    if let Ok(mut inits) = EXTENSION_INITS.lock() {
        inits.push(f);
    }
}

#[unsafe(no_mangle)]
pub extern "C" fn ring_vm_extension(state: RingState) {
    unsafe {
        #[cfg(feature = "ring-list")]
        ffi::ring_vm_list_loadfunctions(state);

        #[cfg(feature = "ring-math")]
        ffi::ring_vm_math_loadfunctions(state);

        #[cfg(all(feature = "ring-file", not(target_arch = "wasm32")))]
        ffi::ring_vm_file_loadfunctions(state);

        #[cfg(all(feature = "ring-os", not(target_arch = "wasm32")))]
        ffi::ring_vm_os_loadfunctions(state);

        #[cfg(all(
            feature = "ring-dll",
            not(target_os = "android"),
            not(target_os = "ios"),
            not(target_arch = "wasm32")
        ))]
        ffi::ring_vm_dll_loadfunctions(state);

        #[cfg(feature = "ring-refmeta")]
        ffi::ring_vm_refmeta_loadfunctions(state);

        #[cfg(feature = "ring-info")]
        ffi::ring_vm_info_loadfunctions(state);
    }

    if let Ok(inits) = EXTENSION_INITS.lock() {
        for init in inits.iter() {
            init(state);
        }
    }
}