Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Side by Side Diff: src/runtime/runtime-debug.cc

Issue 1233073005: Debugger: prepare code for debugging on a per-function basis. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: addressed comments. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects-inl.h ('k') | src/x64/assembler-x64-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/compiler.h" 9 #include "src/compiler.h"
10 #include "src/debug.h" 10 #include "src/debug.h"
(...skipping 1378 matching lines...) Expand 10 before | Expand all | Expand 10 after
1389 return; 1389 return;
1390 } 1390 }
1391 1391
1392 // Currently it takes too much time to find nested scopes due to script 1392 // Currently it takes too much time to find nested scopes due to script
1393 // parsing. Sometimes we want to run the ScopeIterator as fast as possible 1393 // parsing. Sometimes we want to run the ScopeIterator as fast as possible
1394 // (for example, while collecting async call stacks on every 1394 // (for example, while collecting async call stacks on every
1395 // addEventListener call), even if we drop some nested scopes. 1395 // addEventListener call), even if we drop some nested scopes.
1396 // Later we may optimize getting the nested scopes (cache the result?) 1396 // Later we may optimize getting the nested scopes (cache the result?)
1397 // and include nested scopes into the "fast" iteration case as well. 1397 // and include nested scopes into the "fast" iteration case as well.
1398 1398
1399 if (!ignore_nested_scopes && !shared_info->debug_info()->IsUndefined()) { 1399 if (!ignore_nested_scopes && shared_info->HasDebugInfo()) {
1400 // The source position at return is always the end of the function, 1400 // The source position at return is always the end of the function,
1401 // which is not consistent with the current scope chain. Therefore all 1401 // which is not consistent with the current scope chain. Therefore all
1402 // nested with, catch and block contexts are skipped, and we can only 1402 // nested with, catch and block contexts are skipped, and we can only
1403 // inspect the function scope. 1403 // inspect the function scope.
1404 // This can only happen if we set a break point inside right before the 1404 // This can only happen if we set a break point inside right before the
1405 // return, which requires a debug info to be available. 1405 // return, which requires a debug info to be available.
1406 Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared_info); 1406 Handle<DebugInfo> debug_info(shared_info->GetDebugInfo());
1407 1407
1408 // PC points to the instruction after the current one, possibly a break 1408 // PC points to the instruction after the current one, possibly a break
1409 // location as well. So the "- 1" to exclude it from the search. 1409 // location as well. So the "- 1" to exclude it from the search.
1410 Address call_pc = frame()->pc() - 1; 1410 Address call_pc = frame()->pc() - 1;
1411 1411
1412 // Find the break point where execution has stopped. 1412 // Find the break point where execution has stopped.
1413 BreakLocation location = 1413 BreakLocation location =
1414 BreakLocation::FromAddress(debug_info, ALL_BREAK_LOCATIONS, call_pc); 1414 BreakLocation::FromAddress(debug_info, ALL_BREAK_LOCATIONS, call_pc);
1415 1415
1416 ignore_nested_scopes = location.IsReturn(); 1416 ignore_nested_scopes = location.IsReturn();
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
1811 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 1811 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
1812 RUNTIME_ASSERT(isolate->debug()->CheckExecutionState(break_id)); 1812 RUNTIME_ASSERT(isolate->debug()->CheckExecutionState(break_id));
1813 1813
1814 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); 1814 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
1815 1815
1816 // Get the frame where the debugging is performed. 1816 // Get the frame where the debugging is performed.
1817 StackFrame::Id id = UnwrapFrameId(wrapped_id); 1817 StackFrame::Id id = UnwrapFrameId(wrapped_id);
1818 JavaScriptFrameIterator frame_it(isolate, id); 1818 JavaScriptFrameIterator frame_it(isolate, id);
1819 RUNTIME_ASSERT(!frame_it.done()); 1819 RUNTIME_ASSERT(!frame_it.done());
1820 1820
1821 List<FrameSummary> frames(FLAG_max_inlining_levels + 1); 1821 List<int> positions;
1822 frame_it.frame()->Summarize(&frames); 1822 isolate->debug()->GetStepinPositions(frame_it.frame(), id, &positions);
1823 FrameSummary summary = frames.first(); 1823 Factory* factory = isolate->factory();
1824 1824 Handle<FixedArray> array = factory->NewFixedArray(positions.length());
1825 Handle<JSFunction> fun = Handle<JSFunction>(summary.function()); 1825 for (int i = 0; i < positions.length(); ++i) {
1826 Handle<SharedFunctionInfo> shared = Handle<SharedFunctionInfo>(fun->shared()); 1826 array->set(i, Smi::FromInt(positions[i]));
1827
1828 if (!isolate->debug()->EnsureDebugInfo(shared, fun)) {
1829 return isolate->heap()->undefined_value();
1830 } 1827 }
1831 1828 return *factory->NewJSArrayWithElements(array, FAST_SMI_ELEMENTS);
1832 Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared);
1833
1834 // Find range of break points starting from the break point where execution
1835 // has stopped.
1836 Address call_pc = summary.pc() - 1;
1837 List<BreakLocation> locations;
1838 BreakLocation::FromAddressSameStatement(debug_info, ALL_BREAK_LOCATIONS,
1839 call_pc, &locations);
1840
1841 Handle<JSArray> array = isolate->factory()->NewJSArray(locations.length());
1842
1843 int index = 0;
1844 for (BreakLocation location : locations) {
1845 bool accept;
1846 if (location.pc() > summary.pc()) {
1847 accept = true;
1848 } else {
1849 StackFrame::Id break_frame_id = isolate->debug()->break_frame_id();
1850 // The break point is near our pc. Could be a step-in possibility,
1851 // that is currently taken by active debugger call.
1852 if (break_frame_id == StackFrame::NO_ID) {
1853 // We are not stepping.
1854 accept = false;
1855 } else {
1856 JavaScriptFrameIterator additional_frame_it(isolate, break_frame_id);
1857 // If our frame is a top frame and we are stepping, we can do step-in
1858 // at this place.
1859 accept = additional_frame_it.frame()->id() == id;
1860 }
1861 }
1862 if (accept) {
1863 if (location.IsStepInLocation()) {
1864 Smi* position_value = Smi::FromInt(location.position());
1865 RETURN_FAILURE_ON_EXCEPTION(
1866 isolate,
1867 Object::SetElement(isolate, array, index,
1868 handle(position_value, isolate), SLOPPY));
1869 index++;
1870 }
1871 }
1872 }
1873 return *array;
1874 } 1829 }
1875 1830
1876 1831
1877 static const int kScopeDetailsTypeIndex = 0; 1832 static const int kScopeDetailsTypeIndex = 0;
1878 static const int kScopeDetailsObjectIndex = 1; 1833 static const int kScopeDetailsObjectIndex = 1;
1879 static const int kScopeDetailsSize = 2; 1834 static const int kScopeDetailsSize = 2;
1880 1835
1881 1836
1882 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeScopeDetails( 1837 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeScopeDetails(
1883 Isolate* isolate, ScopeIterator* it) { 1838 Isolate* isolate, ScopeIterator* it) {
(...skipping 1341 matching lines...) Expand 10 before | Expand all | Expand 10 after
3225 return *isolate->factory()->undefined_value(); 3180 return *isolate->factory()->undefined_value();
3226 } 3181 }
3227 3182
3228 3183
3229 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { 3184 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) {
3230 UNIMPLEMENTED(); 3185 UNIMPLEMENTED();
3231 return NULL; 3186 return NULL;
3232 } 3187 }
3233 } // namespace internal 3188 } // namespace internal
3234 } // namespace v8 3189 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects-inl.h ('k') | src/x64/assembler-x64-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698