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/events.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/events.lua')
-rw-r--r-- | testes/events.lua | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/testes/events.lua b/testes/events.lua index cf68d1e9..7fb54c9a 100644 --- a/testes/events.lua +++ b/testes/events.lua | |||
@@ -217,9 +217,16 @@ t.__le = function (a,b,c) | |||
217 | return a<=b, "dummy" | 217 | return a<=b, "dummy" |
218 | end | 218 | end |
219 | 219 | ||
220 | t.__eq = function (a,b,c) | ||
221 | assert(c == nil) | ||
222 | if type(a) == 'table' then a = a.x end | ||
223 | if type(b) == 'table' then b = b.x end | ||
224 | return a == b, "dummy" | ||
225 | end | ||
226 | |||
220 | function Op(x) return setmetatable({x=x}, t) end | 227 | function Op(x) return setmetatable({x=x}, t) end |
221 | 228 | ||
222 | local function test () | 229 | local function test (a, b, c) |
223 | assert(not(Op(1)<Op(1)) and (Op(1)<Op(2)) and not(Op(2)<Op(1))) | 230 | assert(not(Op(1)<Op(1)) and (Op(1)<Op(2)) and not(Op(2)<Op(1))) |
224 | assert(not(1 < Op(1)) and (Op(1) < 2) and not(2 < Op(1))) | 231 | assert(not(1 < Op(1)) and (Op(1) < 2) and not(2 < Op(1))) |
225 | assert(not(Op('a')<Op('a')) and (Op('a')<Op('b')) and not(Op('b')<Op('a'))) | 232 | assert(not(Op('a')<Op('a')) and (Op('a')<Op('b')) and not(Op('b')<Op('a'))) |
@@ -232,9 +239,13 @@ local function test () | |||
232 | assert((1 >= Op(1)) and not(1 >= Op(2)) and (Op(2) >= 1)) | 239 | assert((1 >= Op(1)) and not(1 >= Op(2)) and (Op(2) >= 1)) |
233 | assert((Op('a')>=Op('a')) and not(Op('a')>=Op('b')) and (Op('b')>=Op('a'))) | 240 | assert((Op('a')>=Op('a')) and not(Op('a')>=Op('b')) and (Op('b')>=Op('a'))) |
234 | assert(('a' >= Op('a')) and not(Op('a') >= 'b') and (Op('b') >= Op('a'))) | 241 | assert(('a' >= Op('a')) and not(Op('a') >= 'b') and (Op('b') >= Op('a'))) |
242 | assert(Op(1) == Op(1) and Op(1) ~= Op(2)) | ||
243 | assert(Op('a') == Op('a') and Op('a') ~= Op('b')) | ||
244 | assert(a == a and a ~= b) | ||
245 | assert(Op(3) == c) | ||
235 | end | 246 | end |
236 | 247 | ||
237 | test() | 248 | test(Op(1), Op(2), Op(3)) |
238 | 249 | ||
239 | 250 | ||
240 | -- test `partial order' | 251 | -- test `partial order' |