#![allow(clippy::arc_with_non_send_sync)]
#![allow(clippy::result_large_err)]
#![allow(clippy::type_complexity)]
pub mod apply;
pub mod backend;
pub mod defn_registry;
pub mod ir_cache;
pub mod ir_interp;
pub mod jit_state;
pub mod lower;
mod lower_worker;
pub mod tiers;
pub use crate::env::callback::invoke;
pub use crate::env::env::{Env, GlobalEnv};
pub use crate::env::error::{EvalError, EvalResult};
pub use crate::env::gc_roots::{force_collect, set_stw_reclaim_hook};
pub use crate::env::loader::load_ns;
pub use crate::interp::eval::{eval, eval_with_gas};
pub use apply::force_eager_lowering;
pub use backend::JitBackend;
pub use jit_state::{set_ir_threshold, set_jit_threshold, set_osr_threshold};
pub use tiers::Tiers;
use std::sync::Arc;
pub fn load_prebuilt_ir(globals: &Arc<GlobalEnv>, bundle: &cljrs_ir::IrBundle) -> usize {
use cljrs_value::Value;
let ns_map = globals.namespaces.read().unwrap();
let mut loaded = 0usize;
for (ns_name, ns_ptr) in ns_map.iter() {
let interns = ns_ptr.get().interns.lock().unwrap();
for (var_name, var) in interns.iter() {
let val = var.get().deref().unwrap_or(Value::Nil);
let f = match &val {
Value::Fn(gc_fn) => gc_fn.get(),
_ => continue,
};
if f.is_macro {
continue;
}
for arity in &f.arities {
let key = if arity.rest_param.is_some() {
format!("{ns_name}/{var_name}:{}+", arity.params.len())
} else {
format!("{ns_name}/{var_name}:{}", arity.params.len())
};
if let Some(ir_func) = bundle.get(&key) {
globals
.ir_cache()
.store(arity.ir_arity_id, Arc::new(ir_func.clone()));
loaded += 1;
}
}
}
}
loaded
}