Scripting: Much cleaner require shimming

This commit is contained in:
Vicki Pfau 2022-06-09 16:18:34 -07:00
parent aee35a4442
commit 45b47c32d2
1 changed files with 8 additions and 18 deletions

View File

@ -80,7 +80,6 @@ struct mScriptEngineContextLua {
struct mScriptEngineContext d; struct mScriptEngineContext d;
lua_State* lua; lua_State* lua;
int func; int func;
char lastDirectory[PATH_MAX];
int require; int require;
char* lastError; char* lastError;
}; };
@ -515,12 +514,15 @@ bool _luaLoad(struct mScriptEngineContext* ctx, const char* filename, struct VFi
int ret = lua_load(luaContext->lua, _reader, &data, filename, "t"); int ret = lua_load(luaContext->lua, _reader, &data, filename, "t");
switch (ret) { switch (ret) {
case LUA_OK: case LUA_OK:
luaContext->func = luaL_ref(luaContext->lua, LUA_REGISTRYINDEX);
if (dirname[0]) { if (dirname[0]) {
strncpy(luaContext->lastDirectory, dirname, sizeof(luaContext->lastDirectory)); lua_getupvalue(luaContext->lua, -1, 1);
} else { lua_pushliteral(luaContext->lua, "require");
memset(luaContext->lastDirectory, 0, sizeof(luaContext->lastDirectory)); lua_pushstring(luaContext->lua, dirname);
lua_pushcclosure(luaContext->lua, _luaRequireShim, 1);
lua_rawset(luaContext->lua, -3);
lua_pop(luaContext->lua, 1);
} }
luaContext->func = luaL_ref(luaContext->lua, LUA_REGISTRYINDEX);
return true; return true;
case LUA_ERRSYNTAX: case LUA_ERRSYNTAX:
luaContext->lastError = strdup(lua_tostring(luaContext->lua, -1)); luaContext->lastError = strdup(lua_tostring(luaContext->lua, -1));
@ -535,20 +537,8 @@ bool _luaLoad(struct mScriptEngineContext* ctx, const char* filename, struct VFi
bool _luaRun(struct mScriptEngineContext* context) { bool _luaRun(struct mScriptEngineContext* context) {
struct mScriptEngineContextLua* luaContext = (struct mScriptEngineContextLua*) context; struct mScriptEngineContextLua* luaContext = (struct mScriptEngineContextLua*) context;
if (luaContext->lastDirectory[0]) {
// Shim require to look in the previous location
lua_pushstring(luaContext->lua, luaContext->lastDirectory);
lua_pushcclosure(luaContext->lua, _luaRequireShim, 1);
lua_setglobal(luaContext->lua, "require");
}
lua_rawgeti(luaContext->lua, LUA_REGISTRYINDEX, luaContext->func); lua_rawgeti(luaContext->lua, LUA_REGISTRYINDEX, luaContext->func);
bool ret = _luaInvoke(luaContext, NULL); return _luaInvoke(luaContext, NULL);
// Restore previous value of require
lua_rawgeti(luaContext->lua, LUA_REGISTRYINDEX, luaContext->require);
lua_setglobal(luaContext->lua, "require");
return ret;
} }
const char* _luaGetError(struct mScriptEngineContext* context) { const char* _luaGetError(struct mScriptEngineContext* context) {