diff options
| author | Mike Pall <mike> | 2015-05-21 16:38:31 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2015-05-21 16:38:31 +0200 |
| commit | 60fb3fe2b2f91b9e6f053004fd1118891a3e885f (patch) | |
| tree | 4a56e2b39b2bd81a29609854695f539f3fa91cd7 /src | |
| parent | 4a146cac9a00f5a1a7877db847ff5ba03e7b7256 (diff) | |
| download | luajit-60fb3fe2b2f91b9e6f053004fd1118891a3e885f.tar.gz luajit-60fb3fe2b2f91b9e6f053004fd1118891a3e885f.tar.bz2 luajit-60fb3fe2b2f91b9e6f053004fd1118891a3e885f.zip | |
Fix table allocation bump optimization.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_jit.h | 1 | ||||
| -rw-r--r-- | src/lj_record.c | 4 |
2 files changed, 4 insertions, 1 deletions
diff --git a/src/lj_jit.h b/src/lj_jit.h index db3d89bb..69656568 100644 --- a/src/lj_jit.h +++ b/src/lj_jit.h | |||
| @@ -293,6 +293,7 @@ typedef struct ScEvEntry { | |||
| 293 | /* Reverse bytecode map (IRRef -> PC). Only for selected instructions. */ | 293 | /* Reverse bytecode map (IRRef -> PC). Only for selected instructions. */ |
| 294 | typedef struct RBCHashEntry { | 294 | typedef struct RBCHashEntry { |
| 295 | MRef pc; /* Bytecode PC. */ | 295 | MRef pc; /* Bytecode PC. */ |
| 296 | GCRef pt; /* Prototype. */ | ||
| 296 | IRRef ref; /* IR reference. */ | 297 | IRRef ref; /* IR reference. */ |
| 297 | } RBCHashEntry; | 298 | } RBCHashEntry; |
| 298 | 299 | ||
diff --git a/src/lj_record.c b/src/lj_record.c index 19eff723..dc1bf835 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
| @@ -1157,7 +1157,7 @@ static void rec_idx_bump(jit_State *J, RecordIndex *ix) | |||
| 1157 | J->retryrec = 1; /* Abort the trace at the end of recording. */ | 1157 | J->retryrec = 1; /* Abort the trace at the end of recording. */ |
| 1158 | } | 1158 | } |
| 1159 | } else if (ir->o == IR_TDUP) { | 1159 | } else if (ir->o == IR_TDUP) { |
| 1160 | GCtab *tpl = gco2tab(proto_kgc(J->pt, ~(ptrdiff_t)bc_d(*pc))); | 1160 | GCtab *tpl = gco2tab(proto_kgc(&gcref(rbc->pt)->pt, ~(ptrdiff_t)bc_d(*pc))); |
| 1161 | /* Grow template table, but preserve keys with nil values. */ | 1161 | /* Grow template table, but preserve keys with nil values. */ |
| 1162 | if (tb->asize > tpl->asize || (1u << nhbits)-1 > tpl->hmask) { | 1162 | if (tb->asize > tpl->asize || (1u << nhbits)-1 > tpl->hmask) { |
| 1163 | Node *node = noderef(tpl->node); | 1163 | Node *node = noderef(tpl->node); |
| @@ -1783,6 +1783,7 @@ static TRef rec_tnew(jit_State *J, uint32_t ah) | |||
| 1783 | tr = emitir(IRTG(IR_TNEW, IRT_TAB), asize, hbits); | 1783 | tr = emitir(IRTG(IR_TNEW, IRT_TAB), asize, hbits); |
| 1784 | J->rbchash[(tr & (RBCHASH_SLOTS-1))].ref = tref_ref(tr); | 1784 | J->rbchash[(tr & (RBCHASH_SLOTS-1))].ref = tref_ref(tr); |
| 1785 | setmref(J->rbchash[(tr & (RBCHASH_SLOTS-1))].pc, J->pc); | 1785 | setmref(J->rbchash[(tr & (RBCHASH_SLOTS-1))].pc, J->pc); |
| 1786 | setgcref(J->rbchash[(tr & (RBCHASH_SLOTS-1))].pt, obj2gco(J->pt)); | ||
| 1786 | return tr; | 1787 | return tr; |
| 1787 | } | 1788 | } |
| 1788 | 1789 | ||
| @@ -2211,6 +2212,7 @@ void lj_record_ins(jit_State *J) | |||
| 2211 | lj_ir_ktab(J, gco2tab(proto_kgc(J->pt, ~(ptrdiff_t)rc))), 0); | 2212 | lj_ir_ktab(J, gco2tab(proto_kgc(J->pt, ~(ptrdiff_t)rc))), 0); |
| 2212 | J->rbchash[(rc & (RBCHASH_SLOTS-1))].ref = tref_ref(rc); | 2213 | J->rbchash[(rc & (RBCHASH_SLOTS-1))].ref = tref_ref(rc); |
| 2213 | setmref(J->rbchash[(rc & (RBCHASH_SLOTS-1))].pc, pc); | 2214 | setmref(J->rbchash[(rc & (RBCHASH_SLOTS-1))].pc, pc); |
| 2215 | setgcref(J->rbchash[(rc & (RBCHASH_SLOTS-1))].pt, obj2gco(J->pt)); | ||
| 2214 | break; | 2216 | break; |
| 2215 | 2217 | ||
| 2216 | /* -- Calls and vararg handling ----------------------------------------- */ | 2218 | /* -- Calls and vararg handling ----------------------------------------- */ |
