[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: table.insert/remove and metatables
- From: "Dr. Markus Walther" <walther@...>
- Date: Fri, 04 Jul 2008 12:00:59 +0200
PIL 2, p. 171 points to the equivalence of
(1) table.insert(t,line)
and
(2) t[#t+1] = line.
But with metatables these two differ: you can block
access to a read-only table for (2), but not for (1).
I didn't find documentation of the metatable ignorance of
table.insert/remove in the printed reference manual.
Mark Hamburg had noted this before - without getting responses on the
list - in http://lua-users.org/lists/lua-l/2004-01/msg00020.html
"A further issue with either approach is that table.insert, etc. all use
raw access and hence don't go through the write function. One probably
wouldn't want them to in general, but they should perhaps look for
metamethods on the table that provide appropriate replacements."
Question: Shouldn't table.insert/remove respect metatables (__index,
__newindex) for reasons of symmetry and principle-of-least-surprise?
[I stumbled across this in the wake of the 'secure tables' discussion,
where a few loopholes to table security emerged -
get/setmetatable can be easily plugged by __metatable (Roberto),
rawset/get are a bit more difficult but workarounds are not impossible
(Diego) and they could be removed from Lua for special purposes.
The above is a new one, I believe. Of course, again one could remove
this from a special-purpose Lua build.
As an aside, seems Mark Hamburg wanted something similar to secure
tables _in the Lua core_ a while ago, seconding my initial intuitions:
http://lua-users.org/lists/lua-l/2005-01/msg00130.html
]
--Markus