in executor/src/mesapy.rs [44:90]
fn execute(
&self,
_name: String,
arguments: FunctionArguments,
mut payload: Vec<u8>,
runtime: FunctionRuntime,
) -> anyhow::Result<String> {
let py_argv = arguments.into_vec();
let cstr_argv: Vec<_> = py_argv
.iter()
.map(|arg| CString::new(arg.as_str()).unwrap())
.collect();
payload.push(0u8);
let mut p_argv: Vec<_> = cstr_argv
.iter() // do NOT into_iter()
.map(|arg| arg.as_ptr())
.collect();
p_argv.push(std::ptr::null());
let mut py_result = [0u8; MAXPYBUFLEN];
set_thread_context(Context::new(runtime))?;
let result = unsafe {
mesapy_exec(
payload.as_ptr(),
p_argv.len() - 1,
p_argv.as_ptr(),
&mut py_result as *mut _ as *mut u8,
MAXPYBUFLEN as u64,
)
};
reset_thread_context()?;
match result {
MESAPY_ERROR_BUFFER_TOO_SHORT => Ok("MESAPY_ERROR_BUFFER_TOO_SHORT".to_string()),
MESAPY_EXEC_ERROR => Ok("MESAPY_EXEC_ERROR".to_string()),
len => {
let r: Vec<u8> = py_result.iter().take(len as usize).copied().collect();
let payload = String::from_utf8(r)?;
Ok(payload)
}
}
}