Files
llgo/c/lua/_demo/crroutine-continue/corroutine.go
luoliwoshang e3cb4ebfdc c/lua:alloc
2024-09-16 23:30:35 +08:00

73 lines
1.4 KiB
Go

package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func countdownContinue(L *lua.State, status c.Int, ctx lua.KContext) c.Int {
return countdown(L)
}
func countdown(L *lua.State) c.Int {
arg := L.Tointeger(lua.Upvalueindex(1))
c.Printf(c.Str("resume called with %d\n"), arg)
if arg > 0 {
L.Pushinteger(arg - 1)
L.Replace(lua.Upvalueindex(1))
L.Pushinteger(arg)
return L.Yieldk(1, c.Pointer(uintptr(0)), countdownContinue)
}
return 0
}
func createCountdown(L *lua.State) c.Int {
max := L.Checkinteger(1)
L.Pushinteger(max)
L.Pushcclosure(countdown, 1)
return 1
}
func main() {
L := lua.Newstate__1()
L.Openlibs()
defer L.Close()
L.Register(c.Str("create_countdown"), createCountdown)
testcode := c.Str(`
local countdown = create_countdown(5)
local co = coroutine.create(countdown)
while true do
local success, value = coroutine.resume(co)
if not success then
print('Error:', value)
break
end
if value == nil then break end
print('Lua received:', value)
end
print('Countdown finished');
`)
if L.Dostring(testcode) != lua.OK {
c.Printf(c.Str("Error: %s\n"), L.Tostring(-1))
}
L.Openlibs()
}
/* Expected output:
resume called with 5
Lua received: 5
resume called with 4
Lua received: 4
resume called with 3
Lua received: 3
resume called with 2
Lua received: 2
resume called with 1
Lua received: 1
resume called with 0
Countdown finished
*/