lua: proper early-return via guard+raise sentinel; fixes if-then-return-end-rest +3 tests
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled

This commit is contained in:
2026-04-24 21:46:23 +00:00
parent b1bed8e0e5
commit 68b0a279f8
6 changed files with 104 additions and 60 deletions

View File

@@ -187,6 +187,17 @@
(make-symbol "arg")
(list (make-symbol "lua-varargs-arg-table") (make-symbol "__args") n))))
(define
lua-tx-function-guard
(fn (body-sx)
(list
(make-symbol "guard")
(list (make-symbol "e")
(list
(list (make-symbol "lua-return-sentinel?") (make-symbol "e"))
(list (make-symbol "lua-return-value") (make-symbol "e"))))
body-sx)))
(define
lua-tx-function
(fn
@@ -200,7 +211,7 @@
(list
(make-symbol "fn")
(list (make-symbol "&rest") (make-symbol "__args"))
(lua-tx body)))
(lua-tx-function-guard (lua-tx body))))
(else
(let
((bindings (lua-tx-function-bindings params 0)))
@@ -215,10 +226,11 @@
(list
(make-symbol "fn")
(list (make-symbol "&rest") (make-symbol "__args"))
(list
(make-symbol "let")
all-bindings
(lua-tx body))))))))))
(lua-tx-function-guard
(list
(make-symbol "let")
all-bindings
(lua-tx body)))))))))))
(define
lua-tx-block
@@ -460,13 +472,18 @@
(node)
(let
((exps (nth node 1)))
(cond
((= (len exps) 0) nil)
((= (len exps) 1) (lua-tx (first exps)))
(else
(list
(make-symbol "lua-pack-return")
(cons (make-symbol "list") (lua-tx-multi-args exps 0))))))))
(let
((val
(cond
((= (len exps) 0) nil)
((= (len exps) 1) (lua-tx (first exps)))
(else
(list
(make-symbol "lua-pack-return")
(cons (make-symbol "list") (lua-tx-multi-args exps 0)))))))
(list
(make-symbol "raise")
(list (make-symbol "list") (list (make-symbol "quote") (make-symbol "lua-ret")) val))))))
(define
lua-tx-local-function
@@ -500,7 +517,9 @@
(define
lua-eval-ast
(fn (src) (let ((sx (lua-transpile src))) (eval-expr sx))))
(fn (src)
(let ((sx (lua-transpile src)))
(eval-expr (lua-tx-function-guard sx)))))
(define
lua-tx-multi-args