diff options
| -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; |
