aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-10-10 18:16:18 +0200
committerMike Pall <mike>2012-10-10 18:16:18 +0200
commit1c626112a06f1f69d3c22771c62d4ced1cfee356 (patch)
tree6045efeabcc77b7a0351a65161e1d456bb635752 /src
parent4a97faef7ef7e9b12235adcb98e3e591b0db7122 (diff)
downloadluajit-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.dep7
-rw-r--r--src/lib_ffi.c6
-rw-r--r--src/lj_crecord.c23
-rw-r--r--src/lj_crecord.h1
-rw-r--r--src/lj_jit.h1
-rw-r--r--src/lj_record.c12
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
83lj_crecord.o: lj_crecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 83lj_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
88lj_ctype.o: lj_ctype.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 89lj_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
90lj_debug.o: lj_debug.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 91lj_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
590LJLIB_CF(ffi_sizeof) 590LJLIB_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
612LJLIB_CF(ffi_alignof) 612LJLIB_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
622LJLIB_CF(ffi_offsetof) 622LJLIB_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(). */
1597void 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);
23LJ_FUNC void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd); 23LJ_FUNC void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd);
24LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd); 24LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd);
25LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd); 25LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd);
26LJ_FUNC void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd);
26LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); 27LJ_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;