Home | History | Annotate | Download | only in runtime
      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