Source/JavaScriptCore:
[WebKit-https.git] / Source / JavaScriptCore / runtime / RegExpCachedResult.h
1 /*
2  * Copyright (C) 2012, 2016 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 #include "SuperSampler.h"
31
32 namespace JSC {
33
34 class JSArray;
35 class JSString;
36
37 // RegExpCachedResult is used to track the cached results of the last
38 // match, stores on the RegExp constructor (e.g. $&, $_, $1, $2 ...).
39 // These values will be lazily generated on demand, so the cached result
40 // may be in a lazy or reified state. A lazy state is indicated by a
41 // value of m_result indicating a successful match, and a reified state
42 // is indicated by setting m_result to MatchResult::failed().
43 // Following a successful match, m_result, m_lastInput and m_lastRegExp
44 // can be used to reify the results from the match, following reification
45 // m_reifiedResult and m_reifiedInput hold the cached results.
46 class RegExpCachedResult {
47 public:
48     RegExpCachedResult(VM& vm, JSObject* owner, RegExp* emptyRegExp)
49         : m_result(0, 0)
50         , m_reified(false)
51     {
52         m_lastInput.set(vm, owner, jsEmptyString(&vm));
53         m_lastRegExp.set(vm, owner, emptyRegExp);
54     }
55
56     ALWAYS_INLINE void record(VM& vm, JSObject* owner, RegExp* regExp, JSString* input, MatchResult result)
57     {
58         vm.heap.writeBarrier(owner);
59         m_lastRegExp.setWithoutWriteBarrier(regExp);
60         m_lastInput.setWithoutWriteBarrier(input);
61         m_result = result;
62         m_reified = false;
63     }
64
65     JSArray* lastResult(ExecState*, JSObject* owner);
66     void setInput(ExecState*, JSObject* owner, JSString*);
67
68     JSString* leftContext(ExecState*, JSObject* owner);
69     JSString* rightContext(ExecState*, JSObject* owner);
70
71     JSString* input()
72     {
73         return m_reified ? m_reifiedInput.get() : m_lastInput.get();
74     }
75
76     void visitChildren(SlotVisitor&);
77
78     static ptrdiff_t offsetOfLastRegExp() { return OBJECT_OFFSETOF(RegExpCachedResult, m_lastRegExp); }
79     static ptrdiff_t offsetOfLastInput() { return OBJECT_OFFSETOF(RegExpCachedResult, m_lastInput); }
80     static ptrdiff_t offsetOfResult() { return OBJECT_OFFSETOF(RegExpCachedResult, m_result); }
81     static ptrdiff_t offsetOfReified() { return OBJECT_OFFSETOF(RegExpCachedResult, m_reified); }
82
83 private:
84     MatchResult m_result;
85     bool m_reified;
86     WriteBarrier<JSString> m_lastInput;
87     WriteBarrier<RegExp> m_lastRegExp;
88     WriteBarrier<JSArray> m_reifiedResult;
89     WriteBarrier<JSString> m_reifiedInput;
90     WriteBarrier<JSString> m_reifiedLeftContext;
91     WriteBarrier<JSString> m_reifiedRightContext;
92 };
93
94 } // namespace JSC
95
96 #endif // RegExpCachedResult_h