2009-08-01 23 views
9

¿Alguien puede decirme cómo utilizar lua_pop() funciona correctamente en C++.Cómo usar la función lua_pop() correctamente?

  • ¿Debo llamarlo cuando uso una función lua_get *()? me gusta.

    lua_getglobal (L, "algo");

    lua_pop (L, 1);

o cómo usarlo? ¿El recolector de basura limpiará esas cosas después del umbral? Gracias.

Respuesta

20

Llama a lua_pop() para eliminar elementos de la pila de Lua. Para funciones simples, esto puede ser completamente innecesario ya que el núcleo limpiará la pila como parte del manejo de los valores devueltos.

Para funciones más complejas, y especialmente para el código C que está llamando a Lua, a menudo necesitará extraer elementos de la pila para evitar que la pila crezca indefinidamente.

La función lua_getglobal() agrega un elemento a la pila cuando se llama, que es nil si el valor global no existe o el valor de la variable global nombrada. Tener una copia de ese valor en la pila lo protege del recolector de basura, siempre que esté allí. Ese valor debe permanecer en la pila siempre que lo use el código C que lo recuperó, porque si se modificara el global, la copia en la pila podría ser la única referencia restante.

Así que los patrones generales para el uso de un mundial son algo así como los siguientes:

void doMyEvent(lua_State *L) { 
    lua_getglobal(L, "MyEvent"); 
    lua_call(L, 0, 0); /* pops the function and 0 parameters, pushes 0 results */ 
} 

double getGlobalDouble(lua_State *L, const char *name) { 
    double d; 
    lua_getglobal(L,name); 
    d = lua_tonumber(L,1); /* extracts the value, leaves stack unchanged */ 
    lua_pop(L,1);   /* pop the value to leave stack balanced */ 
    return d; 
} 

char *copyGlobalString(lua_State *L, const char *name) { 
    char *s = NULL; 
    lua_getglobal(L,name); 
    if (!lua_isnil(L,-1)) 
     s = strdup(lua_tostring(L,-1)); 
    lua_pop(L,1); 
    return s; 
} 

En el último ejemplo, tengo cuidado para copiar el contenido de la cadena debido a que el puntero devuelto por lua_tostring() solamente se garantiza que sea válido mientras el valor permanezca en la pila. El requiere que una persona que llama de copyGlobalString() es responsable de llamar al free() más tarde.

Tenga en cuenta también que las ediciones recientes de Lua manual incluyen una notación junto con cada función que identifica el número de entradas de la pila consumidas, y el número presionado. Esto ayuda a evitar el crecimiento inesperado de la pila.

+0

+1, estilo de comentario de Lua en código C++? :-) –

+1

@nick ... facepalm! Es mejor ahora ;-) – RBerteig

+0

¡Hola! Gracias por la ayuda. Y una pregunta más, ¿cuál es la diferencia entre llamar lua_call (L, 0, 0); y lua_pop (L, 1); para eliminar las FUNCIONES? Quiero decir, ¿por qué usaste lua_call (L, 0, 0) en lugar de usar lua_pop (L, 1)? – Morpheus

Cuestiones relacionadas