| Index: src/debug.cc
|
| diff --git a/src/debug.cc b/src/debug.cc
|
| index 7f96ddc4ad4dcff1014f5cd81ead1add60a746ab..32cbf6f8e6f538834289cbfbda30e786bb4dfdab 100644
|
| --- a/src/debug.cc
|
| +++ b/src/debug.cc
|
| @@ -1506,23 +1506,22 @@ Handle<Object> Debug::GetSourceBreakLocations(
|
| Handle<FixedArray> locations =
|
| isolate->factory()->NewFixedArray(debug_info->GetBreakPointCount());
|
| int count = 0;
|
| - for (int i = 0; i < debug_info->break_points()->length(); i++) {
|
| + for (int i = 0; i < debug_info->break_points()->length(); ++i) {
|
| if (!debug_info->break_points()->get(i)->IsUndefined()) {
|
| BreakPointInfo* break_point_info =
|
| BreakPointInfo::cast(debug_info->break_points()->get(i));
|
| - if (break_point_info->GetBreakPointCount() > 0) {
|
| - Smi* position = NULL;
|
| - switch (position_alignment) {
|
| - case STATEMENT_ALIGNED:
|
| - position = break_point_info->statement_position();
|
| - break;
|
| - case BREAK_POSITION_ALIGNED:
|
| - position = break_point_info->source_position();
|
| - break;
|
| - }
|
| -
|
| - locations->set(count++, position);
|
| + int break_points = break_point_info->GetBreakPointCount();
|
| + if (break_points == 0) continue;
|
| + Smi* position = NULL;
|
| + switch (position_alignment) {
|
| + case STATEMENT_ALIGNED:
|
| + position = break_point_info->statement_position();
|
| + break;
|
| + case BREAK_POSITION_ALIGNED:
|
| + position = break_point_info->source_position();
|
| + break;
|
| }
|
| + for (int j = 0; j < break_points; ++j) locations->set(count++, position);
|
| }
|
| }
|
| return locations;
|
| @@ -1822,7 +1821,6 @@ static void RecompileAndRelocateSuspendedGenerators(
|
| static bool SkipSharedFunctionInfo(SharedFunctionInfo* shared,
|
| Object* active_code_marker) {
|
| if (!shared->allows_lazy_compilation()) return true;
|
| - if (!shared->script()->IsScript()) return true;
|
| Object* script = shared->script();
|
| if (!script->IsScript()) return true;
|
| if (Script::cast(script)->type()->value() == Script::TYPE_NATIVE) return true;
|
| @@ -2103,6 +2101,21 @@ Handle<Object> Debug::FindSharedFunctionInfoInScript(Handle<Script> script,
|
| }
|
| } // End while loop.
|
|
|
| + // JSFunctions from the same literal may not have the same shared function
|
| + // info. Find those JSFunctions and deduplicate the shared function info.
|
| + HeapIterator iterator(heap, FLAG_lazy ? HeapIterator::kNoFiltering
|
| + : HeapIterator::kFilterUnreachable);
|
| + for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) {
|
| + if (!obj->IsJSFunction()) continue;
|
| + JSFunction* function = JSFunction::cast(obj);
|
| + SharedFunctionInfo* shared = function->shared();
|
| + if (shared != *target && shared->script() == target->script() &&
|
| + shared->start_position_and_type() ==
|
| + target->start_position_and_type()) {
|
| + function->set_shared(*target);
|
| + }
|
| + }
|
| +
|
| return target;
|
| }
|
|
|
|
|