summaryrefslogtreecommitdiff
path: root/src/lj_crecord.c
diff options
context:
space:
mode:
authorMike Pall <mike>2012-06-09 00:19:32 +0200
committerMike Pall <mike>2012-06-09 00:23:27 +0200
commite75561b70e470a19a8101349c48fe1137f0102fe (patch)
tree936391fea4b39d8b57ce834fd671cb80f94b91b4 /src/lj_crecord.c
parentcccf7638989275e57377e2e25595213caacb7da3 (diff)
downloadluajit2-e75561b70e470a19a8101349c48fe1137f0102fe.tar.gz
FFI: Fix address calculation for refs.
Fixes bug introduced in commit 5032e6d8.
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r--src/lj_crecord.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 8859c3ee..3097cbf0 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -417,21 +417,23 @@ static TRef crec_ct_tv(jit_State *J, CType *d, TRef dp, TRef sp, cTValue *sval)
sid = argv2cdata(J, sp, sval)->typeid;
s = ctype_raw(cts, sid);
svisnz = cdataptr(cdataV(sval));
- if (ctype_isref(s->info)) {
- svisnz = *(void **)svisnz;
- s = ctype_rawchild(cts, s);
- sp = emitir(IRT(IR_FLOAD, IRT_PTR), sp, IRFL_CDATA_PTR);
- }
if (ctype_isenum(s->info)) s = ctype_child(cts, s);
t = crec_ct2irt(s);
if (ctype_isptr(s->info)) {
sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_PTR);
- goto doconv;
- } else if (ctype_isinteger(s->info) && s->size == 8) {
+ if (ctype_isref(s->info)) {
+ svisnz = *(void **)svisnz;
+ s = ctype_rawchild(cts, s);
+ if (ctype_isenum(s->info)) s = ctype_child(cts, s);
+ t = crec_ct2irt(s);
+ } else {
+ goto doconv;
+ }
+ } else if (t == IRT_I64 || t == IRT_U64) {
sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT64);
lj_needsplit(J);
goto doconv;
- } else if (ctype_isinteger(s->info) && s->size == 4) {
+ } else if (t == IRT_INT || t == IRT_U32) {
sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT);
goto doconv;
} else {