Registrar funções

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

Registrar funções

Anderson Pimentel
Pessoal, estou com dúvidas sobre a diferença entre o lua_register e o lua_pushcfunction.

Quero criar uma chamada do script lua da seguinte forma:

$script lua

andpaint:Text('Teste da função de texto...')

Quero saber como restringir o acesso a apenas o uso como objeto. Não quero, por exemplo, que ele chame a função em C quando no script estiver da seguinte forma:

$script lua

andpaint.Text('Teste da função de texto...')

Estou registrando as funções da seguinte forma:


luaL_newmetatable( state"paint" );
lua_pushvalue(state, -1);
lua_setfield(state,-2, "__index");
 
 
 luaL_register(stateNULL, andpaint);
 lua_setglobal(state"andpaint");
Como posso fazer para restringir o acesso a apenas chamadas como métodos da classe andpaint?

Preciso utilizar o lua_pushcfunction?

[]´s

--
Att, Anderson Pimentel

--
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: Registrar funções

Michel Braz de Morais

Em 3 de outubro de 2013 10:16, Anderson Pimentel <[hidden email]> escreveu:
Pessoal

Se eu entendi a unica diferença é o '.' e o ':'
Se for isso voce pode restringir verificando o numeros de argumento na pilha no código em c.

por exemplo se fizer:

andpaint:Text()

Sua pilha devera estar assim:
**********************************
        -1|    table |1
**********************************

e ao fazer:
andpaint.Text()

sua pilha no c vai estar assim:

**********************************
**********************************
sem nada!

então se sua função tera somente um argumento (a string), apenas verifique se ela possui dois argumentos, o 1º table e o 2º string.
caso contrario raisererror!!!

Espero ter ajudado!!!




att,

Michel Braz de Morais

Analista / Desenvolvedor de sistemas

--
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: Registrar funções

Anderson Pimentel
In reply to this post by Anderson Pimentel
Sim, obrigado.

Enviado pelo meu Windows Phone

De: [hidden email]
Enviado: 03/10/2013 18:35
Para: [hidden email]
Asunto: Re: [lua-br] Registrar funções


Em 3 de outubro de 2013 10:16, Anderson Pimentel <[hidden email]> escreveu:
Pessoal

Se eu entendi a unica diferença é o '.' e o ':'
Se for isso voce pode restringir verificando o numeros de argumento na pilha no código em c.

por exemplo se fizer:

andpaint:Text()

Sua pilha devera estar assim:
**********************************
        -1|    table |1
**********************************

e ao fazer:
andpaint.Text()

sua pilha no c vai estar assim:

**********************************
**********************************
sem nada!

então se sua função tera somente um argumento (a string), apenas verifique se ela possui dois argumentos, o 1º table e o 2º string.
caso contrario raisererror!!!

Espero ter ajudado!!!




att,

Michel Braz de Morais

Analista / Desenvolvedor de sistemas

--
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: Registrar funções

Tomás Guisasola-2
In reply to this post by Anderson Pimentel
  Oi Anderson

On Thu, 3 Oct 2013, Anderson Pimentel wrote:

> Pessoal, estou com dúvidas sobre a diferença entre o lua_register e o
> lua_pushcfunction.
  A lua_register é uma forma prática de se fazer uma atribuição, como:

nome = function (..) .. end

  A diferença é que vale para funções C. Ela é implementada como
uma macro (código de Lua 5.2.0 que é igual ao de Lua 5.1.5):

#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))

  A função lua_pushcfunction serve para empilhar um valor do
tipo lua_CFunction, ou seja uma função C que pode ser chamada por Lua.
Com o valor na pilha, você pode fazer um monte de outras coisas...

> Quero criar uma chamada do script lua da seguinte forma:
>
> $script lua
>
> *andpaint:Text('Teste da função de texto...')*
>
> Quero saber como restringir o acesso a apenas o uso como objeto. Não quero,
> por exemplo, que ele chame a função em C quando no script estiver da
> seguinte forma:
>
> $script lua
>
> *andpaint.Text('Teste da função de texto...')*
  Como você quer "restringir"?  Quer dar um erro de execução quando
a função for chamada incorretamente?

> Estou registrando as funções da seguinte forma:
>
> luaL_newmetatable( state, "paint" );
> lua_pushvalue(state, -1);
> lua_setfield(state,-2, "__index");
>
> luaL_register(state, NULL, andpaint);
> lua_setglobal(state, "andpaint");
  Acima eu falei de lua_register, que é diferente de luaL_register.
