| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_SCRIPT_WRAPPABLE_VISITOR_VERIFIER_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_SCRIPT_WRAPPABLE_VISITOR_VERIFIER_H_ |
| |
| #include "base/logging.h" |
| #include "third_party/blink/renderer/platform/bindings/script_wrappable_visitor.h" |
| #include "third_party/blink/renderer/platform/heap/gc_info.h" |
| |
| namespace blink { |
| |
| // This visitor should be applied on wrapper members of each marked object |
| // after marking is complete. The Visit method checks that the given wrapper |
| // is also marked. |
| class ScriptWrappableVisitorVerifier final : public ScriptWrappableVisitor { |
| public: |
| ScriptWrappableVisitorVerifier(ThreadState* thread_state) |
| : ScriptWrappableVisitor(thread_state) {} |
| |
| void Visit(const TraceWrapperV8Reference<v8::Value>&) final {} |
| |
| void VisitWithWrappers(void* object, TraceDescriptor descriptor) final { |
| HeapObjectHeader* header = |
| HeapObjectHeader::FromPayload(descriptor.base_object_payload); |
| const char* name = GCInfoTable::Get() |
| .GCInfoFromIndex(header->GcInfoIndex()) |
| ->name_(descriptor.base_object_payload); |
| // If this FATAL is hit, it means that a white (not discovered by |
| // Trace) object was assigned as a member to a black object (already |
| // processed by Trace). The black object will not be processed anymore |
| // so white object will remain undetected and therefore its wrapper |
| // and all wrappers reachable from it would be collected. |
| // |
| // This means there is a write barrier missing somewhere. Check the |
| // backtrace to see which types are causing this and review all the places |
| // where white object is set to a black object. |
| LOG_IF(FATAL, !header->IsWrapperHeaderMarked()) |
| << "Write barrier missed for " << name; |
| } |
| |
| void Visit(DOMWrapperMap<ScriptWrappable>*, |
| const ScriptWrappable* key) final {} |
| |
| void VisitBackingStoreStrongly(void* object, |
| void** object_slot, |
| TraceDescriptor desc) final {} |
| |
| protected: |
| using Visitor::Visit; |
| }; |
| |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_SCRIPT_WRAPPABLE_VISITOR_VERIFIER_H_ |