summaryrefslogtreecommitdiff
path: root/src/lj_opt_fold.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r--src/lj_opt_fold.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index f4aadb8d..74cea785 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -20,6 +20,9 @@
20#include "lj_jit.h" 20#include "lj_jit.h"
21#include "lj_iropt.h" 21#include "lj_iropt.h"
22#include "lj_trace.h" 22#include "lj_trace.h"
23#if LJ_HASFFI
24#include "lj_ctype.h"
25#endif
23#include "lj_carith.h" 26#include "lj_carith.h"
24#include "lj_vm.h" 27#include "lj_vm.h"
25 28
@@ -535,7 +538,16 @@ LJFOLDF(kfold_add_kgc)
535#else 538#else
536 ptrdiff_t ofs = fright->i; 539 ptrdiff_t ofs = fright->i;
537#endif 540#endif
538 return lj_ir_kkptr(J, (char *)o + ofs); 541#if LJ_HASFFI
542 if (irt_iscdata(fleft->t)) {
543 CType *ct = ctype_raw(ctype_ctsG(J2G(J)), gco2cd(o)->ctypeid);
544 if (ctype_isnum(ct->info) || ctype_isenum(ct->info) ||
545 ctype_isptr(ct->info) || ctype_isfunc(ct->info) ||
546 ctype_iscomplex(ct->info) || ctype_isvector(ct->info))
547 return lj_ir_kkptr(J, (char *)o + ofs);
548 }
549#endif
550 return lj_ir_kptr(J, (char *)o + ofs);
539} 551}
540 552
541LJFOLD(ADD KPTR KINT) 553LJFOLD(ADD KPTR KINT)