Annotate

util-src/table.c @ 12402:8deb401a21f6

util.table: Backport table.move() from Lua 5.4 One difference is that 5.4 accepts "table-like" values (for this and other table.*() functions), but that would require additional backporting work.
author Matthew Wild <mwild1@gmail.com>
date Fri, 18 Mar 2022 15:21:25 +0000
parent 7969:1c6a07606309
child 12405:308ed64dc69b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6610
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
12402
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
4 #ifndef LUA_MAXINTEGER
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
5 #include <stdint.h>
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
6 #define LUA_MAXINTEGER PTRDIFF_MAX
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
7 #endif
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
8
7889
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7835
diff changeset
9 static int Lcreate_table(lua_State *L) {
6610
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
12402
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
14 /* COMPAT: w/ Lua pre-5.4 */
7889
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7835
diff changeset
15 static int Lpack(lua_State *L) {
7519
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6615
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: 6615
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: 6615
diff changeset
18 lua_insert(L, 1);
7889
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7835
diff changeset
19
7936
582bfb39337f Backed out changeset a3a4ed0d34f4 C99 is ok
Kim Alvefur <zash@zash.se>
parents: 7889
diff changeset
20 for(int arg = n_args; arg >= 1; arg--) {
7519
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6615
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: 6615
diff changeset
22 }
7889
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7835
diff changeset
23
7519
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6615
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: 6615
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: 6615
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: 6615
diff changeset
27 }
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6615
diff changeset
28
12402
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
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: 7969
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: 7969
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: 7969
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: 7969
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: 7969
diff changeset
34
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
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: 7969
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: 7969
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: 7969
diff changeset
38
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
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: 7969
diff changeset
40 lua_Integer n, i;
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
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: 7969
diff changeset
42 "too many elements to move");
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
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: 7969
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: 7969
diff changeset
45 "destination wrap around");
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
46 if (t > e || t <= f || (tt != 1 && !lua_compare(L, 1, tt, LUA_OPEQ))) {
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
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: 7969
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: 7969
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: 7969
diff changeset
50 }
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
51 } else {
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
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: 7969
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: 7969
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: 7969
diff changeset
55 }
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
56 }
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
57 }
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
58
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
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: 7969
diff changeset
60 return 1;
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
61 }
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
62
7889
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7835
diff changeset
63 int luaopen_util_table(lua_State *L) {
7818
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 7538
diff changeset
64 #if (LUA_VERSION_NUM > 501)
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 7538
diff changeset
65 luaL_checkversion(L);
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 7538
diff changeset
66 #endif
7969
1c6a07606309 util-src: Specify size of various tables to be allocated
Kim Alvefur <zash@zash.se>
parents: 7936
diff changeset
67 lua_createtable(L, 0, 2);
6610
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
68 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
69 lua_setfield(L, -2, "create");
7519
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6615
diff changeset
70 lua_pushcfunction(L, Lpack);
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6615
diff changeset
71 lua_setfield(L, -2, "pack");
12402
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
72 lua_pushcfunction(L, Lmove);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7969
diff changeset
73 lua_setfield(L, -2, "move");
6610
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
74 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
75 }