1use std::marker::{PhantomData, PhantomPinned};
4use std::os::raw::{c_char, c_int, c_void};
5use std::{ptr, slice};
6
7#[repr(C)]
8#[non_exhaustive]
9pub struct lua_CompileOptions {
10 pub optimizationLevel: c_int,
11 pub debugLevel: c_int,
12 pub typeInfoLevel: c_int,
13 pub coverageLevel: c_int,
14 pub vectorLib: *const c_char,
15 pub vectorCtor: *const c_char,
16 pub vectorType: *const c_char,
17 pub vectorPrecision: c_int,
18 pub mutableGlobals: *const *const c_char,
19 pub userdataTypes: *const *const c_char,
20 pub librariesWithKnownMembers: *const *const c_char,
21 pub libraryMemberTypeCallback: Option<lua_LibraryMemberTypeCallback>,
22 pub libraryMemberConstantCallback: Option<lua_LibraryMemberConstantCallback>,
23 pub disabledBuiltins: *const *const c_char,
24}
25
26impl Default for lua_CompileOptions {
27 fn default() -> Self {
28 Self {
29 optimizationLevel: 1,
30 debugLevel: 1,
31 typeInfoLevel: 0,
32 coverageLevel: 0,
33 vectorLib: ptr::null(),
34 vectorCtor: ptr::null(),
35 vectorType: ptr::null(),
36 vectorPrecision: 0,
37 mutableGlobals: ptr::null(),
38 userdataTypes: ptr::null(),
39 librariesWithKnownMembers: ptr::null(),
40 libraryMemberTypeCallback: None,
41 libraryMemberConstantCallback: None,
42 disabledBuiltins: ptr::null(),
43 }
44 }
45}
46
47#[repr(C)]
48pub struct lua_CompileConstant {
49 _data: [u8; 0],
50 _marker: PhantomData<(*mut u8, PhantomPinned)>,
51}
52
53#[doc(hidden)]
55#[repr(i32)]
56#[non_exhaustive]
57pub enum luau_BytecodeType {
58 Nil = 0,
59 Boolean,
60 Number,
61 String,
62 Table,
63 Function,
64 Thread,
65 UserData,
66 Vector,
67 Buffer,
68
69 Any = 15,
70}
71
72pub type lua_LibraryMemberTypeCallback =
73 unsafe extern "C-unwind" fn(library: *const c_char, member: *const c_char) -> c_int;
74
75pub type lua_LibraryMemberConstantCallback = unsafe extern "C-unwind" fn(
76 library: *const c_char,
77 member: *const c_char,
78 constant: *mut lua_CompileConstant,
79);
80
81unsafe extern "C" {
82 pub fn luau_set_compile_constant_nil(cons: *mut lua_CompileConstant);
83 pub fn luau_set_compile_constant_boolean(cons: *mut lua_CompileConstant, b: c_int);
84 pub fn luau_set_compile_constant_number(cons: *mut lua_CompileConstant, n: f64);
85 pub fn luau_set_compile_constant_integer64(cons: *mut lua_CompileConstant, l: i64);
86 pub fn luau_set_compile_constant_vector(cons: *mut lua_CompileConstant, x: f32, y: f32, z: f32, w: f32);
87 pub fn luau_set_compile_constant_vectord(cons: *mut lua_CompileConstant, x: f64, y: f64, z: f64, w: f64);
88 pub fn luau_set_compile_constant_string(cons: *mut lua_CompileConstant, s: *const c_char, l: usize);
89}
90
91unsafe extern "C-unwind" {
92 #[link_name = "luau_compile"]
93 pub fn luau_compile_(
94 source: *const c_char,
95 size: usize,
96 options: *mut lua_CompileOptions,
97 outsize: *mut usize,
98 ) -> *mut c_char;
99}
100
101unsafe extern "C" {
102 fn free(p: *mut c_void);
103}
104
105pub unsafe fn luau_compile(source: &[u8], mut options: lua_CompileOptions) -> Vec<u8> {
106 let mut outsize = 0;
107 let data_ptr = luau_compile_(
108 source.as_ptr() as *const c_char,
109 source.len(),
110 &mut options,
111 &mut outsize,
112 );
113 assert!(!data_ptr.is_null(), "luau_compile failed");
114 let data = slice::from_raw_parts(data_ptr as *mut u8, outsize).to_vec();
115 free(data_ptr as *mut c_void);
116 data
117}