| 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; | 
| } | 
|  | 
|  | 
|  |