OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 // This doesn't happen with other compilers which support EBCO. All the | 71 // This doesn't happen with other compilers which support EBCO. All the |
72 // addresses in the above example will be 0x1000 with EBCO supported. | 72 // addresses in the above example will be 0x1000 with EBCO supported. |
73 // | 73 // |
74 // Since v8::Object::SetAlignedPointerInInternalField requires the pointers to | 74 // Since v8::Object::SetAlignedPointerInInternalField requires the pointers to |
75 // be aligned, we need a hack to specify at least 4 byte alignment to MSVC. | 75 // be aligned, we need a hack to specify at least 4 byte alignment to MSVC. |
76 __declspec(align(4)) | 76 __declspec(align(4)) |
77 #endif | 77 #endif |
78 class ScriptWrappableBase { | 78 class ScriptWrappableBase { |
79 public: | 79 public: |
80 template<typename T> | 80 template<typename T> |
81 static T* fromInternalPointer(ScriptWrappableBase* internalPointer) | 81 T* toImpl() |
82 { | 82 { |
83 // Check if T* is castable to ScriptWrappableBase*, which means T | 83 // Check if T* is castable to ScriptWrappableBase*, which means T |
84 // doesn't have two or more ScriptWrappableBase as superclasses. | 84 // doesn't have two or more ScriptWrappableBase as superclasses. |
85 // If T has two ScriptWrappableBase as superclasses, conversions | 85 // If T has two ScriptWrappableBase as superclasses, conversions |
86 // from T* to ScriptWrappableBase* are ambiguous. | 86 // from T* to ScriptWrappableBase* are ambiguous. |
87 ASSERT(static_cast<ScriptWrappableBase*>(static_cast<T*>(internalPointer
))); | 87 ASSERT(static_cast<ScriptWrappableBase*>(static_cast<T*>(this))); |
88 // The internal pointers must be aligned to at least 4 byte alignment. | 88 // The internal pointers must be aligned to at least 4 byte alignment. |
89 ASSERT((reinterpret_cast<intptr_t>(internalPointer) & 0x3) == 0); | 89 ASSERT((reinterpret_cast<intptr_t>(this) & 0x3) == 0); |
90 return static_cast<T*>(internalPointer); | 90 return static_cast<T*>(this); |
91 } | 91 } |
92 ScriptWrappableBase* toInternalPointer() | 92 ScriptWrappableBase* toScriptWrappableBase() |
93 { | 93 { |
94 // The internal pointers must be aligned to at least 4 byte alignment. | 94 // The internal pointers must be aligned to at least 4 byte alignment. |
95 ASSERT((reinterpret_cast<intptr_t>(this) & 0x3) == 0); | 95 ASSERT((reinterpret_cast<intptr_t>(this) & 0x3) == 0); |
96 return this; | 96 return this; |
97 } | 97 } |
98 | 98 |
99 void assertWrapperSanity(v8::Local<v8::Object> object) | 99 void assertWrapperSanity(v8::Local<v8::Object> object) |
100 { | 100 { |
101 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(object.IsEmpty() | 101 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(object.IsEmpty() |
102 || object->GetAlignedPointerFromInternalField(v8DOMWrapperObjectInde
x) == toInternalPointer()); | 102 || object->GetAlignedPointerFromInternalField(v8DOMWrapperObjectInde
x) == toScriptWrappableBase()); |
103 } | 103 } |
104 }; | 104 }; |
105 | 105 |
106 /** | 106 /** |
107 * ScriptWrappable wraps a V8 object and its WrapperTypeInfo. | 107 * ScriptWrappable wraps a V8 object and its WrapperTypeInfo. |
108 * | 108 * |
109 * ScriptWrappable acts much like a v8::Persistent<> in that it keeps a | 109 * ScriptWrappable acts much like a v8::Persistent<> in that it keeps a |
110 * V8 object alive. Under the hood, however, it keeps either a TypeInfo | 110 * V8 object alive. Under the hood, however, it keeps either a TypeInfo |
111 * object or an actual v8 persistent (or is empty). | 111 * object or an actual v8 persistent (or is empty). |
112 * | 112 * |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 v8::Persistent<v8::Object> persistent; | 243 v8::Persistent<v8::Object> persistent; |
244 getPersistent(&persistent); | 244 getPersistent(&persistent); |
245 isolate->SetReference(parent, persistent); | 245 isolate->SetReference(parent, persistent); |
246 } | 246 } |
247 | 247 |
248 template<typename V8T, typename T> | 248 template<typename V8T, typename T> |
249 static void assertWrapperSanity(v8::Local<v8::Object> object, T* objectAsT) | 249 static void assertWrapperSanity(v8::Local<v8::Object> object, T* objectAsT) |
250 { | 250 { |
251 ASSERT(objectAsT); | 251 ASSERT(objectAsT); |
252 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(object.IsEmpty() | 252 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(object.IsEmpty() |
253 || object->GetAlignedPointerFromInternalField(v8DOMWrapperObjectInde
x) == V8T::toInternalPointer(objectAsT)); | 253 || object->GetAlignedPointerFromInternalField(v8DOMWrapperObjectInde
x) == V8T::toScriptWrappableBase(objectAsT)); |
254 } | 254 } |
255 | 255 |
256 template<typename V8T, typename T> | 256 template<typename V8T, typename T> |
257 static void assertWrapperSanity(void* object, T* objectAsT) | 257 static void assertWrapperSanity(void* object, T* objectAsT) |
258 { | 258 { |
259 ASSERT_NOT_REACHED(); | 259 ASSERT_NOT_REACHED(); |
260 } | 260 } |
261 | 261 |
262 template<typename V8T, typename T> | 262 template<typename V8T, typename T> |
263 static void assertWrapperSanity(ScriptWrappable* object, T* objectAsT) | 263 static void assertWrapperSanity(ScriptWrappable* object, T* objectAsT) |
264 { | 264 { |
265 ASSERT(object); | 265 ASSERT(object); |
266 ASSERT(objectAsT); | 266 ASSERT(objectAsT); |
267 v8::Object* value = object->getRawValue(); | 267 v8::Object* value = object->getRawValue(); |
268 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(value == 0 | 268 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(value == 0 |
269 || value->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex
) == V8T::toInternalPointer(objectAsT)); | 269 || value->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex
) == V8T::toScriptWrappableBase(objectAsT)); |
270 } | 270 } |
271 | 271 |
272 using ScriptWrappableBase::assertWrapperSanity; | 272 using ScriptWrappableBase::assertWrapperSanity; |
273 | 273 |
274 inline bool containsWrapper() const { return (m_wrapperOrTypeInfo & 1); } | 274 inline bool containsWrapper() const { return (m_wrapperOrTypeInfo & 1); } |
275 inline bool containsTypeInfo() const { return m_wrapperOrTypeInfo && !(m_wra
pperOrTypeInfo & 1); } | 275 inline bool containsTypeInfo() const { return m_wrapperOrTypeInfo && !(m_wra
pperOrTypeInfo & 1); } |
276 | 276 |
277 #if !ENABLE(OILPAN) | 277 #if !ENABLE(OILPAN) |
278 protected: | 278 protected: |
279 virtual ~ScriptWrappable() | 279 virtual ~ScriptWrappable() |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 virtual const WrapperTypeInfo* wrapperTypeInfo() const OVERRIDE \ | 366 virtual const WrapperTypeInfo* wrapperTypeInfo() const OVERRIDE \ |
367 { \ | 367 { \ |
368 return &s_wrapperTypeInfo; \ | 368 return &s_wrapperTypeInfo; \ |
369 } \ | 369 } \ |
370 private: \ | 370 private: \ |
371 static const WrapperTypeInfo& s_wrapperTypeInfo | 371 static const WrapperTypeInfo& s_wrapperTypeInfo |
372 | 372 |
373 } // namespace blink | 373 } // namespace blink |
374 | 374 |
375 #endif // ScriptWrappable_h | 375 #endif // ScriptWrappable_h |
OLD | NEW |