Oh wow, that does seem quite painful. That crate reminds me of how JSC' internal bindings work:

```cpp JSC_DEFINE_HOST_FUNCTION(jsMyFunction, (JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame)) { JSC::VM& vm = globalObject->vm(); auto scope = DECLARE_THROW_SCOPE(vm); ... ```

kind of the same thing, seems like -- passing data around to be managed by the GC.