Skip to content

Commit

Permalink
fix: capi call args decode (#1519)
Browse files Browse the repository at this point in the history
Signed-off-by: peefy <xpf6677@163.com>
  • Loading branch information
Peefy committed Jul 24, 2024
1 parent a69943f commit 3ee624c
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 19 deletions.
31 changes: 22 additions & 9 deletions kclvm/api/src/capi_test.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::gpyrpc::*;
use crate::service::capi::*;
use crate::{call, gpyrpc::*};
use once_cell::sync::Lazy;
use prost::Message;
use serde::de::DeserializeOwned;
Expand Down Expand Up @@ -279,7 +279,6 @@ where
let src_ptr = kclvm_service_call_with_length(
serv,
call.as_ptr(),
svc_name.len(),
args.as_ptr(),
args_vec.len(),
&mut result_len,
Expand Down Expand Up @@ -328,13 +327,7 @@ where
let args_vec = serde_json::from_str::<A>(&input).unwrap().encode_to_vec();
let args = unsafe { CString::from_vec_unchecked(args_vec.clone()) };
let call = CString::new(svc_name).unwrap();
kclvm_service_call(
serv,
call.as_ptr(),
svc_name.len(),
args.as_ptr(),
args_vec.len(),
)
kclvm_service_call(serv, call.as_ptr(), args.as_ptr(), args_vec.len())
});
std::panic::set_hook(prev_hook);
match result {
Expand All @@ -359,3 +352,23 @@ where
}
}
}

#[test]
fn test_call_exec_program() {
let name = b"KclvmService.ExecProgram";
let args = b"\x12\x1a./src/testdata/test_call.k";
let result = call(name, args).unwrap();
assert!(
!result.starts_with(b"ERROR"),
"{}",
String::from_utf8(result).unwrap()
);
}

#[test]
fn test_call_get_version() {
let name = b"KclvmService.GetVersion";
let args = b"";
let result = call(name, args).unwrap();
assert!(!result.starts_with(b"ERROR"))
}
10 changes: 6 additions & 4 deletions kclvm/api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ pub use crate::gpyrpc::*;
use crate::service::capi::{kclvm_service_call_with_length, kclvm_service_new};
use crate::service::service_impl::KclvmServiceImpl;
use anyhow::Result;
use std::ffi::c_char;
use std::ffi::{c_char, CString};

pub type API = KclvmServiceImpl;

Expand All @@ -56,12 +56,14 @@ pub fn call_with_plugin_agent<'a>(
let mut result_len: usize = 0;
let result_ptr = {
let serv = kclvm_service_new(plugin_agent);
let args_len = args.len();
let name = unsafe { CString::from_vec_unchecked(name.to_vec()) };
let args = unsafe { CString::from_vec_unchecked(args.to_vec()) };
kclvm_service_call_with_length(
serv,
name.as_ptr() as *const c_char,
name.len(),
name.as_ptr(),
args.as_ptr() as *const c_char,
name.len(),
args_len,
&mut result_len,
)
};
Expand Down
11 changes: 5 additions & 6 deletions kclvm/api/src/service/capi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ macro_rules! call {
unsafe {
let serv_ref = &mut *$serv;
let args = c_char_to_vec($args, $args_len);
let args = $arg_name::decode(args.as_slice()).unwrap();
let args = args.as_slice();
let args = $arg_name::decode(args).unwrap();
let res = serv_ref.$serv_name(&args);
let result_byte = match res {
Ok(res) => res.encode_to_vec(),
Expand Down Expand Up @@ -92,12 +93,11 @@ macro_rules! call {
pub extern "C" fn kclvm_service_call(
serv: *mut kclvm_service,
name: *const c_char,
name_len: usize,
args: *const c_char,
args_len: usize,
) -> *const c_char {
let mut _result_len = 0;
kclvm_service_call_with_length(serv, name, name_len, args, args_len, &mut _result_len)
kclvm_service_call_with_length(serv, name, args, args_len, &mut _result_len)
}

/// Call kclvm service by C API. **Note that it is not thread safe.**
Expand All @@ -123,14 +123,13 @@ pub extern "C" fn kclvm_service_call(
pub extern "C" fn kclvm_service_call_with_length(
serv: *mut kclvm_service,
name: *const c_char,
name_len: usize,
args: *const c_char,
args_len: usize,
result_len: *mut usize,
) -> *const c_char {
let result = std::panic::catch_unwind(|| {
let name = String::from_utf8(c_char_to_vec(name, name_len)).unwrap();
let call = kclvm_get_service_fn_ptr_by_name(&name);
let name = unsafe { std::ffi::CStr::from_ptr(name) }.to_str().unwrap();
let call = kclvm_get_service_fn_ptr_by_name(name);
if call == 0 {
panic!("null fn ptr");
}
Expand Down
4 changes: 4 additions & 0 deletions kclvm/api/src/testdata/test_call.k
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
schema Config:
name?: str

config = Config {}

0 comments on commit 3ee624c

Please sign in to comment.