diff options
-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, |