summaryrefslogtreecommitdiff
path: root/src/3rdparty/javascriptcore/JavaScriptCore/wrec/WRECGenerator.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/javascriptcore/JavaScriptCore/wrec/WRECGenerator.h')
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/wrec/WRECGenerator.h128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wrec/WRECGenerator.h b/src/3rdparty/javascriptcore/JavaScriptCore/wrec/WRECGenerator.h
new file mode 100644
index 0000000..d707a6e
--- /dev/null
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/wrec/WRECGenerator.h
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WRECGenerator_h
+#define WRECGenerator_h
+
+#include <wtf/Platform.h>
+
+#if ENABLE(WREC)
+
+#include "Quantifier.h"
+#include "MacroAssembler.h"
+#include <wtf/ASCIICType.h>
+#include <wtf/unicode/Unicode.h>
+#include "WREC.h"
+
+namespace JSC {
+
+ class JSGlobalData;
+
+ namespace WREC {
+
+ class CharacterRange;
+ class GenerateAtomFunctor;
+ class Parser;
+ struct CharacterClass;
+
+ class Generator : private MacroAssembler {
+ public:
+ using MacroAssembler::Jump;
+ using MacroAssembler::JumpList;
+ using MacroAssembler::Label;
+
+ enum ParenthesesType { Capturing, NonCapturing, Assertion, InvertedAssertion, Error };
+
+ static CompiledRegExp compileRegExp(JSGlobalData*, const UString& pattern, unsigned* numSubpatterns_ptr, const char** error_ptr, RefPtr<ExecutablePool>& pool, bool ignoreCase = false, bool multiline = false);
+
+ Generator(Parser& parser)
+ : m_parser(parser)
+ {
+ }
+
+#if CPU(X86)
+ static const RegisterID input = X86Registers::eax;
+ static const RegisterID index = X86Registers::edx;
+ static const RegisterID length = X86Registers::ecx;
+ static const RegisterID output = X86Registers::edi;
+
+ static const RegisterID character = X86Registers::esi;
+ static const RegisterID repeatCount = X86Registers::ebx; // How many times the current atom repeats in the current match.
+
+ static const RegisterID returnRegister = X86Registers::eax;
+#endif
+#if CPU(X86_64)
+ static const RegisterID input = X86Registers::edi;
+ static const RegisterID index = X86Registers::esi;
+ static const RegisterID length = X86Registers::edx;
+ static const RegisterID output = X86Registers::ecx;
+
+ static const RegisterID character = X86Registers::eax;
+ static const RegisterID repeatCount = X86Registers::ebx; // How many times the current atom repeats in the current match.
+
+ static const RegisterID returnRegister = X86Registers::eax;
+#endif
+
+ void generateEnter();
+ void generateSaveIndex();
+ void generateIncrementIndex(Jump* failure = 0);
+ void generateLoadCharacter(JumpList& failures);
+ void generateJumpIfNotEndOfInput(Label);
+ void generateReturnSuccess();
+ void generateReturnFailure();
+
+ void generateGreedyQuantifier(JumpList& failures, GenerateAtomFunctor& functor, unsigned min, unsigned max);
+ void generateNonGreedyQuantifier(JumpList& failures, GenerateAtomFunctor& functor, unsigned min, unsigned max);
+ void generateBacktrack1();
+ void generateBacktrackBackreference(unsigned subpatternId);
+ void generateCharacterClass(JumpList& failures, const CharacterClass& charClass, bool invert);
+ void generateCharacterClassInverted(JumpList& failures, const CharacterClass& charClass);
+ void generateCharacterClassInvertedRange(JumpList& failures, JumpList& matchDest, const CharacterRange* ranges, unsigned count, unsigned* matchIndex, const UChar* matches, unsigned matchCount);
+ void generatePatternCharacter(JumpList& failures, int ch);
+ void generatePatternCharacterSequence(JumpList& failures, int* sequence, size_t count);
+ void generateAssertionWordBoundary(JumpList& failures, bool invert);
+ void generateAssertionBOL(JumpList& failures);
+ void generateAssertionEOL(JumpList& failures);
+ void generateBackreference(JumpList& failures, unsigned subpatternID);
+ void generateBackreferenceQuantifier(JumpList& failures, Quantifier::Type quantifierType, unsigned subpatternId, unsigned min, unsigned max);
+ void generateParenthesesAssertion(JumpList& failures);
+ void generateParenthesesInvertedAssertion(JumpList& failures);
+ Jump generateParenthesesResetTrampoline(JumpList& newFailures, unsigned subpatternIdBefore, unsigned subpatternIdAfter);
+ void generateParenthesesNonGreedy(JumpList& failures, Label start, Jump success, Jump fail);
+
+ void terminateAlternative(JumpList& successes, JumpList& failures);
+ void terminateDisjunction(JumpList& successes);
+
+ private:
+ bool generatePatternCharacterPair(JumpList& failures, int ch1, int ch2);
+
+ Parser& m_parser;
+ };
+
+} } // namespace JSC::WREC
+
+#endif // ENABLE(WREC)
+
+#endif // WRECGenerator_h