diff options
author | Mike Pall <mike> | 2012-08-08 21:01:36 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-08-08 21:01:36 +0200 |
commit | 2717623e3acbcd4270303a0445ddd66326bc6d97 (patch) | |
tree | c0ed101db49dd6f3d02825af0760a858243b22ec /src | |
parent | e2373c153888ea082c31aa8f7d938c09fbe3f4d6 (diff) | |
download | luajit-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.c | 4 | ||||
-rw-r--r-- | src/lj_crecord.c | 12 | ||||
-rw-r--r-- | src/lj_crecord.h | 2 |
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 | ||
525 | LJLIB_CF(ffi_typeof) | 525 | LJLIB_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 | ||
536 | LJLIB_CF(ffi_istype) LJLIB_REC(ffi_istype) | 536 | LJLIB_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 | ||
1319 | void 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 | |||
1319 | void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd) | 1331 | void 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); | |||
20 | LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd); | 20 | LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd); |
21 | LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd); | 21 | LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd); |
22 | LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd); | 22 | 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_istype(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_abi(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 lj_crecord_tonumber(jit_State *J, RecordFFData *rd); | 26 | LJ_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 |