aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_trace.c15
1 files changed, 4 insertions, 11 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c
index ab4a9469..c7ac0bfa 100644
--- a/src/lj_trace.c
+++ b/src/lj_trace.c
@@ -205,14 +205,6 @@ static void trace_unpatch(jit_State *J, GCtrace *T)
205 lua_assert(op == BC_ITERL || op == BC_LOOP || bc_isret(op)); 205 lua_assert(op == BC_ITERL || op == BC_LOOP || bc_isret(op));
206 *pc = T->startins; 206 *pc = T->startins;
207 break; 207 break;
208 case BC_JMP:
209 lua_assert(op == BC_ITERL);
210 pc += bc_j(*pc)+2;
211 if (bc_op(*pc) == BC_JITERL) {
212 lua_assert(traceref(J, bc_d(*pc)) == T);
213 *pc = T->startins;
214 }
215 break;
216 case BC_JFUNCF: 208 case BC_JFUNCF:
217 lua_assert(op == BC_FUNCF); 209 lua_assert(op == BC_FUNCF);
218 *pc = T->startins; 210 *pc = T->startins;
@@ -227,18 +219,19 @@ static void trace_flushroot(jit_State *J, GCtrace *T)
227{ 219{
228 GCproto *pt = &gcref(T->startpt)->pt; 220 GCproto *pt = &gcref(T->startpt)->pt;
229 lua_assert(T->root == 0 && pt != NULL); 221 lua_assert(T->root == 0 && pt != NULL);
230 /* First unpatch any modified bytecode. */
231 trace_unpatch(J, T);
232 /* Unlink root trace from chain anchored in prototype. */ 222 /* Unlink root trace from chain anchored in prototype. */
233 if (pt->trace == T->traceno) { /* Trace is first in chain. Easy. */ 223 if (pt->trace == T->traceno) { /* Trace is first in chain. Easy. */
234 pt->trace = T->nextroot; 224 pt->trace = T->nextroot;
225unpatch:
226 /* Unpatch modified bytecode only if the trace has not been flushed. */
227 trace_unpatch(J, T);
235 } else if (pt->trace) { /* Otherwise search in chain of root traces. */ 228 } else if (pt->trace) { /* Otherwise search in chain of root traces. */
236 GCtrace *T2 = traceref(J, pt->trace); 229 GCtrace *T2 = traceref(J, pt->trace);
237 if (T2) { 230 if (T2) {
238 for (; T2->nextroot; T2 = traceref(J, T2->nextroot)) 231 for (; T2->nextroot; T2 = traceref(J, T2->nextroot))
239 if (T2->nextroot == T->traceno) { 232 if (T2->nextroot == T->traceno) {
240 T2->nextroot = T->nextroot; /* Unlink from chain. */ 233 T2->nextroot = T->nextroot; /* Unlink from chain. */
241 break; 234 goto unpatch;
242 } 235 }
243 } 236 }
244 } 237 }