Skip to main content

luaur_vm/functions/
sort_less.rs

1use crate::functions::lua_l_error_l::lua_l_error_l;
2use crate::type_aliases::lua_state::lua_State;
3use crate::type_aliases::lua_table::LuaTable;
4use crate::type_aliases::sort_predicate::SortPredicate;
5use crate::type_aliases::t_value::TValue;
6
7use luaur_common::macros::luau_assert::LUAU_ASSERT;
8
9#[inline]
10pub unsafe fn sort_less(
11    L: *mut lua_State,
12    t: *mut LuaTable,
13    i: i32,
14    j: i32,
15    pred: SortPredicate,
16) -> i32 {
17    let arr = (*t).array;
18    let n = (*t).sizearray;
19
20    LUAU_ASSERT!((i as u32) < (n as u32) && (j as u32) < (n as u32));
21
22    let res = match pred {
23        Some(f) => f(L, arr.add(i as usize), arr.add(j as usize)),
24        None => 0,
25    };
26
27    // predicate call may resize the table, which is invalid
28    if (*t).sizearray != n {
29        lua_l_error_l(
30            L,
31            c"table modified during sorting".as_ptr(),
32            core::format_args!("table modified during sorting"),
33        );
34    }
35
36    res
37}