mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
ARM: Fix __newindex metamethod handling for BC_TSETB.
This commit is contained in:
parent
0764c615fd
commit
514ccfceb8
@ -3207,6 +3207,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
|||||||
| tst RA, #1<<MM_newindex
|
| tst RA, #1<<MM_newindex
|
||||||
| bne <1 // 'no __newindex' flag set: done.
|
| bne <1 // 'no __newindex' flag set: done.
|
||||||
| ldr INS, [PC, #-4] // Restore INS.
|
| ldr INS, [PC, #-4] // Restore INS.
|
||||||
|
| decode_RA8 RA, INS
|
||||||
| b ->vmeta_tsetb
|
| b ->vmeta_tsetb
|
||||||
|
|
|
|
||||||
|7: // Possible table write barrier for the value. Skip valiswhite check.
|
|7: // Possible table write barrier for the value. Skip valiswhite check.
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#define DASM_SECTION_CODE_OP 0
|
#define DASM_SECTION_CODE_OP 0
|
||||||
#define DASM_SECTION_CODE_SUB 1
|
#define DASM_SECTION_CODE_SUB 1
|
||||||
#define DASM_MAXSECTION 2
|
#define DASM_MAXSECTION 2
|
||||||
static const unsigned int build_actionlist[5614] = {
|
static const unsigned int build_actionlist[5615] = {
|
||||||
0x00010001,
|
0x00010001,
|
||||||
0x00060014,
|
0x00060014,
|
||||||
0xe3160000,
|
0xe3160000,
|
||||||
@ -4788,6 +4788,7 @@ static const unsigned int build_actionlist[5614] = {
|
|||||||
0x1a000000,
|
0x1a000000,
|
||||||
0x0005000b,
|
0x0005000b,
|
||||||
0xe516e004,
|
0xe516e004,
|
||||||
|
0xe004a2ae,
|
||||||
0xea000000,
|
0xea000000,
|
||||||
0x00050032,
|
0x00050032,
|
||||||
0x00060011,
|
0x00060011,
|
||||||
@ -6989,72 +6990,72 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
|||||||
break;
|
break;
|
||||||
case BC_TSETB:
|
case BC_TSETB:
|
||||||
dasm_put(Dst, 4726, -LJ_TTAB, Dt6(->asize), Dt6(->array), -LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain), LJ_GC_BLACK);
|
dasm_put(Dst, 4726, -LJ_TTAB, Dt6(->asize), Dt6(->array), -LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain), LJ_GC_BLACK);
|
||||||
dasm_put(Dst, 4783, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
|
dasm_put(Dst, 4784, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_TSETM:
|
case BC_TSETM:
|
||||||
dasm_put(Dst, 4792, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_GC_BLACK, Dt1(->base));
|
dasm_put(Dst, 4793, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_GC_BLACK, Dt1(->base));
|
||||||
if (LJ_TARGET_OSX) {
|
if (LJ_TARGET_OSX) {
|
||||||
dasm_put(Dst, 4837, Dt1(->base));
|
dasm_put(Dst, 4838, Dt1(->base));
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 4840, DISPATCH_GL(gc.grayagain), LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
|
dasm_put(Dst, 4841, DISPATCH_GL(gc.grayagain), LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* -- Calls and vararg handling ----------------------------------------- */
|
/* -- Calls and vararg handling ----------------------------------------- */
|
||||||
|
|
||||||
case BC_CALLM:
|
case BC_CALLM:
|
||||||
dasm_put(Dst, 4856);
|
dasm_put(Dst, 4857);
|
||||||
break;
|
break;
|
||||||
case BC_CALL:
|
case BC_CALL:
|
||||||
dasm_put(Dst, 4862, -LJ_TFUNC, Dt7(->field_pc));
|
dasm_put(Dst, 4863, -LJ_TFUNC, Dt7(->field_pc));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_CALLMT:
|
case BC_CALLMT:
|
||||||
dasm_put(Dst, 4882);
|
dasm_put(Dst, 4883);
|
||||||
break;
|
break;
|
||||||
case BC_CALLT:
|
case BC_CALLT:
|
||||||
dasm_put(Dst, 4887, -LJ_TFUNC, Dt7(->ffid), FRAME_TYPE, Dt7(->field_pc), Dt7(->field_pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP);
|
dasm_put(Dst, 4888, -LJ_TFUNC, Dt7(->ffid), FRAME_TYPE, Dt7(->field_pc), Dt7(->field_pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP);
|
||||||
dasm_put(Dst, 4948, FRAME_TYPE);
|
dasm_put(Dst, 4949, FRAME_TYPE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_ITERC:
|
case BC_ITERC:
|
||||||
dasm_put(Dst, 4959, -LJ_TFUNC, Dt7(->field_pc));
|
dasm_put(Dst, 4960, -LJ_TFUNC, Dt7(->field_pc));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_ITERN:
|
case BC_ITERN:
|
||||||
#if LJ_HASJIT
|
#if LJ_HASJIT
|
||||||
#endif
|
#endif
|
||||||
dasm_put(Dst, 4983, Dt6(->asize), Dt6(->array), -LJ_TNIL, ~LJ_TISNUM, Dt6(->hmask), Dt6(->node), DtB(->val), -LJ_TNIL, DtB(->key));
|
dasm_put(Dst, 4984, Dt6(->asize), Dt6(->array), -LJ_TNIL, ~LJ_TISNUM, Dt6(->hmask), Dt6(->node), DtB(->val), -LJ_TNIL, DtB(->key));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_ISNEXT:
|
case BC_ISNEXT:
|
||||||
dasm_put(Dst, 5048, -LJ_TFUNC, Dt8(->ffid), -LJ_TTAB, -LJ_TNIL, FF_next_N, BC_JMP, BC_ITERC);
|
dasm_put(Dst, 5049, -LJ_TFUNC, Dt8(->ffid), -LJ_TTAB, -LJ_TNIL, FF_next_N, BC_JMP, BC_ITERC);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_VARG:
|
case BC_VARG:
|
||||||
dasm_put(Dst, 5087, FRAME_VARG, ~LJ_TNIL, Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->base));
|
dasm_put(Dst, 5088, FRAME_VARG, ~LJ_TNIL, Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->base));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* -- Returns ----------------------------------------------------------- */
|
/* -- Returns ----------------------------------------------------------- */
|
||||||
|
|
||||||
case BC_RETM:
|
case BC_RETM:
|
||||||
dasm_put(Dst, 5159);
|
dasm_put(Dst, 5160);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_RET:
|
case BC_RET:
|
||||||
dasm_put(Dst, 5166, FRAME_TYPE, FRAME_VARG, Dt7(->field_pc), PC2PROTO(k), ~LJ_TNIL, FRAME_TYPEP);
|
dasm_put(Dst, 5167, FRAME_TYPE, FRAME_VARG, Dt7(->field_pc), PC2PROTO(k), ~LJ_TNIL, FRAME_TYPEP);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_RET0: case BC_RET1:
|
case BC_RET0: case BC_RET1:
|
||||||
dasm_put(Dst, 5231, FRAME_TYPE, FRAME_VARG);
|
dasm_put(Dst, 5232, FRAME_TYPE, FRAME_VARG);
|
||||||
if (op == BC_RET1) {
|
if (op == BC_RET1) {
|
||||||
dasm_put(Dst, 5242);
|
dasm_put(Dst, 5243);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5244);
|
dasm_put(Dst, 5245);
|
||||||
if (op == BC_RET1) {
|
if (op == BC_RET1) {
|
||||||
dasm_put(Dst, 5247);
|
dasm_put(Dst, 5248);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5249, Dt7(->field_pc), PC2PROTO(k), ~LJ_TNIL);
|
dasm_put(Dst, 5250, Dt7(->field_pc), PC2PROTO(k), ~LJ_TNIL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* -- Loops and branches ------------------------------------------------ */
|
/* -- Loops and branches ------------------------------------------------ */
|
||||||
@ -7062,7 +7063,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
|||||||
|
|
||||||
case BC_FORL:
|
case BC_FORL:
|
||||||
#if LJ_HASJIT
|
#if LJ_HASJIT
|
||||||
dasm_put(Dst, 5275, -GG_DISP2HOT);
|
dasm_put(Dst, 5276, -GG_DISP2HOT);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -7074,68 +7075,68 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
|||||||
case BC_FORI:
|
case BC_FORI:
|
||||||
case BC_IFORL:
|
case BC_IFORL:
|
||||||
vk = (op == BC_IFORL || op == BC_JFORL);
|
vk = (op == BC_IFORL || op == BC_JFORL);
|
||||||
dasm_put(Dst, 5285);
|
dasm_put(Dst, 5286);
|
||||||
if (op != BC_JFORL) {
|
if (op != BC_JFORL) {
|
||||||
dasm_put(Dst, 5287);
|
dasm_put(Dst, 5288);
|
||||||
}
|
}
|
||||||
if (!vk) {
|
if (!vk) {
|
||||||
dasm_put(Dst, 5289, -LJ_TISNUM, -LJ_TISNUM, -LJ_TISNUM);
|
dasm_put(Dst, 5290, -LJ_TISNUM, -LJ_TISNUM, -LJ_TISNUM);
|
||||||
} else {
|
} else {
|
||||||
dasm_put(Dst, 5307, -LJ_TISNUM);
|
dasm_put(Dst, 5308, -LJ_TISNUM);
|
||||||
if (op == BC_IFORL) {
|
if (op == BC_IFORL) {
|
||||||
dasm_put(Dst, 5315);
|
dasm_put(Dst, 5316);
|
||||||
} else {
|
} else {
|
||||||
dasm_put(Dst, 5317);
|
dasm_put(Dst, 5318);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5320);
|
dasm_put(Dst, 5321);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5325);
|
dasm_put(Dst, 5326);
|
||||||
if (op == BC_FORI) {
|
if (op == BC_FORI) {
|
||||||
dasm_put(Dst, 5327);
|
dasm_put(Dst, 5328);
|
||||||
} else if (op == BC_JFORI) {
|
} else if (op == BC_JFORI) {
|
||||||
dasm_put(Dst, 5329);
|
dasm_put(Dst, 5330);
|
||||||
} else if (op == BC_IFORL) {
|
} else if (op == BC_IFORL) {
|
||||||
dasm_put(Dst, 5332);
|
dasm_put(Dst, 5333);
|
||||||
}
|
}
|
||||||
if (vk) {
|
if (vk) {
|
||||||
dasm_put(Dst, 5334);
|
dasm_put(Dst, 5335);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5336);
|
dasm_put(Dst, 5337);
|
||||||
if (op == BC_JFORI || op == BC_JFORL) {
|
if (op == BC_JFORI || op == BC_JFORL) {
|
||||||
dasm_put(Dst, 5341, BC_JLOOP);
|
dasm_put(Dst, 5342, BC_JLOOP);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5344);
|
dasm_put(Dst, 5345);
|
||||||
if (!vk) {
|
if (!vk) {
|
||||||
dasm_put(Dst, 5351);
|
dasm_put(Dst, 5352);
|
||||||
} else {
|
} else {
|
||||||
dasm_put(Dst, 5353);
|
dasm_put(Dst, 5354);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5355);
|
dasm_put(Dst, 5356);
|
||||||
if (!vk) {
|
if (!vk) {
|
||||||
dasm_put(Dst, 5359, -LJ_TISNUM, -LJ_TISNUM);
|
dasm_put(Dst, 5360, -LJ_TISNUM, -LJ_TISNUM);
|
||||||
} else {
|
} else {
|
||||||
dasm_put(Dst, 5371);
|
dasm_put(Dst, 5372);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5380);
|
dasm_put(Dst, 5381);
|
||||||
if (op == BC_FORI) {
|
if (op == BC_FORI) {
|
||||||
dasm_put(Dst, 5384);
|
dasm_put(Dst, 5385);
|
||||||
} else if (op == BC_JFORI) {
|
} else if (op == BC_JFORI) {
|
||||||
dasm_put(Dst, 5386, BC_JLOOP);
|
dasm_put(Dst, 5387, BC_JLOOP);
|
||||||
} else if (op == BC_IFORL) {
|
} else if (op == BC_IFORL) {
|
||||||
dasm_put(Dst, 5391);
|
dasm_put(Dst, 5392);
|
||||||
} else {
|
} else {
|
||||||
dasm_put(Dst, 5393, BC_JLOOP);
|
dasm_put(Dst, 5394, BC_JLOOP);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5396);
|
dasm_put(Dst, 5397);
|
||||||
if (vk) {
|
if (vk) {
|
||||||
dasm_put(Dst, 5402);
|
dasm_put(Dst, 5403);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5407);
|
dasm_put(Dst, 5408);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_ITERL:
|
case BC_ITERL:
|
||||||
#if LJ_HASJIT
|
#if LJ_HASJIT
|
||||||
dasm_put(Dst, 5413, -GG_DISP2HOT);
|
dasm_put(Dst, 5414, -GG_DISP2HOT);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -7144,40 +7145,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case BC_IITERL:
|
case BC_IITERL:
|
||||||
dasm_put(Dst, 5423);
|
dasm_put(Dst, 5424);
|
||||||
if (op == BC_JITERL) {
|
if (op == BC_JITERL) {
|
||||||
dasm_put(Dst, 5425, -LJ_TNIL, BC_JLOOP);
|
dasm_put(Dst, 5426, -LJ_TNIL, BC_JLOOP);
|
||||||
} else {
|
} else {
|
||||||
dasm_put(Dst, 5431, -LJ_TNIL);
|
dasm_put(Dst, 5432, -LJ_TNIL);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5437);
|
dasm_put(Dst, 5438);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_LOOP:
|
case BC_LOOP:
|
||||||
#if LJ_HASJIT
|
#if LJ_HASJIT
|
||||||
dasm_put(Dst, 5444, -GG_DISP2HOT);
|
dasm_put(Dst, 5445, -GG_DISP2HOT);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_ILOOP:
|
case BC_ILOOP:
|
||||||
dasm_put(Dst, 5454);
|
dasm_put(Dst, 5455);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_JLOOP:
|
case BC_JLOOP:
|
||||||
#if LJ_HASJIT
|
#if LJ_HASJIT
|
||||||
dasm_put(Dst, 5461, DISPATCH_J(trace), DISPATCH_GL(vmstate), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L));
|
dasm_put(Dst, 5462, DISPATCH_J(trace), DISPATCH_GL(vmstate), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L));
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_JMP:
|
case BC_JMP:
|
||||||
dasm_put(Dst, 5475);
|
dasm_put(Dst, 5476);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* -- Function headers -------------------------------------------------- */
|
/* -- Function headers -------------------------------------------------- */
|
||||||
|
|
||||||
case BC_FUNCF:
|
case BC_FUNCF:
|
||||||
#if LJ_HASJIT
|
#if LJ_HASJIT
|
||||||
dasm_put(Dst, 5484, -GG_DISP2HOT);
|
dasm_put(Dst, 5485, -GG_DISP2HOT);
|
||||||
#endif
|
#endif
|
||||||
case BC_FUNCV: /* NYI: compiled vararg functions. */
|
case BC_FUNCV: /* NYI: compiled vararg functions. */
|
||||||
break;
|
break;
|
||||||
@ -7187,42 +7188,42 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case BC_IFUNCF:
|
case BC_IFUNCF:
|
||||||
dasm_put(Dst, 5494, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k));
|
dasm_put(Dst, 5495, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k));
|
||||||
if (op != BC_JFUNCF) {
|
if (op != BC_JFUNCF) {
|
||||||
dasm_put(Dst, 5504);
|
dasm_put(Dst, 5505);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5507, ~LJ_TNIL);
|
dasm_put(Dst, 5508, ~LJ_TNIL);
|
||||||
if (op == BC_JFUNCF) {
|
if (op == BC_JFUNCF) {
|
||||||
dasm_put(Dst, 5514, BC_JLOOP);
|
dasm_put(Dst, 5515, BC_JLOOP);
|
||||||
} else {
|
} else {
|
||||||
dasm_put(Dst, 5518);
|
dasm_put(Dst, 5519);
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5523);
|
dasm_put(Dst, 5524);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_JFUNCV:
|
case BC_JFUNCV:
|
||||||
#if !LJ_HASJIT
|
#if !LJ_HASJIT
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
dasm_put(Dst, 5529);
|
dasm_put(Dst, 5530);
|
||||||
break; /* NYI: compiled vararg functions. */
|
break; /* NYI: compiled vararg functions. */
|
||||||
|
|
||||||
case BC_IFUNCV:
|
case BC_IFUNCV:
|
||||||
dasm_put(Dst, 5531, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), ~LJ_TNIL);
|
dasm_put(Dst, 5532, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), ~LJ_TNIL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_FUNCC:
|
case BC_FUNCC:
|
||||||
case BC_FUNCCW:
|
case BC_FUNCCW:
|
||||||
if (op == BC_FUNCC) {
|
if (op == BC_FUNCC) {
|
||||||
dasm_put(Dst, 5572, Dt8(->f));
|
dasm_put(Dst, 5573, Dt8(->f));
|
||||||
} else {
|
} else {
|
||||||
dasm_put(Dst, 5575, DISPATCH_GL(wrapf));
|
dasm_put(Dst, 5576, DISPATCH_GL(wrapf));
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5578, Dt1(->maxstack), Dt1(->base), Dt1(->top));
|
dasm_put(Dst, 5579, Dt1(->maxstack), Dt1(->base), Dt1(->top));
|
||||||
if (op == BC_FUNCCW) {
|
if (op == BC_FUNCCW) {
|
||||||
dasm_put(Dst, 5588, Dt8(->f));
|
dasm_put(Dst, 5589, Dt8(->f));
|
||||||
}
|
}
|
||||||
dasm_put(Dst, 5591, LJ_VMST_C, DISPATCH_GL(vmstate), Dt1(->base), LJ_VMST_INTERP, Dt1(->top), DISPATCH_GL(vmstate));
|
dasm_put(Dst, 5592, LJ_VMST_C, DISPATCH_GL(vmstate), Dt1(->base), LJ_VMST_INTERP, Dt1(->top), DISPATCH_GL(vmstate));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -7242,7 +7243,7 @@ static int build_backend(BuildCtx *ctx)
|
|||||||
|
|
||||||
build_subroutines(ctx);
|
build_subroutines(ctx);
|
||||||
|
|
||||||
dasm_put(Dst, 5613);
|
dasm_put(Dst, 5614);
|
||||||
for (op = 0; op < BC__MAX; op++)
|
for (op = 0; op < BC__MAX; op++)
|
||||||
build_ins(ctx, (BCOp)op, op);
|
build_ins(ctx, (BCOp)op, op);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user