diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-11-16 12:00:28 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-11-16 12:00:28 -0300 |
commit | b117bdb3448778d9e7f9a0302791e8ac3bb97ddd (patch) | |
tree | cf83da22ab3ea7fae6bb2602c790f1a0ca9533c9 /testes | |
parent | f12ce4029dfbce7b89ec136e6b7ba5f6bca039da (diff) | |
download | lua-b117bdb3448778d9e7f9a0302791e8ac3bb97ddd.tar.gz lua-b117bdb3448778d9e7f9a0302791e8ac3bb97ddd.tar.bz2 lua-b117bdb3448778d9e7f9a0302791e8ac3bb97ddd.zip |
Counter for length of chains of __call metamethods
This counter will allow (in a later commit) error messages to correct
argument numbers in functions called through __call metamethods.
Diffstat (limited to 'testes')
-rw-r--r-- | testes/calls.lua | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/testes/calls.lua b/testes/calls.lua index 409a275d..12312d60 100644 --- a/testes/calls.lua +++ b/testes/calls.lua | |||
@@ -178,7 +178,7 @@ do -- tail calls x chain of __call | |||
178 | end | 178 | end |
179 | 179 | ||
180 | -- build a chain of __call metamethods ending in function 'foo' | 180 | -- build a chain of __call metamethods ending in function 'foo' |
181 | for i = 1, 100 do | 181 | for i = 1, 15 do |
182 | foo = setmetatable({}, {__call = foo}) | 182 | foo = setmetatable({}, {__call = foo}) |
183 | end | 183 | end |
184 | 184 | ||
@@ -190,8 +190,8 @@ end | |||
190 | print('+') | 190 | print('+') |
191 | 191 | ||
192 | 192 | ||
193 | do -- testing chains of '__call' | 193 | do print"testing chains of '__call'" |
194 | local N = 20 | 194 | local N = 15 |
195 | local u = table.pack | 195 | local u = table.pack |
196 | for i = 1, N do | 196 | for i = 1, N do |
197 | u = setmetatable({i}, {__call = u}) | 197 | u = setmetatable({i}, {__call = u}) |
@@ -207,6 +207,23 @@ do -- testing chains of '__call' | |||
207 | end | 207 | end |
208 | 208 | ||
209 | 209 | ||
210 | do -- testing chains too long | ||
211 | local a = {} | ||
212 | for i = 1, 16 do -- one too many | ||
213 | a = setmetatable({}, {__call = a}) | ||
214 | end | ||
215 | local status, msg = pcall(a) | ||
216 | assert(not status and string.find(msg, "too long")) | ||
217 | |||
218 | setmetatable(a, {__call = a}) -- infinite chain | ||
219 | local status, msg = pcall(a) | ||
220 | assert(not status and string.find(msg, "too long")) | ||
221 | |||
222 | -- again, with a tail call | ||
223 | local status, msg = pcall(function () return a() end) | ||
224 | assert(not status and string.find(msg, "too long")) | ||
225 | end | ||
226 | |||
210 | a = nil | 227 | a = nil |
211 | (function (x) a=x end)(23) | 228 | (function (x) a=x end)(23) |
212 | assert(a == 23 and (function (x) return x*2 end)(20) == 40) | 229 | assert(a == 23 and (function (x) return x*2 end)(20) == 40) |