C API: lua_pcallk e lua_yield

61 views
Skip to first unread message

Ezequiel Rabelo Aguiar

unread,
May 4, 2022, 3:44:52 PM5/4/22
to Lua BR
Olá pessoal!

Estou apanhando em implementar uma função que usa o lua_yield. Quando a função é chamada com o lua_pcallk ocorre o erro abaixo quando chega no lua_yield:

"PANIC: unprotected error in call to Lua API"

O programa inteiro fecha ("crash") com o este erro (a intenção é que o erro fique confinado somente no "módulo de extensão" do programa).

Preciso de alguma orientação, um tutorial ou exemplo que possa ajudar a descobrir o que estou fazendo de errado.

Para quem quiser conhecer, o programa em desenvolvimento é um CAD que utiliza a Lua como linguagem de extensão (script). Está disponível em: https://github.com/zecruel/CadZinho

Um abraço!

Roberto Ierusalimschy

unread,
May 4, 2022, 5:10:41 PM5/4/22
to lua...@googlegroups.com
> Estou apanhando em implementar uma função que usa o lua_yield. Quando a
> função é chamada com o lua_pcallk ocorre o erro abaixo quando chega no
> lua_yield:
>
> "PANIC: unprotected error in call to Lua API"

Estranho, isso não devia ocorrer enquanto executando um
lua_pcallk. Você está usando o lua_State correto (o que a função que
chama lua_yield recebeu como parâmetro)?

-- Roberto

Ezequiel Rabelo Aguiar

unread,
May 5, 2022, 7:13:59 AM5/5/22
to Lua BR
Grande Roberto!

Sim, aparentemente é o mesmo lua_State. Veja abaixo o debug:

yield.png

Não sei se ajuda a esclarecer, mas o lua_pcallk não chama diretamente a função que faz o lua_yield ( função chamada dentro da função, meio que um "callback").

Um grande abraço!

Ezequiel

Ezequiel Rabelo Aguiar

unread,
May 6, 2022, 8:42:26 AM5/6/22
to Lua BR
Olá pessoal. Fiz um novo debug já dentro da Lua, que talvez traga uma luz ao problema. Segue abaixo:
debug.png
Um abraço,

Ezequiel

Ezequiel Rabelo Aguiar

unread,
May 6, 2022, 11:03:57 AM5/6/22
to Lua BR
Pessoal, consegui resolver meu problema (egoisticamente falando):
Desisti de usar o lua_pcallk, e no lugar usei um lua_resume. Isto fez meu programa funcionar bem com lua_yield, e atendeu os propósitos.

Agora fiquei sem saber se o problema com o lua_pcallk foi na minha implementação, ou se existe um bug na Lua. Deixo a questão pros especialistas (contem comigo se precisarem debugar).

Um abraço.

Denis Dos Santos Silva

unread,
May 16, 2022, 5:47:29 AM5/16/22
to Lua BR
mano voce tem o codigo "bugado" e o "ok" ?

qual versao do lua/gcc vc ta usando ?

queria testar essa situacao.

Ezequiel Rabelo Aguiar

unread,
May 17, 2022, 7:42:34 AM5/17/22
to Lua BR
Olá Denis!

Estava usando a Lua 5.4.2 e atualizei pra a 5.4.4, apresentando o mesmo comportamento.

O gcc é  5.1.0  (tdm64-1) no Windows (mingw). Realmente ele é meio caidão, mas não tive tempo de compilar num mais moderno (no Linux, por exemplo).

Quanto ao código, acho meio difícil pinçar diretamente da minha aplicação, pois está bem intrincado (acho que vai mais confundir, do que esclarecer). Acho melhor tentar fazer um programa específico só pra testa esta condição. Em resumo, o caminho até o erro foi:

- cria um estado (L = luaL_newstate() )
- abre as bibliotecas (luaL_openlibs(L) ) ->  pode ser opcional
- cria uma thread (T = lua_newthread(L)), pra ser o espaço de execução principal
- carrega um chunk (luaL_loadfile(T, ... ou luaL_loadstring(T, ...), com a função que usa o lua_yield
- chama a função com o lua_pcallk(T, ...) - a função de continuação não chega a ser chamada.

Um abraço.
Reply all
Reply to author
Forward
0 new messages