diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_snap.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/lj_snap.c b/src/lj_snap.c index 40bfad92..97097a5b 100644 --- a/src/lj_snap.c +++ b/src/lj_snap.c | |||
@@ -463,7 +463,7 @@ static TRef snap_dedup(jit_State *J, SnapEntry *map, MSize nmax, IRRef ref) | |||
463 | MSize j; | 463 | MSize j; |
464 | for (j = 0; j < nmax; j++) | 464 | for (j = 0; j < nmax; j++) |
465 | if (snap_ref(map[j]) == ref) | 465 | if (snap_ref(map[j]) == ref) |
466 | return J->slot[snap_slot(map[j])] & ~(SNAP_CONT|SNAP_FRAME); | 466 | return J->slot[snap_slot(map[j])] & ~(SNAP_KEYINDEX|SNAP_CONT|SNAP_FRAME); |
467 | return 0; | 467 | return 0; |
468 | } | 468 | } |
469 | 469 | ||
@@ -538,10 +538,12 @@ void lj_snap_replay(jit_State *J, GCtrace *T) | |||
538 | uint32_t mode = IRSLOAD_INHERIT|IRSLOAD_PARENT; | 538 | uint32_t mode = IRSLOAD_INHERIT|IRSLOAD_PARENT; |
539 | if (LJ_SOFTFP32 && (sn & SNAP_SOFTFPNUM)) t = IRT_NUM; | 539 | if (LJ_SOFTFP32 && (sn & SNAP_SOFTFPNUM)) t = IRT_NUM; |
540 | if (ir->o == IR_SLOAD) mode |= (ir->op2 & IRSLOAD_READONLY); | 540 | if (ir->o == IR_SLOAD) mode |= (ir->op2 & IRSLOAD_READONLY); |
541 | if ((sn & SNAP_KEYINDEX)) mode |= IRSLOAD_KEYINDEX; | ||
541 | tr = emitir_raw(IRT(IR_SLOAD, t), s, mode); | 542 | tr = emitir_raw(IRT(IR_SLOAD, t), s, mode); |
542 | } | 543 | } |
543 | setslot: | 544 | setslot: |
544 | J->slot[s] = tr | (sn&(SNAP_CONT|SNAP_FRAME)); /* Same as TREF_* flags. */ | 545 | /* Same as TREF_* flags. */ |
546 | J->slot[s] = tr | (sn&(SNAP_KEYINDEX|SNAP_CONT|SNAP_FRAME)); | ||
545 | J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && (s != LJ_FR2)); | 547 | J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && (s != LJ_FR2)); |
546 | if ((sn & SNAP_FRAME)) | 548 | if ((sn & SNAP_FRAME)) |
547 | J->baseslot = s+1; | 549 | J->baseslot = s+1; |
@@ -961,6 +963,10 @@ const BCIns *lj_snap_restore(jit_State *J, void *exptr) | |||
961 | setframe_ftsz(o, snap_slot(sn) != 0 ? (int32_t)*flinks-- : ftsz0); | 963 | setframe_ftsz(o, snap_slot(sn) != 0 ? (int32_t)*flinks-- : ftsz0); |
962 | L->base = o+1; | 964 | L->base = o+1; |
963 | #endif | 965 | #endif |
966 | } else if ((sn & SNAP_KEYINDEX)) { | ||
967 | /* A IRT_INT key index slot is restored as a number. Undo this. */ | ||
968 | o->u32.lo = (uint32_t)(LJ_DUALNUM ? intV(o) : lj_num2int(numV(o))); | ||
969 | o->u32.hi = LJ_KEYINDEX; | ||
964 | } | 970 | } |
965 | } | 971 | } |
966 | } | 972 | } |