summaryrefslogtreecommitdiff
path: root/indra/newview/scripts/lua/test_setdtor.lua
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2024-08-29 21:36:39 -0400
committerNat Goodspeed <nat@lindenlab.com>2024-08-29 21:36:39 -0400
commit2d5cf36be6e0e367efec2bfa01378146269f33db (patch)
tree082b0c6b35e2d6cb76078aca32da50c3604e620c /indra/newview/scripts/lua/test_setdtor.lua
parenta098a3d42bf862e0e3789e21f6b8f3f0e71d60d0 (diff)
Support next(), pairs(), ipairs() for LL.setdtor() table proxies.
Replace the global next(), pairs() and ipairs() functions with a C++ function that drills down through layers of setdtor() proxy objects and then forwards the updated arguments to the original global function. Add a Luau __iter() metamethod to setdtor() proxy objects that, like other proxy metamethods, drills down to the underlying _target object. __iter() recognizes the case of a _target table which itself has a __iter() metamethod. Also add __idiv() metamethod to support integer division. Add tests for proxy // division, next(proxy), next(proxy, key), pairs(proxy), ipairs(proxy) and 'for k, v in proxy'. Also test the case where the table wrapped in the proxy has an __iter() metamethod of its own.
Diffstat (limited to 'indra/newview/scripts/lua/test_setdtor.lua')
-rw-r--r--indra/newview/scripts/lua/test_setdtor.lua29
1 files changed, 29 insertions, 0 deletions
diff --git a/indra/newview/scripts/lua/test_setdtor.lua b/indra/newview/scripts/lua/test_setdtor.lua
index 61ed86dcc8..ec5cd47e93 100644
--- a/indra/newview/scripts/lua/test_setdtor.lua
+++ b/indra/newview/scripts/lua/test_setdtor.lua
@@ -30,6 +30,8 @@ print(`n * {i} =`, n * i)
print(`{i} * n =`, i * n)
print(`n / {i} =`, n / i)
print(`{i} / n =`, i / n)
+print(`n // {i} =`, n // i)
+print(`{i} // n =`, i // n)
print(`n % {i} =`, n % i)
print(`{i} % n =`, i % n)
print(`n ^ {i} =`, n ^ i)
@@ -48,10 +50,37 @@ t = LL.setdtor('table', {'[1]', '[2]', abc='.abc', def='.def'},
print('t =', inspect(t))
print('t._target =', inspect(t._target))
print('#t =', #t)
+print('next(t) =', next(t))
+print('next(t, 1) =', next(t, 1))
print('t[2] =', t[2])
print('t.def =', t.def)
t[1] = 'new [1]'
print('t[1] =', t[1])
+print('for k, v in pairs(t) do')
+for k, v in pairs(t) do
+ print(`{k}: {v}`)
+end
+print('for k, v in ipairs(t) do')
+for k, v in ipairs(t) do
+ print(`{k}: {v}`)
+end
+print('for k, v in t do')
+for k, v in t do
+ print(`{k}: {v}`)
+end
+-- and now for something completely different
+setmetatable(
+ t._target,
+ {
+ __iter = function(arg)
+ return next, {'alternate', '__iter'}
+ end
+ }
+)
+print('for k, v in t with __iter() metamethod do')
+for k, v in t do
+ print(`{k}: {v}`)
+end
print('function')
f = LL.setdtor('function', function(a, b) return (a .. b) end, print)