C API: Userdata

classic Classic list List threaded Threaded
6 messages Options
RAM
Reply | Threaded
Open this post in threaded view
|

C API: Userdata

RAM
Pessoal,

Fiz o seguinte: acrescentei na struct lua_State um atributo (void *app_ptr) para passar uma referência de classe C++ para as funções que embarco na linguagem e uso como abaixo:

int l_clear(lua_State *L)
{
   TApp *lApp = (TApp *)L->app_ptr;
   lApp->clear();
}

Reparem que tive que alterar o código-fonte de Lua, algo desnecessário se houver uma solução menos invasiva. Li sobre o registry e userdata, mas não consegui implementar. Alguém pode dar uma dica?

Att,

Rogério
Ótium2 Tec.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: C API: Userdata

Henrique Magarotto
Olá

para isso eu uso Upvalues:


possui exemplo na pagina.

Att.
Henrique



Em 21 de agosto de 2013 20:58, RAM <[hidden email]> escreveu:
Pessoal,

Fiz o seguinte: acrescentei na struct lua_State um atributo (void *app_ptr) para passar uma referência de classe C++ para as funções que embarco na linguagem e uso como abaixo:

int l_clear(lua_State *L)
{
   TApp *lApp = (TApp *)L->app_ptr;
   lApp->clear();
}

Reparem que tive que alterar o código-fonte de Lua, algo desnecessário se houver uma solução menos invasiva. Li sobre o registry e userdata, mas não consegui implementar. Alguém pode dar uma dica?

Att,

Rogério
Ótium2 Tec.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
RAM
Reply | Threaded
Open this post in threaded view
|

Re: C API: Userdata

RAM
Obrigado, Henrique.

Acabei de ver, mas eu quero passar um simples ponteirinho pras funções embarcadas. Upvalues passam toda uma estrutura de estado Lua. 
Acho que vou manter minha abordagem mesmo. Deixo um comentário no código avisando para acrescentar o membro "app_ptr" na struct lua_State (lstate.h) quando atualizar os fontes de Lua.

Thanks!

Em quarta-feira, 21 de agosto de 2013 22h08min10s UTC-3, Henrique escreveu:
Olá

para isso eu uso Upvalues:


possui exemplo na pagina.

Att.
Henrique



Em 21 de agosto de 2013 20:58, RAM <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="2LzNtf2wqPoJ">ramo...@...> escreveu:
Pessoal,

Fiz o seguinte: acrescentei na struct lua_State um atributo (void *app_ptr) para passar uma referência de classe C++ para as funções que embarco na linguagem e uso como abaixo:

int l_clear(lua_State *L)
{
   TApp *lApp = (TApp *)L->app_ptr;
   lApp->clear();
}

Reparem que tive que alterar o código-fonte de Lua, algo desnecessário se houver uma solução menos invasiva. Li sobre o registry e userdata, mas não consegui implementar. Alguém pode dar uma dica?

Att,

Rogério
Ótium2 Tec.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para <a href="javascript:" target="_blank" gdf-obfuscated-mailto="2LzNtf2wqPoJ">lua-br+un...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: C API: Userdata

Henrique Magarotto
Olá Rogério,

Veja, com Upvalues vc pega o "simples ponteirinho" :) assim:

int l_clear(lua_State *L)
{
   TApp *lApp = static_cast<TApp*>(lua_touserdata(L, lua_upvalueindex(1)));
   lApp->clear();
   ...
}


E quando for registrar sua funcao no environment Lua:
...
   lua_pushlightuserdata(L,static_cast<void*>(&lApp));
   lua_pushcclosure(L, l_clear, 1);
   lua_setfield(L, LUA_GLOBALSINDEX, "clear");
...

Aqui eu uso este método com ponteiro para objetos e métodos e com uso de templates assim eu consigo registrar um ou mais objetos mesmo sem uma interface pré-definida. Com um hash interno eu utilizo também somente uma função para tratar o callback lua, e chamar os métodos e objetos corretos em cpp.

Outra dica é colocar a sua funcao dentro de uma tabela em vez do indice global, assim vc pode chamar sua funcao em Lua assim:
app.clear();


Acho simples e vc usa uma feature já existente na API C do Lua, ;-).

Att.
Henrique



Em 21 de agosto de 2013 22:41, RAM <[hidden email]> escreveu:
Obrigado, Henrique.

Acabei de ver, mas eu quero passar um simples ponteirinho pras funções embarcadas. Upvalues passam toda uma estrutura de estado Lua. 
Acho que vou manter minha abordagem mesmo. Deixo um comentário no código avisando para acrescentar o membro "app_ptr" na struct lua_State (lstate.h) quando atualizar os fontes de Lua.

Thanks!

Em quarta-feira, 21 de agosto de 2013 22h08min10s UTC-3, Henrique escreveu:
Olá

para isso eu uso Upvalues:


possui exemplo na pagina.

Att.
Henrique



Em 21 de agosto de 2013 20:58, RAM <[hidden email]> escreveu:
Pessoal,

Fiz o seguinte: acrescentei na struct lua_State um atributo (void *app_ptr) para passar uma referência de classe C++ para as funções que embarco na linguagem e uso como abaixo:

int l_clear(lua_State *L)
{
   TApp *lApp = (TApp *)L->app_ptr;
   lApp->clear();
}

Reparem que tive que alterar o código-fonte de Lua, algo desnecessário se houver uma solução menos invasiva. Li sobre o registry e userdata, mas não consegui implementar. Alguém pode dar uma dica?

Att,

Rogério
Ótium2 Tec.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para lua-br+un...@googlegroups.com.

Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: C API: Userdata

Lourival Vieira Neto
In reply to this post by RAM
2013/8/21 RAM <[hidden email]>:
> Acabei de ver, mas eu quero passar um simples ponteirinho pras funções
> embarcadas.

http://www.lua.org/manual/5.1/manual.html#lua_pushlightuserdata

--
Lourival Vieira Neto

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
RAM
Reply | Threaded
Open this post in threaded view
|

Re: C API: Userdata

RAM
In reply to this post by RAM
Obrigado, amigos.

Vou continuar usando minha abordagem por ela ser direta, mesmo sendo deselegante. Henrique, achei bacana sua ideia de associar as funções a uma tabela. Há dois produtos que usarão os scripts e isso deixará o código conveniente.

Abraços

Em quarta-feira, 21 de agosto de 2013 20h58min37s UTC-3, RAM escreveu:
Pessoal,

Fiz o seguinte: acrescentei na struct lua_State um atributo (void *app_ptr) para passar uma referência de classe C++ para as funções que embarco na linguagem e uso como abaixo:

int l_clear(lua_State *L)
{
   TApp *lApp = (TApp *)L->app_ptr;
   lApp->clear();
}

Reparem que tive que alterar o código-fonte de Lua, algo desnecessário se houver uma solução menos invasiva. Li sobre o registry e userdata, mas não consegui implementar. Alguém pode dar uma dica?

Att,

Rogério
Ótium2 Tec.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.