diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib_ffi.c | 3 | ||||
| -rw-r--r-- | src/lj_crecord.c | 10 | ||||
| -rw-r--r-- | src/lj_crecord.h | 2 | ||||
| -rw-r--r-- | src/lj_jit.h | 3 | ||||
| -rw-r--r-- | src/lj_record.c | 7 |
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. */ |
| 485 | LJLIB_CF(ffi_abi) | 485 | LJLIB_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 | ||
| 1011 | void 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 | ||
| 1013 | void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) | 1023 | void 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); | |||
| 19 | LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd); | 19 | LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd); |
| 20 | LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd); | 20 | LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd); |
| 21 | LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd); | 21 | LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd); |
| 22 | LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd); | ||
| 22 | LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); | 23 | LJ_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 { | |||
| 112 | typedef enum { | 112 | typedef 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 | } |
