FFI: Preserve stack top across implicit load of FFI library in lexer.

This commit is contained in:
Mike Pall 2011-01-09 17:48:25 +01:00
parent 06f99fc3df
commit 9502afb35b
2 changed files with 4 additions and 2 deletions

View File

@ -97,7 +97,7 @@ lj_ir.o: lj_ir.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \
lj_bc.h lj_traceerr.h lj_ctype.h lj_cdata.h lj_lib.h lj_bc.h lj_traceerr.h lj_ctype.h lj_cdata.h lj_lib.h
lj_lex.o: lj_lex.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ lj_lex.o: lj_lex.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \
lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_cdata.h lualib.h \ lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_cdata.h lualib.h \
lj_lex.h lj_parse.h lj_char.h lj_state.h lj_lex.h lj_parse.h lj_char.h
lj_lib.o: lj_lib.c lauxlib.h lua.h luaconf.h lj_obj.h lj_def.h lj_arch.h \ lj_lib.o: lj_lib.c lauxlib.h lua.h luaconf.h lj_obj.h lj_def.h lj_arch.h \
lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_bc.h \ lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_bc.h \
lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h lj_lib.h lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h lj_lib.h

View File

@ -19,6 +19,7 @@
#include "lj_cdata.h" #include "lj_cdata.h"
#include "lualib.h" #include "lualib.h"
#endif #endif
#include "lj_state.h"
#include "lj_lex.h" #include "lj_lex.h"
#include "lj_parse.h" #include "lj_parse.h"
#include "lj_char.h" #include "lj_char.h"
@ -87,6 +88,7 @@ static void inclinenumber(LexState *ls)
/* Load FFI library on-demand. Needed if we create cdata objects. */ /* Load FFI library on-demand. Needed if we create cdata objects. */
static void lex_loadffi(lua_State *L) static void lex_loadffi(lua_State *L)
{ {
ptrdiff_t oldtop = savestack(L, L->top);
cTValue *tmp; cTValue *tmp;
luaopen_ffi(L); luaopen_ffi(L);
tmp = lj_tab_getstr(tabV(registry(L)), lj_str_newlit(L, "_LOADED")); tmp = lj_tab_getstr(tabV(registry(L)), lj_str_newlit(L, "_LOADED"));
@ -95,7 +97,7 @@ static void lex_loadffi(lua_State *L)
copyTV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "ffi")), L->top-1); copyTV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "ffi")), L->top-1);
lj_gc_anybarriert(L, t); lj_gc_anybarriert(L, t);
} }
L->top--; L->top = restorestack(L, oldtop);
} }
/* Parse 64 bit integer. */ /* Parse 64 bit integer. */