/* Take a snapshot of the current stack. */ static void snapshot_stack(jit_State *J, SnapShot *snap, MSize nsnapmap) { BCReg nslots = J->baseslot + J->maxslot; MSize nsm, nframelinks; IRRef2 *p; /* Conservative estimate. Continuation frames need 2 slots. */ nsm = nsnapmap + nslots + (uint32_t)J->framedepth*2+1; if (LJ_UNLIKELY(nsm > J->sizesnapmap)) { /* Need to grow snapshot map? */ if (nsm < 2*J->sizesnapmap) nsm = 2*J->sizesnapmap; else if (nsm < 64) nsm = 64; J->snapmapbuf = (IRRef2 *)lj_mem_realloc(J->L, J->snapmapbuf, J->sizesnapmap*sizeof(IRRef2), nsm*sizeof(IRRef2)); J->cur.snapmap = J->snapmapbuf; J->sizesnapmap = nsm; } p = &J->cur.snapmap[nsnapmap]; snapshot_slots(J, p, nslots); nframelinks = snapshot_framelinks(J, p + nslots); J->cur.nsnapmap = (uint16_t)(nsnapmap + nslots + nframelinks); snap->mapofs = (uint16_t)nsnapmap; snap->ref = (IRRef1)J->cur.nins; snap->nslots = (uint8_t)nslots; snap->nframelinks = (uint8_t)nframelinks; snap->count = 0; }
/* Grow snapshot map buffer. */ void lj_snap_grow_map_(jit_State *J, MSize need) { if (need < 2*J->sizesnapmap) need = 2*J->sizesnapmap; else if (need < 64) need = 64; J->snapmapbuf = (SnapEntry *)lj_mem_realloc(J->L, J->snapmapbuf, J->sizesnapmap*sizeof(SnapEntry), need*sizeof(SnapEntry)); J->cur.snapmap = J->snapmapbuf; J->sizesnapmap = need; }
static void buf_grow(SBuf *sb, MSize sz) { MSize osz = sbufsz(sb), len = sbuflen(sb), nsz = osz; char *b; if (nsz < LJ_MIN_SBUF) nsz = LJ_MIN_SBUF; while (nsz < sz) nsz += nsz; b = (char *)lj_mem_realloc(sbufL(sb), sbufB(sb), osz, nsz); setmref(sb->b, b); setmref(sb->p, b + len); setmref(sb->e, b + nsz); }