]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
FFI: Record ffi.abi().
authorMike Pall <mike>
Mon, 7 Feb 2011 23:09:33 +0000 (00:09 +0100)
committerMike Pall <mike>
Mon, 7 Feb 2011 23:09:33 +0000 (00:09 +0100)
src/lib_ffi.c
src/lj_crecord.c
src/lj_crecord.h
src/lj_jit.h
src/lj_record.c

index 45065c12a855d80ea433d492404a86f1f6c90315..361c3ba19afbbde4ac46f0d5eef5ff64d81e050f 100644 (file)
@@ -482,7 +482,7 @@ LJLIB_CF(ffi_fill)  LJLIB_REC(.)
 #define H_(le, be)     LJ_ENDIAN_SELECT(0x##le, 0x##be)
 
 /* Test ABI string. */
-LJLIB_CF(ffi_abi)
+LJLIB_CF(ffi_abi)      LJLIB_REC(.)
 {
   GCstr *s = lj_lib_checkstr(L, 1);
   int b = 0;
@@ -511,6 +511,7 @@ LJLIB_CF(ffi_abi)
     break;
   }
   setboolV(L->top-1, b);
+  setboolV(&G(L)->tmptv2, b);  /* Remember for trace recorder. */
   return 1;
 }
 
index 8e68a5d64403dccc74c17872b5c92c387e16ddc3..73575fe2c7bc75f8c61643bcb4bd0bfe80b939e8 100644 (file)
@@ -1008,6 +1008,16 @@ void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd)
   }  /* else: interpreter will throw. */
 }
 
+void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd)
+{
+  if (tref_isstr(J->base[0])) {
+    /* Specialize to the ABI string to make the boolean result a constant. */
+    emitir(IRTG(IR_EQ, IRT_STR), J->base[0], lj_ir_kstr(J, strV(&rd->argv[0])));
+    J->postproc = LJ_POST_FIXBOOL;
+    J->base[0] = TREF_TRUE;
+  }  /* else: interpreter will throw. */
+}
+
 /* -- Miscellaneous library functions ------------------------------------- */
 
 void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd)
index 1714f1c4fe9c81b02593c5f7b49dee1605c897e2..0199e0ebaa573988dbc41b8cad1cb157b8f10c60 100644 (file)
@@ -19,6 +19,7 @@ LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd);
 LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd);
 LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd);
 LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd);
+LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd);
 LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
 #else
 #define recff_cdata_index      recff_nyi
@@ -29,6 +30,7 @@ LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
 #define recff_ffi_string       recff_nyi
 #define recff_ffi_copy         recff_nyi
 #define recff_ffi_fill         recff_nyi
+#define recff_ffi_abi          recff_nyi
 #endif
 
 #endif
index 2f3df2a08a914d161d6c8e23ec13bdd0f31a142d..e2dd5fb8f9f41afcf76a82b14e5ed2e5ddbfceb0 100644 (file)
@@ -112,7 +112,8 @@ typedef enum {
 typedef enum {
   LJ_POST_NONE,                /* No action. */
   LJ_POST_FIXCOMP,     /* Fixup comparison and emit pending guard. */
-  LJ_POST_FIXGUARD     /* Fixup and emit pending guard. */
+  LJ_POST_FIXGUARD,    /* Fixup and emit pending guard. */
+  LJ_POST_FIXBOOL      /* Fixup boolean result. */
 } PostProc;
 
 /* Machine code type. */
index d8c6749984a0ec13ac9e96f58ed2ca21811563b5..26e87ab39b1fda9889267f9f7ac81c6252e941be 100644 (file)
@@ -1388,16 +1388,19 @@ void lj_record_ins(jit_State *J)
       rec_comp_fixup(J, pc, (!tvistruecond(&J2G(J)->tmptv2) ^ (bc_op(*pc)&1)));
       /* fallthrough */
     case LJ_POST_FIXGUARD:  /* Fixup and emit pending guard. */
+      if (!tvistruecond(&J2G(J)->tmptv2))
+       J->fold.ins.o ^= 1;  /* Flip guard to opposite. */
+      lj_opt_fold(J);  /* Emit pending guard. */
+      /* fallthrough */
+    case LJ_POST_FIXBOOL:
       if (!tvistruecond(&J2G(J)->tmptv2)) {
        BCReg s;
-       J->fold.ins.o ^= 1;  /* Flip guard to opposite. */
        for (s = 0; s < J->maxslot; s++)  /* Fixup stack slot (if any). */
          if (J->base[s] == TREF_TRUE && tvisfalse(&J->L->base[s])) {
            J->base[s] = TREF_FALSE;
            break;
          }
       }
-      lj_opt_fold(J);  /* Emit pending guard. */
       break;
     default: lua_assert(0); break;
     }