aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib_ffi.c3
-rw-r--r--src/lj_crecord.c10
-rw-r--r--src/lj_crecord.h2
-rw-r--r--src/lj_jit.h3
-rw-r--r--src/lj_record.c7
5 files changed, 21 insertions, 4 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index 45065c12..361c3ba1 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -482,7 +482,7 @@ LJLIB_CF(ffi_fill) LJLIB_REC(.)
482#define H_(le, be) LJ_ENDIAN_SELECT(0x##le, 0x##be) 482#define H_(le, be) LJ_ENDIAN_SELECT(0x##le, 0x##be)
483 483
484/* Test ABI string. */ 484/* Test ABI string. */
485LJLIB_CF(ffi_abi) 485LJLIB_CF(ffi_abi) LJLIB_REC(.)
486{ 486{
487 GCstr *s = lj_lib_checkstr(L, 1); 487 GCstr *s = lj_lib_checkstr(L, 1);
488 int b = 0; 488 int b = 0;
@@ -511,6 +511,7 @@ LJLIB_CF(ffi_abi)
511 break; 511 break;
512 } 512 }
513 setboolV(L->top-1, b); 513 setboolV(L->top-1, b);
514 setboolV(&G(L)->tmptv2, b); /* Remember for trace recorder. */
514 return 1; 515 return 1;
515} 516}
516 517
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 8e68a5d6..73575fe2 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -1008,6 +1008,16 @@ void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd)
1008 } /* else: interpreter will throw. */ 1008 } /* else: interpreter will throw. */
1009} 1009}
1010 1010
1011void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd)
1012{
1013 if (tref_isstr(J->base[0])) {
1014 /* Specialize to the ABI string to make the boolean result a constant. */
1015 emitir(IRTG(IR_EQ, IRT_STR), J->base[0], lj_ir_kstr(J, strV(&rd->argv[0])));
1016 J->postproc = LJ_POST_FIXBOOL;
1017 J->base[0] = TREF_TRUE;
1018 } /* else: interpreter will throw. */
1019}
1020
1011/* -- Miscellaneous library functions ------------------------------------- */ 1021/* -- Miscellaneous library functions ------------------------------------- */
1012 1022
1013void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) 1023void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd)
diff --git a/src/lj_crecord.h b/src/lj_crecord.h
index 1714f1c4..0199e0eb 100644
--- a/src/lj_crecord.h
+++ b/src/lj_crecord.h
@@ -19,6 +19,7 @@ LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd);
19LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd); 19LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd);
20LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd); 20LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd);
21LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd); 21LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd);
22LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd);
22LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); 23LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
23#else 24#else
24#define recff_cdata_index recff_nyi 25#define recff_cdata_index recff_nyi
@@ -29,6 +30,7 @@ LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
29#define recff_ffi_string recff_nyi 30#define recff_ffi_string recff_nyi
30#define recff_ffi_copy recff_nyi 31#define recff_ffi_copy recff_nyi
31#define recff_ffi_fill recff_nyi 32#define recff_ffi_fill recff_nyi
33#define recff_ffi_abi recff_nyi
32#endif 34#endif
33 35
34#endif 36#endif
diff --git a/src/lj_jit.h b/src/lj_jit.h
index 2f3df2a0..e2dd5fb8 100644
--- a/src/lj_jit.h
+++ b/src/lj_jit.h
@@ -112,7 +112,8 @@ typedef enum {
112typedef enum { 112typedef enum {
113 LJ_POST_NONE, /* No action. */ 113 LJ_POST_NONE, /* No action. */
114 LJ_POST_FIXCOMP, /* Fixup comparison and emit pending guard. */ 114 LJ_POST_FIXCOMP, /* Fixup comparison and emit pending guard. */
115 LJ_POST_FIXGUARD /* Fixup and emit pending guard. */ 115 LJ_POST_FIXGUARD, /* Fixup and emit pending guard. */
116 LJ_POST_FIXBOOL /* Fixup boolean result. */
116} PostProc; 117} PostProc;
117 118
118/* Machine code type. */ 119/* Machine code type. */
diff --git a/src/lj_record.c b/src/lj_record.c
index d8c67499..26e87ab3 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -1388,16 +1388,19 @@ void lj_record_ins(jit_State *J)
1388 rec_comp_fixup(J, pc, (!tvistruecond(&J2G(J)->tmptv2) ^ (bc_op(*pc)&1))); 1388 rec_comp_fixup(J, pc, (!tvistruecond(&J2G(J)->tmptv2) ^ (bc_op(*pc)&1)));
1389 /* fallthrough */ 1389 /* fallthrough */
1390 case LJ_POST_FIXGUARD: /* Fixup and emit pending guard. */ 1390 case LJ_POST_FIXGUARD: /* Fixup and emit pending guard. */
1391 if (!tvistruecond(&J2G(J)->tmptv2))
1392 J->fold.ins.o ^= 1; /* Flip guard to opposite. */
1393 lj_opt_fold(J); /* Emit pending guard. */
1394 /* fallthrough */
1395 case LJ_POST_FIXBOOL:
1391 if (!tvistruecond(&J2G(J)->tmptv2)) { 1396 if (!tvistruecond(&J2G(J)->tmptv2)) {
1392 BCReg s; 1397 BCReg s;
1393 J->fold.ins.o ^= 1; /* Flip guard to opposite. */
1394 for (s = 0; s < J->maxslot; s++) /* Fixup stack slot (if any). */ 1398 for (s = 0; s < J->maxslot; s++) /* Fixup stack slot (if any). */
1395 if (J->base[s] == TREF_TRUE && tvisfalse(&J->L->base[s])) { 1399 if (J->base[s] == TREF_TRUE && tvisfalse(&J->L->base[s])) {
1396 J->base[s] = TREF_FALSE; 1400 J->base[s] = TREF_FALSE;
1397 break; 1401 break;
1398 } 1402 }
1399 } 1403 }
1400 lj_opt_fold(J); /* Emit pending guard. */
1401 break; 1404 break;
1402 default: lua_assert(0); break; 1405 default: lua_assert(0); break;
1403 } 1406 }