Test runner: return-value error handling, no guard/cek-try/throws

guard and cek-try both create CEK frames that don't survive async
perform/resume. Instead, run-action returns nil on success and an
error string on failure. The for-each loop checks the return value
and sets fail-msg. No exceptions cross async boundaries.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-17 23:09:38 +00:00
parent db8e680caf
commit 84996d74e2
5 changed files with 77 additions and 66 deletions

View File

@@ -999,7 +999,31 @@
(hs-to-sx (nth ast 1))
(hs-to-sx (nth ast 2)))))
((= head (quote do))
(cons (quote do) (map hs-to-sx (rest ast))))
(let
((compiled (map hs-to-sx (rest ast))))
(if
(and
(> (len compiled) 1)
(some
(fn
(c)
(and
(list? c)
(or
(= (first c) (quote hs-fetch))
(= (first c) (quote hs-wait))
(= (first c) (quote perform)))))
compiled))
(reduce
(fn
(body cmd)
(list
(quote let)
(list (list (quote it) cmd))
body))
(nth compiled (- (len compiled) 1))
(reverse (rest (reverse compiled))))
(cons (quote do) compiled))))
((= head (quote wait)) (list (quote hs-wait) (nth ast 1)))
((= head (quote wait-for)) (emit-wait-for ast))
((= head (quote log))

File diff suppressed because one or more lines are too long

View File

@@ -1859,7 +1859,8 @@
(let
((acc2 (append acc (list cmd))))
(cond
((match-kw "then") (cl-collect acc2))
((match-kw "then")
(cl-collect (append acc2 (list (quote __then__)))))
((and (not (at-end?)) (= (tp-type) "keyword") (cmd-kw? (tp-val)))
(cl-collect acc2))
(true acc2)))))))
@@ -1868,7 +1869,10 @@
(cond
((= (len cmds) 0) nil)
((= (len cmds) 1) (first cmds))
(true (cons (quote do) cmds))))))
(true
(cons
(quote do)
(filter (fn (c) (not (= c (quote __then__)))) cmds)))))))
(define
parse-on-feat
(fn

File diff suppressed because one or more lines are too long