aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2010-12-24 01:31:39 +0100
committerMike Pall <mike>2010-12-24 01:31:39 +0100
commit461bf7733164c1c02f3e3001faef6eb028cd6e9e (patch)
treea4d51e369da8906c5151cd8c43b4424ec56e1404
parent4850865c57996897df61f60631fa064f4adbb088 (diff)
downloadluajit-461bf7733164c1c02f3e3001faef6eb028cd6e9e.tar.gz
luajit-461bf7733164c1c02f3e3001faef6eb028cd6e9e.tar.bz2
luajit-461bf7733164c1c02f3e3001faef6eb028cd6e9e.zip
FFI: Parse complex and 64 bit integer literals.
-rw-r--r--src/Makefile.dep19
-rw-r--r--src/buildvm.c8
-rw-r--r--src/buildvm_ppc.dasc13
-rw-r--r--src/buildvm_ppcspe.h188
-rw-r--r--src/buildvm_x64.h5
-rw-r--r--src/buildvm_x64win.h5
-rw-r--r--src/buildvm_x86.dasc9
-rw-r--r--src/buildvm_x86.h5
-rw-r--r--src/lib_ffi.c3
-rw-r--r--src/lj_bc.h3
-rw-r--r--src/lj_cdata.h9
-rw-r--r--src/lj_lex.c95
-rw-r--r--src/lj_parse.c48
-rw-r--r--src/lj_parse.h3
14 files changed, 303 insertions, 110 deletions
diff --git a/src/Makefile.dep b/src/Makefile.dep
index 6a5d208a..3e202537 100644
--- a/src/Makefile.dep
+++ b/src/Makefile.dep
@@ -93,7 +93,8 @@ lj_ir.o: lj_ir.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \
93 lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \ 93 lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \
94 lj_bc.h lj_traceerr.h lj_lib.h 94 lj_bc.h lj_traceerr.h lj_lib.h
95lj_lex.o: lj_lex.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ 95lj_lex.o: lj_lex.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \
96 lj_err.h lj_errmsg.h lj_str.h lj_lex.h lj_parse.h lj_char.h 96 lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_cdata.h lualib.h \
97 lj_lex.h lj_parse.h lj_char.h
97lj_lib.o: lj_lib.c lauxlib.h lua.h luaconf.h lj_obj.h lj_def.h lj_arch.h \ 98lj_lib.o: lj_lib.c lauxlib.h lua.h luaconf.h lj_obj.h lj_def.h lj_arch.h \
98 lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_bc.h \ 99 lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_bc.h \
99 lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h lj_lib.h 100 lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h lj_lib.h
@@ -118,7 +119,7 @@ lj_opt_narrow.o: lj_opt_narrow.c lj_obj.h lua.h luaconf.h lj_def.h \
118 lj_dispatch.h lj_traceerr.h 119 lj_dispatch.h lj_traceerr.h
119lj_parse.o: lj_parse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 120lj_parse.o: lj_parse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
120 lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_state.h \ 121 lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_state.h \
121 lj_bc.h lj_lex.h lj_parse.h lj_vm.h lj_vmevent.h 122 lj_bc.h lj_ctype.h lj_lex.h lj_parse.h lj_vm.h lj_vmevent.h
122lj_record.o: lj_record.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 123lj_record.o: lj_record.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
123 lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ff.h \ 124 lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ff.h \
124 lj_ffdef.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \ 125 lj_ffdef.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \
@@ -151,13 +152,13 @@ ljamalg.o: ljamalg.c lua.h luaconf.h lauxlib.h lj_gc.c lj_obj.h lj_def.h \
151 lj_char.c lj_char.h lj_bc.c lj_bcdef.h lj_obj.c lj_str.c lj_tab.c \ 152 lj_char.c lj_char.h lj_bc.c lj_bcdef.h lj_obj.c lj_str.c lj_tab.c \
152 lj_func.c lj_udata.c lj_meta.c lj_state.c lj_lex.h lj_alloc.h \ 153 lj_func.c lj_udata.c lj_meta.c lj_state.c lj_lex.h lj_alloc.h \
153 lj_dispatch.c lj_ff.h lj_ffdef.h luajit.h lj_vmevent.c lj_vmevent.h \ 154 lj_dispatch.c lj_ff.h lj_ffdef.h luajit.h lj_vmevent.c lj_vmevent.h \
154 lj_api.c lj_parse.h lj_lex.c lj_parse.c lj_ctype.c lj_cdata.c lj_cconv.h \ 155 lj_api.c lj_parse.h lj_lex.c lualib.h lj_parse.c lj_ctype.c lj_cdata.c \
155 lj_cconv.c lj_cparse.c lj_cparse.h lj_lib.c lj_lib.h lj_ir.c lj_iropt.h \ 156 lj_cconv.h lj_cconv.c lj_cparse.c lj_cparse.h lj_lib.c lj_lib.h lj_ir.c \
156 lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c lj_opt_dce.c \ 157 lj_iropt.h lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c \
157 lj_opt_loop.c lj_snap.h lj_mcode.c lj_mcode.h lj_snap.c lj_target.h \ 158 lj_opt_dce.c lj_opt_loop.c lj_snap.h lj_mcode.c lj_mcode.h lj_snap.c \
158 lj_target_*.h lj_record.c lj_record.h lj_ffrecord.h lj_crecord.c \ 159 lj_target.h lj_target_*.h lj_record.c lj_record.h lj_ffrecord.h \
159 lj_crecord.h lj_ffrecord.c lj_recdef.h lj_asm.c lj_asm.h lj_trace.c \ 160 lj_crecord.c lj_crecord.h lj_ffrecord.c lj_recdef.h lj_asm.c lj_asm.h \
160 lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c lib_base.c lualib.h \ 161 lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c lib_base.c \
161 lj_libdef.h lib_math.c lib_string.c lib_table.c lib_io.c lib_os.c \ 162 lj_libdef.h lib_math.c lib_string.c lib_table.c lib_io.c lib_os.c \
162 lib_package.c lib_debug.c lib_bit.c lib_jit.c lib_ffi.c lib_init.c 163 lib_package.c lib_debug.c lib_bit.c lib_jit.c lib_ffi.c lib_init.c
163luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h lj_arch.h 164luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h lj_arch.h
diff --git a/src/buildvm.c b/src/buildvm.c
index 72e612c1..1681b592 100644
--- a/src/buildvm.c
+++ b/src/buildvm.c
@@ -207,10 +207,10 @@ static int build_code(BuildCtx *ctx)
207 int32_t ofs = dasm_getpclabel(Dst, i); 207 int32_t ofs = dasm_getpclabel(Dst, i);
208 if (ofs < 0) return 0x22000000|i; 208 if (ofs < 0) return 0x22000000|i;
209 ctx->bc_ofs[i] = ofs; 209 ctx->bc_ofs[i] = ofs;
210#if !LJ_HASJIT 210 if ((LJ_HASJIT ||
211 if (!(i == BC_JFORI || i == BC_JFORL || i == BC_JITERL || i == BC_JLOOP || 211 !(i == BC_JFORI || i == BC_JFORL || i == BC_JITERL || i == BC_JLOOP ||
212 i == BC_IFORL || i == BC_IITERL || i == BC_ILOOP)) 212 i == BC_IFORL || i == BC_IITERL || i == BC_ILOOP)) &&
213#endif 213 (LJ_HASFFI || i != BC_KCDATA))
214 sym_insert(ctx, ofs, LABEL_PREFIX_BC, bc_names[i]); 214 sym_insert(ctx, ofs, LABEL_PREFIX_BC, bc_names[i]);
215 } 215 }
216 216
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index 108363e5..a81335db 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -2430,6 +2430,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2430 | evstddx TMP0, BASE, RA 2430 | evstddx TMP0, BASE, RA
2431 | ins_next2 2431 | ins_next2
2432 break; 2432 break;
2433 case BC_KCDATA:
2434#if LJ_HASFFI
2435 | // RA = dst*8, RD = cdata_const*8 (~)
2436 | ins_next1
2437 | srwi TMP1, RD, 1
2438 | subfic TMP1, TMP1, -4
2439 | lwzx TMP0, KBASE, TMP1 // KBASE-4-cdata_const*4
2440 | li TMP2, LJ_TCDATA
2441 | evmergelo TMP0, TMP2, TMP0
2442 | evstddx TMP0, BASE, RA
2443 | ins_next2
2444#endif
2445 break;
2433 case BC_KSHORT: 2446 case BC_KSHORT:
2434 | // RA = dst*8, RD = int16_literal*8 2447 | // RA = dst*8, RD = int16_literal*8
2435 | srwi TMP1, RD, 3 2448 | srwi TMP1, RD, 3
diff --git a/src/buildvm_ppcspe.h b/src/buildvm_ppcspe.h
index 0855fda8..8a10c24a 100644
--- a/src/buildvm_ppcspe.h
+++ b/src/buildvm_ppcspe.h
@@ -12,7 +12,7 @@
12#define DASM_SECTION_CODE_OP 0 12#define DASM_SECTION_CODE_OP 0
13#define DASM_SECTION_CODE_SUB 1 13#define DASM_SECTION_CODE_SUB 1
14#define DASM_MAXSECTION 2 14#define DASM_MAXSECTION 2
15static const unsigned int build_actionlist[4928] = { 15static const unsigned int build_actionlist[4947] = {
160x00010001, 160x00010001,
170x00060014, 170x00060014,
180x72000000, 180x72000000,
@@ -3372,6 +3372,25 @@ static const unsigned int build_actionlist[4928] = {
33720x7c0903a6, 33720x7c0903a6,
33730x4e800420, 33730x4e800420,
33740x00000000, 33740x00000000,
33750x80f00000,
33760x3a100004,
33770x5588007e,
33780x000900ab,
33790x2108fffc,
33800x7c0f402e,
33810x39200000,
33820x00098200,
33830x1009022d,
33840x100ea320,
33850x54e815ba,
33860x54ea5d78,
33870x54ec9b78,
33880x7c11402e,
33890x54f4dd78,
33900x54eb9d78,
33910x7c0903a6,
33920x4e800420,
33930x00000000,
33750x558800fe, 33940x558800fe,
33760x000900ab, 33950x000900ab,
33770x7d080734, 33960x7d080734,
@@ -5619,158 +5638,163 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
5619 case BC_KSTR: 5638 case BC_KSTR:
5620 dasm_put(Dst, 3342, 32-1); 5639 dasm_put(Dst, 3342, 32-1);
5621 break; 5640 break;
5641 case BC_KCDATA:
5642#if LJ_HASFFI
5643 dasm_put(Dst, 3359, 32-1, LJ_TCDATA);
5644#endif
5645 break;
5622 case BC_KSHORT: 5646 case BC_KSHORT:
5623 dasm_put(Dst, 3359, 32-3); 5647 dasm_put(Dst, 3378, 32-3);
5624 break; 5648 break;
5625 case BC_KNUM: 5649 case BC_KNUM:
5626 dasm_put(Dst, 3375); 5650 dasm_put(Dst, 3394);
5627 break; 5651 break;
5628 case BC_KPRI: 5652 case BC_KPRI:
5629 dasm_put(Dst, 3388, 32-3); 5653 dasm_put(Dst, 3407, 32-3);
5630 break; 5654 break;
5631 case BC_KNIL: 5655 case BC_KNIL:
5632 dasm_put(Dst, 3403); 5656 dasm_put(Dst, 3422);
5633 break; 5657 break;
5634 5658
5635 /* -- Upvalue and function ops ------------------------------------------ */ 5659 /* -- Upvalue and function ops ------------------------------------------ */
5636 5660
5637 case BC_UGET: 5661 case BC_UGET:
5638 dasm_put(Dst, 3422, 32-1, offsetof(GCfuncL, uvptr), DtA(->v)); 5662 dasm_put(Dst, 3441, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
5639 break; 5663 break;
5640 case BC_USETV: 5664 case BC_USETV:
5641 dasm_put(Dst, 3443, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, DtA(->closed), -LJ_TISNUM, LJ_TISGCV - LJ_TISNUM, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G); 5665 dasm_put(Dst, 3462, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, DtA(->closed), -LJ_TISNUM, LJ_TISGCV - LJ_TISNUM, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G);
5642 break; 5666 break;
5643 case BC_USETS: 5667 case BC_USETS:
5644 dasm_put(Dst, 3495, 32-1, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, Dt5(->marked), DtA(->closed), LJ_GC_WHITES, GG_DISP2G); 5668 dasm_put(Dst, 3514, 32-1, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, Dt5(->marked), DtA(->closed), LJ_GC_WHITES, GG_DISP2G);
5645 break; 5669 break;
5646 case BC_USETN: 5670 case BC_USETN:
5647 dasm_put(Dst, 3544, 32-1, offsetof(GCfuncL, uvptr), DtA(->v)); 5671 dasm_put(Dst, 3563, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
5648 break; 5672 break;
5649 case BC_USETP: 5673 case BC_USETP:
5650 dasm_put(Dst, 3565, 32-1, offsetof(GCfuncL, uvptr), 32-3, DtA(->v)); 5674 dasm_put(Dst, 3584, 32-1, offsetof(GCfuncL, uvptr), 32-3, DtA(->v));
5651 break; 5675 break;
5652 5676
5653 case BC_UCLO: 5677 case BC_UCLO:
5654 dasm_put(Dst, 3588, Dt1(->openupval), 32-1, -(BCBIAS_J*4 >> 16), Dt1(->base), Dt1(->base)); 5678 dasm_put(Dst, 3607, Dt1(->openupval), 32-1, -(BCBIAS_J*4 >> 16), Dt1(->base), Dt1(->base));
5655 break; 5679 break;
5656 5680
5657 case BC_FNEW: 5681 case BC_FNEW:
5658 dasm_put(Dst, 3618, 32-1, Dt1(->base), Dt1(->base)); 5682 dasm_put(Dst, 3637, 32-1, Dt1(->base), Dt1(->base));
5659 break; 5683 break;
5660 5684
5661 /* -- Table ops --------------------------------------------------------- */ 5685 /* -- Table ops --------------------------------------------------------- */
5662 5686
5663 case BC_TNEW: 5687 case BC_TNEW:
5664 case BC_TDUP: 5688 case BC_TDUP:
5665 dasm_put(Dst, 3644, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base)); 5689 dasm_put(Dst, 3663, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base));
5666 if (op == BC_TNEW) { 5690 if (op == BC_TNEW) {
5667 dasm_put(Dst, 3657); 5691 dasm_put(Dst, 3676);
5668 } else { 5692 } else {
5669 dasm_put(Dst, 3665, 32-1); 5693 dasm_put(Dst, 3684, 32-1);
5670 } 5694 }
5671 dasm_put(Dst, 3672, Dt1(->base)); 5695 dasm_put(Dst, 3691, Dt1(->base));
5672 break; 5696 break;
5673 5697
5674 case BC_GGET: 5698 case BC_GGET:
5675 case BC_GSET: 5699 case BC_GSET:
5676 dasm_put(Dst, 3695, 32-1, Dt7(->env)); 5700 dasm_put(Dst, 3714, 32-1, Dt7(->env));
5677 if (op == BC_GGET) { 5701 if (op == BC_GGET) {
5678 dasm_put(Dst, 3703); 5702 dasm_put(Dst, 3722);
5679 } else { 5703 } else {
5680 dasm_put(Dst, 3706); 5704 dasm_put(Dst, 3725);
5681 } 5705 }
5682 break; 5706 break;
5683 5707
5684 case BC_TGETV: 5708 case BC_TGETV:
5685 dasm_put(Dst, 3709, Dt6(->asize), Dt6(->array), 31-3, Dt6(->metatable), Dt6(->nomm), 1<<MM_index); 5709 dasm_put(Dst, 3728, Dt6(->asize), Dt6(->array), 31-3, Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
5686 break; 5710 break;
5687 case BC_TGETS: 5711 case BC_TGETS:
5688 dasm_put(Dst, 3767, 32-1, Dt6(->hmask), Dt5(->hash), Dt6(->node), 31-5, 31-3, DtB(->key), DtB(->val), DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index); 5712 dasm_put(Dst, 3786, 32-1, Dt6(->hmask), Dt5(->hash), Dt6(->node), 31-5, 31-3, DtB(->key), DtB(->val), DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
5689 dasm_put(Dst, 3831); 5713 dasm_put(Dst, 3850);
5690 break; 5714 break;
5691 case BC_TGETB: 5715 case BC_TGETB:
5692 dasm_put(Dst, 3836, 32-3, Dt6(->asize), Dt6(->array), Dt6(->metatable), Dt6(->nomm), 1<<MM_index); 5716 dasm_put(Dst, 3855, 32-3, Dt6(->asize), Dt6(->array), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
5693 break; 5717 break;
5694 5718
5695 case BC_TSETV: 5719 case BC_TSETV:
5696 dasm_put(Dst, 3880, Dt6(->asize), Dt6(->array), 31-3, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex); 5720 dasm_put(Dst, 3899, Dt6(->asize), Dt6(->array), 31-3, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
5697 dasm_put(Dst, 3947, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist)); 5721 dasm_put(Dst, 3966, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
5698 break; 5722 break;
5699 case BC_TSETS: 5723 case BC_TSETS:
5700 dasm_put(Dst, 3959, 32-1, Dt6(->hmask), Dt5(->hash), Dt6(->node), Dt6(->nomm), 31-5, 31-3, Dt6(->marked), DtB(->key), DtB(->val), LJ_GC_BLACK, DtB(->val), Dt6(->metatable)); 5724 dasm_put(Dst, 3978, 32-1, Dt6(->hmask), Dt5(->hash), Dt6(->node), Dt6(->nomm), 31-5, 31-3, Dt6(->marked), DtB(->key), DtB(->val), LJ_GC_BLACK, DtB(->val), Dt6(->metatable));
5701 dasm_put(Dst, 4020, Dt6(->nomm), 1<<MM_newindex, DtB(->next), Dt6(->metatable), DISPATCH_GL(tmptv), Dt1(->base), Dt6(->nomm), 1<<MM_newindex, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain)); 5725 dasm_put(Dst, 4039, Dt6(->nomm), 1<<MM_newindex, DtB(->next), Dt6(->metatable), DISPATCH_GL(tmptv), Dt1(->base), Dt6(->nomm), 1<<MM_newindex, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain));
5702 dasm_put(Dst, 4071, Dt6(->marked), Dt6(->gclist)); 5726 dasm_put(Dst, 4090, Dt6(->marked), Dt6(->gclist));
5703 break; 5727 break;
5704 case BC_TSETB: 5728 case BC_TSETB:
5705 dasm_put(Dst, 4078, 32-3, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked)); 5729 dasm_put(Dst, 4097, 32-3, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked));
5706 dasm_put(Dst, 4138, Dt6(->gclist)); 5730 dasm_put(Dst, 4157, Dt6(->gclist));
5707 break; 5731 break;
5708 5732
5709 case BC_TSETM: 5733 case BC_TSETM:
5710 dasm_put(Dst, 4143, 32-3, Dt6(->asize), 31-3, Dt6(->marked), Dt6(->array), LJ_GC_BLACK, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist)); 5734 dasm_put(Dst, 4162, 32-3, Dt6(->asize), 31-3, Dt6(->marked), Dt6(->array), LJ_GC_BLACK, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
5711 dasm_put(Dst, 4212); 5735 dasm_put(Dst, 4231);
5712 break; 5736 break;
5713 5737
5714 /* -- Calls and vararg handling ----------------------------------------- */ 5738 /* -- Calls and vararg handling ----------------------------------------- */
5715 5739
5716 case BC_CALLM: 5740 case BC_CALLM:
5717 dasm_put(Dst, 4215); 5741 dasm_put(Dst, 4234);
5718 break; 5742 break;
5719 case BC_CALL: 5743 case BC_CALL:
5720 dasm_put(Dst, 4217, Dt7(->pc)); 5744 dasm_put(Dst, 4236, Dt7(->pc));
5721 break; 5745 break;
5722 5746
5723 case BC_CALLMT: 5747 case BC_CALLMT:
5724 dasm_put(Dst, 4237); 5748 dasm_put(Dst, 4256);
5725 break; 5749 break;
5726 case BC_CALLT: 5750 case BC_CALLT:
5727 dasm_put(Dst, 4239, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP); 5751 dasm_put(Dst, 4258, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
5728 dasm_put(Dst, 4304, FRAME_TYPE); 5752 dasm_put(Dst, 4323, FRAME_TYPE);
5729 break; 5753 break;
5730 5754
5731 case BC_ITERC: 5755 case BC_ITERC:
5732 dasm_put(Dst, 4311, Dt7(->pc)); 5756 dasm_put(Dst, 4330, Dt7(->pc));
5733 break; 5757 break;
5734 5758
5735 case BC_ITERN: 5759 case BC_ITERN:
5736#if LJ_HASJIT 5760#if LJ_HASJIT
5737#endif 5761#endif
5738 dasm_put(Dst, 4337, Dt6(->asize), Dt6(->array), 31-3, -(BCBIAS_J*4 >> 16), Dt6(->hmask), Dt6(->node), 31-5, 31-3, DtB(->key), -(BCBIAS_J*4 >> 16)); 5762 dasm_put(Dst, 4356, Dt6(->asize), Dt6(->array), 31-3, -(BCBIAS_J*4 >> 16), Dt6(->hmask), Dt6(->node), 31-5, 31-3, DtB(->key), -(BCBIAS_J*4 >> 16));
5739 dasm_put(Dst, 4416); 5763 dasm_put(Dst, 4435);
5740 break; 5764 break;
5741 5765
5742 case BC_ISNEXT: 5766 case BC_ISNEXT:
5743 dasm_put(Dst, 4420, LJ_TTAB, LJ_TFUNC, LJ_TNIL, Dt8(->ffid), FF_next_N, 32-1, -(BCBIAS_J*4 >> 16), BC_JMP, BC_ITERC, -(BCBIAS_J*4 >> 16)); 5767 dasm_put(Dst, 4439, LJ_TTAB, LJ_TFUNC, LJ_TNIL, Dt8(->ffid), FF_next_N, 32-1, -(BCBIAS_J*4 >> 16), BC_JMP, BC_ITERC, -(BCBIAS_J*4 >> 16));
5744 break; 5768 break;
5745 5769
5746 case BC_VARG: 5770 case BC_VARG:
5747 dasm_put(Dst, 4471, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base)); 5771 dasm_put(Dst, 4490, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base));
5748 dasm_put(Dst, 4551); 5772 dasm_put(Dst, 4570);
5749 break; 5773 break;
5750 5774
5751 /* -- Returns ----------------------------------------------------------- */ 5775 /* -- Returns ----------------------------------------------------------- */
5752 5776
5753 case BC_RETM: 5777 case BC_RETM:
5754 dasm_put(Dst, 4557); 5778 dasm_put(Dst, 4576);
5755 break; 5779 break;
5756 5780
5757 case BC_RET: 5781 case BC_RET:
5758 dasm_put(Dst, 4559, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP); 5782 dasm_put(Dst, 4578, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
5759 break; 5783 break;
5760 5784
5761 case BC_RET0: case BC_RET1: 5785 case BC_RET0: case BC_RET1:
5762 dasm_put(Dst, 4629, FRAME_TYPE, FRAME_VARG); 5786 dasm_put(Dst, 4648, FRAME_TYPE, FRAME_VARG);
5763 if (op == BC_RET1) { 5787 if (op == BC_RET1) {
5764 dasm_put(Dst, 4642); 5788 dasm_put(Dst, 4661);
5765 } 5789 }
5766 dasm_put(Dst, 4645, Dt7(->pc), PC2PROTO(k)); 5790 dasm_put(Dst, 4664, Dt7(->pc), PC2PROTO(k));
5767 break; 5791 break;
5768 5792
5769 /* -- Loops and branches ------------------------------------------------ */ 5793 /* -- Loops and branches ------------------------------------------------ */
5770 5794
5771 case BC_FORL: 5795 case BC_FORL:
5772#if LJ_HASJIT 5796#if LJ_HASJIT
5773 dasm_put(Dst, 4673); 5797 dasm_put(Dst, 4692);
5774#endif 5798#endif
5775 break; 5799 break;
5776 5800
@@ -5782,35 +5806,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
5782 case BC_FORI: 5806 case BC_FORI:
5783 case BC_IFORL: 5807 case BC_IFORL:
5784 vk = (op == BC_IFORL || op == BC_JFORL); 5808 vk = (op == BC_IFORL || op == BC_JFORL);
5785 dasm_put(Dst, 4675, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8); 5809 dasm_put(Dst, 4694, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8);
5786 if (!vk) { 5810 if (!vk) {
5787 dasm_put(Dst, 4683); 5811 dasm_put(Dst, 4702);
5788 } 5812 }
5789 if (vk) { 5813 if (vk) {
5790 dasm_put(Dst, 4691, FORL_IDX*8); 5814 dasm_put(Dst, 4710, FORL_IDX*8);
5791 } 5815 }
5792 dasm_put(Dst, 4695, FORL_EXT*8); 5816 dasm_put(Dst, 4714, FORL_EXT*8);
5793 if (op != BC_JFORL) { 5817 if (op != BC_JFORL) {
5794 dasm_put(Dst, 4703, 32-1); 5818 dasm_put(Dst, 4722, 32-1);
5795 if (op == BC_JFORI) { 5819 if (op == BC_JFORI) {
5796 dasm_put(Dst, 4707, -(BCBIAS_J*4 >> 16)); 5820 dasm_put(Dst, 4726, -(BCBIAS_J*4 >> 16));
5797 } else { 5821 } else {
5798 dasm_put(Dst, 4710, -(BCBIAS_J*4 >> 16)); 5822 dasm_put(Dst, 4729, -(BCBIAS_J*4 >> 16));
5799 } 5823 }
5800 } 5824 }
5801 if (op == BC_FORI) { 5825 if (op == BC_FORI) {
5802 dasm_put(Dst, 4713); 5826 dasm_put(Dst, 4732);
5803 } else if (op == BC_IFORL) { 5827 } else if (op == BC_IFORL) {
5804 dasm_put(Dst, 4715); 5828 dasm_put(Dst, 4734);
5805 } else { 5829 } else {
5806 dasm_put(Dst, 4717, BC_JLOOP); 5830 dasm_put(Dst, 4736, BC_JLOOP);
5807 } 5831 }
5808 dasm_put(Dst, 4720); 5832 dasm_put(Dst, 4739);
5809 break; 5833 break;
5810 5834
5811 case BC_ITERL: 5835 case BC_ITERL:
5812#if LJ_HASJIT 5836#if LJ_HASJIT
5813 dasm_put(Dst, 4735); 5837 dasm_put(Dst, 4754);
5814#endif 5838#endif
5815 break; 5839 break;
5816 5840
@@ -5819,40 +5843,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
5819 break; 5843 break;
5820#endif 5844#endif
5821 case BC_IITERL: 5845 case BC_IITERL:
5822 dasm_put(Dst, 4737); 5846 dasm_put(Dst, 4756);
5823 if (op == BC_JITERL) { 5847 if (op == BC_JITERL) {
5824 dasm_put(Dst, 4743); 5848 dasm_put(Dst, 4762);
5825 } else { 5849 } else {
5826 dasm_put(Dst, 4745, 32-1, -(BCBIAS_J*4 >> 16)); 5850 dasm_put(Dst, 4764, 32-1, -(BCBIAS_J*4 >> 16));
5827 } 5851 }
5828 dasm_put(Dst, 4752); 5852 dasm_put(Dst, 4771);
5829 break; 5853 break;
5830 5854
5831 case BC_LOOP: 5855 case BC_LOOP:
5832#if LJ_HASJIT 5856#if LJ_HASJIT
5833 dasm_put(Dst, 4764); 5857 dasm_put(Dst, 4783);
5834#endif 5858#endif
5835 break; 5859 break;
5836 5860
5837 case BC_ILOOP: 5861 case BC_ILOOP:
5838 dasm_put(Dst, 4766); 5862 dasm_put(Dst, 4785);
5839 break; 5863 break;
5840 5864
5841 case BC_JLOOP: 5865 case BC_JLOOP:
5842#if LJ_HASJIT 5866#if LJ_HASJIT
5843 dasm_put(Dst, 4777); 5867 dasm_put(Dst, 4796);
5844#endif 5868#endif
5845 break; 5869 break;
5846 5870
5847 case BC_JMP: 5871 case BC_JMP:
5848 dasm_put(Dst, 4779, 32-1, -(BCBIAS_J*4 >> 16)); 5872 dasm_put(Dst, 4798, 32-1, -(BCBIAS_J*4 >> 16));
5849 break; 5873 break;
5850 5874
5851 /* -- Function headers -------------------------------------------------- */ 5875 /* -- Function headers -------------------------------------------------- */
5852 5876
5853 case BC_FUNCF: 5877 case BC_FUNCF:
5854#if LJ_HASJIT 5878#if LJ_HASJIT
5855 dasm_put(Dst, 4795); 5879 dasm_put(Dst, 4814);
5856#endif 5880#endif
5857 case BC_FUNCV: /* NYI: compiled vararg functions. */ 5881 case BC_FUNCV: /* NYI: compiled vararg functions. */
5858 break; 5882 break;
@@ -5862,38 +5886,38 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
5862 break; 5886 break;
5863#endif 5887#endif
5864 case BC_IFUNCF: 5888 case BC_IFUNCF:
5865 dasm_put(Dst, 4797, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3); 5889 dasm_put(Dst, 4816, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3);
5866 if (op == BC_JFUNCF) { 5890 if (op == BC_JFUNCF) {
5867 dasm_put(Dst, 4815); 5891 dasm_put(Dst, 4834);
5868 } else { 5892 } else {
5869 dasm_put(Dst, 4817); 5893 dasm_put(Dst, 4836);
5870 } 5894 }
5871 dasm_put(Dst, 4826); 5895 dasm_put(Dst, 4845);
5872 break; 5896 break;
5873 5897
5874 case BC_JFUNCV: 5898 case BC_JFUNCV:
5875#if !LJ_HASJIT 5899#if !LJ_HASJIT
5876 break; 5900 break;
5877#endif 5901#endif
5878 dasm_put(Dst, 4832); 5902 dasm_put(Dst, 4851);
5879 break; /* NYI: compiled vararg functions. */ 5903 break; /* NYI: compiled vararg functions. */
5880 5904
5881 case BC_IFUNCV: 5905 case BC_IFUNCV:
5882 dasm_put(Dst, 4834, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams)); 5906 dasm_put(Dst, 4853, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams));
5883 break; 5907 break;
5884 5908
5885 case BC_FUNCC: 5909 case BC_FUNCC:
5886 case BC_FUNCCW: 5910 case BC_FUNCCW:
5887 if (op == BC_FUNCC) { 5911 if (op == BC_FUNCC) {
5888 dasm_put(Dst, 4884, Dt8(->f)); 5912 dasm_put(Dst, 4903, Dt8(->f));
5889 } else { 5913 } else {
5890 dasm_put(Dst, 4887, DISPATCH_GL(wrapf)); 5914 dasm_put(Dst, 4906, DISPATCH_GL(wrapf));
5891 } 5915 }
5892 dasm_put(Dst, 4890, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C); 5916 dasm_put(Dst, 4909, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C);
5893 if (op == BC_FUNCCW) { 5917 if (op == BC_FUNCCW) {
5894 dasm_put(Dst, 4903, Dt8(->f)); 5918 dasm_put(Dst, 4922, Dt8(->f));
5895 } 5919 }
5896 dasm_put(Dst, 4906, DISPATCH_GL(vmstate), Dt1(->top), 31-3, Dt1(->base), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate)); 5920 dasm_put(Dst, 4925, DISPATCH_GL(vmstate), Dt1(->top), 31-3, Dt1(->base), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate));
5897 break; 5921 break;
5898 5922
5899 /* ---------------------------------------------------------------------- */ 5923 /* ---------------------------------------------------------------------- */
@@ -5913,7 +5937,7 @@ static int build_backend(BuildCtx *ctx)
5913 5937
5914 build_subroutines(ctx); 5938 build_subroutines(ctx);
5915 5939
5916 dasm_put(Dst, 4927); 5940 dasm_put(Dst, 4946);
5917 for (op = 0; op < BC__MAX; op++) 5941 for (op = 0; op < BC__MAX; op++)
5918 build_ins(ctx, (BCOp)op, op); 5942 build_ins(ctx, (BCOp)op, op);
5919 5943
diff --git a/src/buildvm_x64.h b/src/buildvm_x64.h
index c40abbd8..73cbbb6d 100644
--- a/src/buildvm_x64.h
+++ b/src/buildvm_x64.h
@@ -1862,6 +1862,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
1862 case BC_KSTR: 1862 case BC_KSTR:
1863 dasm_put(Dst, 10553, LJ_TSTR); 1863 dasm_put(Dst, 10553, LJ_TSTR);
1864 break; 1864 break;
1865 case BC_KCDATA:
1866#if LJ_HASFFI
1867 dasm_put(Dst, 10553, LJ_TCDATA);
1868#endif
1869 break;
1865 case BC_KSHORT: 1870 case BC_KSHORT:
1866 if (sse) { 1871 if (sse) {
1867 dasm_put(Dst, 10590); 1872 dasm_put(Dst, 10590);
diff --git a/src/buildvm_x64win.h b/src/buildvm_x64win.h
index e855ca8b..94dbe50f 100644
--- a/src/buildvm_x64win.h
+++ b/src/buildvm_x64win.h
@@ -1863,6 +1863,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
1863 case BC_KSTR: 1863 case BC_KSTR:
1864 dasm_put(Dst, 10534, LJ_TSTR); 1864 dasm_put(Dst, 10534, LJ_TSTR);
1865 break; 1865 break;
1866 case BC_KCDATA:
1867#if LJ_HASFFI
1868 dasm_put(Dst, 10534, LJ_TCDATA);
1869#endif
1870 break;
1866 case BC_KSHORT: 1871 case BC_KSHORT:
1867 if (sse) { 1872 if (sse) {
1868 dasm_put(Dst, 10569); 1873 dasm_put(Dst, 10569);
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc
index 0bd8f304..b4f34782 100644
--- a/src/buildvm_x86.dasc
+++ b/src/buildvm_x86.dasc
@@ -3795,6 +3795,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
3795 | mov [BASE+RA*8], RD 3795 | mov [BASE+RA*8], RD
3796 | ins_next 3796 | ins_next
3797 break; 3797 break;
3798 case BC_KCDATA:
3799#if LJ_HASFFI
3800 | ins_AND // RA = dst, RD = cdata const (~)
3801 | mov RD, [KBASE+RD*4]
3802 | mov dword [BASE+RA*8+4], LJ_TCDATA
3803 | mov [BASE+RA*8], RD
3804 | ins_next
3805#endif
3806 break;
3798 case BC_KSHORT: 3807 case BC_KSHORT:
3799 | ins_AD // RA = dst, RD = signed int16 literal 3808 | ins_AD // RA = dst, RD = signed int16 literal
3800 if (sse) { 3809 if (sse) {
diff --git a/src/buildvm_x86.h b/src/buildvm_x86.h
index 25e4cc8e..555fe67a 100644
--- a/src/buildvm_x86.h
+++ b/src/buildvm_x86.h
@@ -1982,6 +1982,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
1982 case BC_KSTR: 1982 case BC_KSTR:
1983 dasm_put(Dst, 11907, LJ_TSTR); 1983 dasm_put(Dst, 11907, LJ_TSTR);
1984 break; 1984 break;
1985 case BC_KCDATA:
1986#if LJ_HASFFI
1987 dasm_put(Dst, 11907, LJ_TCDATA);
1988#endif
1989 break;
1985 case BC_KSHORT: 1990 case BC_KSHORT:
1986 if (sse) { 1991 if (sse) {
1987 dasm_put(Dst, 11940); 1992 dasm_put(Dst, 11940);
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index ed73a5fe..3ea19dd5 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -474,7 +474,8 @@ LUALIB_API int luaopen_ffi(lua_State *L)
474 lj_ctype_init(L); 474 lj_ctype_init(L);
475 LJ_LIB_REG_(L, NULL, ffi_meta); 475 LJ_LIB_REG_(L, NULL, ffi_meta);
476 /* NOBARRIER: basemt is a GC root. */ 476 /* NOBARRIER: basemt is a GC root. */
477 setgcref(basemt_it(G(L), LJ_TCDATA), obj2gco(tabV(L->top-1))); 477 L->top--;
478 setgcref(basemt_it(G(L), LJ_TCDATA), obj2gco(tabV(L->top)));
478 lua_pushliteral(L, LJ_OS_NAME); 479 lua_pushliteral(L, LJ_OS_NAME);
479 lua_pushliteral(L, LJ_ARCH_NAME); 480 lua_pushliteral(L, LJ_ARCH_NAME);
480 LJ_LIB_REG_(L, NULL, ffi); /* Note: no global "ffi" created! */ 481 LJ_LIB_REG_(L, NULL, ffi); /* Note: no global "ffi" created! */
diff --git a/src/lj_bc.h b/src/lj_bc.h
index 837316d5..101e2c15 100644
--- a/src/lj_bc.h
+++ b/src/lj_bc.h
@@ -121,6 +121,7 @@
121 \ 121 \
122 /* Constant ops. */ \ 122 /* Constant ops. */ \
123 _(KSTR, dst, ___, str, ___) \ 123 _(KSTR, dst, ___, str, ___) \
124 _(KCDATA, dst, ___, cdata, ___) \
124 _(KSHORT, dst, ___, lits, ___) \ 125 _(KSHORT, dst, ___, lits, ___) \
125 _(KNUM, dst, ___, num, ___) \ 126 _(KNUM, dst, ___, num, ___) \
126 _(KPRI, dst, ___, pri, ___) \ 127 _(KPRI, dst, ___, pri, ___) \
@@ -234,7 +235,7 @@ enum {
234/* Bytecode operand modes. ORDER BCMode */ 235/* Bytecode operand modes. ORDER BCMode */
235typedef enum { 236typedef enum {
236 BCMnone, BCMdst, BCMbase, BCMvar, BCMrbase, BCMuv, /* Mode A must be <= 7 */ 237 BCMnone, BCMdst, BCMbase, BCMvar, BCMrbase, BCMuv, /* Mode A must be <= 7 */
237 BCMlit, BCMlits, BCMpri, BCMnum, BCMstr, BCMtab, BCMfunc, BCMjump, 238 BCMlit, BCMlits, BCMpri, BCMnum, BCMstr, BCMtab, BCMfunc, BCMjump, BCMcdata,
238 BCM_max 239 BCM_max
239} BCMode; 240} BCMode;
240#define BCM___ BCMnone 241#define BCM___ BCMnone
diff --git a/src/lj_cdata.h b/src/lj_cdata.h
index 38b6ce16..27b0bf15 100644
--- a/src/lj_cdata.h
+++ b/src/lj_cdata.h
@@ -45,6 +45,15 @@ static LJ_AINLINE GCcdata *lj_cdata_new(CTState *cts, CTypeID id, CTSize sz)
45 return cd; 45 return cd;
46} 46}
47 47
48/* Variant which works without a valid CTState. */
49static LJ_AINLINE GCcdata *lj_cdata_new_(lua_State *L, CTypeID id, CTSize sz)
50{
51 GCcdata *cd = (GCcdata *)lj_mem_newgco(L, sizeof(GCcdata) + sz);
52 cd->gct = ~LJ_TCDATA;
53 cd->typeid = id;
54 return cd;
55}
56
48LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id); 57LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id);
49LJ_FUNC GCcdata *lj_cdata_newv(CTState *cts, CTypeID id, CTSize sz, 58LJ_FUNC GCcdata *lj_cdata_newv(CTState *cts, CTypeID id, CTSize sz,
50 CTSize align); 59 CTSize align);
diff --git a/src/lj_lex.c b/src/lj_lex.c
index a115b79a..01e5ce57 100644
--- a/src/lj_lex.c
+++ b/src/lj_lex.c
@@ -13,6 +13,12 @@
13#include "lj_gc.h" 13#include "lj_gc.h"
14#include "lj_err.h" 14#include "lj_err.h"
15#include "lj_str.h" 15#include "lj_str.h"
16#if LJ_HASFFI
17#include "lj_tab.h"
18#include "lj_ctype.h"
19#include "lj_cdata.h"
20#include "lualib.h"
21#endif
16#include "lj_lex.h" 22#include "lj_lex.h"
17#include "lj_parse.h" 23#include "lj_parse.h"
18#include "lj_char.h" 24#include "lj_char.h"
@@ -77,7 +83,64 @@ static void inclinenumber(LexState *ls)
77 83
78/* -- Scanner for terminals ----------------------------------------------- */ 84/* -- Scanner for terminals ----------------------------------------------- */
79 85
80static void read_numeral(LexState *ls, TValue *tv) 86#if LJ_HASFFI
87/* Load FFI library on-demand. Needed if we create cdata objects. */
88static void lex_loadffi(lua_State *L)
89{
90 cTValue *tmp;
91 luaopen_ffi(L);
92 tmp = lj_tab_getstr(tabV(registry(L)), lj_str_newlit(L, "_LOADED"));
93 if (tmp && tvistab(tmp)) {
94 GCtab *t = tabV(tmp);
95 copyTV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "ffi")), L->top-1);
96 lj_gc_anybarriert(L, t);
97 }
98 L->top--;
99}
100
101/* Parse 64 bit integer. */
102static int lex_number64(LexState *ls, TValue *tv)
103{
104 uint64_t n = 0;
105 uint8_t *p = (uint8_t *)ls->sb.buf;
106 CTypeID id = CTID_INT64;
107 GCcdata *cd;
108 int numl = 0;
109 if (p[0] == '0' && (p[1] & ~0x20) == 'X') { /* Hexadecimal. */
110 p += 2;
111 if (!lj_char_isxdigit(*p)) return 0;
112 do {
113 n = n*16 + (*p & 15);
114 if (!lj_char_isdigit(*p)) n += 9;
115 p++;
116 } while (lj_char_isxdigit(*p));
117 } else { /* Decimal. */
118 if (!lj_char_isdigit(*p)) return 0;
119 do {
120 n = n*10 + (*p - '0');
121 p++;
122 } while (lj_char_isdigit(*p));
123 }
124 for (;;) { /* Parse suffixes. */
125 if ((*p & ~0x20) == 'U')
126 id = CTID_UINT64;
127 else if ((*p & ~0x20) == 'L')
128 numl++;
129 else
130 break;
131 p++;
132 }
133 if (numl != 2 || *p != '\0') return 0;
134 /* Return cdata holding a 64 bit integer. */
135 cd = lj_cdata_new_(ls->L, id, 8);
136 *(uint64_t *)cdataptr(cd) = n;
137 lj_parse_keepcdata(ls, tv, cd);
138 return 1; /* Ok. */
139}
140#endif
141
142/* Parse a number literal. */
143static void lex_number(LexState *ls, TValue *tv)
81{ 144{
82 int c; 145 int c;
83 lua_assert(lj_char_isdigit(ls->current)); 146 lua_assert(lj_char_isdigit(ls->current));
@@ -87,9 +150,31 @@ static void read_numeral(LexState *ls, TValue *tv)
87 } while (lj_char_isident(ls->current) || ls->current == '.' || 150 } while (lj_char_isident(ls->current) || ls->current == '.' ||
88 ((ls->current == '-' || ls->current == '+') && 151 ((ls->current == '-' || ls->current == '+') &&
89 ((c & ~0x20) == 'E' || (c & ~0x20) == 'P'))); 152 ((c & ~0x20) == 'E' || (c & ~0x20) == 'P')));
153#if LJ_HASFFI
154 c &= ~0x20;
155 if ((c == 'I' || c == 'L' || c == 'U') && !ctype_ctsG(G(ls->L)))
156 lex_loadffi(ls->L);
157 if (c == 'I') /* Parse imaginary part of complex number. */
158 ls->sb.n--;
159#endif
90 save(ls, '\0'); 160 save(ls, '\0');
91 if (!lj_str_numconv(ls->sb.buf, tv)) 161#if LJ_HASFFI
92 lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER); 162 if ((c == 'L' || c == 'U') && lex_number64(ls, tv)) { /* Parse 64 bit int. */
163 return;
164 } else
165#endif
166 if (lj_str_numconv(ls->sb.buf, tv)) {
167#if LJ_HASFFI
168 if (c == 'I') { /* Return cdata holding a complex number. */
169 GCcdata *cd = lj_cdata_new_(ls->L, CTID_COMPLEX_DOUBLE, 2*sizeof(double));
170 ((double *)cdataptr(cd))[0] = 0;
171 ((double *)cdataptr(cd))[1] = tv->n;
172 lj_parse_keepcdata(ls, tv, cd);
173 }
174#endif
175 return;
176 }
177 lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER);
93} 178}
94 179
95static int skip_sep(LexState *ls) 180static int skip_sep(LexState *ls)
@@ -224,7 +309,7 @@ static int llex(LexState *ls, TValue *tv)
224 if (lj_char_isident(ls->current)) { 309 if (lj_char_isident(ls->current)) {
225 GCstr *s; 310 GCstr *s;
226 if (lj_char_isdigit(ls->current)) { /* Numeric literal. */ 311 if (lj_char_isdigit(ls->current)) { /* Numeric literal. */
227 read_numeral(ls, tv); 312 lex_number(ls, tv);
228 return TK_number; 313 return TK_number;
229 } 314 }
230 /* Identifier or reserved word. */ 315 /* Identifier or reserved word. */
@@ -306,7 +391,7 @@ static int llex(LexState *ls, TValue *tv)
306 } else if (!lj_char_isdigit(ls->current)) { 391 } else if (!lj_char_isdigit(ls->current)) {
307 return '.'; 392 return '.';
308 } else { 393 } else {
309 read_numeral(ls, tv); 394 lex_number(ls, tv);
310 return TK_number; 395 return TK_number;
311 } 396 }
312 case END_OF_STREAM: 397 case END_OF_STREAM:
diff --git a/src/lj_parse.c b/src/lj_parse.c
index d93ed990..22241b24 100644
--- a/src/lj_parse.c
+++ b/src/lj_parse.c
@@ -17,6 +17,9 @@
17#include "lj_func.h" 17#include "lj_func.h"
18#include "lj_state.h" 18#include "lj_state.h"
19#include "lj_bc.h" 19#include "lj_bc.h"
20#if LJ_HASFFI
21#include "lj_ctype.h"
22#endif
20#include "lj_lex.h" 23#include "lj_lex.h"
21#include "lj_parse.h" 24#include "lj_parse.h"
22#include "lj_vm.h" 25#include "lj_vm.h"
@@ -33,6 +36,7 @@ typedef enum {
33 VKSTR, /* sval = string value */ 36 VKSTR, /* sval = string value */
34 VKNUM, /* nval = number value */ 37 VKNUM, /* nval = number value */
35 VKLAST = VKNUM, 38 VKLAST = VKNUM,
39 VKCDATA, /* nval = cdata value, not treated as a constant expression */
36 /* Non-constant expressions follow: */ 40 /* Non-constant expressions follow: */
37 VLOCAL, /* info = local register */ 41 VLOCAL, /* info = local register */
38 VUPVAL, /* info = upvalue index */ 42 VUPVAL, /* info = upvalue index */
@@ -61,7 +65,7 @@ typedef struct ExpDesc {
61} ExpDesc; 65} ExpDesc;
62 66
63/* Macros for expressions. */ 67/* Macros for expressions. */
64#define expr_hasjump(e) ((e)->t != (e)->f) 68#define expr_hasjump(e) ((e)->t != (e)->f)
65 69
66#define expr_isk(e) ((e)->k <= VKLAST) 70#define expr_isk(e) ((e)->k <= VKLAST)
67#define expr_isk_nojump(e) (expr_isk(e) && !expr_hasjump(e)) 71#define expr_isk_nojump(e) (expr_isk(e) && !expr_hasjump(e))
@@ -216,6 +220,17 @@ GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t len)
216 return s; 220 return s;
217} 221}
218 222
223#if LJ_HASFFI
224/* Anchor cdata to avoid GC. */
225void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd)
226{
227 /* NOBARRIER: the key is new or kept alive. */
228 lua_State *L = ls->L;
229 setcdataV(L, tv, cd);
230 setboolV(lj_tab_set(L, ls->fs->kt, tv), 1);
231}
232#endif
233
219/* -- Jump list handling -------------------------------------------------- */ 234/* -- Jump list handling -------------------------------------------------- */
220 235
221/* Get next element in jump list. */ 236/* Get next element in jump list. */
@@ -469,6 +484,11 @@ static void expr_toreg_nobranch(FuncState *fs, ExpDesc *e, BCReg reg)
469 ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)k); 484 ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)k);
470 else 485 else
471 ins = BCINS_AD(BC_KNUM, reg, const_num(fs, e)); 486 ins = BCINS_AD(BC_KNUM, reg, const_num(fs, e));
487#if LJ_HASFFI
488 } else if (e->k == VKCDATA) {
489 ins = BCINS_AD(BC_KCDATA, reg,
490 const_gc(fs, obj2gco(cdataV(&e->u.nval)), LJ_TCDATA));
491#endif
472 } else if (e->k == VRELOCABLE) { 492 } else if (e->k == VRELOCABLE) {
473 setbc_a(bcptr(fs, e), reg); 493 setbc_a(bcptr(fs, e), reg);
474 goto noins; 494 goto noins;
@@ -856,7 +876,7 @@ static void bcemit_unop(FuncState *fs, BCOp op, ExpDesc *e)
856 if (e->k == VKNIL || e->k == VKFALSE) { 876 if (e->k == VKNIL || e->k == VKFALSE) {
857 e->k = VKTRUE; 877 e->k = VKTRUE;
858 return; 878 return;
859 } else if (expr_isk(e)) { 879 } else if (expr_isk(e) || (LJ_HASFFI && e->k == VKCDATA)) {
860 e->k = VKFALSE; 880 e->k = VKFALSE;
861 return; 881 return;
862 } else if (e->k == VJMP) { 882 } else if (e->k == VJMP) {
@@ -872,10 +892,22 @@ static void bcemit_unop(FuncState *fs, BCOp op, ExpDesc *e)
872 } 892 }
873 } else { 893 } else {
874 lua_assert(op == BC_UNM || op == BC_LEN); 894 lua_assert(op == BC_UNM || op == BC_LEN);
875 /* Constant-fold negations. But avoid folding to -0. */ 895 if (op == BC_UNM && !expr_hasjump(e)) { /* Constant-fold negations. */
876 if (op == BC_UNM && expr_isnumk_nojump(e) && expr_numV(e) != 0) { 896#if LJ_HASFFI
877 setnumV(&e->u.nval, -expr_numV(e)); 897 if (e->k == VKCDATA) { /* Fold in-place since cdata is not interned. */
878 return; 898 GCcdata *cd = cdataV(&e->u.nval);
899 int64_t *p = (int64_t *)cdataptr(cd);
900 if (cd->typeid == CTID_COMPLEX_DOUBLE)
901 p[1] ^= (int64_t)U64x(80000000,00000000);
902 else
903 *p = -*p;
904 return;
905 } else
906#endif
907 if (expr_isnumk(e) && expr_numV(e) != 0) { /* Avoid folding to -0. */
908 e->u.nval.u64 ^= U64x(80000000,00000000);
909 return;
910 }
879 } 911 }
880 expr_toanyreg(fs, e); 912 expr_toanyreg(fs, e);
881 } 913 }
@@ -1554,8 +1586,8 @@ static void expr_simple(LexState *ls, ExpDesc *v)
1554{ 1586{
1555 switch (ls->token) { 1587 switch (ls->token) {
1556 case TK_number: 1588 case TK_number:
1557 expr_init(v, VKNUM, 0); 1589 expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokenval)) ? VKCDATA : VKNUM, 0);
1558 setnumV(&v->u.nval, numV(&ls->tokenval)); 1590 copyTV(ls->L, &v->u.nval, &ls->tokenval);
1559 break; 1591 break;
1560 case TK_string: 1592 case TK_string:
1561 expr_init(v, VKSTR, 0); 1593 expr_init(v, VKSTR, 0);
diff --git a/src/lj_parse.h b/src/lj_parse.h
index 2031eeed..a05cb4ce 100644
--- a/src/lj_parse.h
+++ b/src/lj_parse.h
@@ -11,5 +11,8 @@
11 11
12LJ_FUNC GCproto *lj_parse(LexState *ls); 12LJ_FUNC GCproto *lj_parse(LexState *ls);
13LJ_FUNC GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t l); 13LJ_FUNC GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t l);
14#if LJ_HASFFI
15LJ_FUNC void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd);
16#endif
14 17
15#endif 18#endif