summaryrefslogtreecommitdiff
path: root/src/ffi/luau/luacode.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ffi/luau/luacode.rs')
-rw-r--r--src/ffi/luau/luacode.rs21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/ffi/luau/luacode.rs b/src/ffi/luau/luacode.rs
index 3f24b65..571db4c 100644
--- a/src/ffi/luau/luacode.rs
+++ b/src/ffi/luau/luacode.rs
@@ -1,6 +1,7 @@
//! Contains definitions from `luacode.h`.
-use std::os::raw::{c_char, c_int};
+use std::os::raw::{c_char, c_int, c_void};
+use std::slice;
#[repr(C)]
pub struct lua_CompileOptions {
@@ -13,10 +14,26 @@ pub struct lua_CompileOptions {
}
extern "C" {
- pub fn luau_compile(
+ #[link_name = "luau_compile"]
+ pub fn luau_compile_(
source: *const c_char,
size: usize,
options: *mut lua_CompileOptions,
outsize: *mut usize,
) -> *mut c_char;
+
+ fn free(p: *mut c_void);
+}
+
+pub unsafe fn luau_compile(source: &[u8], mut options: lua_CompileOptions) -> Vec<u8> {
+ let mut outsize = 0;
+ let data_ptr = luau_compile_(
+ source.as_ptr() as *const c_char,
+ source.len(),
+ &mut options,
+ &mut outsize,
+ );
+ let data = slice::from_raw_parts(data_ptr as *mut u8, outsize).to_vec();
+ free(data_ptr as *mut c_void);
+ data
}