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

Side by Side Diff: include/v8-util.h

Issue 863443005: Support old and new weak handle API (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Undo cast that was not needed. Created 5 years, 11 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
« no previous file with comments | « include/v8.h ('k') | src/api.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_UTIL_H_ 5 #ifndef V8_UTIL_H_
6 #define V8_UTIL_H_ 6 #define V8_UTIL_H_
7 7
8 #include "v8.h" 8 #include "v8.h"
9 #include <map> 9 #include <map>
10 #include <vector> 10 #include <vector>
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 } 98 }
99 static K KeyFromWeakCallbackData( 99 static K KeyFromWeakCallbackData(
100 const WeakCallbackData<V, WeakCallbackDataType>& data) { 100 const WeakCallbackData<V, WeakCallbackDataType>& data) {
101 return K(); 101 return K();
102 } 102 }
103 static void DisposeCallbackData(WeakCallbackDataType* data) { } 103 static void DisposeCallbackData(WeakCallbackDataType* data) { }
104 static void Dispose(Isolate* isolate, UniquePersistent<V> value, K key) { } 104 static void Dispose(Isolate* isolate, UniquePersistent<V> value, K key) { }
105 }; 105 };
106 106
107 107
108 template <typename K, typename V>
109 class DefaultPhantomPersistentValueMapTraits : public StdMapTraits<K, V> {
110 private:
111 template <typename T>
112 struct RemovePointer;
113
114 public:
115 // Weak callback & friends:
116 static const PersistentContainerCallbackType kCallbackType = kNotWeak;
117 typedef PersistentValueMap<
118 K, V, DefaultPhantomPersistentValueMapTraits<K, V> > MapType;
119 typedef void PhantomCallbackDataType;
120
121 static PhantomCallbackDataType* PhantomCallbackParameter(MapType* map,
122 const K& key,
123 Local<V> value) {
124 return NULL;
125 }
126 static MapType* MapFromPhantomCallbackData(
127 const PhantomCallbackData<PhantomCallbackDataType>& data) {
128 return NULL;
129 }
130 static K KeyFromPhantomCallbackData(
131 const PhantomCallbackData<PhantomCallbackDataType>& data) {
132 return K();
133 }
134 static void DisposeCallbackData(PhantomCallbackDataType* data) {}
135 static void Dispose(Isolate* isolate, UniquePersistent<V> value, K key) {}
136
137 private:
138 template <typename T>
139 struct RemovePointer<T*> {
140 typedef T Type;
141 };
142 };
143
144
108 /** 145 /**
109 * A map wrapper that allows using UniquePersistent as a mapped value. 146 * A map wrapper that allows using UniquePersistent as a mapped value.
110 * C++11 embedders don't need this class, as they can use UniquePersistent 147 * C++11 embedders don't need this class, as they can use UniquePersistent
111 * directly in std containers. 148 * directly in std containers.
112 * 149 *
113 * The map relies on a backing map, whose type and accessors are described 150 * The map relies on a backing map, whose type and accessors are described
114 * by the Traits class. The backing map will handle values of type 151 * by the Traits class. The backing map will handle values of type
115 * PersistentContainerValue, with all conversion into and out of V8 152 * PersistentContainerValue, with all conversion into and out of V8
116 * handles being transparently handled by this class. 153 * handles being transparently handled by this class.
117 */ 154 */
118 template<typename K, typename V, typename Traits> 155 template <typename K, typename V, typename Traits>
119 class PersistentValueMap { 156 class PersistentValueMapBase {
120 public: 157 public:
121 explicit PersistentValueMap(Isolate* isolate) : isolate_(isolate) {}
122
123 ~PersistentValueMap() { Clear(); }
124
125 Isolate* GetIsolate() { return isolate_; } 158 Isolate* GetIsolate() { return isolate_; }
126 159
127 /** 160 /**
128 * Return size of the map. 161 * Return size of the map.
129 */ 162 */
130 size_t Size() { return Traits::Size(&impl_); } 163 size_t Size() { return Traits::Size(&impl_); }
131 164
132 /** 165 /**
133 * Return whether the map holds weak persistents. 166 * Return whether the map holds weak persistents.
134 */ 167 */
(...skipping 26 matching lines...) Expand all
161 * Call Isolate::SetReference with the given parent and the map value. 194 * Call Isolate::SetReference with the given parent and the map value.
162 */ 195 */
163 void SetReference(const K& key, 196 void SetReference(const K& key,
164 const Persistent<Object>& parent) { 197 const Persistent<Object>& parent) {
165 GetIsolate()->SetReference( 198 GetIsolate()->SetReference(
166 reinterpret_cast<internal::Object**>(parent.val_), 199 reinterpret_cast<internal::Object**>(parent.val_),
167 reinterpret_cast<internal::Object**>(FromVal(Traits::Get(&impl_, key)))); 200 reinterpret_cast<internal::Object**>(FromVal(Traits::Get(&impl_, key))));
168 } 201 }
169 202
170 /** 203 /**
171 * Put value into map. Depending on Traits::kIsWeak, the value will be held
172 * by the map strongly or weakly.
173 * Returns old value as UniquePersistent.
174 */
175 UniquePersistent<V> Set(const K& key, Local<V> value) {
176 UniquePersistent<V> persistent(isolate_, value);
177 return SetUnique(key, &persistent);
178 }
179
180 /**
181 * Put value into map, like Set(const K&, Local<V>).
182 */
183 UniquePersistent<V> Set(const K& key, UniquePersistent<V> value) {
184 return SetUnique(key, &value);
185 }
186
187 /**
188 * Return value for key and remove it from the map. 204 * Return value for key and remove it from the map.
189 */ 205 */
190 UniquePersistent<V> Remove(const K& key) { 206 UniquePersistent<V> Remove(const K& key) {
191 return Release(Traits::Remove(&impl_, key)).Pass(); 207 return Release(Traits::Remove(&impl_, key)).Pass();
192 } 208 }
193 209
194 /** 210 /**
195 * Traverses the map repeatedly, 211 * Traverses the map repeatedly,
196 * in case side effects of disposal cause insertions. 212 * in case side effects of disposal cause insertions.
197 **/ 213 **/
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 return SetReturnValueFromVal(&returnValue, value_); 246 return SetReturnValueFromVal(&returnValue, value_);
231 } 247 }
232 void Reset() { 248 void Reset() {
233 value_ = kPersistentContainerNotFound; 249 value_ = kPersistentContainerNotFound;
234 } 250 }
235 void operator=(const PersistentValueReference& other) { 251 void operator=(const PersistentValueReference& other) {
236 value_ = other.value_; 252 value_ = other.value_;
237 } 253 }
238 254
239 private: 255 private:
240 friend class PersistentValueMap; 256 friend class PersistentValueMapBase;
257 friend class PersistentValueMap<K, V, Traits>;
258 friend class PhantomPersistentValueMap<K, V, Traits>;
241 259
242 explicit PersistentValueReference(PersistentContainerValue value) 260 explicit PersistentValueReference(PersistentContainerValue value)
243 : value_(value) { } 261 : value_(value) { }
244 262
245 void operator=(PersistentContainerValue value) { 263 void operator=(PersistentContainerValue value) {
246 value_ = value; 264 value_ = value;
247 } 265 }
248 266
249 PersistentContainerValue value_; 267 PersistentContainerValue value_;
250 }; 268 };
251 269
252 /** 270 /**
253 * Get a reference to a map value. This enables fast, repeated access 271 * Get a reference to a map value. This enables fast, repeated access
254 * to a value stored in the map while the map remains unchanged. 272 * to a value stored in the map while the map remains unchanged.
255 * 273 *
256 * Careful: This is potentially unsafe, so please use with care. 274 * Careful: This is potentially unsafe, so please use with care.
257 * The value will become invalid if the value for this key changes 275 * The value will become invalid if the value for this key changes
258 * in the underlying map, as a result of Set or Remove for the same 276 * in the underlying map, as a result of Set or Remove for the same
259 * key; as a result of the weak callback for the same key; or as a 277 * key; as a result of the weak callback for the same key; or as a
260 * result of calling Clear() or destruction of the map. 278 * result of calling Clear() or destruction of the map.
261 */ 279 */
262 PersistentValueReference GetReference(const K& key) { 280 PersistentValueReference GetReference(const K& key) {
263 return PersistentValueReference(Traits::Get(&impl_, key)); 281 return PersistentValueReference(Traits::Get(&impl_, key));
264 } 282 }
265 283
284 protected:
285 explicit PersistentValueMapBase(Isolate* isolate) : isolate_(isolate) {}
286
287 ~PersistentValueMapBase() { Clear(); }
288
289 Isolate* isolate() { return isolate_; }
290 typename Traits::Impl* impl() { return &impl_; }
291
292 static V* FromVal(PersistentContainerValue v) {
293 return reinterpret_cast<V*>(v);
294 }
295
296 static PersistentContainerValue ClearAndLeak(
297 UniquePersistent<V>* persistent) {
298 V* v = persistent->val_;
299 persistent->val_ = 0;
300 return reinterpret_cast<PersistentContainerValue>(v);
301 }
302
303 static PersistentContainerValue Leak(UniquePersistent<V>* persistent) {
304 return reinterpret_cast<PersistentContainerValue>(persistent->val_);
305 }
306
266 /** 307 /**
267 * Put a value into the map and update the reference. 308 * Return a container value as UniquePersistent and make sure the weak
268 * Restrictions of GetReference apply here as well. 309 * callback is properly disposed of. All remove functionality should go
310 * through this.
269 */ 311 */
270 UniquePersistent<V> Set(const K& key, UniquePersistent<V> value, 312 static UniquePersistent<V> Release(PersistentContainerValue v) {
271 PersistentValueReference* reference) { 313 UniquePersistent<V> p;
272 *reference = Leak(&value); 314 p.val_ = FromVal(v);
315 if (Traits::kCallbackType != kNotWeak && p.IsWeak()) {
316 Traits::DisposeCallbackData(
317 p.template ClearWeak<typename Traits::WeakCallbackDataType>());
318 }
319 return p.Pass();
320 }
321
322 private:
323 PersistentValueMapBase(PersistentValueMapBase&);
324 void operator=(PersistentValueMapBase&);
325
326 static bool SetReturnValueFromVal(ReturnValue<Value>* returnValue,
327 PersistentContainerValue value) {
328 bool hasValue = value != kPersistentContainerNotFound;
329 if (hasValue) {
330 returnValue->SetInternal(
331 *reinterpret_cast<internal::Object**>(FromVal(value)));
332 }
333 return hasValue;
334 }
335
336 Isolate* isolate_;
337 typename Traits::Impl impl_;
338 };
339
340
341 template <typename K, typename V, typename Traits>
342 class PersistentValueMap : public PersistentValueMapBase<K, V, Traits> {
343 public:
344 explicit PersistentValueMap(Isolate* isolate)
345 : PersistentValueMapBase<K, V, Traits>(isolate) {}
346
347 typedef
348 typename PersistentValueMapBase<K, V, Traits>::PersistentValueReference
349 PersistentValueReference;
350
351 /**
352 * Put value into map. Depending on Traits::kIsWeak, the value will be held
353 * by the map strongly or weakly.
354 * Returns old value as UniquePersistent.
355 */
356 UniquePersistent<V> Set(const K& key, Local<V> value) {
357 UniquePersistent<V> persistent(this->isolate(), value);
358 return SetUnique(key, &persistent);
359 }
360
361 /**
362 * Put value into map, like Set(const K&, Local<V>).
363 */
364 UniquePersistent<V> Set(const K& key, UniquePersistent<V> value) {
273 return SetUnique(key, &value); 365 return SetUnique(key, &value);
274 } 366 }
275 367
276 private:
277 PersistentValueMap(PersistentValueMap&);
278 void operator=(PersistentValueMap&);
279
280 /** 368 /**
281 * Put the value into the map, and set the 'weak' callback when demanded 369 * Put the value into the map, and set the 'weak' callback when demanded
282 * by the Traits class. 370 * by the Traits class.
283 */ 371 */
284 UniquePersistent<V> SetUnique(const K& key, UniquePersistent<V>* persistent) { 372 UniquePersistent<V> SetUnique(const K& key, UniquePersistent<V>* persistent) {
285 if (Traits::kCallbackType != kNotWeak) { 373 if (Traits::kCallbackType != kNotWeak) {
286 Local<V> value(Local<V>::New(isolate_, *persistent)); 374 Local<V> value(Local<V>::New(this->isolate(), *persistent));
287 persistent->template SetWeak<typename Traits::WeakCallbackDataType>( 375 persistent->template SetWeak<typename Traits::WeakCallbackDataType>(
288 Traits::WeakCallbackParameter(this, key, value), WeakCallback); 376 Traits::WeakCallbackParameter(this, key, value), WeakCallback);
289 } 377 }
290 PersistentContainerValue old_value = 378 PersistentContainerValue old_value =
291 Traits::Set(&impl_, key, ClearAndLeak(persistent)); 379 Traits::Set(this->impl(), key, this->ClearAndLeak(persistent));
292 return Release(old_value).Pass(); 380 return this->Release(old_value).Pass();
293 } 381 }
294 382
383 /**
384 * Put a value into the map and update the reference.
385 * Restrictions of GetReference apply here as well.
386 */
387 UniquePersistent<V> Set(const K& key, UniquePersistent<V> value,
388 PersistentValueReference* reference) {
389 *reference = this->Leak(&value);
390 return SetUnique(key, &value);
391 }
392
393 private:
295 static void WeakCallback( 394 static void WeakCallback(
296 const WeakCallbackData<V, typename Traits::WeakCallbackDataType>& data) { 395 const WeakCallbackData<V, typename Traits::WeakCallbackDataType>& data) {
297 if (Traits::kCallbackType != kNotWeak) { 396 if (Traits::kCallbackType != kNotWeak) {
298 PersistentValueMap<K, V, Traits>* persistentValueMap = 397 PersistentValueMap<K, V, Traits>* persistentValueMap =
299 Traits::MapFromWeakCallbackData(data); 398 Traits::MapFromWeakCallbackData(data);
300 K key = Traits::KeyFromWeakCallbackData(data); 399 K key = Traits::KeyFromWeakCallbackData(data);
301 Traits::Dispose(data.GetIsolate(), 400 Traits::Dispose(data.GetIsolate(),
302 persistentValueMap->Remove(key).Pass(), key); 401 persistentValueMap->Remove(key).Pass(), key);
303 Traits::DisposeCallbackData(data.GetParameter()); 402 Traits::DisposeCallbackData(data.GetParameter());
304 } 403 }
305 } 404 }
405 };
306 406
307 static V* FromVal(PersistentContainerValue v) {
308 return reinterpret_cast<V*>(v);
309 }
310 407
311 static bool SetReturnValueFromVal( 408 template <typename K, typename V, typename Traits>
312 ReturnValue<Value>* returnValue, PersistentContainerValue value) { 409 class PhantomPersistentValueMap : public PersistentValueMapBase<K, V, Traits> {
313 bool hasValue = value != kPersistentContainerNotFound; 410 public:
314 if (hasValue) { 411 explicit PhantomPersistentValueMap(Isolate* isolate)
315 returnValue->SetInternal( 412 : PersistentValueMapBase<K, V, Traits>(isolate) {}
316 *reinterpret_cast<internal::Object**>(FromVal(value)));
317 }
318 return hasValue;
319 }
320 413
321 static PersistentContainerValue ClearAndLeak( 414 typedef
322 UniquePersistent<V>* persistent) { 415 typename PersistentValueMapBase<K, V, Traits>::PersistentValueReference
323 V* v = persistent->val_; 416 PersistentValueReference;
324 persistent->val_ = 0;
325 return reinterpret_cast<PersistentContainerValue>(v);
326 }
327 417
328 static PersistentContainerValue Leak( 418 /**
329 UniquePersistent<V>* persistent) { 419 * Put value into map. Depending on Traits::kIsWeak, the value will be held
330 return reinterpret_cast<PersistentContainerValue>(persistent->val_); 420 * by the map strongly or weakly.
421 * Returns old value as UniquePersistent.
422 */
423 UniquePersistent<V> Set(const K& key, Local<V> value) {
424 UniquePersistent<V> persistent(this->isolate(), value);
425 return SetUnique(key, &persistent);
331 } 426 }
332 427
333 /** 428 /**
334 * Return a container value as UniquePersistent and make sure the weak 429 * Put value into map, like Set(const K&, Local<V>).
335 * callback is properly disposed of. All remove functionality should go
336 * through this.
337 */ 430 */
338 static UniquePersistent<V> Release(PersistentContainerValue v) { 431 UniquePersistent<V> Set(const K& key, UniquePersistent<V> value) {
339 UniquePersistent<V> p; 432 return SetUnique(key, &value);
340 p.val_ = FromVal(v);
341 if (Traits::kCallbackType != kNotWeak && p.IsWeak()) {
342 Traits::DisposeCallbackData(
343 p.template ClearWeak<typename Traits::WeakCallbackDataType>());
344 }
345 return p.Pass();
346 } 433 }
347 434
348 Isolate* isolate_; 435 /**
349 typename Traits::Impl impl_; 436 * Put the value into the map, and set the 'weak' callback when demanded
437 * by the Traits class.
438 */
439 UniquePersistent<V> SetUnique(const K& key, UniquePersistent<V>* persistent) {
440 if (Traits::kCallbackType != kNotWeak) {
441 Local<V> value(Local<V>::New(this->isolate(), *persistent));
442 persistent->template SetPhantom<typename Traits::WeakCallbackDataType>(
443 Traits::WeakCallbackParameter(this, key, value), WeakCallback, 0, 1);
444 }
445 PersistentContainerValue old_value =
446 Traits::Set(this->impl(), key, this->ClearAndLeak(persistent));
447 return this->Release(old_value).Pass();
448 }
449
450 /**
451 * Put a value into the map and update the reference.
452 * Restrictions of GetReference apply here as well.
453 */
454 UniquePersistent<V> Set(const K& key, UniquePersistent<V> value,
455 PersistentValueReference* reference) {
456 *reference = this->Leak(&value);
457 return SetUnique(key, &value);
458 }
459
460 private:
461 static void WeakCallback(
462 const PhantomCallbackData<typename Traits::WeakCallbackDataType>& data) {
463 if (Traits::kCallbackType != kNotWeak) {
464 PhantomPersistentValueMap<K, V, Traits>* persistentValueMap =
465 Traits::MapFromPhantomCallbackData(data);
466 K key = Traits::KeyFromPhantomCallbackData(data);
467 Traits::Dispose(data.GetIsolate(), persistentValueMap->Remove(key).Pass(),
468 key);
469 Traits::DisposeCallbackData(data.GetParameter());
470 }
471 }
350 }; 472 };
351 473
352 474
353 /** 475 /**
354 * A map that uses UniquePersistent as value and std::map as the backing 476 * A map that uses UniquePersistent as value and std::map as the backing
355 * implementation. Persistents are held non-weak. 477 * implementation. Persistents are held non-weak.
356 * 478 *
357 * C++11 embedders don't need this class, as they can use 479 * C++11 embedders don't need this class, as they can use
358 * UniquePersistent directly in std containers. 480 * UniquePersistent directly in std containers.
359 */ 481 */
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 return reinterpret_cast<V*>(v); 600 return reinterpret_cast<V*>(v);
479 } 601 }
480 602
481 Isolate* isolate_; 603 Isolate* isolate_;
482 typename Traits::Impl impl_; 604 typename Traits::Impl impl_;
483 }; 605 };
484 606
485 } // namespace v8 607 } // namespace v8
486 608
487 #endif // V8_UTIL_H_ 609 #endif // V8_UTIL_H_
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698