JavaScriptCore/runtime/RegExpCache.cpp
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     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 
       
    34 PassRefPtr<RegExp> RegExpCache::lookupOrCreate(const UString& patternString, const UString& flags)
       
    35 {
       
    36     if (patternString.size() < 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, const UString& flags, RegExpCacheMap::iterator iterator) 
       
    47 {
       
    48     RefPtr<RegExp> regExp = RegExp::create(m_globalData, patternString, flags);
       
    49 
       
    50     if (patternString.size() >= 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.rep();
       
    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 }