diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-07-26 14:59:39 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-07-26 14:59:39 -0300 |
commit | b80077b8f3e27a94c6afa895b41a9f8b52c42e61 (patch) | |
tree | 8a7c21ee0acfed553ef1d92bdfd7b1f728f35a91 /testes/api.lua | |
parent | e70f275f32a5339a86be6f8b9d08c20cb874b205 (diff) | |
download | lua-b80077b8f3e27a94c6afa895b41a9f8b52c42e61.tar.gz lua-b80077b8f3e27a94c6afa895b41a9f8b52c42e61.tar.bz2 lua-b80077b8f3e27a94c6afa895b41a9f8b52c42e61.zip |
Change in the handling of 'L->top' when calling metamethods
Instead of updating 'L->top' in every place that may call a
metamethod, the metamethod functions themselves (luaT_trybinTM and
luaT_callorderTM) correct the top. (When calling metamethods from
the C API, however, the callers must preserve 'L->top'.)
Diffstat (limited to 'testes/api.lua')
-rw-r--r-- | testes/api.lua | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/testes/api.lua b/testes/api.lua index 5da03641..0966ed19 100644 --- a/testes/api.lua +++ b/testes/api.lua | |||
@@ -241,6 +241,23 @@ assert(a == 20 and b == false) | |||
241 | a,b = T.testC("compare LE 5 -6, return 2", a1, 2, 2, a1, 2, 20) | 241 | a,b = T.testC("compare LE 5 -6, return 2", a1, 2, 2, a1, 2, 20) |
242 | assert(a == 20 and b == true) | 242 | assert(a == 20 and b == true) |
243 | 243 | ||
244 | |||
245 | do -- testing lessthan and lessequal with metamethods | ||
246 | local mt = {__lt = function (a,b) return a[1] < b[1] end, | ||
247 | __le = function (a,b) return a[1] <= b[1] end, | ||
248 | __eq = function (a,b) return a[1] == b[1] end} | ||
249 | local function O (x) | ||
250 | return setmetatable({x}, mt) | ||
251 | end | ||
252 | |||
253 | local a, b = T.testC("compare LT 2 3; pushint 10; return 2", O(1), O(2)) | ||
254 | assert(a == true and b == 10) | ||
255 | local a, b = T.testC("compare LE 2 3; pushint 10; return 2", O(3), O(2)) | ||
256 | assert(a == false and b == 10) | ||
257 | local a, b = T.testC("compare EQ 2 3; pushint 10; return 2", O(3), O(3)) | ||
258 | assert(a == true and b == 10) | ||
259 | end | ||
260 | |||
244 | -- testing length | 261 | -- testing length |
245 | local t = setmetatable({x = 20}, {__len = function (t) return t.x end}) | 262 | local t = setmetatable({x = 20}, {__len = function (t) return t.x end}) |
246 | a,b,c = T.testC([[ | 263 | a,b,c = T.testC([[ |