1 /* 2 * Copyright (C) 2010 University of Szeged 3 * Copyright (C) 2010 Renata Hodovan (hodovan (at) inf.u-szeged.hu) 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY 16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR 19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #include "config.h" 29 30 #include "RegExpCache.h" 31 32 namespace JSC { 33 34 PassRefPtr<RegExp> RegExpCache::lookupOrCreate(const UString& patternString, RegExpFlags flags) 35 { 36 if (patternString.length() < maxCacheablePatternLength) { 37 pair<RegExpCacheMap::iterator, bool> result = m_cacheMap.add(RegExpKey(flags, patternString), 0); 38 if (!result.second) 39 return result.first->second; 40 else 41 return create(patternString, flags, result.first); 42 } 43 return create(patternString, flags, m_cacheMap.end()); 44 } 45 46 PassRefPtr<RegExp> RegExpCache::create(const UString& patternString, RegExpFlags flags, RegExpCacheMap::iterator iterator) 47 { 48 RefPtr<RegExp> regExp = RegExp::create(m_globalData, patternString, flags); 49 50 if (patternString.length() >= maxCacheablePatternLength) 51 return regExp; 52 53 RegExpKey key = RegExpKey(flags, patternString); 54 iterator->first = key; 55 iterator->second = regExp; 56 57 ++m_nextKeyToEvict; 58 if (m_nextKeyToEvict == maxCacheableEntries) { 59 m_nextKeyToEvict = 0; 60 m_isFull = true; 61 } 62 if (m_isFull) 63 m_cacheMap.remove(RegExpKey(patternKeyArray[m_nextKeyToEvict].flagsValue, patternKeyArray[m_nextKeyToEvict].pattern)); 64 65 patternKeyArray[m_nextKeyToEvict].flagsValue = key.flagsValue; 66 patternKeyArray[m_nextKeyToEvict].pattern = patternString.impl(); 67 return regExp; 68 } 69 70 RegExpCache::RegExpCache(JSGlobalData* globalData) 71 : m_globalData(globalData) 72 , m_nextKeyToEvict(-1) 73 , m_isFull(false) 74 { 75 } 76 77 } 78