Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index c3610fbe3ffb6df22c959dd2384d79759cc3011c..3e8978824da457a34caeebe758babc457c51315b 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -13111,6 +13111,14 @@ 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); |
@@ -13128,27 +13136,21 @@ RUNTIME_FUNCTION(Runtime_DebugReferencedBy) { |
// Get the number of referencing objects. |
int count; |
- // 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); |
- } |
+ 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. |
- { |
- HeapIterator heap_iterator(heap); |
- count = DebugReferencedBy(&heap_iterator, |
- *target, *instance_filter, max_references, |
- *instances, count, *arguments_function); |
- } |
+ // 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); |
// Return result as JS array. |
Handle<JSFunction> constructor( |
@@ -13199,6 +13201,9 @@ 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); |
@@ -13207,31 +13212,24 @@ RUNTIME_FUNCTION(Runtime_DebugConstructedBy) { |
// Get the number of referencing objects. |
int count; |
- // 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); |
- } |
+ 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( |
@@ -13363,6 +13361,8 @@ 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; |
@@ -13370,6 +13370,8 @@ 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; |
@@ -14452,6 +14454,8 @@ 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)) { |