Index: src/builtins/arm/builtins-arm.cc |
diff --git a/src/builtins/arm/builtins-arm.cc b/src/builtins/arm/builtins-arm.cc |
index 286df2eea793f370a964cde4388c808fad7e9a36..b85468993a0a86216496542fcb6c39aeb762bea3 100644 |
--- a/src/builtins/arm/builtins-arm.cc |
+++ b/src/builtins/arm/builtins-arm.cc |
@@ -1051,16 +1051,14 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
// Get the bytecode array from the function object (or from the DebugInfo if |
// it is present) and load it into kInterpreterBytecodeArrayRegister. |
+ Label maybe_load_debug_bytecode_array, bytecode_array_loaded; |
__ ldr(r0, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); |
- Register debug_info = kInterpreterBytecodeArrayRegister; |
- DCHECK(!debug_info.is(r0)); |
- __ ldr(debug_info, FieldMemOperand(r0, SharedFunctionInfo::kDebugInfoOffset)); |
- __ SmiTst(debug_info); |
- // Load original bytecode array or the debug copy. |
__ ldr(kInterpreterBytecodeArrayRegister, |
- FieldMemOperand(r0, SharedFunctionInfo::kFunctionDataOffset), eq); |
- __ ldr(kInterpreterBytecodeArrayRegister, |
- FieldMemOperand(debug_info, DebugInfo::kDebugBytecodeArrayIndex), ne); |
+ FieldMemOperand(r0, SharedFunctionInfo::kFunctionDataOffset)); |
+ __ ldr(r2, FieldMemOperand(r0, SharedFunctionInfo::kDebugInfoOffset)); |
+ __ SmiTst(r2); |
+ __ b(ne, &maybe_load_debug_bytecode_array); |
+ __ bind(&bytecode_array_loaded); |
// Check whether we should continue to use the interpreter. |
// TODO(rmcilroy) Remove self healing once liveedit only has to deal with |
@@ -1150,6 +1148,17 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
LeaveInterpreterFrame(masm, r2); |
__ Jump(lr); |
+ // Load debug copy of the bytecode array if it exists. |
+ // kInterpreterBytecodeArrayRegister is already loaded with |
+ // SharedFunctionInfo::kFunctionDataOffset. |
+ __ bind(&maybe_load_debug_bytecode_array); |
+ __ ldr(r9, FieldMemOperand(r2, DebugInfo::kFlagsOffset)); |
+ __ SmiUntag(r9); |
+ __ tst(r9, Operand(DebugInfo::kHasBreakInfo)); |
+ __ ldr(kInterpreterBytecodeArrayRegister, |
+ FieldMemOperand(r2, DebugInfo::kDebugBytecodeArrayOffset), ne); |
+ __ b(&bytecode_array_loaded); |
+ |
// If the shared code is no longer this entry trampoline, then the underlying |
// function has been switched to a different kind of code and we heal the |
// closure by switching the code entry field over to the new code as well. |