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