• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 University of Szeged
3  * Copyright (C) 2010 Renata Hodovan (hodovan@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 
lookupOrCreate(const UString & patternString,RegExpFlags flags)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 
create(const UString & patternString,RegExpFlags flags,RegExpCacheMap::iterator iterator)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 
RegExpCache(JSGlobalData * globalData)70 RegExpCache::RegExpCache(JSGlobalData* globalData)
71     : m_globalData(globalData)
72     , m_nextKeyToEvict(-1)
73     , m_isFull(false)
74 {
75 }
76 
77 }
78