author | Kim Alvefur <zash@zash.se> |
Mon, 17 Oct 2022 15:13:04 +0200 | |
changeset 12778 | fc4adc32a537 |
parent 12595 | 494577d883ff |
child 12980 | a187600ec7d6 |
permissions | -rw-r--r-- |
6613
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 |
#include <lua.h> |
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
#include <lauxlib.h> |
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 |
|
12406
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
4 |
#ifndef LUA_MAXINTEGER |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
5 |
#include <stdint.h> |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
6 |
#define LUA_MAXINTEGER PTRDIFF_MAX |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
7 |
#endif |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
8 |
|
7892
b8d694646597
util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents:
7838
diff
changeset
|
9 |
static int Lcreate_table(lua_State *L) { |
6613
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
lua_createtable(L, luaL_checkinteger(L, 1), luaL_checkinteger(L, 2)); |
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
return 1; |
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 |
} |
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
|
12595
494577d883ff
util.table: Fix inaccurate comment
Kim Alvefur <zash@zash.se>
parents:
12579
diff
changeset
|
14 |
/* COMPAT: w/ Lua pre-5.2 */ |
7892
b8d694646597
util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents:
7838
diff
changeset
|
15 |
static int Lpack(lua_State *L) { |
7522
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
16 |
unsigned int n_args = lua_gettop(L); |
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
17 |
lua_createtable(L, n_args, 1); |
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
18 |
lua_insert(L, 1); |
7892
b8d694646597
util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents:
7838
diff
changeset
|
19 |
|
7939
582bfb39337f
Backed out changeset a3a4ed0d34f4 C99 is ok
Kim Alvefur <zash@zash.se>
parents:
7892
diff
changeset
|
20 |
for(int arg = n_args; arg >= 1; arg--) { |
7522
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
21 |
lua_rawseti(L, 1, arg); |
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
22 |
} |
7892
b8d694646597
util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents:
7838
diff
changeset
|
23 |
|
7522
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
24 |
lua_pushinteger(L, n_args); |
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
25 |
lua_setfield(L, -2, "n"); |
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
26 |
return 1; |
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
27 |
} |
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
28 |
|
12406
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
29 |
/* COMPAT: w/ Lua pre-5.4 */ |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
30 |
static int Lmove (lua_State *L) { |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
31 |
lua_Integer f = luaL_checkinteger(L, 2); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
32 |
lua_Integer e = luaL_checkinteger(L, 3); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
33 |
lua_Integer t = luaL_checkinteger(L, 4); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
34 |
|
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
35 |
int tt = !lua_isnoneornil(L, 5) ? 5 : 1; /* destination table */ |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
36 |
luaL_checktype(L, 1, LUA_TTABLE); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
37 |
luaL_checktype(L, tt, LUA_TTABLE); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
38 |
|
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
39 |
if (e >= f) { /* otherwise, nothing to move */ |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
40 |
lua_Integer n, i; |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
41 |
luaL_argcheck(L, f > 0 || e < LUA_MAXINTEGER + f, 3, |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
42 |
"too many elements to move"); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
43 |
n = e - f + 1; /* number of elements to move */ |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
44 |
luaL_argcheck(L, t <= LUA_MAXINTEGER - n + 1, 4, |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
45 |
"destination wrap around"); |
12579
1f6f05a98fcd
util-src: Remove Lua 5.1 compat macros
Kim Alvefur <zash@zash.se>
parents:
12409
diff
changeset
|
46 |
if (t > e || t <= f || (tt != 1 && !lua_compare(L, 1, tt, LUA_OPEQ))) { |
12406
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
47 |
for (i = 0; i < n; i++) { |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
48 |
lua_rawgeti(L, 1, f + i); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
49 |
lua_rawseti(L, tt, t + i); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
50 |
} |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
51 |
} else { |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
52 |
for (i = n - 1; i >= 0; i--) { |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
53 |
lua_rawgeti(L, 1, f + i); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
54 |
lua_rawseti(L, tt, t + i); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
55 |
} |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
56 |
} |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
57 |
} |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
58 |
|
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
59 |
lua_pushvalue(L, tt); /* return destination table */ |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
60 |
return 1; |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
61 |
} |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
62 |
|
7892
b8d694646597
util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents:
7838
diff
changeset
|
63 |
int luaopen_util_table(lua_State *L) { |
7821
54669df178c2
util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents:
7541
diff
changeset
|
64 |
luaL_checkversion(L); |
7972
1c6a07606309
util-src: Specify size of various tables to be allocated
Kim Alvefur <zash@zash.se>
parents:
7939
diff
changeset
|
65 |
lua_createtable(L, 0, 2); |
6613
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 |
lua_pushcfunction(L, Lcreate_table); |
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 |
lua_setfield(L, -2, "create"); |
7522
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
68 |
lua_pushcfunction(L, Lpack); |
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6618
diff
changeset
|
69 |
lua_setfield(L, -2, "pack"); |
12406
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
70 |
lua_pushcfunction(L, Lmove); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7972
diff
changeset
|
71 |
lua_setfield(L, -2, "move"); |
6613
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 |
return 1; |
7c4cf87f4dff
util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 |
} |