Skip to main content

luaur_vm/functions/
sort_func.rs

1use crate::functions::lua_d_call::lua_d_call;
2use crate::macros::l_isfalse::l_isfalse;
3use crate::macros::setobj_2_s::setobj_2_s;
4use crate::records::lua_state::lua_State;
5use crate::type_aliases::t_value::TValue;
6
7use luaur_common::macros::luau_assert::LUAU_ASSERT;
8
9pub unsafe fn sort_func(L: *mut lua_State, l: *const TValue, r: *const TValue) -> core::ffi::c_int {
10    LUAU_ASSERT!(unsafe { (*L).top == (*L).base.offset(2) }); // table, function
11
12    let top = unsafe { (*L).top };
13    let base = unsafe { (*L).base };
14
15    setobj_2_s!(L, top, base.offset(1));
16    setobj_2_s!(L, top.offset(1), l);
17    setobj_2_s!(L, top.offset(2), r);
18
19    unsafe {
20        (*L).top = top.offset(3); // safe because of LUA_MINSTACK guarantee
21        lua_d_call(L, top, 1);
22        (*L).top = (*L).top.offset(-1); // maintain stack depth
23
24        (!l_isfalse!((*L).top)) as core::ffi::c_int
25    }
26}