Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Unified Diff: third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h

Issue 2843603002: Move ScriptWrappable and dependencies to platform/bindings (Closed)
Patch Set: Rebase and try again Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h
index 50eee7f486b858d871d5c6a092ac47d26b167c6a..722e8f8d913bb197961c213bd4dc1e8293e3f581 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h
@@ -2,243 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef ScriptWrappableVisitor_h
-#define ScriptWrappableVisitor_h
-
-#include "core/CoreExport.h"
-#include "platform/RuntimeEnabledFeatures.h"
-#include "platform/heap/HeapPage.h"
-#include "platform/heap/VisitorImpl.h"
-#include "platform/heap/WrapperVisitor.h"
-#include "platform/wtf/Deque.h"
-#include "platform/wtf/Vector.h"
-#include "v8/include/v8.h"
-
-namespace blink {
-
-class HeapObjectHeader;
-template <typename T>
-class Member;
-class ScriptWrappable;
-template <typename T>
-class TraceWrapperV8Reference;
-
-class WrapperMarkingData {
- public:
- WrapperMarkingData(
- void (*trace_wrappers_callback)(const WrapperVisitor*, const void*),
- HeapObjectHeader* (*heap_object_header_callback)(const void*),
- const void* object)
- : trace_wrappers_callback_(trace_wrappers_callback),
- heap_object_header_callback_(heap_object_header_callback),
- raw_object_pointer_(object) {
- DCHECK(trace_wrappers_callback_);
- DCHECK(heap_object_header_callback_);
- DCHECK(raw_object_pointer_);
- }
-
- inline void TraceWrappers(WrapperVisitor* visitor) {
- if (raw_object_pointer_) {
- trace_wrappers_callback_(visitor, raw_object_pointer_);
- }
- }
-
- // Returns true when object was marked. Ignores (returns true) invalidated
- // objects.
- inline bool IsWrapperHeaderMarked() {
- return !raw_object_pointer_ ||
- GetHeapObjectHeader()->IsWrapperHeaderMarked();
- }
-
- inline const void* RawObjectPointer() { return raw_object_pointer_; }
-
- private:
- inline bool ShouldBeInvalidated() {
- return raw_object_pointer_ && !GetHeapObjectHeader()->IsMarked();
- }
-
- inline void Invalidate() { raw_object_pointer_ = nullptr; }
-
- inline const HeapObjectHeader* GetHeapObjectHeader() {
- DCHECK(raw_object_pointer_);
- return heap_object_header_callback_(raw_object_pointer_);
- }
-
- void (*trace_wrappers_callback_)(const WrapperVisitor*, const void*);
- HeapObjectHeader* (*heap_object_header_callback_)(const void*);
- const void* raw_object_pointer_;
-
- friend class ScriptWrappableVisitor;
-};
-
-// ScriptWrappableVisitor is able to trace through the objects to get all
-// wrappers. It is used during V8 garbage collection. When this visitor is
-// set to the v8::Isolate as its embedder heap tracer, V8 will call it during
-// its garbage collection. At the beginning, it will call TracePrologue, then
-// repeatedly it will call AdvanceTracing, and at the end it will call
-// TraceEpilogue. Everytime V8 finds new wrappers, it will let the tracer
-// know using RegisterV8References.
-class CORE_EXPORT ScriptWrappableVisitor : public v8::EmbedderHeapTracer,
- public WrapperVisitor {
- DISALLOW_IMPLICIT_CONSTRUCTORS(ScriptWrappableVisitor);
-
- public:
- ScriptWrappableVisitor(v8::Isolate* isolate) : isolate_(isolate){};
- ~ScriptWrappableVisitor() override;
-
- // Replace all dead objects in the marking deque with nullptr after oilpan
- // gc.
- static void InvalidateDeadObjectsInMarkingDeque(v8::Isolate*);
-
- // Immediately clean up all wrappers.
- static void PerformCleanup(v8::Isolate*);
-
- void TracePrologue() override;
-
- static WrapperVisitor* CurrentVisitor(v8::Isolate*);
-
- static void WriteBarrier(v8::Isolate*,
- const void*,
- const TraceWrapperV8Reference<v8::Value>*);
-
- // TODO(mlippautz): Remove once ScriptWrappable is converted to
- // TraceWrapperV8Reference.
- static void WriteBarrier(v8::Isolate*, const v8::Persistent<v8::Object>*);
-
- template <typename T>
- static void WriteBarrier(const void* object, const Member<T>& value) {
- WriteBarrier(object, value.Get());
- }
-
- template <typename T>
- static void WriteBarrier(const void* src_object, const T* dst_object) {
- static_assert(!NeedsAdjustAndMark<T>::value,
- "wrapper tracing is not supported within mixins");
- if (!src_object || !dst_object) {
- return;
- }
- // We only require a write barrier if |srcObject| is already marked. Note
- // that this implicitly disables the write barrier when the GC is not
- // active as object will not be marked in this case.
- if (!HeapObjectHeader::FromPayload(src_object)->IsWrapperHeaderMarked()) {
- return;
- }
-
- const ThreadState* thread_state = ThreadState::Current();
- DCHECK(thread_state);
- // If the wrapper is already marked we can bail out here.
- if (TraceTrait<T>::GetHeapObjectHeader(dst_object)->IsWrapperHeaderMarked())
- return;
- // Otherwise, eagerly mark the wrapper header and put the object on the
- // marking deque for further processing.
- WrapperVisitor* const visitor = CurrentVisitor(thread_state->GetIsolate());
- visitor->MarkAndPushToMarkingDeque(dst_object);
- }
-
- void RegisterV8References(const std::vector<std::pair<void*, void*>>&
- internal_fields_of_potential_wrappers) override;
- void RegisterV8Reference(const std::pair<void*, void*>& internal_fields);
- bool AdvanceTracing(double deadline_in_ms,
- v8::EmbedderHeapTracer::AdvanceTracingActions) override;
- void TraceEpilogue() override;
- void AbortTracing() override;
- void EnterFinalPause() override;
- size_t NumberOfWrappersToTrace() override;
-
- void DispatchTraceWrappers(const TraceWrapperBase*) const override;
-
- void TraceWrappers(const TraceWrapperV8Reference<v8::Value>&) const override;
- void MarkWrapper(const v8::PersistentBase<v8::Value>*) const override;
-
- void InvalidateDeadObjectsInMarkingDeque();
-
- bool MarkWrapperHeader(HeapObjectHeader*) const;
-
- // Mark wrappers in all worlds for the given script wrappable as alive in
- // V8.
- void MarkWrappersInAllWorlds(const ScriptWrappable*) const override;
-
- WTF::Deque<WrapperMarkingData>* GetMarkingDeque() { return &marking_deque_; }
- WTF::Deque<WrapperMarkingData>* GetVerifierDeque() {
- return &verifier_deque_;
- }
- WTF::Vector<HeapObjectHeader*>* GetHeadersToUnmark() {
- return &headers_to_unmark_;
- }
-
- // Immediately cleans up all wrappers if necessary.
- void PerformCleanup();
-
- protected:
- bool PushToMarkingDeque(
- void (*trace_wrappers_callback)(const WrapperVisitor*, const void*),
- HeapObjectHeader* (*heap_object_header_callback)(const void*),
- void (*missed_write_barrier_callback)(void),
- const void* object) const override {
- if (!tracing_in_progress_)
- return false;
-
- marking_deque_.push_back(WrapperMarkingData(
- trace_wrappers_callback, heap_object_header_callback, object));
-#if DCHECK_IS_ON()
- if (!advancing_tracing_) {
- verifier_deque_.push_back(WrapperMarkingData(
- trace_wrappers_callback, heap_object_header_callback, object));
- }
-#endif
- return true;
- }
-
- // Returns true if wrapper tracing is currently in progress, i.e.,
- // TracePrologue has been called, and TraceEpilogue has not yet been called.
- bool tracing_in_progress_ = false;
-
- // Is AdvanceTracing currently running? If not, we know that all calls of
- // pushToMarkingDeque are from V8 or new wrapper associations. And this
- // information is used by the verifier feature.
- bool advancing_tracing_ = false;
-
- // Indicates whether an idle task for a lazy cleanup has already been
- // scheduled. The flag is used to avoid scheduling multiple idle tasks for
- // cleaning up.
- bool idle_cleanup_task_scheduled_ = false;
-
- // Indicates whether cleanup should currently happen. The flag is used to
- // avoid cleaning up in the next GC cycle.
- bool should_cleanup_ = false;
-
- // Schedule an idle task to perform a lazy (incremental) clean up of
- // wrappers.
- void ScheduleIdleLazyCleanup();
- void PerformLazyCleanup(double deadline_seconds);
-
- // Collection of objects we need to trace from. We assume it is safe to hold
- // on to the raw pointers because:
- // - oilpan object cannot move
- // - oilpan gc will call invalidateDeadObjectsInMarkingDeque to delete all
- // obsolete objects
- mutable WTF::Deque<WrapperMarkingData> marking_deque_;
-
- // Collection of objects we started tracing from. We assume it is safe to
- // hold on to the raw pointers because:
- // - oilpan object cannot move
- // - oilpan gc will call invalidateDeadObjectsInMarkingDeque to delete
- // all obsolete objects
- //
- // These objects are used when TraceWrappablesVerifier feature is enabled to
- // verify that all objects reachable in the atomic pause were marked
- // incrementally. If not, there is one or multiple write barriers missing.
- mutable WTF::Deque<WrapperMarkingData> verifier_deque_;
-
- // Collection of headers we need to unmark after the tracing finished. We
- // assume it is safe to hold on to the headers because:
- // - oilpan objects cannot move
- // - objects this headers belong to are invalidated by the oilpan GC in
- // invalidateDeadObjectsInMarkingDeque.
- mutable WTF::Vector<HeapObjectHeader*> headers_to_unmark_;
- v8::Isolate* isolate_;
-};
-
-} // namespace blink
-
-#endif // ScriptWrappableVisitor_h
+// This file has been moved to platform/bindings/ScriptWrappableVisitor.h.
+// TODO(adithyas): Remove this file.
+#include "platform/bindings/ScriptWrappableVisitor.h"

Powered by Google App Engine
This is Rietveld 408576698