Don't treat all constified cdata content as constant.

This commit is contained in:
Mike Pall
2012-07-24 14:56:29 +02:00
parent 3636a720a5
commit e8af6e9da4
3 changed files with 16 additions and 2 deletions

View File

@@ -20,6 +20,9 @@
#include "lj_jit.h"
#include "lj_iropt.h"
#include "lj_trace.h"
#if LJ_HASFFI
#include "lj_ctype.h"
#endif
#include "lj_carith.h"
#include "lj_vm.h"
@@ -535,7 +538,16 @@ LJFOLDF(kfold_add_kgc)
#else
ptrdiff_t ofs = fright->i;
#endif
return lj_ir_kkptr(J, (char *)o + ofs);
#if LJ_HASFFI
if (irt_iscdata(fleft->t)) {
CType *ct = ctype_raw(ctype_ctsG(J2G(J)), gco2cd(o)->ctypeid);
if (ctype_isnum(ct->info) || ctype_isenum(ct->info) ||
ctype_isptr(ct->info) || ctype_isfunc(ct->info) ||
ctype_iscomplex(ct->info) || ctype_isvector(ct->info))
return lj_ir_kkptr(J, (char *)o + ofs);
}
#endif
return lj_ir_kptr(J, (char *)o + ofs);
}
LJFOLD(ADD KPTR KINT)