lua-users home
lua-l archive

execute function:second revision

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


Hello:
Here's my revised execution function. Everything seems to work until I get to the pcall, where it fails. What am I doing wrong here? Also, if there is a way to make this cleaner/remove the meta table after I'm done executing, I'd appreciate any advice.
void Script::Execute(Entity* obj, const std::string &code)
{
 std::cout << "Executing " << code << std::endl;
 char id[16];
 World* world = World::GetPtr();
//we need to create a new metatable for the object so we have a sanitary execution context.
 if (!obj)
 {
 std::cout << "Invalid object." << std::endl;
 return;
 }
 if (obj->IsPlayer())
 {
 memcpy(id, obj->GetName().c_str(), obj->GetName().length());
 }
 else
 {
 NumberToString(id, obj->GetOnum());
 }
 if (!luaL_newmetatable(state, id))
 {
 std::cout << "Could not create metatable." << std::endl;
 std::cout << id << std::endl;
 return;
 }
 lua_pushstring(state, "__index");
 lua_pushvalue(state, LUA_GLOBALSINDEX);
 lua_settable(state, -3); //table is at -1 again
//we load our code to be executed.
 if (!luaL_loadbuffer(state, code.c_str(), code.length(), "execution"))
 {
//we set the table
 lua_getmetatable(state, -2);
//now we setfenv
 lua_setfenv(state, -2); //the function is back at -1
//we call the code.
 if (lua_pcall(state, 0, 0, 0))
 {
 std::cout << "pcall failed." << std::endl;
 world->WriteLog(lua_tostring(state, -1), SCRIPT, "script");
 lua_gc(state, LUA_GCCOLLECT, 0);
 }
 }
}
--
Take care,
Ty
my website:
http://tds-solutions.net
my blog:
http://tds-solutions.net/blog
skype: st8amnd127
My programs don't have bugs; they're randomly added features!

AltStyle によって変換されたページ (->オリジナル) /