git.delta.rocks / jrsonnet / refs/commits / 41db4d558ad2

difftreelog

refactor(libjsonnet) move to split stdlib

Yaroslav Bolyukin2022-07-23parent: #dde7eda.patch.diff
in: master

5 files changed

modifiedbindings/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]
modifiedbindings/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]
modifiedbindings/jsonnet/src/native.rsdiffbeforeafterboth
before · bindings/jsonnet/src/native.rs
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	vm.add_native(77		name,78		#[allow(deprecated)]79		Cc::new(tb!(NativeCallback::new(80			params,81			tb!(JsonnetNativeCallbackHandler { ctx, cb }),82		))),83	)84}
after · bindings/jsonnet/src/native.rs
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}
modifiedbindings/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(),
 	}
 }
modifiedbindings/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