diff options
author | Mike Pall <mike> | 2011-01-02 18:30:02 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-01-02 18:30:02 +0100 |
commit | 55a9be7809e6fa85f8051a85b8085cc8a9d36734 (patch) | |
tree | 58bdb2a4756f96e49bea75a6a667fc76a2e1b1b0 /src | |
parent | 0005b2c2b91d3d3c115b1e5d12b32715c0ea77a6 (diff) | |
download | luajit-55a9be7809e6fa85f8051a85b8085cc8a9d36734.tar.gz luajit-55a9be7809e6fa85f8051a85b8085cc8a9d36734.tar.bz2 luajit-55a9be7809e6fa85f8051a85b8085cc8a9d36734.zip |
FFI: Record tonumber() for boxed cdata.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib_base.c | 2 | ||||
-rw-r--r-- | src/lj_crecord.c | 28 | ||||
-rw-r--r-- | src/lj_crecord.h | 1 | ||||
-rw-r--r-- | src/lj_ffrecord.c | 3 |
4 files changed, 32 insertions, 2 deletions
diff --git a/src/lib_base.c b/src/lib_base.c index c52f9191..52fbeb09 100644 --- a/src/lib_base.c +++ b/src/lib_base.c | |||
@@ -198,7 +198,7 @@ LJLIB_ASM(tonumber) LJLIB_REC(.) | |||
198 | if (tviscdata(o)) { | 198 | if (tviscdata(o)) { |
199 | CTState *cts = ctype_cts(L); | 199 | CTState *cts = ctype_cts(L); |
200 | lj_cconv_ct_tv(cts, ctype_get(cts, CTID_DOUBLE), | 200 | lj_cconv_ct_tv(cts, ctype_get(cts, CTID_DOUBLE), |
201 | (uint8_t *)&(L->base-1)->n, o, CCF_CAST); | 201 | (uint8_t *)&(L->base-1)->n, o, 0); |
202 | return FFH_RES(1); | 202 | return FFH_RES(1); |
203 | } | 203 | } |
204 | #endif | 204 | #endif |
diff --git a/src/lj_crecord.c b/src/lj_crecord.c index 791c177c..b474a6b9 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c | |||
@@ -569,6 +569,34 @@ void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd) | |||
569 | crec_alloc(J, rd, argv2ctype(J, J->base[0], &rd->argv[0])); | 569 | crec_alloc(J, rd, argv2ctype(J, J->base[0], &rd->argv[0])); |
570 | } | 570 | } |
571 | 571 | ||
572 | /* -- Miscellaneous library functions ------------------------------------- */ | ||
573 | |||
574 | void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) | ||
575 | { | ||
576 | CTypeID sid = argv2cdata(J, J->base[0], &rd->argv[0])->typeid; | ||
577 | CTState *cts = ctype_ctsG(J2G(J)); | ||
578 | CType *s = ctype_raw(cts, sid); | ||
579 | TRef sp = J->base[0]; | ||
580 | if (ctype_isref(s->info)) { | ||
581 | sp = emitir(IRT(IR_FLOAD, IRT_PTR), sp, IRFL_CDATA_PTR); | ||
582 | s = ctype_rawchild(cts, s); | ||
583 | } else { | ||
584 | sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCcdata))); | ||
585 | } | ||
586 | if (ctype_isenum(s->info)) s = ctype_child(cts, s); | ||
587 | if (ctype_isnum(s->info) || ctype_iscomplex(s->info)) { | ||
588 | IRType t = crec_ct2irt(s); | ||
589 | if (t != IRT_CDATA) { | ||
590 | TRef tr = emitir(IRT(IR_XLOAD, t), sp, 0); /* Load number value. */ | ||
591 | if (t == IRT_FLOAT || t == IRT_U32 || t == IRT_I64 || t == IRT_U64) | ||
592 | tr = emitconv(tr, IRT_NUM, t, 0); | ||
593 | J->base[0] = tr; | ||
594 | return; | ||
595 | } | ||
596 | } | ||
597 | lj_trace_err(J, LJ_TRERR_BADTYPE); | ||
598 | } | ||
599 | |||
572 | #undef IR | 600 | #undef IR |
573 | #undef emitir | 601 | #undef emitir |
574 | #undef emitconv | 602 | #undef emitconv |
diff --git a/src/lj_crecord.h b/src/lj_crecord.h index af98bde5..05ef6110 100644 --- a/src/lj_crecord.h +++ b/src/lj_crecord.h | |||
@@ -14,6 +14,7 @@ | |||
14 | LJ_FUNC void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd); | 14 | LJ_FUNC void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd); |
15 | LJ_FUNC void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd); | 15 | LJ_FUNC void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd); |
16 | LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd); | 16 | LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd); |
17 | LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); | ||
17 | #else | 18 | #else |
18 | #define recff_cdata_index recff_nyi | 19 | #define recff_cdata_index recff_nyi |
19 | #define recff_cdata_call recff_nyi | 20 | #define recff_cdata_call recff_nyi |
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c index ca9f6ceb..c10e38fe 100644 --- a/src/lj_ffrecord.c +++ b/src/lj_ffrecord.c | |||
@@ -268,7 +268,8 @@ static void LJ_FASTCALL recff_tonumber(jit_State *J, RecordFFData *rd) | |||
268 | } | 268 | } |
269 | #if LJ_HASFFI | 269 | #if LJ_HASFFI |
270 | } else if (tref_iscdata(tr)) { | 270 | } else if (tref_iscdata(tr)) { |
271 | recff_nyiu(J); | 271 | lj_crecord_tonumber(J, rd); |
272 | return; | ||
272 | #endif | 273 | #endif |
273 | } else { | 274 | } else { |
274 | tr = TREF_NIL; | 275 | tr = TREF_NIL; |