diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 14 |
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 | ||
541 | LJFOLD(ADD KPTR KINT) | 553 | LJFOLD(ADD KPTR KINT) |