Browse Source

FFI: Load FFI library on-demand for bytecode with cdata literals.

Mike Pall 12 years ago
parent
commit
2c293a96de
2 changed files with 13 additions and 3 deletions
  1. 1 1
      src/Makefile.dep
  2. 12 2
      src/lj_bcread.c

+ 1 - 1
src/Makefile.dep

@@ -51,7 +51,7 @@ lj_bc.o: lj_bc.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_bc.h \
  lj_bcdef.h
  lj_bcdef.h
 lj_bcread.o: lj_bcread.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
 lj_bcread.o: lj_bcread.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_bc.h lj_ctype.h \
  lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_bc.h lj_ctype.h \
- lj_cdata.h lj_lex.h lj_bcdump.h lj_state.h
+ lj_cdata.h lualib.h lj_lex.h lj_bcdump.h lj_state.h
 lj_bcwrite.o: lj_bcwrite.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
 lj_bcwrite.o: lj_bcwrite.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
  lj_gc.h lj_str.h lj_bc.h lj_ctype.h lj_dispatch.h lj_jit.h lj_ir.h \
  lj_gc.h lj_str.h lj_bc.h lj_ctype.h lj_dispatch.h lj_jit.h lj_ir.h \
  lj_bcdump.h lj_lex.h lj_err.h lj_errmsg.h lj_vm.h
  lj_bcdump.h lj_lex.h lj_err.h lj_errmsg.h lj_vm.h

+ 12 - 2
src/lj_bcread.c

@@ -15,6 +15,7 @@
 #if LJ_HASFFI
 #if LJ_HASFFI
 #include "lj_ctype.h"
 #include "lj_ctype.h"
 #include "lj_cdata.h"
 #include "lj_cdata.h"
+#include "lualib.h"
 #endif
 #endif
 #include "lj_lex.h"
 #include "lj_lex.h"
 #include "lj_bcdump.h"
 #include "lj_bcdump.h"
@@ -428,9 +429,18 @@ static int bcread_header(LexState *ls)
       bcread_byte(ls) != BCDUMP_VERSION) return 0;
       bcread_byte(ls) != BCDUMP_VERSION) return 0;
   bcread_flags(ls) = flags = bcread_uleb128(ls);
   bcread_flags(ls) = flags = bcread_uleb128(ls);
   if ((flags & ~(BCDUMP_F_KNOWN)) != 0) return 0;
   if ((flags & ~(BCDUMP_F_KNOWN)) != 0) return 0;
-#if !LJ_HASFFI
-  if ((flags & BCDUMP_F_FFI)) return 0;
+  if ((flags & BCDUMP_F_FFI)) {
+#if LJ_HASFFI
+    lua_State *L = ls->L;
+    if (!ctype_ctsG(G(L))) {
+      ptrdiff_t oldtop = savestack(L, L->top);
+      luaopen_ffi(L);  /* Load FFI library on-demand. */
+      L->top = restorestack(L, oldtop);
+    }
+#else
+    return 0;
 #endif
 #endif
+  }
   if ((flags & BCDUMP_F_STRIP)) {
   if ((flags & BCDUMP_F_STRIP)) {
     ls->chunkname = lj_str_newz(ls->L, ls->chunkarg);
     ls->chunkname = lj_str_newz(ls->L, ls->chunkarg);
   } else {
   } else {