| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/arguments.h" | 8 #include "src/arguments.h" |
| 9 #include "src/debug.h" | 9 #include "src/debug.h" |
| 10 #include "src/deoptimizer.h" | 10 #include "src/deoptimizer.h" |
| (...skipping 1146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1157 | 1157 |
| 1158 // Currently it takes too much time to find nested scopes due to script | 1158 // Currently it takes too much time to find nested scopes due to script |
| 1159 // parsing. Sometimes we want to run the ScopeIterator as fast as possible | 1159 // parsing. Sometimes we want to run the ScopeIterator as fast as possible |
| 1160 // (for example, while collecting async call stacks on every | 1160 // (for example, while collecting async call stacks on every |
| 1161 // addEventListener call), even if we drop some nested scopes. | 1161 // addEventListener call), even if we drop some nested scopes. |
| 1162 // Later we may optimize getting the nested scopes (cache the result?) | 1162 // Later we may optimize getting the nested scopes (cache the result?) |
| 1163 // and include nested scopes into the "fast" iteration case as well. | 1163 // and include nested scopes into the "fast" iteration case as well. |
| 1164 if (!ignore_nested_scopes) { | 1164 if (!ignore_nested_scopes) { |
| 1165 Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared_info); | 1165 Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared_info); |
| 1166 | 1166 |
| 1167 // PC points to the instruction after the current one, possibly a break |
| 1168 // location as well. So the "- 1" to exclude it from the search. |
| 1169 Address call_pc = frame->pc() - 1; |
| 1170 |
| 1167 // Find the break point where execution has stopped. | 1171 // Find the break point where execution has stopped. |
| 1168 BreakLocationIterator break_location_iterator(debug_info, | 1172 BreakLocation location = |
| 1169 ALL_BREAK_LOCATIONS); | 1173 BreakLocation::FromAddress(debug_info, ALL_BREAK_LOCATIONS, call_pc); |
| 1170 // pc points to the instruction after the current one, possibly a break | |
| 1171 // location as well. So the "- 1" to exclude it from the search. | |
| 1172 break_location_iterator.FindBreakLocationFromAddress(frame->pc() - 1); | |
| 1173 | 1174 |
| 1174 // Within the return sequence at the moment it is not possible to | 1175 // Within the return sequence at the moment it is not possible to |
| 1175 // get a source position which is consistent with the current scope chain. | 1176 // get a source position which is consistent with the current scope chain. |
| 1176 // Thus all nested with, catch and block contexts are skipped and we only | 1177 // Thus all nested with, catch and block contexts are skipped and we only |
| 1177 // provide the function scope. | 1178 // provide the function scope. |
| 1178 ignore_nested_scopes = break_location_iterator.IsExit(); | 1179 ignore_nested_scopes = location.IsExit(); |
| 1179 } | 1180 } |
| 1180 | 1181 |
| 1181 if (ignore_nested_scopes) { | 1182 if (ignore_nested_scopes) { |
| 1182 if (scope_info->HasContext()) { | 1183 if (scope_info->HasContext()) { |
| 1183 context_ = Handle<Context>(context_->declaration_context(), isolate_); | 1184 context_ = Handle<Context>(context_->declaration_context(), isolate_); |
| 1184 } else { | 1185 } else { |
| 1185 while (context_->closure() == *function_) { | 1186 while (context_->closure() == *function_) { |
| 1186 context_ = Handle<Context>(context_->previous(), isolate_); | 1187 context_ = Handle<Context>(context_->previous(), isolate_); |
| 1187 } | 1188 } |
| 1188 } | 1189 } |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1552 | 1553 |
| 1553 Handle<JSFunction> fun = Handle<JSFunction>(frame->function()); | 1554 Handle<JSFunction> fun = Handle<JSFunction>(frame->function()); |
| 1554 Handle<SharedFunctionInfo> shared = Handle<SharedFunctionInfo>(fun->shared()); | 1555 Handle<SharedFunctionInfo> shared = Handle<SharedFunctionInfo>(fun->shared()); |
| 1555 | 1556 |
| 1556 if (!isolate->debug()->EnsureDebugInfo(shared, fun)) { | 1557 if (!isolate->debug()->EnsureDebugInfo(shared, fun)) { |
| 1557 return isolate->heap()->undefined_value(); | 1558 return isolate->heap()->undefined_value(); |
| 1558 } | 1559 } |
| 1559 | 1560 |
| 1560 Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared); | 1561 Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared); |
| 1561 | 1562 |
| 1562 int len = 0; | 1563 // Find range of break points starting from the break point where execution |
| 1563 Handle<JSArray> array(isolate->factory()->NewJSArray(10)); | 1564 // has stopped. |
| 1564 // Find the break point where execution has stopped. | 1565 Address call_pc = frame->pc() - 1; |
| 1565 BreakLocationIterator break_location_iterator(debug_info, | 1566 List<BreakLocation> locations; |
| 1566 ALL_BREAK_LOCATIONS); | 1567 BreakLocation::FromAddressSameStatement(debug_info, ALL_BREAK_LOCATIONS, |
| 1568 call_pc, &locations); |
| 1567 | 1569 |
| 1568 break_location_iterator.FindBreakLocationFromAddress(frame->pc() - 1); | 1570 Handle<JSArray> array = isolate->factory()->NewJSArray(locations.length()); |
| 1569 int current_statement_pos = break_location_iterator.statement_position(); | |
| 1570 | 1571 |
| 1571 while (!break_location_iterator.Done()) { | 1572 int index = 0; |
| 1573 for (BreakLocation location : locations) { |
| 1572 bool accept; | 1574 bool accept; |
| 1573 if (break_location_iterator.pc() > frame->pc()) { | 1575 if (location.pc() > frame->pc()) { |
| 1574 accept = true; | 1576 accept = true; |
| 1575 } else { | 1577 } else { |
| 1576 StackFrame::Id break_frame_id = isolate->debug()->break_frame_id(); | 1578 StackFrame::Id break_frame_id = isolate->debug()->break_frame_id(); |
| 1577 // The break point is near our pc. Could be a step-in possibility, | 1579 // The break point is near our pc. Could be a step-in possibility, |
| 1578 // that is currently taken by active debugger call. | 1580 // that is currently taken by active debugger call. |
| 1579 if (break_frame_id == StackFrame::NO_ID) { | 1581 if (break_frame_id == StackFrame::NO_ID) { |
| 1580 // We are not stepping. | 1582 // We are not stepping. |
| 1581 accept = false; | 1583 accept = false; |
| 1582 } else { | 1584 } else { |
| 1583 JavaScriptFrameIterator additional_frame_it(isolate, break_frame_id); | 1585 JavaScriptFrameIterator additional_frame_it(isolate, break_frame_id); |
| 1584 // If our frame is a top frame and we are stepping, we can do step-in | 1586 // If our frame is a top frame and we are stepping, we can do step-in |
| 1585 // at this place. | 1587 // at this place. |
| 1586 accept = additional_frame_it.frame()->id() == id; | 1588 accept = additional_frame_it.frame()->id() == id; |
| 1587 } | 1589 } |
| 1588 } | 1590 } |
| 1589 if (accept) { | 1591 if (accept) { |
| 1590 if (break_location_iterator.IsStepInLocation(isolate)) { | 1592 if (location.IsStepInLocation()) { |
| 1591 Smi* position_value = Smi::FromInt(break_location_iterator.position()); | 1593 Smi* position_value = Smi::FromInt(location.position()); |
| 1592 RETURN_FAILURE_ON_EXCEPTION( | 1594 RETURN_FAILURE_ON_EXCEPTION( |
| 1593 isolate, JSObject::SetElement( | 1595 isolate, JSObject::SetElement( |
| 1594 array, len, Handle<Object>(position_value, isolate), | 1596 array, index, Handle<Object>(position_value, isolate), |
| 1595 NONE, SLOPPY)); | 1597 NONE, SLOPPY)); |
| 1596 len++; | 1598 index++; |
| 1597 } | 1599 } |
| 1598 } | 1600 } |
| 1599 // Advance iterator. | |
| 1600 break_location_iterator.Next(); | |
| 1601 if (current_statement_pos != break_location_iterator.statement_position()) { | |
| 1602 break; | |
| 1603 } | |
| 1604 } | 1601 } |
| 1605 return *array; | 1602 return *array; |
| 1606 } | 1603 } |
| 1607 | 1604 |
| 1608 | 1605 |
| 1609 static const int kScopeDetailsTypeIndex = 0; | 1606 static const int kScopeDetailsTypeIndex = 0; |
| 1610 static const int kScopeDetailsObjectIndex = 1; | 1607 static const int kScopeDetailsObjectIndex = 1; |
| 1611 static const int kScopeDetailsSize = 2; | 1608 static const int kScopeDetailsSize = 2; |
| 1612 | 1609 |
| 1613 | 1610 |
| (...skipping 1197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2811 return Smi::FromInt(isolate->debug()->is_active()); | 2808 return Smi::FromInt(isolate->debug()->is_active()); |
| 2812 } | 2809 } |
| 2813 | 2810 |
| 2814 | 2811 |
| 2815 RUNTIME_FUNCTION(RuntimeReference_DebugBreakInOptimizedCode) { | 2812 RUNTIME_FUNCTION(RuntimeReference_DebugBreakInOptimizedCode) { |
| 2816 UNIMPLEMENTED(); | 2813 UNIMPLEMENTED(); |
| 2817 return NULL; | 2814 return NULL; |
| 2818 } | 2815 } |
| 2819 } | 2816 } |
| 2820 } // namespace v8::internal | 2817 } // namespace v8::internal |
| OLD | NEW |