--- a/bindings/jsonnet/Cargo.toml +++ b/bindings/jsonnet/Cargo.toml @@ -10,6 +10,7 @@ [dependencies] jrsonnet-evaluator = { path = "../../crates/jrsonnet-evaluator", version = "0.4.2" } jrsonnet-parser = { path = "../../crates/jrsonnet-parser", version = "0.4.2" } +jrsonnet-stdlib = { path = "../../crates/jrsonnet-stdlib", version = "0.4.2" } jrsonnet-gcmodule = { version = "0.3.4" } [lib] --- a/bindings/jsonnet/src/lib.rs +++ b/bindings/jsonnet/src/lib.rs @@ -31,8 +31,9 @@ #[no_mangle] pub extern "C" fn jsonnet_make() -> *mut State { let state = State::default(); - state.with_stdlib(); state.settings_mut().import_resolver = Box::new(NativeImportResolver::default()); + state.settings_mut().context_initializer = + Box::new(jrsonnet_stdlib::ContextInitializer::new(state.clone())); Box::into_raw(Box::new(state)) } @@ -40,7 +41,7 @@ #[no_mangle] #[allow(clippy::boxed_local)] pub unsafe extern "C" fn jsonnet_destroy(vm: *mut State) { - Box::from_raw(vm); + drop(Box::from_raw(vm)); } #[no_mangle] @@ -92,7 +93,7 @@ #[no_mangle] #[allow(clippy::boxed_local)] pub unsafe extern "C" fn jsonnet_json_destroy(_vm: &State, v: *mut Val) { - Box::from_raw(v); + drop(Box::from_raw(v)); } #[no_mangle] --- a/bindings/jsonnet/src/native.rs +++ b/bindings/jsonnet/src/native.rs @@ -73,12 +73,17 @@ raw_params = raw_params.offset(1); } - vm.add_native( - name, - #[allow(deprecated)] - Cc::new(tb!(NativeCallback::new( - params, - tb!(JsonnetNativeCallbackHandler { ctx, cb }), - ))), - ) + let any_resolver = vm.context_initializer(); + any_resolver + .as_any() + .downcast_ref::() + .expect("only stdlib context initializer supported") + .add_native( + name, + #[allow(deprecated)] + Cc::new(tb!(NativeCallback::new( + params, + tb!(JsonnetNativeCallbackHandler { ctx, cb }), + ))), + ) } --- a/bindings/jsonnet/src/val_extract.rs +++ b/bindings/jsonnet/src/val_extract.rs @@ -10,7 +10,7 @@ #[no_mangle] pub extern "C" fn jsonnet_json_extract_string(_vm: &State, v: &Val) -> *mut c_char { match v { - Val::Str(s) => CString::new(&*s as &str).unwrap().into_raw(), + Val::Str(s) => CString::new(s as &str).unwrap().into_raw(), _ => std::ptr::null_mut(), } } --- a/bindings/jsonnet/src/vars_tlas.rs +++ b/bindings/jsonnet/src/vars_tlas.rs @@ -9,10 +9,16 @@ pub unsafe extern "C" fn jsonnet_ext_var(vm: &State, name: *const c_char, value: *const c_char) { let name = CStr::from_ptr(name); let value = CStr::from_ptr(value); - vm.add_ext_str( - name.to_str().unwrap().into(), - value.to_str().unwrap().into(), - ) + + let any_resolver = vm.context_initializer(); + any_resolver + .as_any() + .downcast_ref::() + .expect("only stdlib context initializer supported") + .add_ext_str( + name.to_str().unwrap().into(), + value.to_str().unwrap().into(), + ) } /// # Safety @@ -20,7 +26,13 @@ pub unsafe extern "C" fn jsonnet_ext_code(vm: &State, name: *const c_char, value: *const c_char) { let name = CStr::from_ptr(name); let value = CStr::from_ptr(value); - vm.add_ext_code(name.to_str().unwrap(), value.to_str().unwrap().into()) + + let any_resolver = vm.context_initializer(); + any_resolver + .as_any() + .downcast_ref::() + .expect("only stdlib context initializer supported") + .add_ext_code(name.to_str().unwrap(), value.to_str().unwrap().into()) .unwrap() } /// # Safety