1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Apple Inc. All rights reserved.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * are met:
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *    documentation and/or other materials provided with the distribution.
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef WRECGenerator_h
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define WRECGenerator_h
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/Platform.h>
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WREC)
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Quantifier.h"
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "MacroAssembler.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/ASCIICType.h>
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/unicode/Unicode.h>
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WREC.h"
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace JSC {
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class JSGlobalData;
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    namespace WREC {
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class CharacterRange;
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class GenerateAtomFunctor;
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class Parser;
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct CharacterClass;
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class Generator : private MacroAssembler {
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    public:
52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        using MacroAssembler::Jump;
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        using MacroAssembler::JumpList;
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        using MacroAssembler::Label;
55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        enum ParenthesesType { Capturing, NonCapturing, Assertion, InvertedAssertion, Error };
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        static CompiledRegExp compileRegExp(JSGlobalData*, const UString& pattern, unsigned* numSubpatterns_ptr, const char** error_ptr, RefPtr<ExecutablePool>& pool, bool ignoreCase = false, bool multiline = false);
59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Generator(Parser& parser)
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            : m_parser(parser)
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
65d0825bca7fe65beaee391d30da42e937db621564Steve Block#if CPU(X86)
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID input = X86Registers::eax;
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID index = X86Registers::edx;
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID length = X86Registers::ecx;
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID output = X86Registers::edi;
708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID character = X86Registers::esi;
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID repeatCount = X86Registers::ebx; // How many times the current atom repeats in the current match.
738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID returnRegister = X86Registers::eax;
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
76d0825bca7fe65beaee391d30da42e937db621564Steve Block#if CPU(X86_64)
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID input = X86Registers::edi;
78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID index = X86Registers::esi;
79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID length = X86Registers::edx;
80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID output = X86Registers::ecx;
818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID character = X86Registers::eax;
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID repeatCount = X86Registers::ebx; // How many times the current atom repeats in the current match.
848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const RegisterID returnRegister = X86Registers::eax;
868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif
878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateEnter();
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateSaveIndex();
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateIncrementIndex(Jump* failure = 0);
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateLoadCharacter(JumpList& failures);
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateJumpIfNotEndOfInput(Label);
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateReturnSuccess();
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateReturnFailure();
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateGreedyQuantifier(JumpList& failures, GenerateAtomFunctor& functor, unsigned min, unsigned max);
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateNonGreedyQuantifier(JumpList& failures, GenerateAtomFunctor& functor, unsigned min, unsigned max);
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateBacktrack1();
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateBacktrackBackreference(unsigned subpatternId);
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateCharacterClass(JumpList& failures, const CharacterClass& charClass, bool invert);
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateCharacterClassInverted(JumpList& failures, const CharacterClass& charClass);
102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateCharacterClassInvertedRange(JumpList& failures, JumpList& matchDest, const CharacterRange* ranges, unsigned count, unsigned* matchIndex, const UChar* matches, unsigned matchCount);
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generatePatternCharacter(JumpList& failures, int ch);
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generatePatternCharacterSequence(JumpList& failures, int* sequence, size_t count);
105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateAssertionWordBoundary(JumpList& failures, bool invert);
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateAssertionBOL(JumpList& failures);
107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateAssertionEOL(JumpList& failures);
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateBackreference(JumpList& failures, unsigned subpatternID);
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateBackreferenceQuantifier(JumpList& failures, Quantifier::Type quantifierType, unsigned subpatternId, unsigned min, unsigned max);
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateParenthesesAssertion(JumpList& failures);
111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateParenthesesInvertedAssertion(JumpList& failures);
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Jump generateParenthesesResetTrampoline(JumpList& newFailures, unsigned subpatternIdBefore, unsigned subpatternIdAfter);
113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void generateParenthesesNonGreedy(JumpList& failures, Label start, Jump success, Jump fail);
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void terminateAlternative(JumpList& successes, JumpList& failures);
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void terminateDisjunction(JumpList& successes);
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    private:
119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool generatePatternCharacterPair(JumpList& failures, int ch1, int ch2);
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Parser& m_parser;
122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} } // namespace JSC::WREC
125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // ENABLE(WREC)
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // WRECGenerator_h
129