Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index ce92611c0755c8d0530a45f1b6d0a8c86ac2f9fd..f50c862c0344e9a78c704977cf1be974a249f1ec 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -1554,15 +1554,12 @@ static bool IsUnmodifiedHeapObject(Object** p) { |
if (object->IsSmi()) return false; |
HeapObject* heap_object = HeapObject::cast(object); |
if (!object->IsJSObject()) return false; |
- Object* obj_constructor = (JSObject::cast(object))->map()->GetConstructor(); |
- if (!obj_constructor->IsJSFunction()) return false; |
- JSFunction* constructor = JSFunction::cast(obj_constructor); |
- if (!constructor->shared()->IsApiFunction()) return false; |
- if (constructor != nullptr && |
- constructor->initial_map() == heap_object->map()) { |
- return true; |
- } |
- return false; |
+ JSObject* js_object = JSObject::cast(object); |
+ if (!js_object->WasConstructedFromApiFunction()) return false; |
+ JSFunction* constructor = |
+ JSFunction::cast(js_object->map()->GetConstructor()); |
+ |
+ return constructor->initial_map() == heap_object->map(); |
} |
@@ -3589,6 +3586,7 @@ AllocationResult Heap::CopyJSObject(JSObject* source, AllocationSite* site) { |
CHECK(map->instance_type() == JS_REGEXP_TYPE || |
map->instance_type() == JS_OBJECT_TYPE || |
map->instance_type() == JS_ARRAY_TYPE || |
+ map->instance_type() == JS_API_OBJECT_TYPE || |
map->instance_type() == JS_SPECIAL_API_OBJECT_TYPE); |
int object_size = map->instance_size(); |
@@ -5385,6 +5383,24 @@ void Heap::NotifyDeserializationComplete() { |
#endif // DEBUG |
} |
+void Heap::SetEmbedderHeapTracer(EmbedderHeapTracer* tracer) { |
+ DCHECK_NOT_NULL(tracer); |
+ CHECK_NULL(embedder_heap_tracer_); |
+ embedder_heap_tracer_ = tracer; |
+} |
+ |
+void Heap::TracePossibleWrapper(JSObject* js_object) { |
+ DCHECK(js_object->WasConstructedFromApiFunction()); |
+ if (js_object->GetInternalFieldCount() >= 2 && |
+ js_object->GetInternalField(0) != undefined_value() && |
+ js_object->GetInternalField(1) != undefined_value()) { |
+ mark_compact_collector()->wrappers_to_trace().push_back( |
+ std::pair<Value*, Value*>( |
+ reinterpret_cast<Value*>(js_object->GetInternalField(0)), |
+ reinterpret_cast<Value*>(js_object->GetInternalField(1)))); |
+ } |
+} |
+ |
void Heap::RegisterExternallyReferencedObject(Object** object) { |
DCHECK(mark_compact_collector()->in_use()); |
HeapObject* heap_object = HeapObject::cast(*object); |
@@ -5560,12 +5576,6 @@ void Heap::RemoveGCEpilogueCallback(v8::Isolate::GCCallback callback) { |
UNREACHABLE(); |
} |
-void Heap::SetEmbedderHeapTracer(EmbedderHeapTracer* tracer) { |
- DCHECK_NOT_NULL(tracer); |
- CHECK_NULL(embedder_heap_tracer_); |
- embedder_heap_tracer_ = tracer; |
-} |
- |
// TODO(ishell): Find a better place for this. |
void Heap::AddWeakObjectToCodeDependency(Handle<HeapObject> obj, |
Handle<DependentCode> dep) { |