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

Side by Side Diff: Source/bindings/core/v8/V8DOMWrapper.h

Issue 456683002: bindings: Introduces type-check for the internal pointers. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 21 matching lines...) Expand all
32 #define V8DOMWrapper_h 32 #define V8DOMWrapper_h
33 33
34 #include "bindings/core/v8/DOMDataStore.h" 34 #include "bindings/core/v8/DOMDataStore.h"
35 #include "wtf/PassRefPtr.h" 35 #include "wtf/PassRefPtr.h"
36 #include "wtf/RawPtr.h" 36 #include "wtf/RawPtr.h"
37 #include "wtf/text/AtomicString.h" 37 #include "wtf/text/AtomicString.h"
38 #include <v8.h> 38 #include <v8.h>
39 39
40 namespace blink { 40 namespace blink {
41 41
42 class ScriptWrappableBase;
42 struct WrapperTypeInfo; 43 struct WrapperTypeInfo;
43 44
44 class V8DOMWrapper { 45 class V8DOMWrapper {
45 public: 46 public:
46 static v8::Local<v8::Object> createWrapper(v8::Handle<v8::Object> creationCo ntext, const WrapperTypeInfo*, void*, v8::Isolate*); 47 static v8::Local<v8::Object> createWrapper(v8::Handle<v8::Object> creationCo ntext, const WrapperTypeInfo*, ScriptWrappableBase* internalPointer, v8::Isolate *);
47 48
48 template<typename V8T, typename T> 49 template<typename V8T, typename T>
49 static inline v8::Handle<v8::Object> associateObjectWithWrapper(PassRefPtr<T >, const WrapperTypeInfo*, v8::Handle<v8::Object>, v8::Isolate*, WrapperConfigur ation::Lifetime); 50 static inline v8::Handle<v8::Object> associateObjectWithWrapper(PassRefPtr<T >, const WrapperTypeInfo*, v8::Handle<v8::Object>, v8::Isolate*, WrapperConfigur ation::Lifetime);
50 template<typename V8T, typename T> 51 template<typename V8T, typename T>
51 static inline v8::Handle<v8::Object> associateObjectWithWrapper(RawPtr<T> ob ject, const WrapperTypeInfo* wrapperTypeInfo, v8::Handle<v8::Object> wrapper, v8 ::Isolate* isolate, WrapperConfiguration::Lifetime lifetime) 52 static inline v8::Handle<v8::Object> associateObjectWithWrapper(RawPtr<T> ob ject, const WrapperTypeInfo* wrapperTypeInfo, v8::Handle<v8::Object> wrapper, v8 ::Isolate* isolate, WrapperConfiguration::Lifetime lifetime)
52 { 53 {
53 return associateObjectWithWrapper<V8T, T>(object.get(), wrapperTypeInfo, wrapper, isolate, lifetime); 54 return associateObjectWithWrapper<V8T, T>(object.get(), wrapperTypeInfo, wrapper, isolate, lifetime);
54 } 55 }
55 template<typename V8T, typename T> 56 template<typename V8T, typename T>
56 static inline v8::Handle<v8::Object> associateObjectWithWrapper(T*, const Wr apperTypeInfo*, v8::Handle<v8::Object>, v8::Isolate*, WrapperConfiguration::Life time); 57 static inline v8::Handle<v8::Object> associateObjectWithWrapper(T*, const Wr apperTypeInfo*, v8::Handle<v8::Object>, v8::Isolate*, WrapperConfiguration::Life time);
57 static inline void setNativeInfo(v8::Handle<v8::Object>, const WrapperTypeIn fo*, void*); 58 static inline void setNativeInfo(v8::Handle<v8::Object>, const WrapperTypeIn fo*, ScriptWrappableBase* internalPointer);
58 static inline void setNativeInfoForHiddenWrapper(v8::Handle<v8::Object>, con st WrapperTypeInfo*, void*); 59 static inline void setNativeInfoForHiddenWrapper(v8::Handle<v8::Object>, con st WrapperTypeInfo*, ScriptWrappableBase* internalPointer);
59 static inline void setNativeInfoWithPersistentHandle(v8::Handle<v8::Object>, const WrapperTypeInfo*, void*, PersistentNode*); 60 static inline void setNativeInfoWithPersistentHandle(v8::Handle<v8::Object>, const WrapperTypeInfo*, ScriptWrappableBase* internalPointer, PersistentNode*);
60 static inline void clearNativeInfo(v8::Handle<v8::Object>, const WrapperType Info*); 61 static inline void clearNativeInfo(v8::Handle<v8::Object>, const WrapperType Info*);
61 62
62 static bool isDOMWrapper(v8::Handle<v8::Value>); 63 static bool isDOMWrapper(v8::Handle<v8::Value>);
63 }; 64 };
64 65
65 inline void V8DOMWrapper::setNativeInfo(v8::Handle<v8::Object> wrapper, const Wr apperTypeInfo* wrapperTypeInfo, void* object) 66 inline void V8DOMWrapper::setNativeInfo(v8::Handle<v8::Object> wrapper, const Wr apperTypeInfo* wrapperTypeInfo, ScriptWrappableBase* internalPointer)
66 { 67 {
67 ASSERT(wrapper->InternalFieldCount() >= 2); 68 ASSERT(wrapper->InternalFieldCount() >= 2);
68 ASSERT(object); 69 ASSERT(internalPointer);
69 ASSERT(wrapperTypeInfo); 70 ASSERT(wrapperTypeInfo);
70 #if ENABLE(OILPAN) 71 #if ENABLE(OILPAN)
71 ASSERT(wrapperTypeInfo->gcType == RefCountedObject); 72 ASSERT(wrapperTypeInfo->gcType == RefCountedObject);
72 #else 73 #else
73 ASSERT(wrapperTypeInfo->gcType == RefCountedObject || wrapperTypeInfo->gcTyp e == WillBeGarbageCollectedObject); 74 ASSERT(wrapperTypeInfo->gcType == RefCountedObject || wrapperTypeInfo->gcTyp e == WillBeGarbageCollectedObject);
74 #endif 75 #endif
75 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperObjectIndex, object); 76 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperObjectIndex, internalP ointer);
76 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperTypeIndex, const_cast< WrapperTypeInfo*>(wrapperTypeInfo)); 77 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperTypeIndex, const_cast< WrapperTypeInfo*>(wrapperTypeInfo));
77 } 78 }
78 79
79 inline void V8DOMWrapper::setNativeInfoForHiddenWrapper(v8::Handle<v8::Object> w rapper, const WrapperTypeInfo* wrapperTypeInfo, void* object) 80 inline void V8DOMWrapper::setNativeInfoForHiddenWrapper(v8::Handle<v8::Object> w rapper, const WrapperTypeInfo* wrapperTypeInfo, ScriptWrappableBase* internalPoi nter)
80 { 81 {
81 // see V8WindowShell::installDOMWindow() comment for why this version is nee ded and safe. 82 // see V8WindowShell::installDOMWindow() comment for why this version is nee ded and safe.
82 ASSERT(wrapper->InternalFieldCount() >= 2); 83 ASSERT(wrapper->InternalFieldCount() >= 2);
83 ASSERT(object); 84 ASSERT(internalPointer);
84 ASSERT(wrapperTypeInfo); 85 ASSERT(wrapperTypeInfo);
85 #if ENABLE(OILPAN) 86 #if ENABLE(OILPAN)
86 ASSERT(wrapperTypeInfo->gcType != RefCountedObject); 87 ASSERT(wrapperTypeInfo->gcType != RefCountedObject);
87 #else 88 #else
88 ASSERT(wrapperTypeInfo->gcType == RefCountedObject || wrapperTypeInfo->gcTyp e == WillBeGarbageCollectedObject); 89 ASSERT(wrapperTypeInfo->gcType == RefCountedObject || wrapperTypeInfo->gcTyp e == WillBeGarbageCollectedObject);
89 #endif 90 #endif
90 91
91 // Clear out the last internal field, which is assumed to contain a valid pe rsistent pointer value. 92 // Clear out the last internal field, which is assumed to contain a valid pe rsistent pointer value.
92 if (wrapperTypeInfo->gcType == GarbageCollectedObject) { 93 if (wrapperTypeInfo->gcType == GarbageCollectedObject) {
93 wrapper->SetAlignedPointerInInternalField(wrapper->InternalFieldCount() - 1, 0); 94 wrapper->SetAlignedPointerInInternalField(wrapper->InternalFieldCount() - 1, 0);
94 } else if (wrapperTypeInfo->gcType == WillBeGarbageCollectedObject) { 95 } else if (wrapperTypeInfo->gcType == WillBeGarbageCollectedObject) {
95 #if ENABLE(OILPAN) 96 #if ENABLE(OILPAN)
96 wrapper->SetAlignedPointerInInternalField(wrapper->InternalFieldCount() - 1, 0); 97 wrapper->SetAlignedPointerInInternalField(wrapper->InternalFieldCount() - 1, 0);
97 #endif 98 #endif
98 } 99 }
99 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperObjectIndex, object); 100 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperObjectIndex, internalP ointer);
100 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperTypeIndex, const_cast< WrapperTypeInfo*>(wrapperTypeInfo)); 101 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperTypeIndex, const_cast< WrapperTypeInfo*>(wrapperTypeInfo));
101 } 102 }
102 103
103 inline void V8DOMWrapper::setNativeInfoWithPersistentHandle(v8::Handle<v8::Objec t> wrapper, const WrapperTypeInfo* wrapperTypeInfo, void* object, PersistentNode * handle) 104 inline void V8DOMWrapper::setNativeInfoWithPersistentHandle(v8::Handle<v8::Objec t> wrapper, const WrapperTypeInfo* wrapperTypeInfo, ScriptWrappableBase* interna lPointer, PersistentNode* handle)
104 { 105 {
105 ASSERT(wrapper->InternalFieldCount() >= 3); 106 ASSERT(wrapper->InternalFieldCount() >= 3);
106 ASSERT(object); 107 ASSERT(internalPointer);
107 ASSERT(wrapperTypeInfo); 108 ASSERT(wrapperTypeInfo);
108 ASSERT(wrapperTypeInfo->gcType != RefCountedObject); 109 ASSERT(wrapperTypeInfo->gcType != RefCountedObject);
109 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperObjectIndex, object); 110 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperObjectIndex, internalP ointer);
110 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperTypeIndex, const_cast< WrapperTypeInfo*>(wrapperTypeInfo)); 111 wrapper->SetAlignedPointerInInternalField(v8DOMWrapperTypeIndex, const_cast< WrapperTypeInfo*>(wrapperTypeInfo));
111 // Persistent handle is stored in the last internal field. 112 // Persistent handle is stored in the last internal field.
112 wrapper->SetAlignedPointerInInternalField(wrapper->InternalFieldCount() - 1, handle); 113 wrapper->SetAlignedPointerInInternalField(wrapper->InternalFieldCount() - 1, handle);
113 } 114 }
114 115
115 inline void V8DOMWrapper::clearNativeInfo(v8::Handle<v8::Object> wrapper, const WrapperTypeInfo* wrapperTypeInfo) 116 inline void V8DOMWrapper::clearNativeInfo(v8::Handle<v8::Object> wrapper, const WrapperTypeInfo* wrapperTypeInfo)
116 { 117 {
117 ASSERT(wrapper->InternalFieldCount() >= 2); 118 ASSERT(wrapper->InternalFieldCount() >= 2);
118 ASSERT(wrapperTypeInfo); 119 ASSERT(wrapperTypeInfo);
119 // clearNativeInfo() is used only by NP objects, which are not garbage colle cted. 120 // clearNativeInfo() is used only by NP objects, which are not garbage colle cted.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 v8::Handle<v8::Context> context() const { return m_context; } 173 v8::Handle<v8::Context> context() const { return m_context; }
173 174
174 private: 175 private:
175 bool m_didEnterContext; 176 bool m_didEnterContext;
176 v8::Handle<v8::Context> m_context; 177 v8::Handle<v8::Context> m_context;
177 }; 178 };
178 179
179 } // namespace blink 180 } // namespace blink
180 181
181 #endif // V8DOMWrapper_h 182 #endif // V8DOMWrapper_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698