Joined common code in 'lua_rawset' and 'lua_rawsetp'
diff --git a/lapi.c b/lapi.c
index 8b48f7f..b49d45c 100644
--- a/lapi.c
+++ b/lapi.c
@@ -848,21 +848,33 @@
}
-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;
TValue *slot;
lua_lock(L);
- api_checknelems(L, 2);
+ api_checknelems(L, n);
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));
+ L->top -= n;
invalidateTMcache(t);
luaC_barrierback(L, obj2gco(t), s2v(L->top - 1));
- L->top -= 2;
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) {
Table *t;
lua_lock(L);
@@ -875,21 +887,6 @@
}
-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) {
TValue *obj;
Table *mt;
diff --git a/testes/api.lua b/testes/api.lua
index b268063..b565741 100644
--- a/testes/api.lua
+++ b/testes/api.lua
@@ -516,9 +516,11 @@
do -- getp/setp
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(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
diff --git a/testes/strings.lua b/testes/strings.lua
index f2f6141..2ce3ebc 100644
--- a/testes/strings.lua
+++ b/testes/strings.lua
@@ -161,18 +161,21 @@
local null = string.format("%p", nil)
assert(string.format("%p", {}) ~= null)
assert(string.format("%p", 4) == null)
+ assert(string.format("%p", true) == null)
assert(string.format("%p", print) ~= 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
local t1 = {}; local t2 = {}
assert(string.format("%p", t1) ~= string.format("%p", t2))
end
- do -- short strings
+ do -- short strings are internalized
local s1 = string.rep("a", 10)
local s2 = string.rep("a", 10)
assert(string.format("%p", s1) == string.format("%p", s2))
end
- do -- long strings
+ do -- long strings aren't internalized
local s1 = string.rep("a", 300); local s2 = string.rep("a", 300)
assert(string.format("%p", s1) ~= string.format("%p", s2))
end