| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 0caaa47bd57f79ba52b8b46959a590c9fe918041..2209221227c8841243119a700bdb399c6b2ff4a7 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -12241,7 +12241,7 @@ static const int kScopeDetailsObjectIndex = 1;
|
| static const int kScopeDetailsSize = 2;
|
|
|
|
|
| -static MaybeObject* MaterializeScopeDetails(Isolate* isolate,
|
| +static Handle<JSObject> MaterializeScopeDetails(Isolate* isolate,
|
| ScopeIterator* it) {
|
| // Calculate the size of the result.
|
| int details_size = kScopeDetailsSize;
|
| @@ -12250,10 +12250,10 @@ static MaybeObject* MaterializeScopeDetails(Isolate* isolate,
|
| // Fill in scope details.
|
| details->set(kScopeDetailsTypeIndex, Smi::FromInt(it->Type()));
|
| Handle<JSObject> scope_object = it->ScopeObject();
|
| - RETURN_IF_EMPTY_HANDLE(isolate, scope_object);
|
| + RETURN_IF_EMPTY_HANDLE_VALUE(isolate, scope_object, Handle<JSObject>());
|
| details->set(kScopeDetailsObjectIndex, *scope_object);
|
|
|
| - return *isolate->factory()->NewJSArrayWithElements(details);
|
| + return isolate->factory()->NewJSArrayWithElements(details);
|
| }
|
|
|
|
|
| @@ -12294,7 +12294,51 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeDetails) {
|
| if (it.Done()) {
|
| return isolate->heap()->undefined_value();
|
| }
|
| - return MaterializeScopeDetails(isolate, &it);
|
| + Handle<JSObject> details = MaterializeScopeDetails(isolate, &it);
|
| + RETURN_IF_EMPTY_HANDLE(isolate, details);
|
| + return *details;
|
| +}
|
| +
|
| +
|
| +// Return an array of scope details
|
| +// args[0]: number: break id
|
| +// args[1]: number: frame index
|
| +// args[2]: number: inlined frame index
|
| +//
|
| +// The array returned contains arrays with the following information:
|
| +// 0: Scope type
|
| +// 1: Scope object
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_GetAllScopesDetails) {
|
| + HandleScope scope(isolate);
|
| + ASSERT(args.length() == 3);
|
| +
|
| + // Check arguments.
|
| + Object* check;
|
| + { MaybeObject* maybe_check = Runtime_CheckExecutionState(
|
| + RUNTIME_ARGUMENTS(isolate, args));
|
| + if (!maybe_check->ToObject(&check)) return maybe_check;
|
| + }
|
| + CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
|
| + CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]);
|
| +
|
| + // Get the frame where the debugging is performed.
|
| + StackFrame::Id id = UnwrapFrameId(wrapped_id);
|
| + JavaScriptFrameIterator frame_it(isolate, id);
|
| + JavaScriptFrame* frame = frame_it.frame();
|
| +
|
| + List<Handle<JSObject> > result(4);
|
| + ScopeIterator it(isolate, frame, inlined_jsframe_index);
|
| + for (; !it.Done(); it.Next()) {
|
| + Handle<JSObject> details = MaterializeScopeDetails(isolate, &it);
|
| + RETURN_IF_EMPTY_HANDLE(isolate, details);
|
| + result.Add(details);
|
| + }
|
| +
|
| + Handle<FixedArray> array = isolate->factory()->NewFixedArray(result.length());
|
| + for (int i = 0; i < result.length(); ++i) {
|
| + array->set(i, *result[i]);
|
| + }
|
| + return *isolate->factory()->NewJSArrayWithElements(array);
|
| }
|
|
|
|
|
| @@ -12333,7 +12377,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionScopeDetails) {
|
| return isolate->heap()->undefined_value();
|
| }
|
|
|
| - return MaterializeScopeDetails(isolate, &it);
|
| + Handle<JSObject> details = MaterializeScopeDetails(isolate, &it);
|
| + RETURN_IF_EMPTY_HANDLE(isolate, details);
|
| + return *details;
|
| }
|
|
|
|
|
|
|