110 lines
2.7 KiB
C++
110 lines
2.7 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "js/WeakMapPtr.h"
|
|
|
|
#include "jsweakmap.h"
|
|
|
|
//
|
|
// Machinery for the externally-linkable JS::WeakMapPtr, which wraps js::WeakMap
|
|
// for a few public data types.
|
|
//
|
|
|
|
using namespace js;
|
|
|
|
namespace details {
|
|
|
|
template<typename T>
|
|
struct DataType
|
|
{
|
|
};
|
|
|
|
template<>
|
|
struct DataType<JSObject*>
|
|
{
|
|
using BarrieredType = HeapPtr<JSObject*>;
|
|
using HasherType = MovableCellHasher<BarrieredType>;
|
|
static JSObject* NullValue() { return nullptr; }
|
|
};
|
|
|
|
template<>
|
|
struct DataType<JS::Value>
|
|
{
|
|
using BarrieredType = HeapPtr<Value>;
|
|
static JS::Value NullValue() { return JS::UndefinedValue(); }
|
|
};
|
|
|
|
template <typename K, typename V>
|
|
struct Utils
|
|
{
|
|
typedef typename DataType<K>::BarrieredType KeyType;
|
|
typedef typename DataType<K>::HasherType HasherType;
|
|
typedef typename DataType<V>::BarrieredType ValueType;
|
|
typedef WeakMap<KeyType, ValueType, HasherType> Type;
|
|
typedef Type* PtrType;
|
|
static PtrType cast(void* ptr) { return static_cast<PtrType>(ptr); }
|
|
};
|
|
|
|
} /* namespace */
|
|
|
|
template <typename K, typename V>
|
|
void
|
|
JS::WeakMapPtr<K, V>::destroy()
|
|
{
|
|
MOZ_ASSERT(initialized());
|
|
js_delete(details::Utils<K, V>::cast(ptr));
|
|
ptr = nullptr;
|
|
}
|
|
|
|
template <typename K, typename V>
|
|
bool
|
|
JS::WeakMapPtr<K, V>::init(JSContext* cx)
|
|
{
|
|
MOZ_ASSERT(!initialized());
|
|
typename details::Utils<K, V>::PtrType map = cx->runtime()->new_<typename details::Utils<K,V>::Type>(cx);
|
|
if (!map || !map->init())
|
|
return false;
|
|
ptr = map;
|
|
return true;
|
|
}
|
|
|
|
template <typename K, typename V>
|
|
void
|
|
JS::WeakMapPtr<K, V>::trace(JSTracer* trc)
|
|
{
|
|
MOZ_ASSERT(initialized());
|
|
return details::Utils<K, V>::cast(ptr)->trace(trc);
|
|
}
|
|
|
|
template <typename K, typename V>
|
|
V
|
|
JS::WeakMapPtr<K, V>::lookup(const K& key)
|
|
{
|
|
MOZ_ASSERT(initialized());
|
|
typename details::Utils<K, V>::Type::Ptr result = details::Utils<K, V>::cast(ptr)->lookup(key);
|
|
if (!result)
|
|
return details::DataType<V>::NullValue();
|
|
return result->value();
|
|
}
|
|
|
|
template <typename K, typename V>
|
|
bool
|
|
JS::WeakMapPtr<K, V>::put(JSContext* cx, const K& key, const V& value)
|
|
{
|
|
MOZ_ASSERT(initialized());
|
|
return details::Utils<K, V>::cast(ptr)->put(key, value);
|
|
}
|
|
|
|
//
|
|
// Supported specializations of JS::WeakMap:
|
|
//
|
|
|
|
template class JS_PUBLIC_API(JS::WeakMapPtr)<JSObject*, JSObject*>;
|
|
|
|
#ifdef DEBUG
|
|
// Nobody's using this at the moment, but we want to make sure it compiles.
|
|
template class JS_PUBLIC_API(JS::WeakMapPtr)<JSObject*, JS::Value>;
|
|
#endif
|