** check whether, in an assignment to a local variable, the local variable ** is needed in a previous assignment (to a table). If so, save original ** local value in a safe place and use this safe copy in the previous ** assignment. */
| 8482 | ** assignment. |
| 8483 | */ |
| 8484 | static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { |
| 8485 | FuncState *fs = ls->fs; |
| 8486 | int extra = fs->freereg; /* eventual position to save local variable */ |
| 8487 | int conflict = 0; |
| 8488 | for (; lh; lh = lh->prev) { |
| 8489 | if (lh->v.k == VINDEXED) { |
| 8490 | if (lh->v.u.s.info == v->u.s.info) { /* conflict? */ |
| 8491 | conflict = 1; |
| 8492 | lh->v.u.s.info = extra; /* previous assignment will use safe copy */ |
| 8493 | } |
| 8494 | if (lh->v.u.s.aux == v->u.s.info) { /* conflict? */ |
| 8495 | conflict = 1; |
| 8496 | lh->v.u.s.aux = extra; /* previous assignment will use safe copy */ |
| 8497 | } |
| 8498 | } |
| 8499 | } |
| 8500 | if (conflict) { |
| 8501 | luaK_codeABC(fs, OP_MOVE, fs->freereg, v->u.s.info, 0); /* make copy */ |
| 8502 | luaK_reserveregs(fs, 1); |
| 8503 | } |
| 8504 | } |
| 8505 | |
| 8506 | |
| 8507 | static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { |
no test coverage detected