luaur-code-gen 0.1.0

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::records::native_context::NativeContext;
use crate::type_aliases::lua_state::lua_State;
use crate::type_aliases::luau_fast_function::luau_fast_function;
use luaur_vm::type_aliases::stk_id::StkId;
use luaur_vm::type_aliases::t_value::TValue;
use luaur_vm::type_aliases::tms::TMS;

extern "C" {
    pub fn luaV_lessthan(L: *mut lua_State, l: *const TValue, r: *const TValue)
        -> core::ffi::c_int;
    pub fn luaV_lessequal(
        L: *mut lua_State,
        l: *const TValue,
        r: *const TValue,
    ) -> core::ffi::c_int;
    pub fn luaV_equalval(
        L: *mut lua_State,
        t1: *const TValue,
        t2: *const TValue,
    ) -> core::ffi::c_int;

    pub fn luaV_doarithimpl_TM_ADD(
        L: *mut lua_State,
        ra: StkId,
        rb: *const TValue,
        rc: *const TValue,
    );
    pub fn luaV_doarithimpl_TM_SUB(
        L: *mut lua_State,
        ra: StkId,
        rb: *const TValue,
        rc: *const TValue,
    );
    pub fn luaV_doarithimpl_TM_MUL(
        L: *mut lua_State,
        ra: StkId,
        rb: *const TValue,
        rc: *const TValue,
    );
    pub fn luaV_doarithimpl_TM_DIV(
        L: *mut lua_State,
        ra: StkId,
        rb: *const TValue,
        rc: *const TValue,
    );
    pub fn luaV_doarithimpl_TM_IDIV(
        L: *mut lua_State,
        ra: StkId,
        rb: *const TValue,
        rc: *const TValue,
    );
    pub fn luaV_doarithimpl_TM_MOD(
        L: *mut lua_State,
        ra: StkId,
        rb: *const TValue,
        rc: *const TValue,
    );
    pub fn luaV_doarithimpl_TM_POW(
        L: *mut lua_State,
        ra: StkId,
        rb: *const TValue,
        rc: *const TValue,
    );
    pub fn luaV_doarithimpl_TM_UNM(
        L: *mut lua_State,
        ra: StkId,
        rb: *const TValue,
        rc: *const TValue,
    );

    pub fn luaV_dolen(L: *mut lua_State, ra: StkId, rb: *const TValue);
    pub fn luaV_gettable(L: *mut lua_State, t: *const TValue, key: *mut TValue, val: StkId);
    pub fn luaV_settable(L: *mut lua_State, t: *const TValue, key: *mut TValue, val: StkId);
    pub fn luaV_concat(L: *mut lua_State, total: core::ffi::c_int, last: core::ffi::c_int);

    pub fn luaH_getn(t: *mut core::ffi::c_void) -> core::ffi::c_int;
    pub fn luaH_new(
        L: *mut lua_State,
        narray: core::ffi::c_int,
        lnhash: core::ffi::c_int,
    ) -> *mut core::ffi::c_void;
    pub fn luaH_clone(L: *mut lua_State, tt: *mut core::ffi::c_void) -> *mut core::ffi::c_void;
    pub fn luaH_resizearray(L: *mut lua_State, t: *mut core::ffi::c_void, nasize: core::ffi::c_int);
    pub fn luaH_setnum(
        L: *mut lua_State,
        t: *mut core::ffi::c_void,
        key: core::ffi::c_int,
    ) -> *mut TValue;

    pub fn luaC_barriertable(
        L: *mut lua_State,
        t: *mut core::ffi::c_void,
        v: *mut core::ffi::c_void,
    );
    pub fn luaC_barrierf(L: *mut lua_State, o: *mut core::ffi::c_void, v: *mut core::ffi::c_void);
    pub fn luaC_barrierback(
        L: *mut lua_State,
        o: *mut core::ffi::c_void,
        gclist: *mut *mut core::ffi::c_void,
    );
    pub fn luaC_step(L: *mut lua_State, assist: bool) -> usize;

    pub fn luaF_close(L: *mut lua_State, level: StkId);
    pub fn luaF_findupval(L: *mut lua_State, level: StkId) -> *mut core::ffi::c_void;
    pub fn luaF_newLclosure(
        L: *mut lua_State,
        nelems: core::ffi::c_int,
        e: *mut core::ffi::c_void,
        p: *mut core::ffi::c_void,
    ) -> *mut core::ffi::c_void;

    pub fn luaT_gettm(
        events: *mut core::ffi::c_void,
        event: TMS,
        ename: *mut core::ffi::c_void,
    ) -> *const TValue;
    pub fn luaT_objtypenamestr(L: *mut lua_State, o: *const TValue) -> *const core::ffi::c_void;

    pub fn exp(x: f64) -> f64;
    pub fn pow(x: f64, y: f64) -> f64;
    pub fn fmod(x: f64, y: f64) -> f64;
    pub fn log(x: f64) -> f64;
    pub fn log2(x: f64) -> f64;
    pub fn log10(x: f64) -> f64;
    pub fn ldexp(x: f64, exp: core::ffi::c_int) -> f64;
    pub fn round(x: f64) -> f64;
    pub fn frexp(x: f64, exp: *mut core::ffi::c_int) -> f64;
    pub fn modf(x: f64, iptr: *mut f64) -> f64;

    pub fn asin(x: f64) -> f64;
    pub fn sin(x: f64) -> f64;
    pub fn sinh(x: f64) -> f64;
    pub fn acos(x: f64) -> f64;
    pub fn cos(x: f64) -> f64;
    pub fn cosh(x: f64) -> f64;
    pub fn atan(x: f64) -> f64;
    pub fn atan2(y: f64, x: f64) -> f64;
    pub fn tan(x: f64) -> f64;
    pub fn tanh(x: f64) -> f64;

    pub fn forgLoopTableIter(
        L: *mut lua_State,
        h: *mut core::ffi::c_void,
        index: core::ffi::c_int,
        ra: *mut TValue,
    ) -> bool;
    pub fn forgLoopNodeIter(
        L: *mut lua_State,
        h: *mut core::ffi::c_void,
        index: core::ffi::c_int,
        ra: *mut TValue,
    ) -> bool;
    pub fn forgLoopNonTableFallback(
        L: *mut lua_State,
        insnA: core::ffi::c_int,
        aux: core::ffi::c_int,
    ) -> core::ffi::c_int;
    pub fn forgLoopNonTableFallback_DEPRECATED(
        L: *mut lua_State,
        insnA: core::ffi::c_int,
        aux: core::ffi::c_int,
    ) -> bool;
    pub fn forgPrepXnextFallback(L: *mut lua_State, ra: *mut TValue, pc: core::ffi::c_int);
    pub fn callProlog(
        L: *mut lua_State,
        ra: *mut TValue,
        argtop: StkId,
        nresults: core::ffi::c_int,
    ) -> *mut core::ffi::c_void;
    pub fn callEpilogC(L: *mut lua_State, nresults: core::ffi::c_int, n: core::ffi::c_int);
    pub fn newUserdata(
        L: *mut lua_State,
        s: usize,
        tag: core::ffi::c_int,
    ) -> *mut core::ffi::c_void;
    pub fn getImport(L: *mut lua_State, res: StkId, id: core::ffi::c_uint, pc: core::ffi::c_uint);

    pub fn callFallback(
        L: *mut lua_State,
        ra: StkId,
        argtop: StkId,
        nresults: core::ffi::c_int,
    ) -> *mut core::ffi::c_void;

    pub fn executeGETGLOBAL(
        L: *mut lua_State,
        pc: *const u32,
        base: StkId,
        k: *mut TValue,
    ) -> *const u32;
    pub fn executeSETGLOBAL(
        L: *mut lua_State,
        pc: *const u32,
        base: StkId,
        k: *mut TValue,
    ) -> *const u32;
    pub fn executeGETTABLEKS(
        L: *mut lua_State,
        pc: *const u32,
        base: StkId,
        k: *mut TValue,
    ) -> *const u32;
    pub fn executeSETTABLEKS(
        L: *mut lua_State,
        pc: *const u32,
        base: StkId,
        k: *mut TValue,
    ) -> *const u32;
    pub fn executeNAMECALL(
        L: *mut lua_State,
        pc: *const u32,
        base: StkId,
        k: *mut TValue,
    ) -> *const u32;
    pub fn executeFORGPREP(
        L: *mut lua_State,
        pc: *const u32,
        base: StkId,
        k: *mut TValue,
    ) -> *const u32;
    pub fn executeGETVARARGSMultRet(
        L: *mut lua_State,
        pc: *const u32,
        base: StkId,
        rai: core::ffi::c_int,
    );
    pub fn executeGETVARARGSConst(
        L: *mut lua_State,
        base: StkId,
        rai: core::ffi::c_int,
        b: core::ffi::c_int,
    );
    pub fn executeDUPCLOSURE(
        L: *mut lua_State,
        pc: *const u32,
        base: StkId,
        k: *mut TValue,
    ) -> *const u32;
    pub fn executePREPVARARGS(
        L: *mut lua_State,
        pc: *const u32,
        base: StkId,
        k: *mut TValue,
    ) -> *const u32;
    pub fn executeSETLIST(
        L: *mut lua_State,
        pc: *const u32,
        base: StkId,
        k: *mut TValue,
    ) -> *const u32;

    pub static luauF_table: [luau_fast_function; 256];
}

