diff options
author | Mike Pall <mike> | 2012-10-10 18:16:18 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-10-10 18:16:18 +0200 |
commit | 1c626112a06f1f69d3c22771c62d4ced1cfee356 (patch) | |
tree | 6045efeabcc77b7a0351a65161e1d456bb635752 /src | |
parent | 4a97faef7ef7e9b12235adcb98e3e591b0db7122 (diff) | |
download | luajit-1c626112a06f1f69d3c22771c62d4ced1cfee356.tar.gz luajit-1c626112a06f1f69d3c22771c62d4ced1cfee356.tar.bz2 luajit-1c626112a06f1f69d3c22771c62d4ced1cfee356.zip |
FFI: Compile ffi.sizeof(), ffi.alignof() and ffi.offsetof().
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.dep | 7 | ||||
-rw-r--r-- | src/lib_ffi.c | 6 | ||||
-rw-r--r-- | src/lj_crecord.c | 23 | ||||
-rw-r--r-- | src/lj_crecord.h | 1 | ||||
-rw-r--r-- | src/lj_jit.h | 1 | ||||
-rw-r--r-- | src/lj_record.c | 12 |
6 files changed, 42 insertions, 8 deletions
diff --git a/src/Makefile.dep b/src/Makefile.dep index cab23b79..9571e16d 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep | |||
@@ -82,9 +82,10 @@ lj_cparse.o: lj_cparse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ | |||
82 | lj_bc.h lj_vm.h lj_char.h lj_strscan.h | 82 | lj_bc.h lj_vm.h lj_char.h lj_strscan.h |
83 | lj_crecord.o: lj_crecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ | 83 | lj_crecord.o: lj_crecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ |
84 | lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h \ | 84 | lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h \ |
85 | lj_gc.h lj_cdata.h lj_cparse.h lj_cconv.h lj_clib.h lj_ccall.h lj_ir.h \ | 85 | lj_gc.h lj_cdata.h lj_cparse.h lj_cconv.h lj_clib.h lj_ccall.h lj_ff.h \ |
86 | lj_jit.h lj_ircall.h lj_iropt.h lj_trace.h lj_dispatch.h lj_traceerr.h \ | 86 | lj_ffdef.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_trace.h \ |
87 | lj_record.h lj_ffrecord.h lj_snap.h lj_crecord.h | 87 | lj_dispatch.h lj_traceerr.h lj_record.h lj_ffrecord.h lj_snap.h \ |
88 | lj_crecord.h | ||
88 | lj_ctype.o: lj_ctype.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ | 89 | lj_ctype.o: lj_ctype.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ |
89 | lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_ccallback.h | 90 | lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_ccallback.h |
90 | lj_debug.o: lj_debug.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ | 91 | lj_debug.o: lj_debug.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ |
diff --git a/src/lib_ffi.c b/src/lib_ffi.c index 69bebefc..689f7a9d 100644 --- a/src/lib_ffi.c +++ b/src/lib_ffi.c | |||
@@ -587,7 +587,7 @@ LJLIB_CF(ffi_istype) LJLIB_REC(.) | |||
587 | return 1; | 587 | return 1; |
588 | } | 588 | } |
589 | 589 | ||
590 | LJLIB_CF(ffi_sizeof) | 590 | LJLIB_CF(ffi_sizeof) LJLIB_REC(ffi_xof FF_ffi_sizeof) |
591 | { | 591 | { |
592 | CTState *cts = ctype_cts(L); | 592 | CTState *cts = ctype_cts(L); |
593 | CTypeID id = ffi_checkctype(L, cts, NULL); | 593 | CTypeID id = ffi_checkctype(L, cts, NULL); |
@@ -609,7 +609,7 @@ LJLIB_CF(ffi_sizeof) | |||
609 | return 1; | 609 | return 1; |
610 | } | 610 | } |
611 | 611 | ||
612 | LJLIB_CF(ffi_alignof) | 612 | LJLIB_CF(ffi_alignof) LJLIB_REC(ffi_xof FF_ffi_alignof) |
613 | { | 613 | { |
614 | CTState *cts = ctype_cts(L); | 614 | CTState *cts = ctype_cts(L); |
615 | CTypeID id = ffi_checkctype(L, cts, NULL); | 615 | CTypeID id = ffi_checkctype(L, cts, NULL); |
@@ -619,7 +619,7 @@ LJLIB_CF(ffi_alignof) | |||
619 | return 1; | 619 | return 1; |
620 | } | 620 | } |
621 | 621 | ||
622 | LJLIB_CF(ffi_offsetof) | 622 | LJLIB_CF(ffi_offsetof) LJLIB_REC(ffi_xof FF_ffi_offsetof) |
623 | { | 623 | { |
624 | CTState *cts = ctype_cts(L); | 624 | CTState *cts = ctype_cts(L); |
625 | CTypeID id = ffi_checkctype(L, cts, NULL); | 625 | CTypeID id = ffi_checkctype(L, cts, NULL); |
diff --git a/src/lj_crecord.c b/src/lj_crecord.c index 6a22544a..f9220322 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include "lj_cconv.h" | 20 | #include "lj_cconv.h" |
21 | #include "lj_clib.h" | 21 | #include "lj_clib.h" |
22 | #include "lj_ccall.h" | 22 | #include "lj_ccall.h" |
23 | #include "lj_ff.h" | ||
23 | #include "lj_ir.h" | 24 | #include "lj_ir.h" |
24 | #include "lj_jit.h" | 25 | #include "lj_jit.h" |
25 | #include "lj_ircall.h" | 26 | #include "lj_ircall.h" |
@@ -1587,7 +1588,27 @@ void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd) | |||
1587 | emitir(IRTG(IR_EQ, IRT_STR), J->base[0], lj_ir_kstr(J, strV(&rd->argv[0]))); | 1588 | emitir(IRTG(IR_EQ, IRT_STR), J->base[0], lj_ir_kstr(J, strV(&rd->argv[0]))); |
1588 | J->postproc = LJ_POST_FIXBOOL; | 1589 | J->postproc = LJ_POST_FIXBOOL; |
1589 | J->base[0] = TREF_TRUE; | 1590 | J->base[0] = TREF_TRUE; |
1590 | } /* else: interpreter will throw. */ | 1591 | } else { |
1592 | lj_trace_err(J, LJ_TRERR_BADTYPE); | ||
1593 | } | ||
1594 | } | ||
1595 | |||
1596 | /* Record ffi.sizeof(), ffi.alignof(), ffi.offsetof(). */ | ||
1597 | void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd) | ||
1598 | { | ||
1599 | CTypeID id = argv2ctype(J, J->base[0], &rd->argv[0]); | ||
1600 | if (rd->data == FF_ffi_sizeof) { | ||
1601 | CType *ct = lj_ctype_rawref(ctype_ctsG(J2G(J)), id); | ||
1602 | if (ctype_isvltype(ct->info)) | ||
1603 | lj_trace_err(J, LJ_TRERR_BADTYPE); | ||
1604 | } else if (rd->data == FF_ffi_offsetof) { /* Specialize to the field name. */ | ||
1605 | if (!tref_isstr(J->base[1])) | ||
1606 | lj_trace_err(J, LJ_TRERR_BADTYPE); | ||
1607 | emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, strV(&rd->argv[1]))); | ||
1608 | rd->nres = 3; /* Just in case. */ | ||
1609 | } | ||
1610 | J->postproc = LJ_POST_FIXCONST; | ||
1611 | J->base[0] = J->base[1] = J->base[2] = TREF_NIL; | ||
1591 | } | 1612 | } |
1592 | 1613 | ||
1593 | /* -- Miscellaneous library functions ------------------------------------- */ | 1614 | /* -- Miscellaneous library functions ------------------------------------- */ |
diff --git a/src/lj_crecord.h b/src/lj_crecord.h index ab0e27e7..bd217651 100644 --- a/src/lj_crecord.h +++ b/src/lj_crecord.h | |||
@@ -23,6 +23,7 @@ LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd); | |||
23 | LJ_FUNC void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd); | 23 | LJ_FUNC void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd); |
24 | LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd); | 24 | LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd); |
25 | LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd); | 25 | LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd); |
26 | LJ_FUNC void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd); | ||
26 | LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); | 27 | LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); |
27 | #endif | 28 | #endif |
28 | 29 | ||
diff --git a/src/lj_jit.h b/src/lj_jit.h index 43a99392..4549ac6c 100644 --- a/src/lj_jit.h +++ b/src/lj_jit.h | |||
@@ -144,6 +144,7 @@ typedef enum { | |||
144 | LJ_POST_FIXGUARD, /* Fixup and emit pending guard. */ | 144 | LJ_POST_FIXGUARD, /* Fixup and emit pending guard. */ |
145 | LJ_POST_FIXGUARDSNAP, /* Fixup and emit pending guard and snapshot. */ | 145 | LJ_POST_FIXGUARDSNAP, /* Fixup and emit pending guard and snapshot. */ |
146 | LJ_POST_FIXBOOL, /* Fixup boolean result. */ | 146 | LJ_POST_FIXBOOL, /* Fixup boolean result. */ |
147 | LJ_POST_FIXCONST, /* Fixup constant results. */ | ||
147 | LJ_POST_FFRETRY /* Suppress recording of retried fast functions. */ | 148 | LJ_POST_FFRETRY /* Suppress recording of retried fast functions. */ |
148 | } PostProc; | 149 | } PostProc; |
149 | 150 | ||
diff --git a/src/lj_record.c b/src/lj_record.c index 956f3bed..ea391bf1 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
@@ -1654,13 +1654,23 @@ void lj_record_ins(jit_State *J) | |||
1654 | case LJ_POST_FIXBOOL: | 1654 | case LJ_POST_FIXBOOL: |
1655 | if (!tvistruecond(&J2G(J)->tmptv2)) { | 1655 | if (!tvistruecond(&J2G(J)->tmptv2)) { |
1656 | BCReg s; | 1656 | BCReg s; |
1657 | TValue *tv = J->L->base; | ||
1657 | for (s = 0; s < J->maxslot; s++) /* Fixup stack slot (if any). */ | 1658 | for (s = 0; s < J->maxslot; s++) /* Fixup stack slot (if any). */ |
1658 | if (J->base[s] == TREF_TRUE && tvisfalse(&J->L->base[s])) { | 1659 | if (J->base[s] == TREF_TRUE && tvisfalse(&tv[s])) { |
1659 | J->base[s] = TREF_FALSE; | 1660 | J->base[s] = TREF_FALSE; |
1660 | break; | 1661 | break; |
1661 | } | 1662 | } |
1662 | } | 1663 | } |
1663 | break; | 1664 | break; |
1665 | case LJ_POST_FIXCONST: | ||
1666 | { | ||
1667 | BCReg s; | ||
1668 | TValue *tv = J->L->base; | ||
1669 | for (s = 0; s < J->maxslot; s++) /* Constify stack slots (if any). */ | ||
1670 | if (J->base[s] == TREF_NIL && !tvisnil(&tv[s])) | ||
1671 | J->base[s] = lj_record_constify(J, &tv[s]); | ||
1672 | } | ||
1673 | break; | ||
1664 | case LJ_POST_FFRETRY: /* Suppress recording of retried fast function. */ | 1674 | case LJ_POST_FFRETRY: /* Suppress recording of retried fast function. */ |
1665 | if (bc_op(*J->pc) >= BC__MAX) | 1675 | if (bc_op(*J->pc) >= BC__MAX) |
1666 | return; | 1676 | return; |