aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-07-24 14:56:29 +0200
committerMike Pall <mike>2012-07-24 14:56:29 +0200
commite8af6e9da4465ffb02f89bee8dfc372b48741bf7 (patch)
tree2021e6d195b26deaab04e11b81447b4f676284dd /src
parent3636a720a57adefb84c7ac70b68f640caf47f27f (diff)
downloadluajit-e8af6e9da4465ffb02f89bee8dfc372b48741bf7.tar.gz
luajit-e8af6e9da4465ffb02f89bee8dfc372b48741bf7.tar.bz2
luajit-e8af6e9da4465ffb02f89bee8dfc372b48741bf7.zip
Don't treat all constified cdata content as constant.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.dep3
-rw-r--r--src/lj_ir.h1
-rw-r--r--src/lj_opt_fold.c14
3 files changed, 16 insertions, 2 deletions
diff --git a/src/Makefile.dep b/src/Makefile.dep
index 1c7e5dc0..f9e658e1 100644
--- a/src/Makefile.dep
+++ b/src/Makefile.dep
@@ -133,7 +133,8 @@ lj_opt_dce.o: lj_opt_dce.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
133 lj_ir.h lj_jit.h lj_iropt.h 133 lj_ir.h lj_jit.h lj_iropt.h
134lj_opt_fold.o: lj_opt_fold.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 134lj_opt_fold.o: lj_opt_fold.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
135 lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \ 135 lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \
136 lj_bc.h lj_traceerr.h lj_carith.h lj_vm.h lj_folddef.h 136 lj_bc.h lj_traceerr.h lj_ctype.h lj_gc.h lj_carith.h lj_vm.h \
137 lj_folddef.h
137lj_opt_loop.o: lj_opt_loop.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 138lj_opt_loop.o: lj_opt_loop.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
138 lj_err.h lj_errmsg.h lj_str.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h \ 139 lj_err.h lj_errmsg.h lj_str.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h \
139 lj_dispatch.h lj_bc.h lj_traceerr.h lj_snap.h lj_vm.h 140 lj_dispatch.h lj_bc.h lj_traceerr.h lj_snap.h lj_vm.h
diff --git a/src/lj_ir.h b/src/lj_ir.h
index 0bdc19df..6d016b93 100644
--- a/src/lj_ir.h
+++ b/src/lj_ir.h
@@ -332,6 +332,7 @@ typedef struct IRType1 { uint8_t irt; } IRType1;
332#define irt_islightud(t) (irt_type(t) == IRT_LIGHTUD) 332#define irt_islightud(t) (irt_type(t) == IRT_LIGHTUD)
333#define irt_isstr(t) (irt_type(t) == IRT_STR) 333#define irt_isstr(t) (irt_type(t) == IRT_STR)
334#define irt_istab(t) (irt_type(t) == IRT_TAB) 334#define irt_istab(t) (irt_type(t) == IRT_TAB)
335#define irt_iscdata(t) (irt_type(t) == IRT_CDATA)
335#define irt_isfloat(t) (irt_type(t) == IRT_FLOAT) 336#define irt_isfloat(t) (irt_type(t) == IRT_FLOAT)
336#define irt_isnum(t) (irt_type(t) == IRT_NUM) 337#define irt_isnum(t) (irt_type(t) == IRT_NUM)
337#define irt_isint(t) (irt_type(t) == IRT_INT) 338#define irt_isint(t) (irt_type(t) == IRT_INT)
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)