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

Side by Side Diff: src/runtime.cc

Issue 181063008: Introduce Runtime_GetAllScopesDetails to get all scopes at once for a frame. (Closed) Base URL: git://github.com/v8/v8.git@master
Patch Set: addressed 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 12223 matching lines...) Expand 10 before | Expand all | Expand 10 after
12234 } 12234 }
12235 return *array; 12235 return *array;
12236 } 12236 }
12237 12237
12238 12238
12239 static const int kScopeDetailsTypeIndex = 0; 12239 static const int kScopeDetailsTypeIndex = 0;
12240 static const int kScopeDetailsObjectIndex = 1; 12240 static const int kScopeDetailsObjectIndex = 1;
12241 static const int kScopeDetailsSize = 2; 12241 static const int kScopeDetailsSize = 2;
12242 12242
12243 12243
12244 static MaybeObject* MaterializeScopeDetails(Isolate* isolate, 12244 static Handle<JSObject> MaterializeScopeDetails(Isolate* isolate,
12245 ScopeIterator* it) { 12245 ScopeIterator* it) {
12246 // Calculate the size of the result. 12246 // Calculate the size of the result.
12247 int details_size = kScopeDetailsSize; 12247 int details_size = kScopeDetailsSize;
12248 Handle<FixedArray> details = isolate->factory()->NewFixedArray(details_size); 12248 Handle<FixedArray> details = isolate->factory()->NewFixedArray(details_size);
12249 12249
12250 // Fill in scope details. 12250 // Fill in scope details.
12251 details->set(kScopeDetailsTypeIndex, Smi::FromInt(it->Type())); 12251 details->set(kScopeDetailsTypeIndex, Smi::FromInt(it->Type()));
12252 Handle<JSObject> scope_object = it->ScopeObject(); 12252 Handle<JSObject> scope_object = it->ScopeObject();
12253 RETURN_IF_EMPTY_HANDLE(isolate, scope_object); 12253 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, scope_object, Handle<JSObject>());
12254 details->set(kScopeDetailsObjectIndex, *scope_object); 12254 details->set(kScopeDetailsObjectIndex, *scope_object);
12255 12255
12256 return *isolate->factory()->NewJSArrayWithElements(details); 12256 return isolate->factory()->NewJSArrayWithElements(details);
12257 } 12257 }
12258 12258
12259 12259
12260 // Return an array with scope details 12260 // Return an array with scope details
12261 // args[0]: number: break id 12261 // args[0]: number: break id
12262 // args[1]: number: frame index 12262 // args[1]: number: frame index
12263 // args[2]: number: inlined frame index 12263 // args[2]: number: inlined frame index
12264 // args[3]: number: scope index 12264 // args[3]: number: scope index
12265 // 12265 //
12266 // The array returned contains the following information: 12266 // The array returned contains the following information:
(...skipping 20 matching lines...) Expand all
12287 12287
12288 // Find the requested scope. 12288 // Find the requested scope.
12289 int n = 0; 12289 int n = 0;
12290 ScopeIterator it(isolate, frame, inlined_jsframe_index); 12290 ScopeIterator it(isolate, frame, inlined_jsframe_index);
12291 for (; !it.Done() && n < index; it.Next()) { 12291 for (; !it.Done() && n < index; it.Next()) {
12292 n++; 12292 n++;
12293 } 12293 }
12294 if (it.Done()) { 12294 if (it.Done()) {
12295 return isolate->heap()->undefined_value(); 12295 return isolate->heap()->undefined_value();
12296 } 12296 }
12297 return MaterializeScopeDetails(isolate, &it); 12297 Handle<JSObject> details = MaterializeScopeDetails(isolate, &it);
12298 RETURN_IF_EMPTY_HANDLE(isolate, details);
12299 return *details;
12298 } 12300 }
12299 12301
12300 12302
12303 // Return an array of scope details
12304 // args[0]: number: break id
12305 // args[1]: number: frame index
12306 // args[2]: number: inlined frame index
12307 //
12308 // The array returned contains arrays with the following information:
12309 // 0: Scope type
12310 // 1: Scope object
12311 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetAllScopesDetails) {
12312 HandleScope scope(isolate);
12313 ASSERT(args.length() == 3);
12314
12315 // Check arguments.
12316 Object* check;
12317 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
12318 RUNTIME_ARGUMENTS(isolate, args));
12319 if (!maybe_check->ToObject(&check)) return maybe_check;
12320 }
12321 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
12322 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]);
12323
12324 // Get the frame where the debugging is performed.
12325 StackFrame::Id id = UnwrapFrameId(wrapped_id);
12326 JavaScriptFrameIterator frame_it(isolate, id);
12327 JavaScriptFrame* frame = frame_it.frame();
12328
12329 List<Handle<JSObject> > result(4);
12330 ScopeIterator it(isolate, frame, inlined_jsframe_index);
12331 for (; !it.Done(); it.Next()) {
12332 Handle<JSObject> details = MaterializeScopeDetails(isolate, &it);
12333 RETURN_IF_EMPTY_HANDLE(isolate, details);
12334 result.Add(details);
12335 }
12336
12337 Handle<FixedArray> array = isolate->factory()->NewFixedArray(result.length());
12338 for (int i = 0; i < result.length(); ++i) {
12339 array->set(i, *result[i]);
12340 }
12341 return *isolate->factory()->NewJSArrayWithElements(array);
12342 }
12343
12344
12301 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionScopeCount) { 12345 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionScopeCount) {
12302 HandleScope scope(isolate); 12346 HandleScope scope(isolate);
12303 ASSERT(args.length() == 1); 12347 ASSERT(args.length() == 1);
12304 12348
12305 // Check arguments. 12349 // Check arguments.
12306 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); 12350 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0);
12307 12351
12308 // Count the visible scopes. 12352 // Count the visible scopes.
12309 int n = 0; 12353 int n = 0;
12310 for (ScopeIterator it(isolate, fun); !it.Done(); it.Next()) { 12354 for (ScopeIterator it(isolate, fun); !it.Done(); it.Next()) {
(...skipping 15 matching lines...) Expand all
12326 // Find the requested scope. 12370 // Find the requested scope.
12327 int n = 0; 12371 int n = 0;
12328 ScopeIterator it(isolate, fun); 12372 ScopeIterator it(isolate, fun);
12329 for (; !it.Done() && n < index; it.Next()) { 12373 for (; !it.Done() && n < index; it.Next()) {
12330 n++; 12374 n++;
12331 } 12375 }
12332 if (it.Done()) { 12376 if (it.Done()) {
12333 return isolate->heap()->undefined_value(); 12377 return isolate->heap()->undefined_value();
12334 } 12378 }
12335 12379
12336 return MaterializeScopeDetails(isolate, &it); 12380 Handle<JSObject> details = MaterializeScopeDetails(isolate, &it);
12381 RETURN_IF_EMPTY_HANDLE(isolate, details);
12382 return *details;
12337 } 12383 }
12338 12384
12339 12385
12340 static bool SetScopeVariableValue(ScopeIterator* it, int index, 12386 static bool SetScopeVariableValue(ScopeIterator* it, int index,
12341 Handle<String> variable_name, 12387 Handle<String> variable_name,
12342 Handle<Object> new_value) { 12388 Handle<Object> new_value) {
12343 for (int n = 0; !it->Done() && n < index; it->Next()) { 12389 for (int n = 0; !it->Done() && n < index; it->Next()) {
12344 n++; 12390 n++;
12345 } 12391 }
12346 if (it->Done()) { 12392 if (it->Done()) {
(...skipping 2618 matching lines...) Expand 10 before | Expand all | Expand 10 after
14965 // Handle last resort GC and make sure to allow future allocations 15011 // Handle last resort GC and make sure to allow future allocations
14966 // to grow the heap without causing GCs (if possible). 15012 // to grow the heap without causing GCs (if possible).
14967 isolate->counters()->gc_last_resort_from_js()->Increment(); 15013 isolate->counters()->gc_last_resort_from_js()->Increment();
14968 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, 15014 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
14969 "Runtime::PerformGC"); 15015 "Runtime::PerformGC");
14970 } 15016 }
14971 } 15017 }
14972 15018
14973 15019
14974 } } // namespace v8::internal 15020 } } // 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