aboutsummaryrefslogtreecommitdiff
path: root/testes
diff options
context:
space:
mode:
authorRoberto I <roberto@inf.puc-rio.br>2026-07-12 14:57:55 -0300
committerRoberto I <roberto@inf.puc-rio.br>2026-07-12 14:57:55 -0300
commitb996f8fd1be7fb711cc6f754a31a1c87d2c2fd9b (patch)
tree575dd4819e9fbf7e7696908cf779b6f55825f181 /testes
parentbc4bbcef651ba2870d6c68db16dc7d6ce6f68636 (diff)
downloadlua-b996f8fd1be7fb711cc6f754a31a1c87d2c2fd9b.tar.gz
lua-b996f8fd1be7fb711cc6f754a31a1c87d2c2fd9b.tar.bz2
lua-b996f8fd1be7fb711cc6f754a31a1c87d2c2fd9b.zip
Bug: Issues with write barrier for __newindex
In 'luaV_finishset', there is an update on a table that is a field on another table. If the first table is the same as the one with the field (e.g., after 't.__newindex = t'), the update can change the value on that field (e.g., there may be a collision and the field is moved, or the field being updated is '__newindex' itself). After that, the barrier is called with the table stored in that field, which is not the correct table anymore.
Diffstat (limited to 'testes')
-rw-r--r--testes/events.lua12
1 files changed, 12 insertions, 0 deletions
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