aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-05 14:16:16 +0100
committerMike Pall <mike>2011-02-05 14:16:16 +0100
commit14f51037645c570f1a28d06a1c0ce219447d1b82 (patch)
treed73f6adc339953a9a9aad6c87c2b13b9c3f5c7b8 /src
parent223d85aa06a30dcf4bfdbdda38114c49e9bc6cbe (diff)
downloadluajit-14f51037645c570f1a28d06a1c0ce219447d1b82.tar.gz
luajit-14f51037645c570f1a28d06a1c0ce219447d1b82.tar.bz2
luajit-14f51037645c570f1a28d06a1c0ce219447d1b82.zip
FFI: Record C library namespace lookups.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.dep6
-rw-r--r--src/lib_ffi.c2
-rw-r--r--src/lj_clib.c4
-rw-r--r--src/lj_clib.h3
-rw-r--r--src/lj_crecord.c34
-rw-r--r--src/lj_crecord.h2
-rw-r--r--src/lj_opt_fold.c12
-rw-r--r--src/lj_traceerr.h1
8 files changed, 53 insertions, 11 deletions
diff --git a/src/Makefile.dep b/src/Makefile.dep
index cecaf403..b869fdff 100644
--- a/src/Makefile.dep
+++ b/src/Makefile.dep
@@ -75,9 +75,9 @@ lj_cparse.o: lj_cparse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
75 lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_ctype.h lj_cparse.h lj_frame.h \ 75 lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_ctype.h lj_cparse.h lj_frame.h \
76 lj_bc.h lj_vm.h lj_char.h 76 lj_bc.h lj_vm.h lj_char.h
77lj_crecord.o: lj_crecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 77lj_crecord.o: lj_crecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
78 lj_err.h lj_errmsg.h lj_str.h lj_ctype.h lj_gc.h lj_cparse.h lj_cconv.h \ 78 lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_gc.h lj_cparse.h \
79 lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h lj_bc.h \ 79 lj_cconv.h lj_clib.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h \
80 lj_traceerr.h lj_ffrecord.h lj_crecord.h 80 lj_dispatch.h lj_bc.h lj_traceerr.h lj_ffrecord.h lj_crecord.h
81lj_ctype.o: lj_ctype.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 81lj_ctype.o: lj_ctype.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
82 lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h 82 lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h
83lj_dispatch.o: lj_dispatch.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 83lj_dispatch.o: lj_dispatch.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 72128574..54d49f87 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -239,7 +239,7 @@ static TValue *ffi_clib_index(lua_State *L)
239 return lj_clib_index(L, cl, strV(o+1)); 239 return lj_clib_index(L, cl, strV(o+1));
240} 240}
241 241
242LJLIB_CF(ffi_clib___index) 242LJLIB_CF(ffi_clib___index) LJLIB_REC(clib_index)
243{ 243{
244 TValue *tv = ffi_clib_index(L); 244 TValue *tv = ffi_clib_index(L);
245 if (tviscdata(tv)) { 245 if (tviscdata(tv)) {
diff --git a/src/lj_clib.c b/src/lj_clib.c
index e2d349fd..64d06dbc 100644
--- a/src/lj_clib.c
+++ b/src/lj_clib.c
@@ -222,10 +222,6 @@ static void *clib_getsym(CLibrary *cl, const char *name)
222 222
223/* -- C library indexing -------------------------------------------------- */ 223/* -- C library indexing -------------------------------------------------- */
224 224
225/* Namespace for C library indexing. */
226#define CLNS_INDEX \
227 ((1u<<CT_FUNC)|(1u<<CT_EXTERN)|(1u<<CT_CONSTVAL))
228
229#if LJ_TARGET_X86 && LJ_ABI_WIN 225#if LJ_TARGET_X86 && LJ_ABI_WIN
230/* Compute argument size for fastcall/stdcall functions. */ 226/* Compute argument size for fastcall/stdcall functions. */
231static CTSize clib_func_argsize(CTState *cts, CType *ct) 227static CTSize clib_func_argsize(CTState *cts, CType *ct)
diff --git a/src/lj_clib.h b/src/lj_clib.h
index 86045d24..51c32703 100644
--- a/src/lj_clib.h
+++ b/src/lj_clib.h
@@ -10,6 +10,9 @@
10 10
11#if LJ_HASFFI 11#if LJ_HASFFI
12 12
13/* Namespace for C library indexing. */
14#define CLNS_INDEX ((1u<<CT_FUNC)|(1u<<CT_EXTERN)|(1u<<CT_CONSTVAL))
15
13/* C library namespace. */ 16/* C library namespace. */
14typedef struct CLibrary { 17typedef struct CLibrary {
15 void *handle; /* Opaque handle for dynamic library loader. */ 18 void *handle; /* Opaque handle for dynamic library loader. */
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 80f00e18..e5413fb3 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -12,9 +12,11 @@
12 12
13#include "lj_err.h" 13#include "lj_err.h"
14#include "lj_str.h" 14#include "lj_str.h"
15#include "lj_tab.h"
15#include "lj_ctype.h" 16#include "lj_ctype.h"
16#include "lj_cparse.h" 17#include "lj_cparse.h"
17#include "lj_cconv.h" 18#include "lj_cconv.h"
19#include "lj_clib.h"
18#include "lj_ir.h" 20#include "lj_ir.h"
19#include "lj_jit.h" 21#include "lj_jit.h"
20#include "lj_iropt.h" 22#include "lj_iropt.h"
@@ -837,6 +839,38 @@ void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd)
837 } 839 }
838} 840}
839 841
842/* -- C library namespace metamethods ------------------------------------- */
843
844void LJ_FASTCALL recff_clib_index(jit_State *J, RecordFFData *rd)
845{
846 CTState *cts = ctype_ctsG(J2G(J));
847 if (tref_isudata(J->base[0]) && tref_isstr(J->base[1]) &&
848 udataV(&rd->argv[0])->udtype == UDTYPE_FFI_CLIB) {
849 CLibrary *cl = (CLibrary *)uddata(udataV(&rd->argv[0]));
850 GCstr *name = strV(&rd->argv[1]);
851 CType *ct;
852 CTypeID id = lj_ctype_getname(cts, &ct, name, CLNS_INDEX);
853 cTValue *tv = lj_tab_getstr(cl->cache, name);
854 if (id && tv && tviscdata(tv)) {
855 /* Specialize to the symbol name and make the result a constant. */
856 emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, name));
857 if (ctype_isconstval(ct->info)) {
858 if (ct->size >= 0x80000000u &&
859 (ctype_child(cts, ct)->info & CTF_UNSIGNED))
860 J->base[0] = lj_ir_knum(J, (lua_Number)(uint32_t)ct->size);
861 else
862 J->base[0] = lj_ir_kint(J, (int32_t)ct->size);
863 } else if (ctype_isextern(ct->info)) {
864 lj_trace_err(J, LJ_TRERR_BADTYPE); /* NYI: access extern variables. */
865 } else {
866 J->base[0] = lj_ir_kgc(J, obj2gco(cdataV(tv)), IRT_CDATA);
867 }
868 } else {
869 lj_trace_err(J, LJ_TRERR_NOCACHE);
870 }
871 } /* else: interpreter will throw. */
872}
873
840/* -- FFI library functions ----------------------------------------------- */ 874/* -- FFI library functions ----------------------------------------------- */
841 875
842void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd) 876void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd)
diff --git a/src/lj_crecord.h b/src/lj_crecord.h
index 4ac5b3e2..2b6c3ec6 100644
--- a/src/lj_crecord.h
+++ b/src/lj_crecord.h
@@ -14,6 +14,7 @@
14LJ_FUNC void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd); 14LJ_FUNC void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd);
15LJ_FUNC void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd); 15LJ_FUNC void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd);
16LJ_FUNC void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd); 16LJ_FUNC void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd);
17LJ_FUNC void LJ_FASTCALL recff_clib_index(jit_State *J, RecordFFData *rd);
17LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd); 18LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd);
18LJ_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);
19LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); 20LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
@@ -21,6 +22,7 @@ LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
21#define recff_cdata_index recff_nyi 22#define recff_cdata_index recff_nyi
22#define recff_cdata_call recff_nyi 23#define recff_cdata_call recff_nyi
23#define recff_cdata_arith recff_nyi 24#define recff_cdata_arith recff_nyi
25#define recff_clib_index recff_nyi
24#define recff_ffi_new recff_nyi 26#define recff_ffi_new recff_nyi
25#define recff_ffi_string recff_nyi 27#define recff_ffi_string recff_nyi
26#endif 28#endif
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index 9675fca2..ef397aea 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -1768,12 +1768,18 @@ LJFOLDF(fload_cdata_typeid_kgc)
1768 return NEXTFOLD; 1768 return NEXTFOLD;
1769} 1769}
1770 1770
1771/* The content of int64 cdata objects is immutable. */ 1771/* Get the contents of immutable cdata objects. */
1772LJFOLD(FLOAD KGC IRFL_CDATA_PTR)
1772LJFOLD(FLOAD KGC IRFL_CDATA_INT64) 1773LJFOLD(FLOAD KGC IRFL_CDATA_INT64)
1773LJFOLDF(fload_cdata_int64_kgc) 1774LJFOLDF(fload_cdata_int64_kgc)
1774{ 1775{
1775 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) 1776 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {
1776 return INT64FOLD(*(uint64_t *)cdataptr(ir_kcdata(fleft))); 1777 void *p = cdataptr(ir_kcdata(fleft));
1778 if (irt_is64(fins->t))
1779 return INT64FOLD(*(uint64_t *)p);
1780 else
1781 return INTFOLD(*(int32_t *)p);
1782 }
1777 return NEXTFOLD; 1783 return NEXTFOLD;
1778} 1784}
1779 1785
diff --git a/src/lj_traceerr.h b/src/lj_traceerr.h
index e212dd4c..f0c45963 100644
--- a/src/lj_traceerr.h
+++ b/src/lj_traceerr.h
@@ -35,6 +35,7 @@ TREDEF(IDXLOOP, "looping index lookup")
35TREDEF(NYITMIX, "NYI: mixed sparse/dense table") 35TREDEF(NYITMIX, "NYI: mixed sparse/dense table")
36 36
37/* Recording C data operations. */ 37/* Recording C data operations. */
38TREDEF(NOCACHE, "symbol not in cache")
38TREDEF(NYICONV, "NYI: unsupported C type conversion") 39TREDEF(NYICONV, "NYI: unsupported C type conversion")
39 40
40/* Optimizations. */ 41/* Optimizations. */