lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


It was thus said that the Great Ervin Hegedüs once stated:
> Hi Lua-l list,
> 
> 
> On Wed, Sep 23, 2015 at 10:35:21AM +0200, Michal Kottman wrote:
> > 
> > Instead, take a look at Programming in Lua, especially
> > http://www.lua.org/pil/24.2.html to learn about accessing Lua from C using
> > the stack. The book is written for Lua 5.0, but still very relevant even
> > with 5.3.
> 
> so, I've read the documents above - that's very-very clear. Now I
> think I understand the stack - it's not just very funny, it has
> cold logic, and pure implementation.
> 
> Here is the sample code, what I tries first - and there is the
> state of stack, to help me to clarify the working of Lua stack.
> 
> Please review and comment it - em I understanding right it?
> 
> /*
>  myTable = {
>     [0] = { ["a"] = 4, ["b"] = 2 },
>     [1] = { ["a"] = 13, ["b"] = 37 }
> } */

  An alternative to your code:

	lua_newtable(L);	/* t */
	lua_pushinteger(L,0);	/* t n */
	lua_newtable(L);	/* t n t */
	lua_pushinteger(L,4);	/* t n t n */
	lua_setfield(L,-2,"a");	/* t n t */
	lua_pushinteger(L,2);	/* t n t n */
	lua_setfield(L,-2,"b");	/* t n t */
	lua_settable(L,-3);	/* t */

	lua_pushinteger(L,1);	/* t n */
	lua_newtable(L);	/* t n t */
	lua_pushinteger(L,13);	/* t n t n */
	lua_setfield(L,-2,"a");	/* t n t */
	lua_pushinteger(L,37);	/* t n t n */
	lua_setfield(L,-2,"b");	/* t n t */
	lua_settable(L,-3);	/* t */
	lua_setglobal(L,"t");	/* */

  The Lua stack is documented in the comments using a notation from Forth. 
The top of the stack is to the right; the leftmost item is at index 1, while
the right most item is -1.  

  I also have a function I occasionally use to help with the stack
manipulations---it dumps out the current Lua stack (it's in C):

	void dump_luastack(lua_State *L)
	{
	  int max;
	  int i;

	  printf("LUA STACK DUMP");
	  max = lua_gettop(L);

	  for (i = 1 ; i <= max ; i++)
	  {
	    const char *name;
	    const char *type;
	    int         ri;
	    
	    lua_getglobal(L,"tostring");
	    lua_pushvalue(L,i);
	    lua_call(L,1,1);
	    
	    name = lua_tostring(L,-1);
	    type = luaL_typename(L,i);
	    ri   = i - max - 1;
	    
	    printf("Stack: %d %d - %s %s",i,ri,type,name);
	    lua_pop(L,1);
	  }
	}

  -spc