pub fn init_functions(context: &mut NativeContext) {
    unsafe {
        core::ptr::copy_nonoverlapping(luauF_table.as_ptr(), context.luauF_table.as_mut_ptr(), 256);

        context.luaV_lessthan = Some(luaV_lessthan);
        context.luaV_lessequal = Some(luaV_lessequal);
        context.luaV_equalval = Some(luaV_equalval);

        context.luaV_doarithadd = Some(luaV_doarithimpl_TM_ADD);
        context.luaV_doarithsub = Some(luaV_doarithimpl_TM_SUB);
        context.luaV_doarithmul = Some(luaV_doarithimpl_TM_MUL);
        context.luaV_doarithdiv = Some(luaV_doarithimpl_TM_DIV);
        context.luaV_doarithidiv = Some(luaV_doarithimpl_TM_IDIV);
        context.luaV_doarithmod = Some(luaV_doarithimpl_TM_MOD);
        context.luaV_doarithpow = Some(luaV_doarithimpl_TM_POW);
        context.luaV_doarithunm = Some(luaV_doarithimpl_TM_UNM);

        context.luaV_dolen = Some(luaV_dolen);
        context.luaV_gettable = Some(luaV_gettable);
        context.luaV_settable = Some(luaV_settable);
        context.luaV_concat = Some(luaV_concat);

        context.luaH_getn = Some(luaH_getn);
        context.luaH_new = Some(luaH_new);
        context.luaH_clone = Some(luaH_clone);
        context.luaH_resizearray = Some(luaH_resizearray);
        context.luaH_setnum = Some(luaH_setnum);

        context.luaC_barriertable = Some(luaC_barriertable);
        context.luaC_barrierf = Some(luaC_barrierf);
        context.luaC_barrierback = Some(luaC_barrierback);
        context.luaC_step = Some(luaC_step);

        context.luaF_close = Some(luaF_close);
        context.luaF_findupval = Some(luaF_findupval);
        context.luaF_newLclosure = Some(luaF_newLclosure);

        context.luaT_gettm = Some(luaT_gettm);
        context.luaT_objtypenamestr = Some(luaT_objtypenamestr);

        context.libm_exp = Some(exp);
        context.libm_pow = Some(pow);
        context.libm_fmod = Some(fmod);
        context.libm_log = Some(log);
        context.libm_log2 = Some(log2);
        context.libm_log10 = Some(log10);
        context.libm_ldexp = Some(ldexp);
        context.libm_round = Some(round);
        context.libm_frexp = Some(frexp);
        context.libm_modf = Some(modf);

        context.libm_asin = Some(asin);
        context.libm_sin = Some(sin);
        context.libm_sinh = Some(sinh);
        context.libm_acos = Some(acos);
        context.libm_cos = Some(cos);
        context.libm_cosh = Some(cosh);
        context.libm_atan = Some(atan);
        context.libm_atan2 = Some(atan2);
        context.libm_tan = Some(tan);
        context.libm_tanh = Some(tanh);

        context.forgLoopTableIter = Some(forgLoopTableIter);
        context.forgLoopNodeIter = Some(forgLoopNodeIter);
        context.forgLoopNonTableFallback = Some(forgLoopNonTableFallback);
        context.forgLoopNonTableFallback_DEPRECATED = Some(forgLoopNonTableFallback_DEPRECATED);
        context.forgPrepXnextFallback = Some(forgPrepXnextFallback);
        context.callProlog = Some(callProlog);
        context.callEpilogC = Some(callEpilogC);
        context.newUserdata = Some(newUserdata);
        context.getImport = Some(getImport);

        context.callFallback = Some(callFallback);

        context.executeGETGLOBAL = Some(executeGETGLOBAL);
        context.executeSETGLOBAL = Some(executeSETGLOBAL);
        context.executeGETTABLEKS = Some(executeGETTABLEKS);
        context.executeSETTABLEKS = Some(executeSETTABLEKS);

        context.executeNAMECALL = Some(executeNAMECALL);
        context.executeFORGPREP = Some(executeFORGPREP);
        context.executeGETVARARGSMultRet = Some(executeGETVARARGSMultRet);
        context.executeGETVARARGSConst = Some(executeGETVARARGSConst);
        context.executeDUPCLOSURE = Some(executeDUPCLOSURE);
        context.executePREPVARARGS = Some(executePREPVARARGS);
        context.executeSETLIST = Some(executeSETLIST);
    }
}