diff options
| author | Mike Pall <mike> | 2015-08-20 01:11:59 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2015-08-20 01:11:59 +0200 |
| commit | ca7888944e3a4244d00e8e402a05654f65a286f4 (patch) | |
| tree | edec3a354d61c272897754ab67e3df4e181e604a | |
| parent | b86fc2b36a394c7d093b9ca053a50ad060388b44 (diff) | |
| parent | 8715ae65c1f70f2402b89a004b88ab04ca103625 (diff) | |
| download | luajit-ca7888944e3a4244d00e8e402a05654f65a286f4.tar.gz luajit-ca7888944e3a4244d00e8e402a05654f65a286f4.tar.bz2 luajit-ca7888944e3a4244d00e8e402a05654f65a286f4.zip | |
Merge branch 'master' into v2.1
| -rw-r--r-- | src/lj_trace.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c index 79c50b0a..42f4321d 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c | |||
| @@ -117,15 +117,22 @@ static void perftools_addtrace(GCtrace *T) | |||
| 117 | } | 117 | } |
| 118 | #endif | 118 | #endif |
| 119 | 119 | ||
| 120 | /* Save current trace by copying and compacting it. */ | 120 | /* Allocate space for copy of trace. */ |
| 121 | static void trace_save(jit_State *J) | 121 | static GCtrace *trace_save_alloc(jit_State *J) |
| 122 | { | 122 | { |
| 123 | size_t sztr = ((sizeof(GCtrace)+7)&~7); | 123 | size_t sztr = ((sizeof(GCtrace)+7)&~7); |
| 124 | size_t szins = (J->cur.nins-J->cur.nk)*sizeof(IRIns); | 124 | size_t szins = (J->cur.nins-J->cur.nk)*sizeof(IRIns); |
| 125 | size_t sz = sztr + szins + | 125 | size_t sz = sztr + szins + |
| 126 | J->cur.nsnap*sizeof(SnapShot) + | 126 | J->cur.nsnap*sizeof(SnapShot) + |
| 127 | J->cur.nsnapmap*sizeof(SnapEntry); | 127 | J->cur.nsnapmap*sizeof(SnapEntry); |
| 128 | GCtrace *T = lj_mem_newt(J->L, (MSize)sz, GCtrace); | 128 | return lj_mem_newt(J->L, (MSize)sz, GCtrace); |
| 129 | } | ||
| 130 | |||
| 131 | /* Save current trace by copying and compacting it. */ | ||
| 132 | static void trace_save(jit_State *J, GCtrace *T) | ||
| 133 | { | ||
| 134 | size_t sztr = ((sizeof(GCtrace)+7)&~7); | ||
| 135 | size_t szins = (J->cur.nins-J->cur.nk)*sizeof(IRIns); | ||
| 129 | char *p = (char *)T + sztr; | 136 | char *p = (char *)T + sztr; |
| 130 | memcpy(T, &J->cur, sizeof(GCtrace)); | 137 | memcpy(T, &J->cur, sizeof(GCtrace)); |
| 131 | setgcrefr(T->nextgc, J2G(J)->gc.root); | 138 | setgcrefr(T->nextgc, J2G(J)->gc.root); |
| @@ -418,6 +425,7 @@ static void trace_stop(jit_State *J) | |||
| 418 | BCOp op = bc_op(J->cur.startins); | 425 | BCOp op = bc_op(J->cur.startins); |
| 419 | GCproto *pt = &gcref(J->cur.startpt)->pt; | 426 | GCproto *pt = &gcref(J->cur.startpt)->pt; |
| 420 | TraceNo traceno = J->cur.traceno; | 427 | TraceNo traceno = J->cur.traceno; |
| 428 | GCtrace *T = trace_save_alloc(J); /* Do this first. May throw OOM. */ | ||
| 421 | lua_State *L; | 429 | lua_State *L; |
| 422 | 430 | ||
| 423 | switch (op) { | 431 | switch (op) { |
| @@ -468,7 +476,7 @@ static void trace_stop(jit_State *J) | |||
| 468 | /* Commit new mcode only after all patching is done. */ | 476 | /* Commit new mcode only after all patching is done. */ |
| 469 | lj_mcode_commit(J, J->cur.mcode); | 477 | lj_mcode_commit(J, J->cur.mcode); |
| 470 | J->postproc = LJ_POST_NONE; | 478 | J->postproc = LJ_POST_NONE; |
| 471 | trace_save(J); | 479 | trace_save(J, T); |
| 472 | 480 | ||
| 473 | L = J->L; | 481 | L = J->L; |
| 474 | lj_vmevent_send(L, TRACE, | 482 | lj_vmevent_send(L, TRACE, |
