lua: coroutines (create/resume/yield/status/wrap) via call/cc +8 tests
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled

This commit is contained in:
2026-04-24 18:36:41 +00:00
parent 0934c4bd28
commit a5947e1295
3 changed files with 152 additions and 1 deletions

View File

@@ -710,6 +710,24 @@ cat > "$TMPFILE" << 'EPOCHS'
(epoch 980)
(eval "(lua-eval-ast \"local t = setmetatable({x = 1, y = 2}, {}) local n = 0 for k in pairs(t) do n = n + 1 end return n\")")
;; ── Phase 5: coroutines ────────────────────────────────────────
(epoch 1000)
(eval "(lua-eval-ast \"local co = coroutine.create(function() end) return coroutine.status(co)\")")
(epoch 1001)
(eval "(lua-eval-ast \"local co = coroutine.create(function() return 42 end) coroutine.resume(co) return coroutine.status(co)\")")
(epoch 1010)
(eval "(lua-eval-ast \"local co = coroutine.create(function() coroutine.yield(1) coroutine.yield(2) return 3 end) local ok1, v1 = coroutine.resume(co) local ok2, v2 = coroutine.resume(co) local ok3, v3 = coroutine.resume(co) return v1 * 100 + v2 * 10 + v3\")")
(epoch 1011)
(eval "(lua-eval-ast \"local co = coroutine.create(function(a, b) return a + b end) local ok, v = coroutine.resume(co, 10, 20) return v\")")
(epoch 1012)
(eval "(lua-eval-ast \"local co = coroutine.create(function() local x = coroutine.yield() return x + 100 end) coroutine.resume(co) local ok, v = coroutine.resume(co, 42) return v\")")
(epoch 1020)
(eval "(lua-eval-ast \"local co = coroutine.create(function() return 42 end) coroutine.resume(co) local ok, err = coroutine.resume(co) if ok then return \\\"no\\\" else return err end\")")
(epoch 1030)
(eval "(lua-eval-ast \"local gen = coroutine.wrap(function() coroutine.yield(1) coroutine.yield(2) coroutine.yield(3) end) return gen() + gen() + gen()\")")
(epoch 1040)
(eval "(lua-eval-ast \"local function iter() coroutine.yield(10) coroutine.yield(20) coroutine.yield(30) end local co = coroutine.create(iter) local sum = 0 for i = 1, 3 do local ok, v = coroutine.resume(co) sum = sum + v end return sum\")")
EPOCHS
OUTPUT=$(timeout 60 "$SX_SERVER" < "$TMPFILE" 2>/dev/null)
@@ -1062,6 +1080,16 @@ check 970 "stateful closure iter" '15'
check 971 "3-value iterator form" '30'
check 980 "pairs skips __meta" '2'
# ── Phase 5: coroutines ────────────────────────────────────────
check 1000 "coroutine.status initial" '"suspended"'
check 1001 "coroutine.status after done" '"dead"'
check 1010 "yield/resume × 3 sequence" '123'
check 1011 "resume passes args to body" '30'
check 1012 "resume passes args via yield" '142'
check 1020 "resume dead returns error" '"cannot resume dead coroutine"'
check 1030 "coroutine.wrap" '6'
check 1040 "iterator via coroutine" '60'
TOTAL=$((PASS + FAIL))
if [ $FAIL -eq 0 ]; then
echo "ok $PASS/$TOTAL Lua-on-SX tests passed"