--- source: src/main.rs expression: compiled input_file: test-data/lua5.1-tests/vararg.lua --- print('testing vararg'); _G.arg = nil global fn f(a, ...) { assert(type(arg) == 'table'); assert(type(arg.n) == 'number'); for i = 1, arg.n { assert(a[(i)] == arg[(i)]); } return arg.n } global fn c12(...) { assert(arg == nil); local x = { ... } x.n = table.getn(x) local res = (x.n == 2 && x[(1)] == 1 && x[(2)] == 2) if res { res = 55 } return res, 2 } global fn vararg(...) { return arg } local call = fn (f, args) { return f(unpack(args, 1, args.n)) } assert(f() == 0); assert(f({ 1, 2, 3 }, 1, 2, 3) == 3); assert(f({ "alo", nil, 45, f, nil }, "alo", nil, 45, f, nil) == 5); assert(c12(1, 2) == 55); a, b = assert(call(c12, { 1, 2 })) assert(a == 55 && b == 2); a = call(c12, { 1, 2, n = 2 }) assert(a == 55 && b == 2); a = call(c12, { 1, 2, n = 1 }) assert(!a); assert(c12(1, 2, 3) == false); local a = vararg(call(next, { _G, nil, n = 2 })) local b, c = next(_G) assert(a[(1)] == b && a[(2)] == c && a.n == 2); a = vararg(call(call, { c12, { 1, 2 } })) assert(a.n == 2 && a[(1)] == 55 && a[(2)] == 2); a = call(print, { '+' }) assert(a == nil); local t = { 1, 10 } method t::f(...) { return self[(arg[(1)])] + arg.n } assert(t::f(1, 4) == 3 && t::f(2) == 11); print('+'); lim = 20 local i, a = 1, {} while i <= lim { a[(i)] = i + 0.3 i = i + 1 } global fn f(a, b, c, d, ...) { local more = { ... } assert(a == 1.3 && more[(1)] == 5.3 && more[(lim - 4)] == lim + 0.3 && !more[(lim - 3)]); } global fn g(a, b, c) { assert(a == 1.3 && b == 2.3 && c == 3.3); } call(f, a); call(g, a); a = {} i = 1 while i <= lim { a[(i)] = i i = i + 1 } assert(call(math.max, a) == lim); print("+"); global fn oneless(a, ...) { return ... } global fn f(n, a, ...) { local b assert(arg == nil); if n == 0 { local b, c, d = ... return a, b, c, d, oneless(oneless(oneless(...))) } else { n, b, a = n - 1, ..., a assert(b == ...); return f(n, a, ...) } } a, b, c, d, e = assert(f(10, 5, 4, 3, 2, 1)) assert(a == 5 && b == 4 && c == 3 && d == 2 && e == 1); a, b, c, d, e = f(4) assert(a == nil && b == nil && c == nil && d == nil && e == nil); f = loadstring([[ return {...} ]]) x = f(2, 3) assert(x[(1)] == 2 && x[(2)] == 3 && x[(3)] == nil); f = loadstring([[ local x = {...} for i=1,select('#', ...) do assert(x[i] == select(i, ...)) end assert(x[select('#', ...)+1] == nil) return true ]]) assert(f("a", "b", nil, {}, assert)); assert(f()); a = { select(3, unpack({ 10, 20, 30, 40 })) } assert(table.getn(a) == 2 && a[(1)] == 30 && a[(2)] == 40); a = { select(1) } assert(next(a) == nil); a = { select(-1, 3, 5, 7) } assert(a[(1)] == 7 && a[(2)] == nil); a = { select(-2, 3, 5, 7) } assert(a[(1)] == 5 && a[(2)] == 7 && a[(3)] == nil); pcall(select, 10000); pcall(select, -10000); print('OK');