1/* 2 * Copyright (C) 2012 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef RegExpCachedResult_h 27#define RegExpCachedResult_h 28 29#include "RegExpObject.h" 30 31namespace JSC { 32 33 class JSString; 34 class RegExpMatchesArray; 35 36 // RegExpCachedResult is used to track the cached results of the last 37 // match, stores on the RegExp constructor (e.g. $&, $_, $1, $2 ...). 38 // These values will be lazily generated on demand, so the cached result 39 // may be in a lazy or reified state. A lazy state is indicated by a 40 // value of m_result indicating a successful match, and a reified state 41 // is indicated by setting m_result to MatchResult::failed(). 42 // Following a successful match, m_result, m_lastInput and m_lastRegExp 43 // can be used to reify the results from the match, following reification 44 // m_reifiedResult and m_reifiedInput hold the cached results. 45 class RegExpCachedResult { 46 public: 47 RegExpCachedResult(VM& vm, JSObject* owner, RegExp* emptyRegExp) 48 : m_result(0, 0) 49 { 50 m_lastInput.set(vm, owner, jsEmptyString(&vm)); 51 m_lastRegExp.set(vm, owner, emptyRegExp); 52 } 53 54 ALWAYS_INLINE void record(VM& vm, JSObject* owner, RegExp* regExp, JSString* input, MatchResult result) 55 { 56 m_lastRegExp.set(vm, owner, regExp); 57 m_lastInput.set(vm, owner, input); 58 m_result = result; 59 } 60 61 RegExpMatchesArray* lastResult(ExecState*, JSObject* owner); 62 void setInput(ExecState*, JSObject* owner, JSString*); 63 64 JSString* input() 65 { 66 // If m_result showas a match then we're in a lazy state, so m_lastInput 67 // is the most recent value of the input property. If not then we have 68 // reified, in which case m_reifiedInput will contain the correct value. 69 return m_result ? m_lastInput.get() : m_reifiedInput.get(); 70 } 71 72 void visitChildren(SlotVisitor&); 73 74 private: 75 MatchResult m_result; 76 WriteBarrier<JSString> m_lastInput; 77 WriteBarrier<RegExp> m_lastRegExp; 78 WriteBarrier<RegExpMatchesArray> m_reifiedResult; 79 WriteBarrier<JSString> m_reifiedInput; 80 }; 81 82} // namespace JSC 83 84#endif // RegExpCachedResult_h 85