aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2015-08-20 01:11:59 +0200
committerMike Pall <mike>2015-08-20 01:11:59 +0200
commitca7888944e3a4244d00e8e402a05654f65a286f4 (patch)
treeedec3a354d61c272897754ab67e3df4e181e604a /src
parentb86fc2b36a394c7d093b9ca053a50ad060388b44 (diff)
parent8715ae65c1f70f2402b89a004b88ab04ca103625 (diff)
downloadluajit-ca7888944e3a4244d00e8e402a05654f65a286f4.tar.gz
luajit-ca7888944e3a4244d00e8e402a05654f65a286f4.tar.bz2
luajit-ca7888944e3a4244d00e8e402a05654f65a286f4.zip
Merge branch 'master' into v2.1
Diffstat (limited to 'src')
-rw-r--r--src/lj_trace.c16
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. */
121static void trace_save(jit_State *J) 121static 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. */
132static 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,