aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lvm.c18
-rw-r--r--testes/events.lua12
2 files changed, 24 insertions, 6 deletions
diff --git a/lvm.c b/lvm.c
index f9e87b61..f83d47d1 100644
--- a/lvm.c
+++ b/lvm.c
@@ -360,13 +360,19 @@ void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
360 luaT_callTM(L, tm, t, key, val); 360 luaT_callTM(L, tm, t, key, val);
361 return; 361 return;
362 } 362 }
363 t = tm; /* else repeat assignment over 'tm' */ 363 t = tm; /* else must repeat assignment over 'tm' */
364 luaV_fastset(t, key, val, hres, luaH_pset); 364 /* do the equivalent to 'luaV_fastset', but saving 'h' */
365 if (hres == HOK) { 365 if (!ttistable(t))
366 luaV_finishfastset(L, t, val); 366 hres = HNOTATABLE;
367 return; /* done */ 367 else {
368 Table *h = hvalue(t); /* next call can change the value at 't' */
369 hres = luaH_pset(h, key, val);
370 if (hres == HOK) {
371 luaC_barrierback(L, obj2gco(h), val); /* luaV_finishfastset */
372 return; /* done */
373 }
368 } 374 }
369 /* else 'return luaV_finishset(L, t, key, val, slot)' (loop) */ 375 /* else 'return luaV_finishset(L, t, key, val, hres)' (loop) */
370 } 376 }
371 luaG_runerror(L, "'__newindex' chain too long; possible loop"); 377 luaG_runerror(L, "'__newindex' chain too long; possible loop");
372} 378}
diff --git a/testes/events.lua b/testes/events.lua
index 7e434b1f..fa9966ab 100644
--- a/testes/events.lua
+++ b/testes/events.lua
@@ -390,6 +390,18 @@ do
390 for i=1, 10 do t[i] = 1 end 390 for i=1, 10 do t[i] = 1 end
391end 391end
392 392
393
394do -- bug since 5.4
395 local parent = {}
396 parent.__newindex = parent
397 collectgarbage()
398 local child = setmetatable({}, parent)
399 child.__newindex = {x = "hello"}
400 collectgarbage("step")
401 assert(parent.__newindex.x == "hello")
402end
403
404
393-- concat metamethod x numbers (bug in 5.1.1) 405-- concat metamethod x numbers (bug in 5.1.1)
394c = {} 406c = {}
395local x 407local x