Software /
code /
prosody
Annotate
util-src/table.c @ 12497:83f269db6850
Merge 0.12->trunk
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 08 May 2022 18:06:41 +0200 |
parent | 12405:308ed64dc69b |
child | 12575:1f6f05a98fcd |
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 |
12405
308ed64dc69b
util.table: Compatibility with Lua 5.1 lua_equals
Matthew Wild <mwild1@gmail.com>
parents:
12402
diff
changeset
|
9 #if (LUA_VERSION_NUM > 501) |
308ed64dc69b
util.table: Compatibility with Lua 5.1 lua_equals
Matthew Wild <mwild1@gmail.com>
parents:
12402
diff
changeset
|
10 #define lua_equal(L, A, B) lua_compare(L, A, B, LUA_OPEQ) |
308ed64dc69b
util.table: Compatibility with Lua 5.1 lua_equals
Matthew Wild <mwild1@gmail.com>
parents:
12402
diff
changeset
|
11 #endif |
308ed64dc69b
util.table: Compatibility with Lua 5.1 lua_equals
Matthew Wild <mwild1@gmail.com>
parents:
12402
diff
changeset
|
12 |
7889
b8d694646597
util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents:
7835
diff
changeset
|
13 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
|
14 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
|
15 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
|
16 } |
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
|
17 |
12402
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
18 /* 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
|
19 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
|
20 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
|
21 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
|
22 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
|
23 |
7936
582bfb39337f
Backed out changeset a3a4ed0d34f4 C99 is ok
Kim Alvefur <zash@zash.se>
parents:
7889
diff
changeset
|
24 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
|
25 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
|
26 } |
7889
b8d694646597
util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents:
7835
diff
changeset
|
27 |
7519
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6615
diff
changeset
|
28 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
|
29 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
|
30 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
|
31 } |
d278a770eddc
util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents:
6615
diff
changeset
|
32 |
12402
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
33 /* 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
|
34 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
|
35 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
|
36 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
|
37 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
|
38 |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
39 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
|
40 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
|
41 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
|
42 |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
43 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
|
44 lua_Integer n, i; |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
45 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
|
46 "too many elements to move"); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
47 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
|
48 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
|
49 "destination wrap around"); |
12405
308ed64dc69b
util.table: Compatibility with Lua 5.1 lua_equals
Matthew Wild <mwild1@gmail.com>
parents:
12402
diff
changeset
|
50 if (t > e || t <= f || (tt != 1 && !lua_equal(L, 1, tt))) { |
12402
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
51 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
|
52 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
|
53 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
|
54 } |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
55 } else { |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
56 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
|
57 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
|
58 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
|
59 } |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
60 } |
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 |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
63 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
|
64 return 1; |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
65 } |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
66 |
7889
b8d694646597
util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents:
7835
diff
changeset
|
67 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
|
68 #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
|
69 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
|
70 #endif |
7969
1c6a07606309
util-src: Specify size of various tables to be allocated
Kim Alvefur <zash@zash.se>
parents:
7936
diff
changeset
|
71 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
|
72 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
|
73 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
|
74 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
|
75 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
|
76 lua_pushcfunction(L, Lmove); |
8deb401a21f6
util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents:
7969
diff
changeset
|
77 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
|
78 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
|
79 } |