lua: vararg ... transpile (spreads in call+table last pos); 6x transpile-unsup fixed +6 tests
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
This commit is contained in:
@@ -259,9 +259,24 @@
|
||||
((f (first fs)))
|
||||
(cond
|
||||
((= (first f) "pos")
|
||||
(begin
|
||||
(set! t (assoc t (str array-idx) (nth f 1)))
|
||||
(set! array-idx (+ array-idx 1))))
|
||||
(let ((v (nth f 1)))
|
||||
(cond
|
||||
((and (lua-multi? v) (= (len fs) 1))
|
||||
(begin
|
||||
(define
|
||||
spread-loop
|
||||
(fn (i)
|
||||
(when (< i (len v))
|
||||
(begin
|
||||
(set! t (assoc t (str array-idx) (nth v i)))
|
||||
(set! array-idx (+ array-idx 1))
|
||||
(spread-loop (+ i 1))))))
|
||||
(spread-loop 1)))
|
||||
(else
|
||||
(let ((val (if (lua-multi? v) (lua-first v) v)))
|
||||
(begin
|
||||
(set! t (assoc t (str array-idx) val))
|
||||
(set! array-idx (+ array-idx 1))))))))
|
||||
((= (first f) "kv")
|
||||
(let
|
||||
((k (nth f 1)) (v (nth f 2)))
|
||||
@@ -384,23 +399,48 @@
|
||||
|
||||
(define sx-apply-ref apply)
|
||||
|
||||
(define
|
||||
lua-spread-last-multi
|
||||
(fn (rargs)
|
||||
(cond
|
||||
((= (len rargs) 0) rargs)
|
||||
(else
|
||||
(let ((last-idx (- (len rargs) 1)))
|
||||
(let ((last (nth rargs last-idx)))
|
||||
(cond
|
||||
((lua-multi? last)
|
||||
(let ((init (lua-pack-build rargs 0)))
|
||||
(append
|
||||
(if (> last-idx 0) (lua-init-before rargs 0 last-idx) (list))
|
||||
(rest last))))
|
||||
(else rargs))))))))
|
||||
|
||||
(define
|
||||
lua-init-before
|
||||
(fn (rargs i limit)
|
||||
(if (>= i limit)
|
||||
(list)
|
||||
(cons (nth rargs i) (lua-init-before rargs (+ i 1) limit)))))
|
||||
|
||||
(define
|
||||
lua-apply
|
||||
(fn
|
||||
(f rargs)
|
||||
(f rargs-in)
|
||||
(let
|
||||
((n (len rargs)))
|
||||
(cond
|
||||
((= n 0) (f))
|
||||
((= n 1) (f (nth rargs 0)))
|
||||
((= n 2) (f (nth rargs 0) (nth rargs 1)))
|
||||
((= n 3) (f (nth rargs 0) (nth rargs 1) (nth rargs 2)))
|
||||
((= n 4) (f (nth rargs 0) (nth rargs 1) (nth rargs 2) (nth rargs 3)))
|
||||
((= n 5) (f (nth rargs 0) (nth rargs 1) (nth rargs 2) (nth rargs 3) (nth rargs 4)))
|
||||
((= n 6) (f (nth rargs 0) (nth rargs 1) (nth rargs 2) (nth rargs 3) (nth rargs 4) (nth rargs 5)))
|
||||
((= n 7) (f (nth rargs 0) (nth rargs 1) (nth rargs 2) (nth rargs 3) (nth rargs 4) (nth rargs 5) (nth rargs 6)))
|
||||
((= n 8) (f (nth rargs 0) (nth rargs 1) (nth rargs 2) (nth rargs 3) (nth rargs 4) (nth rargs 5) (nth rargs 6) (nth rargs 7)))
|
||||
(else (sx-apply-ref f rargs))))))
|
||||
((rargs (lua-spread-last-multi rargs-in)))
|
||||
(let
|
||||
((n (len rargs)))
|
||||
(cond
|
||||
((= n 0) (f))
|
||||
((= n 1) (f (nth rargs 0)))
|
||||
((= n 2) (f (nth rargs 0) (nth rargs 1)))
|
||||
((= n 3) (f (nth rargs 0) (nth rargs 1) (nth rargs 2)))
|
||||
((= n 4) (f (nth rargs 0) (nth rargs 1) (nth rargs 2) (nth rargs 3)))
|
||||
((= n 5) (f (nth rargs 0) (nth rargs 1) (nth rargs 2) (nth rargs 3) (nth rargs 4)))
|
||||
((= n 6) (f (nth rargs 0) (nth rargs 1) (nth rargs 2) (nth rargs 3) (nth rargs 4) (nth rargs 5)))
|
||||
((= n 7) (f (nth rargs 0) (nth rargs 1) (nth rargs 2) (nth rargs 3) (nth rargs 4) (nth rargs 5) (nth rargs 6)))
|
||||
((= n 8) (f (nth rargs 0) (nth rargs 1) (nth rargs 2) (nth rargs 3) (nth rargs 4) (nth rargs 5) (nth rargs 6) (nth rargs 7)))
|
||||
(else (sx-apply-ref f rargs)))))))
|
||||
|
||||
(define
|
||||
lua-call
|
||||
@@ -1441,3 +1481,15 @@
|
||||
|
||||
(define _G {})
|
||||
(define _VERSION "Lua 5.1")
|
||||
|
||||
(define
|
||||
lua-varargs
|
||||
(fn (args skip)
|
||||
(cons (quote lua-multi) (lua-varargs-tail args skip))))
|
||||
|
||||
(define
|
||||
lua-varargs-tail
|
||||
(fn (args i)
|
||||
(if (>= i (len args))
|
||||
(list)
|
||||
(cons (nth args i) (lua-varargs-tail args (+ i 1))))))
|
||||
|
||||
@@ -9,13 +9,9 @@
|
||||
"pass_rate": 0.0
|
||||
},
|
||||
"top_failure_modes": [
|
||||
[
|
||||
"transpile: unsupported node",
|
||||
6
|
||||
],
|
||||
[
|
||||
"other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"assertion failed!\\\\\\\"\\",
|
||||
4
|
||||
5
|
||||
],
|
||||
[
|
||||
"parse error",
|
||||
@@ -25,9 +21,29 @@
|
||||
"other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"lua: attempt to call non-functio",
|
||||
2
|
||||
],
|
||||
[
|
||||
"other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"lua: module 'string' not found\\\\",
|
||||
1
|
||||
],
|
||||
[
|
||||
"timeout",
|
||||
1
|
||||
],
|
||||
[
|
||||
"undefined symbol: collectgarbage\\",
|
||||
1
|
||||
],
|
||||
[
|
||||
"undefined symbol: setfenv\\",
|
||||
1
|
||||
],
|
||||
[
|
||||
"undefined symbol: T\\",
|
||||
1
|
||||
],
|
||||
[
|
||||
"undefined symbol: arg\\",
|
||||
1
|
||||
]
|
||||
],
|
||||
"results": [
|
||||
@@ -46,20 +62,20 @@
|
||||
{
|
||||
"name": "attrib.lua",
|
||||
"status": "fail",
|
||||
"reason": "transpile: unsupported node",
|
||||
"ms": 5378
|
||||
"reason": "other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"lua: module 'string' not found\\\\",
|
||||
"ms": 5744
|
||||
},
|
||||
{
|
||||
"name": "big.lua",
|
||||
"status": "timeout",
|
||||
"reason": "per-test timeout",
|
||||
"ms": 8007
|
||||
"ms": 8004
|
||||
},
|
||||
{
|
||||
"name": "calls.lua",
|
||||
"status": "fail",
|
||||
"reason": "transpile: unsupported node",
|
||||
"ms": 4393
|
||||
"reason": "other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"assertion failed!\\\\\\\"\\",
|
||||
"ms": 4612
|
||||
},
|
||||
{
|
||||
"name": "checktable.lua",
|
||||
@@ -70,8 +86,8 @@
|
||||
{
|
||||
"name": "closure.lua",
|
||||
"status": "fail",
|
||||
"reason": "transpile: unsupported node",
|
||||
"ms": 5425
|
||||
"reason": "undefined symbol: collectgarbage\\",
|
||||
"ms": 6160
|
||||
},
|
||||
{
|
||||
"name": "code.lua",
|
||||
@@ -83,7 +99,7 @@
|
||||
"name": "constructs.lua",
|
||||
"status": "fail",
|
||||
"reason": "parse error",
|
||||
"ms": 2509
|
||||
"ms": 2720
|
||||
},
|
||||
{
|
||||
"name": "db.lua",
|
||||
@@ -95,13 +111,13 @@
|
||||
"name": "errors.lua",
|
||||
"status": "fail",
|
||||
"reason": "other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"assertion failed!\\\\\\\"\\",
|
||||
"ms": 2934
|
||||
"ms": 3172
|
||||
},
|
||||
{
|
||||
"name": "events.lua",
|
||||
"status": "fail",
|
||||
"reason": "transpile: unsupported node",
|
||||
"ms": 6455
|
||||
"reason": "undefined symbol: setfenv\\",
|
||||
"ms": 6976
|
||||
},
|
||||
{
|
||||
"name": "files.lua",
|
||||
@@ -125,7 +141,7 @@
|
||||
"name": "locals.lua",
|
||||
"status": "fail",
|
||||
"reason": "other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"assertion failed!\\\\\\\"\\",
|
||||
"ms": 1554
|
||||
"ms": 1707
|
||||
},
|
||||
{
|
||||
"name": "main.lua",
|
||||
@@ -137,43 +153,43 @@
|
||||
"name": "math.lua",
|
||||
"status": "fail",
|
||||
"reason": "parse error",
|
||||
"ms": 2378
|
||||
"ms": 2475
|
||||
},
|
||||
{
|
||||
"name": "nextvar.lua",
|
||||
"status": "fail",
|
||||
"reason": "transpile: unsupported node",
|
||||
"ms": 5918
|
||||
"reason": "undefined symbol: T\\",
|
||||
"ms": 6743
|
||||
},
|
||||
{
|
||||
"name": "pm.lua",
|
||||
"status": "fail",
|
||||
"reason": "other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"assertion failed!\\\\\\\"\\",
|
||||
"ms": 5658
|
||||
"ms": 5928
|
||||
},
|
||||
{
|
||||
"name": "sort.lua",
|
||||
"status": "fail",
|
||||
"reason": "other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"lua: attempt to call non-functio",
|
||||
"ms": 1145
|
||||
"ms": 1169
|
||||
},
|
||||
{
|
||||
"name": "strings.lua",
|
||||
"status": "fail",
|
||||
"reason": "other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"assertion failed!\\\\\\\"\\",
|
||||
"ms": 3696
|
||||
"ms": 3872
|
||||
},
|
||||
{
|
||||
"name": "vararg.lua",
|
||||
"status": "fail",
|
||||
"reason": "transpile: unsupported node",
|
||||
"ms": 1901
|
||||
"reason": "undefined symbol: arg\\",
|
||||
"ms": 2140
|
||||
},
|
||||
{
|
||||
"name": "verybig.lua",
|
||||
"status": "fail",
|
||||
"reason": "other: Unhandled exception: \\\"Unhandled exception: \\\\\\\"lua: attempt to call non-functio",
|
||||
"ms": 533
|
||||
"ms": 553
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -5,11 +5,15 @@ fail=15 timeout=1 skip=8 total=24
|
||||
|
||||
## Top failure modes
|
||||
|
||||
- **6x** transpile: unsupported node
|
||||
- **4x** other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\
|
||||
- **5x** other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\
|
||||
- **3x** parse error
|
||||
- **2x** other: Unhandled exception: \"Unhandled exception: \\\"lua: attempt to call non-functio
|
||||
- **1x** other: Unhandled exception: \"Unhandled exception: \\\"lua: module 'string' not found\\
|
||||
- **1x** timeout
|
||||
- **1x** undefined symbol: collectgarbage\
|
||||
- **1x** undefined symbol: setfenv\
|
||||
- **1x** undefined symbol: T\
|
||||
- **1x** undefined symbol: arg\
|
||||
|
||||
## Per-test results
|
||||
|
||||
@@ -17,25 +21,25 @@ fail=15 timeout=1 skip=8 total=24
|
||||
|---|---|---|---:|
|
||||
| all.lua | skip | driver uses dofile to chain other tests | 0 |
|
||||
| api.lua | skip | requires testC (C debug library) | 0 |
|
||||
| attrib.lua | fail | transpile: unsupported node | 5378 |
|
||||
| big.lua | timeout | per-test timeout | 8007 |
|
||||
| calls.lua | fail | transpile: unsupported node | 4393 |
|
||||
| attrib.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"lua: module 'string' not found\\ | 5744 |
|
||||
| big.lua | timeout | per-test timeout | 8004 |
|
||||
| calls.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\ | 4612 |
|
||||
| checktable.lua | skip | internal debug helpers | 0 |
|
||||
| closure.lua | fail | transpile: unsupported node | 5425 |
|
||||
| closure.lua | fail | undefined symbol: collectgarbage\ | 6160 |
|
||||
| code.lua | skip | bytecode inspection via debug library | 0 |
|
||||
| constructs.lua | fail | parse error | 2509 |
|
||||
| constructs.lua | fail | parse error | 2720 |
|
||||
| db.lua | skip | debug library | 0 |
|
||||
| errors.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\ | 2934 |
|
||||
| events.lua | fail | transpile: unsupported node | 6455 |
|
||||
| errors.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\ | 3172 |
|
||||
| events.lua | fail | undefined symbol: setfenv\ | 6976 |
|
||||
| files.lua | skip | io library | 0 |
|
||||
| gc.lua | skip | collectgarbage / finalisers | 0 |
|
||||
| literals.lua | fail | parse error | 1786 |
|
||||
| locals.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\ | 1554 |
|
||||
| locals.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\ | 1707 |
|
||||
| main.lua | skip | standalone interpreter driver | 0 |
|
||||
| math.lua | fail | parse error | 2378 |
|
||||
| nextvar.lua | fail | transpile: unsupported node | 5918 |
|
||||
| pm.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\ | 5658 |
|
||||
| sort.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"lua: attempt to call non-functio | 1145 |
|
||||
| strings.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\ | 3696 |
|
||||
| vararg.lua | fail | transpile: unsupported node | 1901 |
|
||||
| verybig.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"lua: attempt to call non-functio | 533 |
|
||||
| math.lua | fail | parse error | 2475 |
|
||||
| nextvar.lua | fail | undefined symbol: T\ | 6743 |
|
||||
| pm.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\ | 5928 |
|
||||
| sort.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"lua: attempt to call non-functio | 1169 |
|
||||
| strings.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"assertion failed!\\\"\ | 3872 |
|
||||
| vararg.lua | fail | undefined symbol: arg\ | 2140 |
|
||||
| verybig.lua | fail | other: Unhandled exception: \"Unhandled exception: \\\"lua: attempt to call non-functio | 553 |
|
||||
|
||||
@@ -888,6 +888,20 @@ cat > "$TMPFILE" << 'EPOCHS'
|
||||
(epoch 1604)
|
||||
(eval "(lua-eval-ast \"package.preload.noret = function() end local r = require(\\\"noret\\\") return type(r)\")")
|
||||
|
||||
;; ── Phase 7: vararg `...` (scoreboard iteration) ──────────────
|
||||
(epoch 1700)
|
||||
(eval "(lua-eval-ast \"local function f(...) return ... end local a, b, c = f(1, 2, 3) return a + b + c\")")
|
||||
(epoch 1701)
|
||||
(eval "(lua-eval-ast \"local function f(...) local t = {...} return t[2] end return f(10, 20, 30)\")")
|
||||
(epoch 1702)
|
||||
(eval "(lua-eval-ast \"local function f(a, ...) return a + select(\\\"#\\\", ...) end return f(10, 1, 2, 3)\")")
|
||||
(epoch 1703)
|
||||
(eval "(lua-eval-ast \"local function f(...) return select(2, ...) end local a, b = f(10, 20, 30) return a + b\")")
|
||||
(epoch 1704)
|
||||
(eval "(lua-eval-ast \"local function sum(...) local s = 0 for _, v in ipairs({...}) do s = s + v end return s end return sum(1, 2, 3, 4, 5)\")")
|
||||
(epoch 1705)
|
||||
(eval "(lua-eval-ast \"local function f(a, b, ...) return a * 100 + b * 10 + select(\\\"#\\\", ...) end return f(7, 8, 1, 2, 3)\")")
|
||||
|
||||
EPOCHS
|
||||
|
||||
OUTPUT=$(timeout 60 "$SX_SERVER" < "$TMPFILE" 2>/dev/null)
|
||||
@@ -1336,6 +1350,14 @@ check 1602 "require unknown module errors" '1'
|
||||
check 1603 "package.loaded populated" '42'
|
||||
check 1604 "nil return caches as true" '"boolean"'
|
||||
|
||||
# ── Phase 7: vararg `...` (scoreboard iteration) ──────────────
|
||||
check 1700 "f(...) return ... unpack" '6'
|
||||
check 1701 "{...} table from vararg" '20'
|
||||
check 1702 "f(a, ...) + select(#,...)" '13'
|
||||
check 1703 "select(2, ...) unpack" '50'
|
||||
check 1704 "sum via ipairs({...})" '15'
|
||||
check 1705 "f(a, b, ...) mixed" '783'
|
||||
|
||||
TOTAL=$((PASS + FAIL))
|
||||
if [ $FAIL -eq 0 ]; then
|
||||
echo "ok $PASS/$TOTAL Lua-on-SX tests passed"
|
||||
|
||||
@@ -18,8 +18,7 @@
|
||||
((= tag (quote lua-true)) true)
|
||||
((= tag (quote lua-false)) false)
|
||||
((= tag (quote lua-name)) (make-symbol (nth node 1)))
|
||||
((= tag (quote lua-vararg))
|
||||
(error "lua-transpile: ... not yet supported"))
|
||||
((= tag (quote lua-vararg)) (make-symbol "__varargs"))
|
||||
((= tag (quote lua-binop)) (lua-tx-binop node))
|
||||
((= tag (quote lua-unop)) (lua-tx-unop node))
|
||||
((= tag (quote lua-call)) (lua-tx-call node))
|
||||
@@ -174,6 +173,13 @@
|
||||
(list (make-symbol "lua-arg") (make-symbol "__args") i))
|
||||
(lua-tx-function-bindings params (+ i 1))))))
|
||||
|
||||
(define
|
||||
lua-tx-function-varargs-binding
|
||||
(fn (n)
|
||||
(list
|
||||
(make-symbol "__varargs")
|
||||
(list (make-symbol "lua-varargs") (make-symbol "__args") n))))
|
||||
|
||||
(define
|
||||
lua-tx-function
|
||||
(fn
|
||||
@@ -183,19 +189,26 @@
|
||||
(is-vararg (nth node 2))
|
||||
(body (nth node 3)))
|
||||
(cond
|
||||
((= (len params) 0)
|
||||
((and (= (len params) 0) (not is-vararg))
|
||||
(list
|
||||
(make-symbol "fn")
|
||||
(list (make-symbol "&rest") (make-symbol "__args"))
|
||||
(lua-tx body)))
|
||||
(else
|
||||
(list
|
||||
(make-symbol "fn")
|
||||
(list (make-symbol "&rest") (make-symbol "__args"))
|
||||
(list
|
||||
(make-symbol "let")
|
||||
(lua-tx-function-bindings params 0)
|
||||
(lua-tx body))))))))
|
||||
(let
|
||||
((bindings (lua-tx-function-bindings params 0)))
|
||||
(let
|
||||
((all-bindings
|
||||
(if is-vararg
|
||||
(append bindings (list (lua-tx-function-varargs-binding (len params))))
|
||||
bindings)))
|
||||
(list
|
||||
(make-symbol "fn")
|
||||
(list (make-symbol "&rest") (make-symbol "__args"))
|
||||
(list
|
||||
(make-symbol "let")
|
||||
all-bindings
|
||||
(lua-tx body))))))))))
|
||||
|
||||
(define
|
||||
lua-tx-block
|
||||
|
||||
@@ -82,6 +82,7 @@ Each item: implement → tests → tick box → update progress log.
|
||||
|
||||
_Newest first. Agent appends on every commit._
|
||||
|
||||
- 2026-04-24: lua: scoreboard iteration — **vararg `...` transpile**. Parser already emitted `(lua-vararg)`; transpile now: (a) binds `__varargs` in function body when `is-vararg`, (b) emits `__varargs` for `...` uses; `lua-varargs`/`lua-spread-last-multi` runtime helpers spread multi in last call-arg and last table-pos positions. Eliminated all 6× "transpile: unsupported" failures; top-5 now all real asserts. 353 unit tests.
|
||||
- 2026-04-24: lua: scoreboard iteration — added `rawget`/`rawset`/`rawequal`/`rawlen`, `loadstring`/`load`, `select`, `assert`, `_G`, `_VERSION`. Failure mix now 6×vararg-transpile / 4×real-assertion / 3×parse / 2×call-non-fn / 1×timeout (was 14 parse + 1 print undef at baseline); tests now reach deep into real assertions. Still 0/16 runnable — next targets: vararg transpile, goto, loadstring-compile depth. 347 unit tests.
|
||||
- 2026-04-24: lua: `require`/`package` via preload-only (no filesystem search). `package.loaded` caching, nil-returning modules cache as `true`, unknown modules error. 347 tests.
|
||||
- 2026-04-24: lua: `os` stub — time/clock monotonic counter, difftime, date (default string / `*t` dict), getenv/remove/rename/tmpname/execute/exit stubs. Phase 6 complete. 342 tests.
|
||||
|
||||
Reference in New Issue
Block a user