Example #1
0
LuaManager::LuaManager() : m_lua(NULL) {
	if (instantiated) {
		fprintf(stderr, "Can't instantiate more than one LuaManager");
		abort();
	}

	m_lua = lua_open();

	luaL_openlibs(m_lua);

	lua_atpanic(m_lua, pi_lua_panic);

	RefCountedPtr<FileSystem::FileData> code = FileSystem::gameDataFiles.ReadFile(luaDebugFilename);
	if (!code) {
		fprintf(stderr, "could not read Lua file '%s'\n", luaDebugFilename.c_str());
		abort();
	}

	int ret = luaL_loadbuffer(m_lua, code->GetData(), code->GetSize(), code->GetInfo().GetPath().c_str());
	if (ret) {
		if (ret == LUA_ERRSYNTAX) {
			const char* message = lua_tostring(m_lua, -1);
			fprintf(stderr, "Syntax error in '%s:\n%s\n", code->GetInfo().GetAbsolutePath().c_str(), message);
		}
		else
			fprintf(stderr, "Error while loading '%s'\n", code->GetInfo().GetAbsolutePath().c_str());
		abort();
	}
	if (lua_pcall(m_lua, 0, 1, 0)) {
		fprintf(stderr, "Fatal Lua error: pidebug.lua failed to initialise.");
		abort();
	}
	if (lua_type(m_lua, -1) != LUA_TTABLE) {
		fprintf(stderr, "Fatal Lua error: pidebug.lua did not return module table.");
		abort();
	}
	lua_getfield(m_lua, -1, "error_handler");
	if (lua_type(m_lua, -1) != LUA_TFUNCTION) {
		fprintf(stderr, "Fatal Lua error: pidebug.lua did not define error_handler function.");
		abort();
	}
	lua_pop(m_lua, 1);
	lua_setfield(m_lua, LUA_REGISTRYINDEX, "PiDebug");

	instantiated = true;
}
Example #2
0
void pi_lua_dofile(lua_State *l, const std::string &path)
{
	assert(l);
	LUA_DEBUG_START(l);

	RefCountedPtr<FileSystem::FileData> code = FileSystem::gameDataFiles.ReadFile(path);
	if (!code) {
		fprintf(stderr, "could not read Lua file '%s'\n", path.c_str());
	}

	// XXX kill CurrentDirectory
	std::string dir = code->GetInfo().GetDir();
	if (dir.empty()) { dir = "."; }
	lua_pushstring(l, dir.c_str());
	lua_setglobal(l, "CurrentDirectory");

	pi_lua_dofile(l, *code);

	// XXX kill CurrentDirectory
	lua_pushnil(l);
	lua_setglobal(l, "CurrentDirectory");

	LUA_DEBUG_END(l, 0);
}