aboutsummaryrefslogtreecommitdiff
path: root/src/lj_snap.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_snap.c10
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 }