Add CatchScope and force all exception checks to be via ThrowScope or CatchScope.
[WebKit-https.git] / Source / WebCore / contentextensions / DFABytecodeCompiler.h
1 /*
2  * Copyright (C) 2015 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef DFABytecodeCompiler_h
27 #define DFABytecodeCompiler_h
28
29 #if ENABLE(CONTENT_EXTENSIONS)
30
31 #include "DFABytecode.h"
32 #include <wtf/Vector.h>
33
34 namespace WebCore {
35
36 namespace ContentExtensions {
37
38 struct DFA;
39 class DFANode;
40
41 class WEBCORE_EXPORT DFABytecodeCompiler {
42 public:
43     DFABytecodeCompiler(const DFA& dfa, Vector<DFABytecode>& bytecode)
44         : m_bytecode(bytecode)
45         , m_dfa(dfa)
46     {
47     }
48     
49     void compile();
50
51 private:
52     struct Range {
53         Range(uint8_t min, uint8_t max, uint32_t destination, bool caseSensitive)
54             : min(min)
55             , max(max)
56             , destination(destination)
57             , caseSensitive(caseSensitive)
58         {
59         }
60         uint8_t min;
61         uint8_t max;
62         uint32_t destination;
63         bool caseSensitive;
64     };
65     struct JumpTable {
66         ~JumpTable()
67         {
68             ASSERT(min + destinations.size() == max + 1);
69             ASSERT(min == max || destinations.size() > 1);
70         }
71
72         uint8_t min { 0 };
73         uint8_t max { 0 };
74         bool caseSensitive { true };
75         Vector<uint32_t> destinations;
76     };
77     struct Transitions {
78         Vector<JumpTable> jumpTables;
79         Vector<Range> ranges;
80         bool useFallbackTransition { false };
81         uint32_t fallbackTransitionTarget { std::numeric_limits<uint32_t>::max() };
82     };
83     JumpTable extractJumpTable(Vector<Range>&, unsigned first, unsigned last);
84     Transitions transitions(const DFANode&);
85     
86     unsigned compiledNodeMaxBytecodeSize(uint32_t index);
87     void compileNode(uint32_t index, bool root);
88     unsigned nodeTransitionsMaxBytecodeSize(const DFANode&);
89     void compileNodeTransitions(uint32_t nodeIndex);
90     unsigned checkForJumpTableMaxBytecodeSize(const JumpTable&);
91     unsigned checkForRangeMaxBytecodeSize(const Range&);
92     void compileJumpTable(uint32_t nodeIndex, const JumpTable&);
93     void compileCheckForRange(uint32_t nodeIndex, const Range&);
94     int32_t longestPossibleJump(uint32_t jumpLocation, uint32_t sourceNodeIndex, uint32_t destinationNodeIndex);
95
96     void emitAppendAction(uint64_t);
97     void emitJump(uint32_t sourceNodeIndex, uint32_t destinationNodeIndex);
98     void emitCheckValue(uint8_t value, uint32_t sourceNodeIndex, uint32_t destinationNodeIndex, bool caseSensitive);
99     void emitCheckValueRange(uint8_t lowValue, uint8_t highValue, uint32_t sourceNodeIndex, uint32_t destinationNodeIndex, bool caseSensitive);
100     void emitTerminate();
101
102     Vector<DFABytecode>& m_bytecode;
103     const DFA& m_dfa;
104     
105     Vector<uint32_t> m_maxNodeStartOffsets;
106     Vector<uint32_t> m_nodeStartOffsets;
107     
108     struct LinkRecord {
109         DFABytecodeJumpSize jumpSize;
110         int32_t longestPossibleJump;
111         uint32_t instructionLocation;
112         uint32_t jumpLocation;
113         uint32_t destinationNodeIndex;
114     };
115     Vector<LinkRecord> m_linkRecords;
116 };
117
118 } // namespace ContentExtensions
119
120 } // namespace WebCore
121
122 #endif // ENABLE(CONTENT_EXTENSIONS)
123
124 #endif // DFABytecodeCompiler_h