// Indicates whether we need to force the use of interpreter when returning from the // interpreter into the runtime. This allows to deoptimize the stack and continue // execution with interpreter for debugging. staticbool IsForcedInterpreterNeededForUpcall(Thread* thread, ArtMethod* m)
REQUIRES_SHARED(Locks::mutator_lock_) { if (LIKELY(!thread->HasDebuggerShadowFrames())) { returnfalse;
} // If we have debugger stack frames we always need to go back to interpreter unless we are // native or a proxy. return m != nullptr && !m->IsProxyMethod() && !m->IsNative();
}
// Indicates whether we need to force the use of interpreter when handling an // exception. This allows to deoptimize the stack and continue execution with // the interpreter. // Note: the interpreter will start by handling the exception when executing // the deoptimized frames. staticbool IsForcedInterpreterNeededForException(Thread* thread)
REQUIRES_SHARED(Locks::mutator_lock_) { // A quick check to avoid walking the stack. If there are no shadow frames or no method // that needs to be deoptimized we can safely continue with optimized code. if (LIKELY(!thread->HasDebuggerShadowFrames() &&
Runtime::Current()->GetInstrumentation()->IsDeoptimizedMethodsEmpty())) { returnfalse;
} return IsForcedInterpreterNeededForExceptionImpl(thread);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.