| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 99dc6bfc406de1bc245c51fa302ab7d9ba32474c..3522609f4fb1c3d5f593c3bc437299fdd7c64de0 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -13129,14 +13129,6 @@ RUNTIME_FUNCTION(Runtime_DebugReferencedBy) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
|
|
| - // First perform a full GC in order to avoid references from dead objects.
|
| - Heap* heap = isolate->heap();
|
| - heap->CollectAllGarbage(Heap::kMakeHeapIterableMask, "%DebugReferencedBy");
|
| - // The heap iterator reserves the right to do a GC to make the heap iterable.
|
| - // Due to the GC above we know it won't need to do that, but it seems cleaner
|
| - // to get the heap iterator constructed before we start having unprotected
|
| - // Object* locals that are not protected by handles.
|
| -
|
| // Check parameters.
|
| CONVERT_ARG_HANDLE_CHECKED(JSObject, target, 0);
|
| CONVERT_ARG_HANDLE_CHECKED(Object, instance_filter, 1);
|
| @@ -13154,21 +13146,27 @@ RUNTIME_FUNCTION(Runtime_DebugReferencedBy) {
|
|
|
| // Get the number of referencing objects.
|
| int count;
|
| - HeapIterator heap_iterator(heap);
|
| - count = DebugReferencedBy(&heap_iterator,
|
| - *target, *instance_filter, max_references,
|
| - NULL, 0, *arguments_function);
|
| + // First perform a full GC in order to avoid dead objects and to make the heap
|
| + // iterable.
|
| + Heap* heap = isolate->heap();
|
| + heap->CollectAllGarbage(Heap::kMakeHeapIterableMask, "%DebugConstructedBy");
|
| + {
|
| + HeapIterator heap_iterator(heap);
|
| + count = DebugReferencedBy(&heap_iterator,
|
| + *target, *instance_filter, max_references,
|
| + NULL, 0, *arguments_function);
|
| + }
|
|
|
| // Allocate an array to hold the result.
|
| Handle<FixedArray> instances = isolate->factory()->NewFixedArray(count);
|
|
|
| // Fill the referencing objects.
|
| - // AllocateFixedArray above does not make the heap non-iterable.
|
| - ASSERT(heap->IsHeapIterable());
|
| - HeapIterator heap_iterator2(heap);
|
| - count = DebugReferencedBy(&heap_iterator2,
|
| - *target, *instance_filter, max_references,
|
| - *instances, count, *arguments_function);
|
| + {
|
| + HeapIterator heap_iterator(heap);
|
| + count = DebugReferencedBy(&heap_iterator,
|
| + *target, *instance_filter, max_references,
|
| + *instances, count, *arguments_function);
|
| + }
|
|
|
| // Return result as JS array.
|
| Handle<JSFunction> constructor(
|
| @@ -13219,9 +13217,6 @@ RUNTIME_FUNCTION(Runtime_DebugConstructedBy) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 2);
|
|
|
| - // First perform a full GC in order to avoid dead objects.
|
| - Heap* heap = isolate->heap();
|
| - heap->CollectAllGarbage(Heap::kMakeHeapIterableMask, "%DebugConstructedBy");
|
|
|
| // Check parameters.
|
| CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 0);
|
| @@ -13230,24 +13225,31 @@ RUNTIME_FUNCTION(Runtime_DebugConstructedBy) {
|
|
|
| // Get the number of referencing objects.
|
| int count;
|
| - HeapIterator heap_iterator(heap);
|
| - count = DebugConstructedBy(&heap_iterator,
|
| - *constructor,
|
| - max_references,
|
| - NULL,
|
| - 0);
|
| + // First perform a full GC in order to avoid dead objects and to make the heap
|
| + // iterable.
|
| + Heap* heap = isolate->heap();
|
| + heap->CollectAllGarbage(Heap::kMakeHeapIterableMask, "%DebugConstructedBy");
|
| + {
|
| + HeapIterator heap_iterator(heap);
|
| + count = DebugConstructedBy(&heap_iterator,
|
| + *constructor,
|
| + max_references,
|
| + NULL,
|
| + 0);
|
| + }
|
|
|
| // Allocate an array to hold the result.
|
| Handle<FixedArray> instances = isolate->factory()->NewFixedArray(count);
|
|
|
| - ASSERT(heap->IsHeapIterable());
|
| // Fill the referencing objects.
|
| - HeapIterator heap_iterator2(heap);
|
| - count = DebugConstructedBy(&heap_iterator2,
|
| - *constructor,
|
| - max_references,
|
| - *instances,
|
| - count);
|
| + {
|
| + HeapIterator heap_iterator2(heap);
|
| + count = DebugConstructedBy(&heap_iterator2,
|
| + *constructor,
|
| + max_references,
|
| + *instances,
|
| + count);
|
| + }
|
|
|
| // Return result as JS array.
|
| Handle<JSFunction> array_function(
|
| @@ -13379,8 +13381,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditFindSharedFunctionInfosForScript) {
|
| int number;
|
| Heap* heap = isolate->heap();
|
| {
|
| - heap->EnsureHeapIsIterable();
|
| - DisallowHeapAllocation no_allocation;
|
| HeapIterator heap_iterator(heap);
|
| Script* scr = *script;
|
| FixedArray* arr = *array;
|
| @@ -13388,8 +13388,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditFindSharedFunctionInfosForScript) {
|
| }
|
| if (number > kBufferSize) {
|
| array = isolate->factory()->NewFixedArray(number);
|
| - heap->EnsureHeapIsIterable();
|
| - DisallowHeapAllocation no_allocation;
|
| HeapIterator heap_iterator(heap);
|
| Script* scr = *script;
|
| FixedArray* arr = *array;
|
| @@ -14472,8 +14470,6 @@ static Handle<Object> Runtime_GetScriptFromScriptName(
|
| Handle<Script> script;
|
| Factory* factory = script_name->GetIsolate()->factory();
|
| Heap* heap = script_name->GetHeap();
|
| - heap->EnsureHeapIsIterable();
|
| - DisallowHeapAllocation no_allocation_during_heap_iteration;
|
| HeapIterator iterator(heap);
|
| HeapObject* obj = NULL;
|
| while (script.is_null() && ((obj = iterator.next()) != NULL)) {
|
|
|