mirror of
https://github.com/lua/lua.git
synced 2025-07-05 07:29:36 +00:00
Joined common code in 'lua_rawset' and 'lua_rawsetp'
This commit is contained in:
parent
e0ab13c62f
commit
c646e57fd6
3 changed files with 25 additions and 23 deletions
35
lapi.c
35
lapi.c
|
@ -848,21 +848,33 @@ LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LUA_API void lua_rawset (lua_State *L, int idx) {
|
static void aux_rawset (lua_State *L, int idx, TValue *key, int n) {
|
||||||
Table *t;
|
Table *t;
|
||||||
TValue *slot;
|
TValue *slot;
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
api_checknelems(L, 2);
|
api_checknelems(L, n);
|
||||||
t = gettable(L, idx);
|
t = gettable(L, idx);
|
||||||
slot = luaH_set(L, t, s2v(L->top - 2));
|
slot = luaH_set(L, t, key);
|
||||||
setobj2t(L, slot, s2v(L->top - 1));
|
setobj2t(L, slot, s2v(L->top - 1));
|
||||||
|
L->top -= n;
|
||||||
invalidateTMcache(t);
|
invalidateTMcache(t);
|
||||||
luaC_barrierback(L, obj2gco(t), s2v(L->top - 1));
|
luaC_barrierback(L, obj2gco(t), s2v(L->top - 1));
|
||||||
L->top -= 2;
|
|
||||||
lua_unlock(L);
|
lua_unlock(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LUA_API void lua_rawset (lua_State *L, int idx) {
|
||||||
|
aux_rawset(L, idx, s2v(L->top - 2), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) {
|
||||||
|
TValue k;
|
||||||
|
setpvalue(&k, cast_voidp(p));
|
||||||
|
aux_rawset(L, idx, &k, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) {
|
LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) {
|
||||||
Table *t;
|
Table *t;
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
|
@ -875,21 +887,6 @@ LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) {
|
|
||||||
Table *t;
|
|
||||||
TValue k, *slot;
|
|
||||||
lua_lock(L);
|
|
||||||
api_checknelems(L, 1);
|
|
||||||
t = gettable(L, idx);
|
|
||||||
setpvalue(&k, cast_voidp(p));
|
|
||||||
slot = luaH_set(L, t, &k);
|
|
||||||
setobj2t(L, slot, s2v(L->top - 1));
|
|
||||||
luaC_barrierback(L, obj2gco(t), s2v(L->top - 1));
|
|
||||||
L->top--;
|
|
||||||
lua_unlock(L);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LUA_API int lua_setmetatable (lua_State *L, int objindex) {
|
LUA_API int lua_setmetatable (lua_State *L, int objindex) {
|
||||||
TValue *obj;
|
TValue *obj;
|
||||||
Table *mt;
|
Table *mt;
|
||||||
|
|
|
@ -516,9 +516,11 @@ print"+"
|
||||||
|
|
||||||
do -- getp/setp
|
do -- getp/setp
|
||||||
local a = {}
|
local a = {}
|
||||||
T.testC("rawsetp 2 1", a, 20)
|
local a1 = T.testC("rawsetp 2 1; return 1", a, 20)
|
||||||
|
assert(a == a1)
|
||||||
assert(a[T.pushuserdata(1)] == 20)
|
assert(a[T.pushuserdata(1)] == 20)
|
||||||
assert(T.testC("rawgetp -1 1; return 1", a) == 20)
|
local a1, res = T.testC("rawgetp -1 1; return 2", a)
|
||||||
|
assert(a == a1 and res == 20)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -161,18 +161,21 @@ do -- tests for '%p' format
|
||||||
local null = string.format("%p", nil)
|
local null = string.format("%p", nil)
|
||||||
assert(string.format("%p", {}) ~= null)
|
assert(string.format("%p", {}) ~= null)
|
||||||
assert(string.format("%p", 4) == null)
|
assert(string.format("%p", 4) == null)
|
||||||
|
assert(string.format("%p", true) == null)
|
||||||
assert(string.format("%p", print) ~= null)
|
assert(string.format("%p", print) ~= null)
|
||||||
assert(string.format("%p", coroutine.running()) ~= null)
|
assert(string.format("%p", coroutine.running()) ~= null)
|
||||||
|
assert(string.format("%p", io.stdin) ~= null)
|
||||||
|
assert(string.format("%p", io.stdin) == string.format("%p", io.stdin))
|
||||||
do
|
do
|
||||||
local t1 = {}; local t2 = {}
|
local t1 = {}; local t2 = {}
|
||||||
assert(string.format("%p", t1) ~= string.format("%p", t2))
|
assert(string.format("%p", t1) ~= string.format("%p", t2))
|
||||||
end
|
end
|
||||||
do -- short strings
|
do -- short strings are internalized
|
||||||
local s1 = string.rep("a", 10)
|
local s1 = string.rep("a", 10)
|
||||||
local s2 = string.rep("a", 10)
|
local s2 = string.rep("a", 10)
|
||||||
assert(string.format("%p", s1) == string.format("%p", s2))
|
assert(string.format("%p", s1) == string.format("%p", s2))
|
||||||
end
|
end
|
||||||
do -- long strings
|
do -- long strings aren't internalized
|
||||||
local s1 = string.rep("a", 300); local s2 = string.rep("a", 300)
|
local s1 = string.rep("a", 300); local s2 = string.rep("a", 300)
|
||||||
assert(string.format("%p", s1) ~= string.format("%p", s2))
|
assert(string.format("%p", s1) ~= string.format("%p", s2))
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue