Skip to content

Invalid coroutine.resume return values #2406

Open
@semyon422

Description

@semyon422

When I create a coroutine using coroutine.wrap and then resume it, coroutine.resume skips the first "status" value and returns all other values. As docs says it must return the first "status" boolean value.
I use openresty from AUR: aur/openresty 1.27.1.1-1

$ curl http://localhost:8080/1
2, nil, 3, nil, false, cannot resume dead coroutine
$ curl http://localhost:8080/2
true, 2, true, 3, false, cannot resume dead coroutine
worker_processes 1;
error_log error.log notice;
pid nginx.pid;

events {
    worker_connections 1024;
}

http {
    server {
        listen 8080;
        lua_code_cache off;

        location /1 {
            content_by_lua_block {
                local co

                local function f()
                    co = coroutine.running()
                    coroutine.yield(1)
                    coroutine.yield(2)
                    return 3
                end

                assert(coroutine.wrap(f)() == 1)

                local ok1, ret1 = coroutine.resume(co)
                local ok2, ret2 = coroutine.resume(co)
                local ok3, ret3 = coroutine.resume(co)
                ngx.say(("%s, %s, %s, %s, %s, %s"):format(
                    ok1, ret1, ok2, ret2, ok3, ret3
                ))
            }
        }

        location /2 {
            content_by_lua_block {
                local co

                local function f()
                    co = coroutine.running()
                    coroutine.yield(1)
                    coroutine.yield(2)
                    return 3
                end

                do
                    local c = coroutine.create(f)
                    local ok, v = assert(coroutine.resume(c))
                    assert(v == 1)
                end

                local ok1, ret1 = coroutine.resume(co)
                local ok2, ret2 = coroutine.resume(co)
                local ok3, ret3 = coroutine.resume(co)
                ngx.say(("%s, %s, %s, %s, %s, %s"):format(
                    ok1, ret1, ok2, ret2, ok3, ret3
                ))
            }
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions