[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index] - Subject: Re: rename LUA_RIDX_CPCALL to LUA_RIDX_CCALL? (5.2.0-work2)
- From: David Manura <dm.lua@...>
- Date: Tue, 18 May 2010 22:51:13 -0400
On Mon, Mar 29, 2010 at 10:22 AM, Roberto Ierusalimschy wrote: > In 5.2, luaL_cpcall is able to return values. Doesn't that solve > the problem? (luaL_cpcall is also cheaper than 5.1's lua_cpcall.) Under Lua 5.2.0work3, we can make this example error safe without too much trouble: /* implement common utility function ppushstring (protected push string) */ static int pushudstring(lua_State * L) { lua_pushstring(L, (char const *)lua_touserdata(L, 1)); return 1; } static int ppushstring(lua_State * L, char const * str) { lua_pushcfunction(L, &pushudstring); lua_pushlightuserdata(L, str); return lua_pcall(L, 1, 1, 0); } /* now solve the real problem: migrate C heap object to Lua stack object */ char const * const str = some_library_get_string(); /* alloc C string or return NULL */ int const err = ppushstring(L, str); /* push Lua string (or nil given NULL) or return error code while pushing Lua error */ some_library_free_string(str); if (err != 0) lua_error(L); /* note: Lua string alone exists now */ Perhaps in this case we would prefer this actually: lua_freezeerror(L); // begin queuing any errors char const * const str = some_library_get_string(); lua_pushstring(L, str); some_library_free_string(str); lua_thawerror(L); // stop queuing errors, clear queue, and raise first queued error if any