22 typedef uintptr_t PersistentContainerValue;
23 static const uintptr_t kPersistentContainerNotFound = 0;
24 enum PersistentContainerCallbackType {
28 kWeakWithInternalFields
37 template<
typename K,
typename V>
41 typedef std::map<K, PersistentContainerValue> Impl;
42 typedef typename Impl::iterator Iterator;
44 static bool Empty(Impl* impl) {
return impl->empty(); }
45 static size_t Size(Impl* impl) {
return impl->size(); }
46 static void Swap(Impl& a, Impl& b) { std::swap(a, b); }
47 static Iterator Begin(Impl* impl) {
return impl->begin(); }
48 static Iterator End(Impl* impl) {
return impl->end(); }
49 static K Key(Iterator it) {
return it->first; }
50 static PersistentContainerValue
Value(Iterator it) {
return it->second; }
51 static PersistentContainerValue
Set(Impl* impl, K key,
52 PersistentContainerValue value) {
53 std::pair<Iterator, bool> res = impl->insert(std::make_pair(key, value));
54 PersistentContainerValue old_value = kPersistentContainerNotFound;
56 old_value = res.first->second;
57 res.first->second = value;
61 static PersistentContainerValue Get(Impl* impl, K key) {
62 Iterator it = impl->find(key);
63 if (it == impl->end())
return kPersistentContainerNotFound;
66 static PersistentContainerValue Remove(Impl* impl, K key) {
67 Iterator it = impl->find(key);
68 if (it == impl->end())
return kPersistentContainerNotFound;
69 PersistentContainerValue value = it->second;
84 template<
typename K,
typename V>
88 static const PersistentContainerCallbackType kCallbackType = kNotWeak;
91 typedef void WeakCallbackDataType;
93 static WeakCallbackDataType* WeakCallbackParameter(
97 static MapType* MapFromWeakCallbackInfo(
101 static K KeyFromWeakCallbackInfo(
105 static void DisposeCallbackData(WeakCallbackDataType* data) { }
110 template <
typename K,
typename V>
113 template <
typename T>
114 struct RemovePointer;
118 static const PersistentContainerCallbackType kCallbackType = kNotWeak;
120 typedef void WeakCallbackDataType;
122 static WeakCallbackDataType* WeakCallbackParameter(
MapType* map,
const K& key,
126 static MapType* MapFromWeakCallbackInfo(
130 static K KeyFromWeakCallbackInfo(
134 static void DisposeCallbackData(WeakCallbackDataType* data) {}
135 static void OnWeakCallback(
142 template <
typename T>
143 struct RemovePointer<T*> {
159 template <
typename K,
typename V,
typename Traits>
162 Isolate* GetIsolate() {
return isolate_; }
167 size_t Size() {
return Traits::Size(&impl_); }
172 bool IsWeak() {
return Traits::kCallbackType != kNotWeak; }
178 return Local<V>::New(isolate_, FromVal(Traits::Get(&impl_, key)));
185 return Traits::Get(&impl_, key) != kPersistentContainerNotFound;
194 return SetReturnValueFromVal(&returnValue, Traits::Get(&impl_, key));
202 "Used TracedGlobal and EmbedderHeapTracer::RegisterEmbedderReference",
203 inline void RegisterExternallyReferencedObject(K& key));
209 return Release(Traits::Remove(&impl_, key)).Pass();
217 typedef typename Traits::Iterator It;
220 while (!Traits::Empty(&impl_)) {
221 typename Traits::Impl impl;
222 Traits::Swap(impl_, impl);
223 for (It i = Traits::Begin(&impl); i != Traits::End(&impl); ++i) {
224 Traits::Dispose(isolate_,
Release(Traits::Value(i)).Pass(),
238 : value_(other.value_) { }
243 bool IsEmpty()
const {
244 return value_ == kPersistentContainerNotFound;
248 return SetReturnValueFromVal(&returnValue, value_);
251 value_ = kPersistentContainerNotFound;
254 value_ = other.value_;
265 void operator=(PersistentContainerValue value) {
269 PersistentContainerValue value_;
288 : isolate_(isolate), label_(nullptr) {}
289 PersistentValueMapBase(Isolate* isolate,
const char* label)
290 : isolate_(isolate), label_(label) {}
292 ~PersistentValueMapBase() {
Clear(); }
294 Isolate* isolate() {
return isolate_; }
295 typename Traits::Impl* impl() {
return &impl_; }
297 static V* FromVal(PersistentContainerValue v) {
298 return reinterpret_cast<V*>(v);
301 static PersistentContainerValue ClearAndLeak(Global<V>* persistent) {
302 V* v = persistent->val_;
303 persistent->val_ =
nullptr;
304 return reinterpret_cast<PersistentContainerValue>(v);
307 static PersistentContainerValue Leak(Global<V>* persistent) {
308 return reinterpret_cast<PersistentContainerValue>(persistent->val_);
319 if (Traits::kCallbackType != kNotWeak && p.
IsWeak()) {
320 Traits::DisposeCallbackData(
321 p.template ClearWeak<typename Traits::WeakCallbackDataType>());
326 void RemoveWeak(
const K& key) {
328 p.val_ = FromVal(Traits::Remove(&impl_, key));
332 void AnnotateStrongRetainer(Global<V>* persistent) {
333 persistent->AnnotateStrongRetainer(label_);
337 PersistentValueMapBase(PersistentValueMapBase&);
338 void operator=(PersistentValueMapBase&);
340 static bool SetReturnValueFromVal(ReturnValue<Value>* returnValue,
341 PersistentContainerValue value) {
342 bool hasValue = value != kPersistentContainerNotFound;
344 returnValue->SetInternal(
345 *reinterpret_cast<internal::Address*>(FromVal(value)));
351 typename Traits::Impl impl_;
355 template <
typename K,
typename V,
typename Traits>
357 PersistentValueMapBase<K, V, Traits>::RegisterExternallyReferencedObject(
359 assert(Contains(key));
360 V8::RegisterExternallyReferencedObject(
361 reinterpret_cast<internal::Address*>(FromVal(Traits::Get(&impl_, key))),
362 reinterpret_cast<internal::Isolate*>(GetIsolate()));
365 template <
typename K,
typename V,
typename Traits>
383 Global<V> persistent(this->isolate(), value);
399 if (Traits::kCallbackType == kNotWeak) {
400 this->AnnotateStrongRetainer(persistent);
402 WeakCallbackType callback_type =
403 Traits::kCallbackType == kWeakWithInternalFields
404 ? WeakCallbackType::kInternalFields
405 : WeakCallbackType::kParameter;
407 persistent->template SetWeak<typename Traits::WeakCallbackDataType>(
408 Traits::WeakCallbackParameter(
this, key, value), WeakCallback,
411 PersistentContainerValue old_value =
412 Traits::Set(this->impl(), key, this->ClearAndLeak(persistent));
413 return this->
Release(old_value).Pass();
422 *reference = this->Leak(&value);
427 static void WeakCallback(
429 if (Traits::kCallbackType != kNotWeak) {
431 Traits::MapFromWeakCallbackInfo(data);
432 K key = Traits::KeyFromWeakCallbackInfo(data);
433 Traits::Dispose(data.GetIsolate(),
434 persistentValueMap->
Remove(key).Pass(), key);
435 Traits::DisposeCallbackData(data.GetParameter());
441 template <
typename K,
typename V,
typename Traits>
459 Global<V> persistent(this->isolate(), value);
475 if (Traits::kCallbackType == kNotWeak) {
476 this->AnnotateStrongRetainer(persistent);
478 WeakCallbackType callback_type =
479 Traits::kCallbackType == kWeakWithInternalFields
480 ? WeakCallbackType::kInternalFields
481 : WeakCallbackType::kParameter;
483 persistent->template SetWeak<typename Traits::WeakCallbackDataType>(
484 Traits::WeakCallbackParameter(
this, key, value), OnWeakCallback,
487 PersistentContainerValue old_value =
488 Traits::Set(this->impl(), key, this->ClearAndLeak(persistent));
489 return this->
Release(old_value).Pass();
498 *reference = this->Leak(&value);
503 static void OnWeakCallback(
505 if (Traits::kCallbackType != kNotWeak) {
506 auto map = Traits::MapFromWeakCallbackInfo(data);
507 K key = Traits::KeyFromWeakCallbackInfo(data);
508 map->RemoveWeak(key);
509 Traits::OnWeakCallback(data);
510 data.SetSecondPassCallback(SecondWeakCallback);
514 static void SecondWeakCallback(
515 const WeakCallbackInfo<typename Traits::WeakCallbackDataType>& data) {
516 Traits::DisposeWeak(data);
528 template<
typename K,
typename V,
529 typename Traits = DefaultPersistentValueMapTraits<K, V> >
544 template <
typename K,
typename V,
555 typedef std::vector<PersistentContainerValue> Impl;
557 static void Append(Impl* impl, PersistentContainerValue value) {
558 impl->push_back(value);
560 static bool IsEmpty(
const Impl* impl) {
561 return impl->empty();
563 static size_t Size(
const Impl* impl) {
566 static PersistentContainerValue Get(
const Impl* impl,
size_t i) {
567 return (i < impl->size()) ? impl->at(i) : kPersistentContainerNotFound;
569 static void ReserveCapacity(Impl* impl,
size_t capacity) {
570 impl->reserve(capacity);
572 static void Clear(Impl* impl) {
588 template<
typename V,
typename Traits = DefaultPersistentValueVectorTraits>
602 Traits::Append(&impl_, ClearAndLeak(&persistent));
609 Traits::Append(&impl_, ClearAndLeak(&persistent));
616 return Traits::IsEmpty(&impl_);
623 return Traits::Size(&impl_);
630 return Local<V>::New(isolate_, FromVal(Traits::Get(&impl_, index)));
637 size_t length = Traits::Size(&impl_);
638 for (
size_t i = 0; i < length; i++) {
640 p.val_ = FromVal(Traits::Get(&impl_, i));
642 Traits::Clear(&impl_);
650 Traits::ReserveCapacity(&impl_, capacity);
654 static PersistentContainerValue ClearAndLeak(
Global<V>* persistent) {
655 V* v = persistent->val_;
656 persistent->val_ =
nullptr;
657 return reinterpret_cast<PersistentContainerValue>(v);
660 static V* FromVal(PersistentContainerValue v) {
661 return reinterpret_cast<V*>(v);
665 typename Traits::Impl impl_;
Global< V > Set(const K &key, Global< V > value)
Definition: v8-util.h:466
size_t Size() const
Definition: v8-util.h:622
size_t Size()
Definition: v8-util.h:167
bool IsEmpty() const
Definition: v8-util.h:615
Global< V > Set(const K &key, Global< V > value, PersistentValueReference *reference)
Definition: v8-util.h:420
Global< V > SetUnique(const K &key, Global< V > *persistent)
Definition: v8-util.h:398
V8_INLINE bool IsWeak() const
Definition: v8.h:9796
Definition: v8-util.h:234
Global< V > Set(const K &key, Global< V > value)
Definition: v8-util.h:390
static Global< V > Release(PersistentContainerValue v)
Definition: v8-util.h:316
Definition: v8-util.h:160
void ReserveCapacity(size_t capacity)
Definition: v8-util.h:649
PersistentValueReference GetReference(const K &key)
Definition: v8-util.h:282
Local< V > Get(const K &key)
Definition: v8-util.h:177
Definition: v8-internal.h:15
Global< V > Set(const K &key, Local< V > value)
Definition: v8-util.h:458
bool SetReturnValue(const K &key, ReturnValue< Value > returnValue)
Definition: v8-util.h:192
Definition: v8-util.h:442
Local< V > Get(size_t index) const
Definition: v8-util.h:629
Definition: v8-util.h:589
Global< V > Set(const K &key, Local< V > value)
Definition: v8-util.h:382
static V8_INLINE Local< T > New(Isolate *isolate, Local< T > that)
Definition: v8.h:9697
Global< V > Set(const K &key, Global< V > value, PersistentValueReference *reference)
Definition: v8-util.h:496
Definition: v8-util.h:546
void Clear()
Definition: v8-util.h:216
void Append(Local< V > value)
Definition: v8-util.h:600
Definition: v8-util.h:111
Global< V > Remove(const K &key)
Definition: v8-util.h:208
Definition: v8-util.h:553
Definition: v8-util.h:530
bool IsWeak()
Definition: v8-util.h:172
Global< V > SetUnique(const K &key, Global< V > *persistent)
Definition: v8-util.h:474
void Clear()
Definition: v8-util.h:636
V8_INLINE void Reset()
Definition: v8.h:9805
V8_DEPRECATE_SOON("Used TracedGlobal and EmbedderHeapTracer::RegisterEmbedderReference", inline void RegisterExternallyReferencedObject(K &key))
Definition: v8-util.h:366
Global Pass()
Definition: v8.h:807
bool Contains(const K &key)
Definition: v8-util.h:184
void Append(Global< V > persistent)
Definition: v8-util.h:608