aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/include/v8-util.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/include/v8-util.h')
-rw-r--r--deps/v8/include/v8-util.h49
1 files changed, 34 insertions, 15 deletions
diff --git a/deps/v8/include/v8-util.h b/deps/v8/include/v8-util.h
index b01d527754..6454a19b7e 100644
--- a/deps/v8/include/v8-util.h
+++ b/deps/v8/include/v8-util.h
@@ -117,26 +117,25 @@ class DefaultGlobalMapTraits : public StdMapTraits<K, V> {
public:
// Weak callback & friends:
static const PersistentContainerCallbackType kCallbackType = kNotWeak;
- typedef PersistentValueMap<K, V, DefaultGlobalMapTraits<K, V> > MapType;
- typedef void WeakCallbackInfoType;
+ typedef GlobalValueMap<K, V, DefaultGlobalMapTraits<K, V> > MapType;
+ typedef void WeakCallbackDataType;
- static WeakCallbackInfoType* WeakCallbackParameter(MapType* map, const K& key,
+ static WeakCallbackDataType* WeakCallbackParameter(MapType* map, const K& key,
Local<V> value) {
return nullptr;
}
static MapType* MapFromWeakCallbackInfo(
- const WeakCallbackInfo<WeakCallbackInfoType>& data) {
+ const WeakCallbackInfo<WeakCallbackDataType>& data) {
return nullptr;
}
static K KeyFromWeakCallbackInfo(
- const WeakCallbackInfo<WeakCallbackInfoType>& data) {
+ const WeakCallbackInfo<WeakCallbackDataType>& data) {
return K();
}
- static void DisposeCallbackData(WeakCallbackInfoType* data) {}
+ static void DisposeCallbackData(WeakCallbackDataType* data) {}
static void Dispose(Isolate* isolate, Global<V> value, K key) {}
- static void DisposeWeak(Isolate* isolate,
- const WeakCallbackInfo<WeakCallbackInfoType>& data,
- K key) {}
+ // This is a second pass callback, so SetSecondPassCallback cannot be called.
+ static void DisposeWeak(const WeakCallbackInfo<WeakCallbackDataType>& data) {}
private:
template <typename T>
@@ -453,7 +452,7 @@ class GlobalValueMap : public PersistentValueMapBase<K, V, Traits> {
: WeakCallbackType::kParameter;
Local<V> value(Local<V>::New(this->isolate(), *persistent));
persistent->template SetWeak<typename Traits::WeakCallbackDataType>(
- Traits::WeakCallbackParameter(this, key, value), WeakCallback,
+ Traits::WeakCallbackParameter(this, key, value), FirstWeakCallback,
callback_type);
}
PersistentContainerValue old_value =
@@ -472,16 +471,20 @@ class GlobalValueMap : public PersistentValueMapBase<K, V, Traits> {
}
private:
- static void WeakCallback(
+ static void FirstWeakCallback(
const WeakCallbackInfo<typename Traits::WeakCallbackDataType>& data) {
if (Traits::kCallbackType != kNotWeak) {
- GlobalValueMap<K, V, Traits>* persistentValueMap =
- Traits::MapFromWeakCallbackInfo(data);
+ auto map = Traits::MapFromWeakCallbackInfo(data);
K key = Traits::KeyFromWeakCallbackInfo(data);
- persistentValueMap->RemoveWeak(key);
- Traits::DisposeWeak(data.GetIsolate(), data, key);
+ map->RemoveWeak(key);
+ data.SetSecondPassCallback(SecondWeakCallback);
}
}
+
+ static void SecondWeakCallback(
+ const WeakCallbackInfo<typename Traits::WeakCallbackDataType>& data) {
+ Traits::DisposeWeak(data);
+ }
};
@@ -501,6 +504,22 @@ class StdPersistentValueMap : public PersistentValueMap<K, V, Traits> {
};
+/**
+ * A map that uses Global as value and std::map as the backing
+ * implementation. Globals are held non-weak.
+ *
+ * C++11 embedders don't need this class, as they can use
+ * Global directly in std containers.
+ */
+template <typename K, typename V,
+ typename Traits = DefaultGlobalMapTraits<K, V> >
+class StdGlobalValueMap : public GlobalValueMap<K, V, Traits> {
+ public:
+ explicit StdGlobalValueMap(Isolate* isolate)
+ : GlobalValueMap<K, V, Traits>(isolate) {}
+};
+
+
class DefaultPersistentValueVectorTraits {
public:
typedef std::vector<PersistentContainerValue> Impl;