| Index: src/runtime/runtime-debug.cc
|
| diff --git a/src/runtime/runtime-debug.cc b/src/runtime/runtime-debug.cc
|
| index aff5ec996c6fec92aa326c289b813543ad37d847..f4c81c8c72b5ff499e66276462245f70e7acadb2 100644
|
| --- a/src/runtime/runtime-debug.cc
|
| +++ b/src/runtime/runtime-debug.cc
|
| @@ -1396,14 +1396,14 @@ class ScopeIterator {
|
| // Later we may optimize getting the nested scopes (cache the result?)
|
| // and include nested scopes into the "fast" iteration case as well.
|
|
|
| - if (!ignore_nested_scopes && !shared_info->debug_info()->IsUndefined()) {
|
| + if (!ignore_nested_scopes && shared_info->HasDebugInfo()) {
|
| // The source position at return is always the end of the function,
|
| // which is not consistent with the current scope chain. Therefore all
|
| // nested with, catch and block contexts are skipped, and we can only
|
| // inspect the function scope.
|
| // This can only happen if we set a break point inside right before the
|
| // return, which requires a debug info to be available.
|
| - Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared_info);
|
| + Handle<DebugInfo> debug_info(shared_info->GetDebugInfo());
|
|
|
| // PC points to the instruction after the current one, possibly a break
|
| // location as well. So the "- 1" to exclude it from the search.
|
| @@ -1818,59 +1818,14 @@ RUNTIME_FUNCTION(Runtime_GetStepInPositions) {
|
| JavaScriptFrameIterator frame_it(isolate, id);
|
| RUNTIME_ASSERT(!frame_it.done());
|
|
|
| - List<FrameSummary> frames(FLAG_max_inlining_levels + 1);
|
| - frame_it.frame()->Summarize(&frames);
|
| - FrameSummary summary = frames.first();
|
| -
|
| - Handle<JSFunction> fun = Handle<JSFunction>(summary.function());
|
| - Handle<SharedFunctionInfo> shared = Handle<SharedFunctionInfo>(fun->shared());
|
| -
|
| - if (!isolate->debug()->EnsureDebugInfo(shared, fun)) {
|
| - return isolate->heap()->undefined_value();
|
| - }
|
| -
|
| - Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared);
|
| -
|
| - // Find range of break points starting from the break point where execution
|
| - // has stopped.
|
| - Address call_pc = summary.pc() - 1;
|
| - List<BreakLocation> locations;
|
| - BreakLocation::FromAddressSameStatement(debug_info, ALL_BREAK_LOCATIONS,
|
| - call_pc, &locations);
|
| -
|
| - Handle<JSArray> array = isolate->factory()->NewJSArray(locations.length());
|
| -
|
| - int index = 0;
|
| - for (BreakLocation location : locations) {
|
| - bool accept;
|
| - if (location.pc() > summary.pc()) {
|
| - accept = true;
|
| - } else {
|
| - StackFrame::Id break_frame_id = isolate->debug()->break_frame_id();
|
| - // The break point is near our pc. Could be a step-in possibility,
|
| - // that is currently taken by active debugger call.
|
| - if (break_frame_id == StackFrame::NO_ID) {
|
| - // We are not stepping.
|
| - accept = false;
|
| - } else {
|
| - JavaScriptFrameIterator additional_frame_it(isolate, break_frame_id);
|
| - // If our frame is a top frame and we are stepping, we can do step-in
|
| - // at this place.
|
| - accept = additional_frame_it.frame()->id() == id;
|
| - }
|
| - }
|
| - if (accept) {
|
| - if (location.IsStepInLocation()) {
|
| - Smi* position_value = Smi::FromInt(location.position());
|
| - RETURN_FAILURE_ON_EXCEPTION(
|
| - isolate,
|
| - Object::SetElement(isolate, array, index,
|
| - handle(position_value, isolate), SLOPPY));
|
| - index++;
|
| - }
|
| - }
|
| + List<int> positions;
|
| + isolate->debug()->GetStepinPositions(frame_it.frame(), id, &positions);
|
| + Factory* factory = isolate->factory();
|
| + Handle<FixedArray> array = factory->NewFixedArray(positions.length());
|
| + for (int i = 0; i < positions.length(); ++i) {
|
| + array->set(i, Smi::FromInt(positions[i]));
|
| }
|
| - return *array;
|
| + return *factory->NewJSArrayWithElements(array, FAST_SMI_ELEMENTS);
|
| }
|
|
|
|
|
|
|