aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-08-08 21:01:36 +0200
committerMike Pall <mike>2012-08-08 21:01:36 +0200
commit2717623e3acbcd4270303a0445ddd66326bc6d97 (patch)
treec0ed101db49dd6f3d02825af0760a858243b22ec /src
parente2373c153888ea082c31aa8f7d938c09fbe3f4d6 (diff)
downloadluajit-2717623e3acbcd4270303a0445ddd66326bc6d97.tar.gz
luajit-2717623e3acbcd4270303a0445ddd66326bc6d97.tar.bz2
luajit-2717623e3acbcd4270303a0445ddd66326bc6d97.zip
FFI: Compile ffi.typeof(cdata).
Thanks to Robert G. Jakabosky.
Diffstat (limited to 'src')
-rw-r--r--src/lib_ffi.c4
-rw-r--r--src/lj_crecord.c12
-rw-r--r--src/lj_crecord.h2
3 files changed, 16 insertions, 2 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index e0951c56..24a6625c 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -522,7 +522,7 @@ LJLIB_CF(ffi_cast) LJLIB_REC(ffi_new)
522 return 1; 522 return 1;
523} 523}
524 524
525LJLIB_CF(ffi_typeof) 525LJLIB_CF(ffi_typeof) LJLIB_REC(.)
526{ 526{
527 CTState *cts = ctype_cts(L); 527 CTState *cts = ctype_cts(L);
528 CTypeID id = ffi_checkctype(L, cts, L->base+1); 528 CTypeID id = ffi_checkctype(L, cts, L->base+1);
@@ -533,7 +533,7 @@ LJLIB_CF(ffi_typeof)
533 return 1; 533 return 1;
534} 534}
535 535
536LJLIB_CF(ffi_istype) LJLIB_REC(ffi_istype) 536LJLIB_CF(ffi_istype) LJLIB_REC(.)
537{ 537{
538 CTState *cts = ctype_cts(L); 538 CTState *cts = ctype_cts(L);
539 CTypeID id1 = ffi_checkctype(L, cts, NULL); 539 CTypeID id1 = ffi_checkctype(L, cts, NULL);
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index dbd0b83b..30d315d5 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -1316,6 +1316,18 @@ void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd)
1316 } /* else: interpreter will throw. */ 1316 } /* else: interpreter will throw. */
1317} 1317}
1318 1318
1319void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd)
1320{
1321 if (tref_iscdata(J->base[0])) {
1322 TRef trid = lj_ir_kint(J, argv2ctype(J, J->base[0], &rd->argv[0]));
1323 J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA),
1324 lj_ir_kint(J, CTID_CTYPEID), trid);
1325 } else {
1326 setfuncV(J->L, &J->errinfo, J->fn);
1327 lj_trace_err_info(J, LJ_TRERR_NYIFFU);
1328 }
1329}
1330
1319void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd) 1331void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd)
1320{ 1332{
1321 argv2ctype(J, J->base[0], &rd->argv[0]); 1333 argv2ctype(J, J->base[0], &rd->argv[0]);
diff --git a/src/lj_crecord.h b/src/lj_crecord.h
index 0f93e145..c2a3758d 100644
--- a/src/lj_crecord.h
+++ b/src/lj_crecord.h
@@ -20,6 +20,7 @@ LJ_FUNC void LJ_FASTCALL recff_ffi_errno(jit_State *J, RecordFFData *rd);
20LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd); 20LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd);
21LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd); 21LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd);
22LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd); 22LJ_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_istype(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_abi(jit_State *J, RecordFFData *rd); 25LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd);
25LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); 26LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
@@ -33,6 +34,7 @@ LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
33#define recff_ffi_string recff_nyi 34#define recff_ffi_string recff_nyi
34#define recff_ffi_copy recff_nyi 35#define recff_ffi_copy recff_nyi
35#define recff_ffi_fill recff_nyi 36#define recff_ffi_fill recff_nyi
37#define recff_ffi_typeof recff_nyi
36#define recff_ffi_istype recff_nyi 38#define recff_ffi_istype recff_nyi
37#define recff_ffi_abi recff_nyi 39#define recff_ffi_abi recff_nyi
38#endif 40#endif