git.delta.rocks / jrsonnet / refs/commits / f7dfa48fc136

difftreelog

feat upgrade bindings to new importbin result

Yaroslav Bolyukin2022-11-20parent: #5876186.patch.diff
in: master

2 files changed

modifiedbindings/jsonnet/src/import.rsdiffbeforeafterboth
--- a/bindings/jsonnet/src/import.rs
+++ b/bindings/jsonnet/src/import.rs
@@ -1,6 +1,7 @@
 //! Import resolution manipulation utilities
 
 use std::{
+	alloc::Layout,
 	any::Any,
 	cell::RefCell,
 	collections::HashMap,
@@ -25,8 +26,9 @@
 	base: *const c_char,
 	rel: *const c_char,
 	found_here: *mut *const c_char,
-	success: &mut c_int,
-) -> *mut c_char;
+	buf: *mut *mut c_char,
+	buflen: *mut usize,
+) -> c_int;
 
 /// Resolves imports using callback
 #[derive(Trace)]
@@ -53,22 +55,31 @@
 		let base = unsafe { crate::unparse_path(&base) };
 		let rel = CString::new(path).unwrap();
 		let found_here: *mut c_char = null_mut();
-		let mut success: i32 = 0;
-		let result_ptr = unsafe {
+
+		let mut buf = null_mut();
+		let mut buf_len = 0;
+		let success = unsafe {
 			(self.cb)(
 				self.ctx,
 				base.as_ptr(),
 				rel.as_ptr(),
 				&mut (found_here as *const _),
-				&mut success,
+				&mut buf,
+				&mut buf_len,
 			)
 		};
-		let result_raw = unsafe { CStr::from_ptr(result_ptr) };
-		let result_str = result_raw.to_str().unwrap();
+		let buf_slice: &[u8] = unsafe { std::slice::from_raw_parts(buf.cast(), buf_len) };
+		unsafe {
+			std::alloc::dealloc(
+				buf.cast(),
+				Layout::from_size_align(buf_len, 1).expect("layout is valid"),
+			);
+		};
+		let buf_intern = buf_slice.to_vec();
+
 		assert!(success == 0 || success == 1);
 		if success == 0 {
-			unsafe { CString::from_raw(result_ptr) };
-			let result = result_str.to_owned();
+			let result = String::from_utf8(buf_intern).expect("error should be valid string");
 			throw!(ImportCallbackError(result));
 		}
 
@@ -82,8 +93,7 @@
 
 		let mut out = self.out.borrow_mut();
 		if !out.contains_key(&found_here_buf) {
-			out.insert(found_here_buf.clone(), result_str.into());
-			unsafe { CString::from_raw(result_ptr) };
+			out.insert(found_here_buf.clone(), buf_intern);
 		}
 
 		Ok(found_here_buf)
modifiedbindings/jsonnet/src/lib.rsdiffbeforeafterboth
40/// then there is a mismatch between header and compiled library.40/// then there is a mismatch between header and compiled library.
41#[no_mangle]41#[no_mangle]
42pub extern "C" fn jsonnet_version() -> &'static [u8; 8] {42pub extern "C" fn jsonnet_version() -> &'static [u8; 8] {
43 b"v0.16.0\0"43 b"v0.19.1\0"
44}44}
4545
46unsafe fn parse_path(input: &CStr) -> Cow<Path> {46unsafe fn parse_path(input: &CStr) -> Cow<Path> {