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

Side by Side Diff: src/runtime.cc

Issue 203463011: Add option to run ScopeIterator faster giving up nested scope chain. (Closed) Base URL: git://github.com/v8/v8.git@master
Patch Set: debug test was failing Created 6 years, 9 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/runtime.h ('k') | test/mjsunit/debug-scopes.js » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 11797 matching lines...) Expand 10 before | Expand all | Expand 10 after
11808 ScopeTypeLocal, 11808 ScopeTypeLocal,
11809 ScopeTypeWith, 11809 ScopeTypeWith,
11810 ScopeTypeClosure, 11810 ScopeTypeClosure,
11811 ScopeTypeCatch, 11811 ScopeTypeCatch,
11812 ScopeTypeBlock, 11812 ScopeTypeBlock,
11813 ScopeTypeModule 11813 ScopeTypeModule
11814 }; 11814 };
11815 11815
11816 ScopeIterator(Isolate* isolate, 11816 ScopeIterator(Isolate* isolate,
11817 JavaScriptFrame* frame, 11817 JavaScriptFrame* frame,
11818 int inlined_jsframe_index) 11818 int inlined_jsframe_index,
11819 bool ignore_nested_scopes = false)
11819 : isolate_(isolate), 11820 : isolate_(isolate),
11820 frame_(frame), 11821 frame_(frame),
11821 inlined_jsframe_index_(inlined_jsframe_index), 11822 inlined_jsframe_index_(inlined_jsframe_index),
11822 function_(frame->function()), 11823 function_(frame->function()),
11823 context_(Context::cast(frame->context())), 11824 context_(Context::cast(frame->context())),
11824 nested_scope_chain_(4), 11825 nested_scope_chain_(4),
11825 failed_(false) { 11826 failed_(false) {
11826 11827
11827 // Catch the case when the debugger stops in an internal function. 11828 // Catch the case when the debugger stops in an internal function.
11828 Handle<SharedFunctionInfo> shared_info(function_->shared()); 11829 Handle<SharedFunctionInfo> shared_info(function_->shared());
11829 Handle<ScopeInfo> scope_info(shared_info->scope_info()); 11830 Handle<ScopeInfo> scope_info(shared_info->scope_info());
11830 if (shared_info->script() == isolate->heap()->undefined_value()) { 11831 if (shared_info->script() == isolate->heap()->undefined_value()) {
11831 while (context_->closure() == *function_) { 11832 while (context_->closure() == *function_) {
11832 context_ = Handle<Context>(context_->previous(), isolate_); 11833 context_ = Handle<Context>(context_->previous(), isolate_);
11833 } 11834 }
11834 return; 11835 return;
11835 } 11836 }
11836 11837
11837 // Get the debug info (create it if it does not exist). 11838 // Get the debug info (create it if it does not exist).
11838 if (!isolate->debug()->EnsureDebugInfo(shared_info, function_)) { 11839 if (!isolate->debug()->EnsureDebugInfo(shared_info, function_)) {
11839 // Return if ensuring debug info failed. 11840 // Return if ensuring debug info failed.
11840 return; 11841 return;
11841 } 11842 }
11842 Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared_info);
11843 11843
11844 // Find the break point where execution has stopped. 11844 // Currently it takes too much time to find nested scopes due to script
11845 BreakLocationIterator break_location_iterator(debug_info, 11845 // parsing. Sometimes we want to run the ScopeIterator as fast as possible
11846 ALL_BREAK_LOCATIONS); 11846 // (for example, while collecting async call stacks on every
11847 // pc points to the instruction after the current one, possibly a break 11847 // addEventListener call), even if we drop some nested scopes.
11848 // location as well. So the "- 1" to exclude it from the search. 11848 // Later we may optimize getting the nested scopes (cache the result?)
11849 break_location_iterator.FindBreakLocationFromAddress(frame->pc() - 1); 11849 // and include nested scopes into the "fast" iteration case as well.
11850 if (break_location_iterator.IsExit()) { 11850 if (!ignore_nested_scopes) {
11851 // We are within the return sequence. At the momemt it is not possible to 11851 Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared_info);
11852
11853 // Find the break point where execution has stopped.
11854 BreakLocationIterator break_location_iterator(debug_info,
11855 ALL_BREAK_LOCATIONS);
11856 // pc points to the instruction after the current one, possibly a break
11857 // location as well. So the "- 1" to exclude it from the search.
11858 break_location_iterator.FindBreakLocationFromAddress(frame->pc() - 1);
11859
11860 // Within the return sequence at the moment it is not possible to
11852 // get a source position which is consistent with the current scope chain. 11861 // get a source position which is consistent with the current scope chain.
11853 // Thus all nested with, catch and block contexts are skipped and we only 11862 // Thus all nested with, catch and block contexts are skipped and we only
11854 // provide the function scope. 11863 // provide the function scope.
11864 ignore_nested_scopes = break_location_iterator.IsExit();
11865 }
11866
11867 if (ignore_nested_scopes) {
11855 if (scope_info->HasContext()) { 11868 if (scope_info->HasContext()) {
11856 context_ = Handle<Context>(context_->declaration_context(), isolate_); 11869 context_ = Handle<Context>(context_->declaration_context(), isolate_);
11857 } else { 11870 } else {
11858 while (context_->closure() == *function_) { 11871 while (context_->closure() == *function_) {
11859 context_ = Handle<Context>(context_->previous(), isolate_); 11872 context_ = Handle<Context>(context_->previous(), isolate_);
11860 } 11873 }
11861 } 11874 }
11862 if (scope_info->scope_type() != EVAL_SCOPE) { 11875 if (scope_info->scope_type() != EVAL_SCOPE &&
ulan 2014/03/21 12:02:21 Considering the comment above: "we only provide th
11876 scope_info->scope_type() != GLOBAL_SCOPE) {
11863 nested_scope_chain_.Add(scope_info); 11877 nested_scope_chain_.Add(scope_info);
11864 } 11878 }
11865 } else { 11879 } else {
11866 // Reparse the code and analyze the scopes. 11880 // Reparse the code and analyze the scopes.
11867 Handle<Script> script(Script::cast(shared_info->script())); 11881 Handle<Script> script(Script::cast(shared_info->script()));
11868 Scope* scope = NULL; 11882 Scope* scope = NULL;
11869 11883
11870 // Check whether we are in global, eval or function code. 11884 // Check whether we are in global, eval or function code.
11871 Handle<ScopeInfo> scope_info(shared_info->scope_info()); 11885 Handle<ScopeInfo> scope_info(shared_info->scope_info());
11872 if (scope_info->scope_type() != FUNCTION_SCOPE) { 11886 if (scope_info->scope_type() != FUNCTION_SCOPE) {
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
12320 Handle<JSObject> details = MaterializeScopeDetails(isolate, &it); 12334 Handle<JSObject> details = MaterializeScopeDetails(isolate, &it);
12321 RETURN_IF_EMPTY_HANDLE(isolate, details); 12335 RETURN_IF_EMPTY_HANDLE(isolate, details);
12322 return *details; 12336 return *details;
12323 } 12337 }
12324 12338
12325 12339
12326 // Return an array of scope details 12340 // Return an array of scope details
12327 // args[0]: number: break id 12341 // args[0]: number: break id
12328 // args[1]: number: frame index 12342 // args[1]: number: frame index
12329 // args[2]: number: inlined frame index 12343 // args[2]: number: inlined frame index
12344 // args[3]: boolean: ignore nested scopes
12330 // 12345 //
12331 // The array returned contains arrays with the following information: 12346 // The array returned contains arrays with the following information:
12332 // 0: Scope type 12347 // 0: Scope type
12333 // 1: Scope object 12348 // 1: Scope object
12334 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetAllScopesDetails) { 12349 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetAllScopesDetails) {
12335 HandleScope scope(isolate); 12350 HandleScope scope(isolate);
12336 ASSERT(args.length() == 3); 12351 ASSERT(args.length() == 3 || args.length() == 4);
12337 12352
12338 // Check arguments. 12353 // Check arguments.
12339 Object* check; 12354 Object* check;
12340 { MaybeObject* maybe_check = Runtime_CheckExecutionState( 12355 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
12341 RUNTIME_ARGUMENTS(isolate, args)); 12356 RUNTIME_ARGUMENTS(isolate, args));
12342 if (!maybe_check->ToObject(&check)) return maybe_check; 12357 if (!maybe_check->ToObject(&check)) return maybe_check;
12343 } 12358 }
12344 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); 12359 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
12345 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); 12360 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]);
12346 12361
12362 bool ignore_nested_scopes = false;
12363 if (args.length() == 4) {
12364 CONVERT_BOOLEAN_ARG_CHECKED(flag, 3);
12365 ignore_nested_scopes = flag;
12366 }
12367
12347 // Get the frame where the debugging is performed. 12368 // Get the frame where the debugging is performed.
12348 StackFrame::Id id = UnwrapFrameId(wrapped_id); 12369 StackFrame::Id id = UnwrapFrameId(wrapped_id);
12349 JavaScriptFrameIterator frame_it(isolate, id); 12370 JavaScriptFrameIterator frame_it(isolate, id);
12350 JavaScriptFrame* frame = frame_it.frame(); 12371 JavaScriptFrame* frame = frame_it.frame();
12351 12372
12352 List<Handle<JSObject> > result(4); 12373 List<Handle<JSObject> > result(4);
12353 ScopeIterator it(isolate, frame, inlined_jsframe_index); 12374 ScopeIterator it(isolate, frame, inlined_jsframe_index, ignore_nested_scopes);
12354 for (; !it.Done(); it.Next()) { 12375 for (; !it.Done(); it.Next()) {
12355 Handle<JSObject> details = MaterializeScopeDetails(isolate, &it); 12376 Handle<JSObject> details = MaterializeScopeDetails(isolate, &it);
12356 RETURN_IF_EMPTY_HANDLE(isolate, details); 12377 RETURN_IF_EMPTY_HANDLE(isolate, details);
12357 result.Add(details); 12378 result.Add(details);
12358 } 12379 }
12359 12380
12360 Handle<FixedArray> array = isolate->factory()->NewFixedArray(result.length()); 12381 Handle<FixedArray> array = isolate->factory()->NewFixedArray(result.length());
12361 for (int i = 0; i < result.length(); ++i) { 12382 for (int i = 0; i < result.length(); ++i) {
12362 array->set(i, *result[i]); 12383 array->set(i, *result[i]);
12363 } 12384 }
(...skipping 2676 matching lines...) Expand 10 before | Expand all | Expand 10 after
15040 // Handle last resort GC and make sure to allow future allocations 15061 // Handle last resort GC and make sure to allow future allocations
15041 // to grow the heap without causing GCs (if possible). 15062 // to grow the heap without causing GCs (if possible).
15042 isolate->counters()->gc_last_resort_from_js()->Increment(); 15063 isolate->counters()->gc_last_resort_from_js()->Increment();
15043 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, 15064 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
15044 "Runtime::PerformGC"); 15065 "Runtime::PerformGC");
15045 } 15066 }
15046 } 15067 }
15047 15068
15048 15069
15049 } } // namespace v8::internal 15070 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.h ('k') | test/mjsunit/debug-scopes.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698