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

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/TraceWrapperV8Reference.h

Issue 2479133002: [wrapper-tracing] Fix dispatching of TraceWrapperv8Reference (Closed)
Patch Set: Regenerate bindings results Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef TraceWrapperV8Reference_h
6 #define TraceWrapperV8Reference_h
7
8 #include "bindings/core/v8/ScriptWrappableVisitor.h"
9
10 namespace blink {
11
12 /**
13 * TraceWrapperV8Reference is used to trace from Blink to V8. If wrapper
14 * tracing is disabled, the reference is a weak v8::Persistent. Otherwise,
15 * the reference is (strongly) traced by wrapper tracing.
16 *
17 * TODO(mlippautz): Use a better handle type than v8::Persistent.
18 */
19 template <typename T>
20 class TraceWrapperV8Reference {
21 public:
22 explicit TraceWrapperV8Reference(void* parent) : m_parent(parent) {}
23
24 TraceWrapperV8Reference(v8::Isolate* isolate,
25 void* parent,
26 v8::Local<T> handle)
27 : m_parent(parent) {
28 internalSet(isolate, handle);
29 m_handle.SetWeak();
30 }
31
32 ~TraceWrapperV8Reference() { clear(); }
33
34 void set(v8::Isolate* isolate, v8::Local<T> handle) {
35 internalSet(isolate, handle);
36 m_handle.SetWeak();
37 }
38
39 template <typename P>
40 void set(v8::Isolate* isolate,
41 v8::Local<T> handle,
42 P* parameters,
43 void (*callback)(const v8::WeakCallbackInfo<P>&),
44 v8::WeakCallbackType type = v8::WeakCallbackType::kParameter) {
45 internalSet(isolate, handle);
46 m_handle.SetWeak(parameters, callback, type);
47 }
48
49 ALWAYS_INLINE v8::Local<T> newLocal(v8::Isolate* isolate) const {
50 return v8::Local<T>::New(isolate, m_handle);
51 }
52
53 bool isEmpty() const { return m_handle.IsEmpty(); }
54 void clear() { m_handle.Reset(); }
55 ALWAYS_INLINE v8::Persistent<T>& get() { return m_handle; }
56
57 void setReference(const v8::Persistent<v8::Object>& parent,
58 v8::Isolate* isolate) {
59 DCHECK(!RuntimeEnabledFeatures::traceWrappablesEnabled());
60 isolate->SetReference(parent, m_handle);
61 }
62
63 template <typename S>
64 const TraceWrapperV8Reference<S>& cast() const {
65 return reinterpret_cast<const TraceWrapperV8Reference<S>&>(
66 const_cast<const TraceWrapperV8Reference<T>&>(*this));
67 }
68
69 private:
70 inline void internalSet(v8::Isolate* isolate, v8::Local<T> handle) {
71 m_handle.Reset(isolate, handle);
72 ScriptWrappableVisitor::writeBarrier(m_parent, &cast<v8::Value>());
73 }
74
75 v8::Persistent<T> m_handle;
76 void* m_parent;
77 };
78
79 } // namespace blink
80
81 #endif // TraceWrapperV8Reference_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698