Esta última serve para registrar _várias_ funções de uma vez.  O terceiro
parâmetro deve ser um array de pares (nome, função), onde o nome é a
chave na tabela que estiver no topo da pilha (no seu caso, a tabela
criada pela luaL_newmetatable) à qual será associada a função dada.
  Seja como for, até aqui você só está associando funções C a
globais (com lua_register) ou a campos de uma tabela (com luaL_register).
Isso não tem nada a ver com o uso dessas funções.

> Como posso fazer para restringir o acesso a apenas chamadas como métodos da
> classe andpaint?
  Se você quer dar um erro de execução quando a andpaint() for
chamada sem uma tabela como primeiro parâmetro, isso é outra coisa :-)
Você deve fazer isso na implementação da própria função.  Por exemplo:

static int andpaint_Text (lua_State *L) {
  luaL_checktype(L, 1, LUA_TTABLE);
...
}

  A primeira coisa que a função faz é verificar se o primeiro
parâmetro passado é uma tabela.  Uma tabela qualquer.  Para outros
exemplos parecidos, verifique a implementação da biblioteca de tabelas
de Lua (src/ltablib.c, nos fontes).

  Espero ter ajudado!

  Abraço,
  Tomás

--
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: Registrar funções

Anderson Pimentel
Bem esclarecedor Tomás.
Atualmente estou implementando da forma que o Michel havia citado, pelo número de elementos na pilha, ainda não havia pensado sobre a questão da tabela em si. Vou testar com essa solução e posto aqui o resultado.


Em 4 de outubro de 2013 09:12, Tomas Guisasola Gorham <[hidden email]> escreveu:
        Oi Anderson


On Thu, 3 Oct 2013, Anderson Pimentel wrote:

Pessoal, estou com dúvidas sobre a diferença entre o lua_register e o
lua_pushcfunction.
        A lua_register é uma forma prática de se fazer uma atribuição, como:

nome = function (..) .. end

        A diferença é que vale para funções C.  Ela é implementada como
uma macro (código de Lua 5.2.0 que é igual ao de Lua 5.1.5):

#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))

        A função lua_pushcfunction serve para empilhar um valor do
tipo lua_CFunction, ou seja uma função C que pode ser chamada por Lua.
Com o valor na pilha, você pode fazer um monte de outras coisas...

Quero criar uma chamada do script lua da seguinte forma:

$script lua

*andpaint:Text('Teste da função de texto...')*


Quero saber como restringir o acesso a apenas o uso como objeto. Não quero,
por exemplo, que ele chame a função em C quando no script estiver da
seguinte forma:

$script lua

*andpaint.Text('Teste da função de texto...')*
        Como você quer "restringir"?  Quer dar um erro de execução quando
a função for chamada incorretamente?


Estou registrando as funções da seguinte forma:

luaL_newmetatable( state, "paint" );
lua_pushvalue(state, -1);
lua_setfield(state,-2, "__index");

luaL_register(state, NULL, andpaint);
lua_setglobal(state, "andpaint");
        Acima eu falei de lua_register, que é diferente de luaL_register.
Esta última serve para registrar _várias_ funções de uma vez.  O terceiro
parâmetro deve ser um array de pares (nome, função), onde o nome é a
chave na tabela que estiver no topo da pilha (no seu caso, a tabela
criada pela luaL_newmetatable) à qual será associada a função dada.
        Seja como for, até aqui você só está associando funções C a
globais (com lua_register) ou a campos de uma tabela (com luaL_register).
Isso não tem nada a ver com o uso dessas funções.


Como posso fazer para restringir o acesso a apenas chamadas como métodos da
classe andpaint?
        Se você quer dar um erro de execução quando a andpaint() for
chamada sem uma tabela como primeiro parâmetro, isso é outra coisa :-)
Você deve fazer isso na implementação da própria função.  Por exemplo:

static int andpaint_Text (lua_State *L) {
        luaL_checktype(L, 1, LUA_TTABLE);
...
}

        A primeira coisa que a função faz é verificar se o primeiro
parâmetro passado é uma tabela.  Uma tabela qualquer.  Para outros
exemplos parecidos, verifique a implementação da biblioteca de tabelas
de Lua (src/ltablib.c, nos fontes).

        Espero ter ajudado!

        Abraço,
                Tomás


--
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.



--
Att, Anderson Pimentel

--
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.