difftreelog
refactor(libjsonnet) move to split stdlib
in: master
5 files changed
bindings/jsonnet/Cargo.tomldiffbeforeafterboth--- 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]
bindings/jsonnet/src/lib.rsdiffbeforeafterboth--- 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]
bindings/jsonnet/src/native.rsdiffbeforeafterboth1use std::{2 ffi::{c_void, CStr},3 os::raw::{c_char, c_int},4};56use jrsonnet_evaluator::{7 error::{Error, LocError},8 function::builtin::{BuiltinParam, NativeCallback, NativeCallbackHandler},9 tb,10 typed::Typed,11 IStr, State, Val,12};13use jrsonnet_gcmodule::Cc;1415type JsonnetNativeCallback = unsafe extern "C" fn(16 ctx: *const c_void,17 argv: *const *const Val,18 success: *mut c_int,19) -> *mut Val;2021#[derive(jrsonnet_gcmodule::Trace)]22struct JsonnetNativeCallbackHandler {23 #[trace(skip)]24 ctx: *const c_void,25 #[trace(skip)]26 cb: JsonnetNativeCallback,27}28impl NativeCallbackHandler for JsonnetNativeCallbackHandler {29 fn call(&self, s: State, args: &[Val]) -> Result<Val, LocError> {30 let mut n_args = Vec::new();31 for a in args {32 n_args.push(Some(Box::new(a.clone())));33 }34 n_args.push(None);35 let mut success = 1;36 let v = unsafe {37 (self.cb)(38 self.ctx,39 &n_args as *const _ as *const *const Val,40 &mut success,41 )42 };43 let v = unsafe { *Box::from_raw(v) };44 if success == 1 {45 Ok(v)46 } else {47 let e = IStr::from_untyped(v, s).expect("error msg");48 Err(Error::RuntimeError(e).into())49 }50 }51}5253/// # Safety54#[no_mangle]55pub unsafe extern "C" fn jsonnet_native_callback(56 vm: &State,57 name: *const c_char,58 cb: JsonnetNativeCallback,59 ctx: *const c_void,60 mut raw_params: *const *const c_char,61) {62 let name = CStr::from_ptr(name).to_str().expect("utf8 name").into();63 let mut params = Vec::new();64 loop {65 if (*raw_params).is_null() {66 break;67 }68 let param = CStr::from_ptr(*raw_params).to_str().expect("not utf8");69 params.push(BuiltinParam {70 name: param.into(),71 has_default: false,72 });73 raw_params = raw_params.offset(1);74 }7576 vm.add_native(77 name,78 #[allow(deprecated)]79 Cc::new(tb!(NativeCallback::new(80 params,81 tb!(JsonnetNativeCallbackHandler { ctx, cb }),82 ))),83 )84}1use std::{2 ffi::{c_void, CStr},3 os::raw::{c_char, c_int},4};56use jrsonnet_evaluator::{7 error::{Error, LocError},8 function::builtin::{BuiltinParam, NativeCallback, NativeCallbackHandler},9 tb,10 typed::Typed,11 IStr, State, Val,12};13use jrsonnet_gcmodule::Cc;1415type JsonnetNativeCallback = unsafe extern "C" fn(16 ctx: *const c_void,17 argv: *const *const Val,18 success: *mut c_int,19) -> *mut Val;2021#[derive(jrsonnet_gcmodule::Trace)]22struct JsonnetNativeCallbackHandler {23 #[trace(skip)]24 ctx: *const c_void,25 #[trace(skip)]26 cb: JsonnetNativeCallback,27}28impl NativeCallbackHandler for JsonnetNativeCallbackHandler {29 fn call(&self, s: State, args: &[Val]) -> Result<Val, LocError> {30 let mut n_args = Vec::new();31 for a in args {32 n_args.push(Some(Box::new(a.clone())));33 }34 n_args.push(None);35 let mut success = 1;36 let v = unsafe {37 (self.cb)(38 self.ctx,39 &n_args as *const _ as *const *const Val,40 &mut success,41 )42 };43 let v = unsafe { *Box::from_raw(v) };44 if success == 1 {45 Ok(v)46 } else {47 let e = IStr::from_untyped(v, s).expect("error msg");48 Err(Error::RuntimeError(e).into())49 }50 }51}5253/// # Safety54#[no_mangle]55pub unsafe extern "C" fn jsonnet_native_callback(56 vm: &State,57 name: *const c_char,58 cb: JsonnetNativeCallback,59 ctx: *const c_void,60 mut raw_params: *const *const c_char,61) {62 let name = CStr::from_ptr(name).to_str().expect("utf8 name").into();63 let mut params = Vec::new();64 loop {65 if (*raw_params).is_null() {66 break;67 }68 let param = CStr::from_ptr(*raw_params).to_str().expect("not utf8");69 params.push(BuiltinParam {70 name: param.into(),71 has_default: false,72 });73 raw_params = raw_params.offset(1);74 }7576 let any_resolver = vm.context_initializer();77 any_resolver78 .as_any()79 .downcast_ref::<jrsonnet_stdlib::ContextInitializer>()80 .expect("only stdlib context initializer supported")81 .add_native(82 name,83 #[allow(deprecated)]84 Cc::new(tb!(NativeCallback::new(85 params,86 tb!(JsonnetNativeCallbackHandler { ctx, cb }),87 ))),88 )89}bindings/jsonnet/src/val_extract.rsdiffbeforeafterboth--- 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(),
}
}
bindings/jsonnet/src/vars_tlas.rsdiffbeforeafterboth--- 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::<jrsonnet_stdlib::ContextInitializer>()
+ .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::<jrsonnet_stdlib::ContextInitializer>()
+ .expect("only stdlib context initializer supported")
+ .add_ext_code(name.to_str().unwrap(), value.to_str().unwrap().into())
.unwrap()
}
/// # Safety