Skip to main content

mlua_sys/luau/
luacode.rs

1//! Contains definitions from `luacode.h`.
2
3use 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/// Type table tags
54#[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}