16f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch/* 26f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * Copyright (C) 2014 Google Inc. All rights reserved. 36f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * 46f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * Redistribution and use in source and binary forms, with or without 56f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * modification, are permitted provided that the following conditions are 66f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * met: 76f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * 86f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * * Redistributions of source code must retain the above copyright 96f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * notice, this list of conditions and the following disclaimer. 106f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * * Redistributions in binary form must reproduce the above 116f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * copyright notice, this list of conditions and the following disclaimer 126f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * in the documentation and/or other materials provided with the 136f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * distribution. 146f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * * Neither the name of Google Inc. nor the names of its 156f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * contributors may be used to endorse or promote products derived from 166f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * this software without specific prior written permission. 176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * 186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 216f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 246f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 266f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 276f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 296f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch */ 306f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 316f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#ifndef V8PersistentValueMap_h 326f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#define V8PersistentValueMap_h 336f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 346f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "wtf/HashMap.h" 356f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include <v8-util.h> 366f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include <v8.h> 376f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 396f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 406f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch/** 416f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * A Traits class for v8::PersistentValueMap that uses wtf/HashMap as a 426f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * backing store. 436f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * 446f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * The parameter is_weak will determine whether the references are 'weak'. 456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * If so, entries will be removed from the map as the weak references are 466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * collected. 476f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch */ 486f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochtemplate<class KeyType, class ValueType, bool is_weak> 496f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochclass V8PersistentValueMapTraits { 506f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochpublic: 516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch // Map traits: 526f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typedef HashMap<KeyType, v8::PersistentContainerValue> Impl; 536f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typedef typename Impl::iterator Iterator; 546f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static size_t Size(const Impl* impl) { return impl->size(); } 556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static bool Empty(Impl* impl) { return impl->isEmpty(); } 566f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static void Swap(Impl& impl, Impl& other) { impl.swap(other); } 576f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static Iterator Begin(Impl* impl) { return impl->begin(); } 586f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static Iterator End(Impl* impl) { return impl->end(); } 596f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static v8::PersistentContainerValue Value(Iterator& iter) 606f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 616f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return iter->value; 626f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 636f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static KeyType Key(Iterator& iter) { return iter->key; } 646f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static v8::PersistentContainerValue Set( 656f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch Impl* impl, KeyType key, v8::PersistentContainerValue value) 666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 676f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch v8::PersistentContainerValue oldValue = Get(impl, key); 68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) impl->set(key, value); 696f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return oldValue; 706f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static v8::PersistentContainerValue Get(const Impl* impl, KeyType key) 726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 736f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return impl->get(key); 746f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 766f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static v8::PersistentContainerValue Remove(Impl* impl, KeyType key) 776f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 786f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return impl->take(key); 796f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 806f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 816f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch // Weak traits: 826f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static const v8::PersistentContainerCallbackType kCallbackType = is_weak ? v8::kWeak : v8::kNotWeak; 836f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typedef v8::PersistentValueMap<KeyType, ValueType, V8PersistentValueMapTraits<KeyType, ValueType, is_weak> > MapType; 846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 856f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typedef void WeakCallbackDataType; 866f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 876f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static WeakCallbackDataType* WeakCallbackParameter(MapType* map, KeyType key, const v8::Local<ValueType>& value) 886f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 896f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return 0; 906f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 916f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 926f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static void DisposeCallbackData(WeakCallbackDataType* callbackData) 936f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 946f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 956f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 966f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static MapType* MapFromWeakCallbackData( 976f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch const v8::WeakCallbackData<ValueType, WeakCallbackDataType>& data) 986f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 996f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return 0; 1006f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 1016f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1026f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static KeyType KeyFromWeakCallbackData( 1036f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch const v8::WeakCallbackData<ValueType, WeakCallbackDataType>& data) 1046f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 1056f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return KeyType(); 1066f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 1076f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1086f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch // Dispose traits: 1096f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static void Dispose(v8::Isolate* isolate, v8::UniquePersistent<ValueType> value, KeyType key) { } 1106f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}; 1116f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1126f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch/** 1136f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * A map for safely storing persistent V8 values, based on 1146f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * v8::PersistentValueMap. 1156f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * 1166f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * If is_weak is set, values will be held weakly and map entries will be 1176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * removed as their values are being collected. 1186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch */ 1196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochtemplate<class KeyType, class ValueType, bool is_weak = true> 1206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochclass V8PersistentValueMap : public v8::PersistentValueMap<KeyType, ValueType, V8PersistentValueMapTraits<KeyType, ValueType, is_weak> > { 1216f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochpublic: 1226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typedef V8PersistentValueMapTraits<KeyType, ValueType, is_weak> Traits; 1236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch explicit V8PersistentValueMap(v8::Isolate* isolate) : v8::PersistentValueMap<KeyType, ValueType, Traits>(isolate) { } 1246f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}; 1256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1276f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#endif // V8PersistentValueMap_h 129