use std::cell::Cell;
use mozjs::jsapi::{GCReason, JSTracer};
use mozjs::rust::wrappers2::JS_GC;
use mozjs::rust::{CustomAutoRooter, CustomTrace, JSEngine, Runtime};
struct TraceCheck {
trace_was_called: Cell<bool>,
}
impl TraceCheck {
fn new() -> TraceCheck {
TraceCheck {
trace_was_called: Cell::new(false),
}
}
}
unsafe impl CustomTrace for TraceCheck {
fn trace(&self, _: *mut JSTracer) {
self.trace_was_called.set(true);
}
}
#[test]
fn virtual_trace_called() {
let engine = JSEngine::init().unwrap();
let mut runtime = Runtime::new(engine.handle());
let context = runtime.cx();
let mut rooter = CustomAutoRooter::new(TraceCheck::new());
let guard = rooter.root(unsafe { context.raw_cx() });
unsafe {
JS_GC(context, GCReason::API);
}
assert!(guard.trace_was_called.get());
}