diff options
author | Mike Pall <mike> | 2011-02-08 00:09:33 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-02-08 00:09:33 +0100 |
commit | c39ca7c35b4f4efd91c83ab0777f32c294766e23 (patch) | |
tree | 915ac9ce5b18762e98c58b239ddcc159bb309442 | |
parent | 7a37b93f1b40ba83cc68965b1c80c35363c1493d (diff) | |
download | luajit-c39ca7c35b4f4efd91c83ab0777f32c294766e23.tar.gz luajit-c39ca7c35b4f4efd91c83ab0777f32c294766e23.tar.bz2 luajit-c39ca7c35b4f4efd91c83ab0777f32c294766e23.zip |
FFI: Record ffi.abi().
-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 | } |