ProxyRuntimeObject.h revision 8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef WREC_h
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WREC_h
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(WREC)
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ustring.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <masm/X86Assembler.h>
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/ASCIICType.h>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h>
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if COMPILER(GCC)
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WREC_CALL __attribute__ ((regparm (3)))
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WREC_CALL
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    typedef int (*WRECFunction)(const UChar* input, unsigned start, unsigned length, int* output) WREC_CALL;
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class GenerateAtomFunctor;
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    struct CharacterClassRange;
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    struct CharacterClass;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    struct Quantifier {
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        enum Type {
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            None,
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Greedy,
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NonGreedy,
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Error,
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Quantifier()
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            : type(None)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Quantifier(Type type, unsigned min = 0, unsigned max = noMaxSpecified)
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            : type(type)
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , min(min)
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , max(max)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Type type;
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned min;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned max;
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const unsigned noMaxSpecified = UINT_MAX;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class WRECParser;
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    typedef Vector<X86Assembler::JmpSrc> JmpSrcVector;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class WRECGenerator {
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    public:
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WRECGenerator(WRECParser& parser, X86Assembler& jit)
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            : m_parser(parser)
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_jit(jit)
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        typedef X86Assembler::JmpSrc JmpSrc;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        typedef X86Assembler::JmpDst JmpDst;
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // these regs setup by the params
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const X86Assembler::RegisterID inputRegister = X86::eax;
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const X86Assembler::RegisterID currentPositionRegister = X86::edx;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const X86Assembler::RegisterID lengthRegister = X86::ecx;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const X86Assembler::RegisterID currentValueRegister = X86::esi;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const X86Assembler::RegisterID outputRegister = X86::edi;
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const X86Assembler::RegisterID quantifierCountRegister = X86::ebx;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        friend class GenerateAtomFunctor;
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        friend class GeneratePatternCharacterFunctor;
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        friend class GenerateCharacterClassFunctor;
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        friend class GenerateBackreferenceFunctor;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        friend class GenerateParenthesesNonGreedyFunctor;
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateGreedyQuantifier(JmpSrcVector& failures, GenerateAtomFunctor& functor, unsigned min, unsigned max);
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateNonGreedyQuantifier(JmpSrcVector& failures, GenerateAtomFunctor& functor, unsigned min, unsigned max);
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateBacktrack1();
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateBacktrackBackreference(unsigned subpatternId);
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateCharacterClass(JmpSrcVector& failures, CharacterClass& charClass, bool invert);
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateCharacterClassInverted(JmpSrcVector& failures, CharacterClass& charClass);
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateCharacterClassInvertedRange(JmpSrcVector& failures, JmpSrcVector& matchDest, const CharacterClassRange* ranges, unsigned count, unsigned* matchIndex, const UChar* matches, unsigned matchCount);
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generatePatternCharacter(JmpSrcVector& failures, int ch);
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateAssertionWordBoundary(JmpSrcVector& failures, bool invert);
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateAssertionBOL(JmpSrcVector& failures);
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateAssertionEOL(JmpSrcVector& failures);
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateBackreference(JmpSrcVector& failures, unsigned subpatternID);
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateBackreferenceQuantifier(JmpSrcVector& failures, Quantifier::Type quantifierType, unsigned subpatternId, unsigned min, unsigned max);
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        enum ParenthesesType { capturing, non_capturing, assertion, inverted_assertion }; // order is relied on in generateParentheses()
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JmpSrc generateParentheses(ParenthesesType type);
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JmpSrc generateParenthesesResetTrampoline(JmpSrcVector& newFailures, unsigned subpatternIdBefore, unsigned subpatternIdAfter);
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateParenthesesNonGreedy(JmpSrcVector& failures, JmpDst start, JmpSrc success, JmpSrc fail);
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void generateDisjunction(JmpSrcVector& successes, JmpSrcVector& failures);
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void terminateDisjunction(JmpSrcVector& successes);
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WRECParser& m_parser;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        X86Assembler& m_jit;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class WRECParser {
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    public:
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool m_ignoreCase;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool m_multiline;
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned m_numSubpatterns;
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        enum WRECError {
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NoError,
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Error_malformedCharacterClass,
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Error_malformedParentheses,
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Error_malformedPattern,
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Error_malformedQuantifier,
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Error_malformedEscape,
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            TempError_unsupportedQuantifier,
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            TempError_unsupportedParentheses,
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } m_err;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WRECParser(const UString& pattern, bool ignoreCase, bool multiline, X86Assembler& jit)
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            : m_ignoreCase(ignoreCase)
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_multiline(multiline)
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_numSubpatterns(0)
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_err(NoError)
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_generator(*this, jit)
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_data(pattern.data())
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_size(pattern.size())
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            , m_index(0)
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void parseAlternative(JmpSrcVector& failures)
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (parseTerm(failures)) { }
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void parseDisjunction(JmpSrcVector& failures);
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parseTerm(JmpSrcVector& failures);
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parseEscape(JmpSrcVector& failures);
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parseOctalEscape(JmpSrcVector& failures);
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parseParentheses(JmpSrcVector& failures);
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parseCharacterClass(JmpSrcVector& failures);
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parseCharacterClassQuantifier(JmpSrcVector& failures, CharacterClass& charClass, bool invert);
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parsePatternCharacterQualifier(JmpSrcVector& failures, int ch);
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parseBackreferenceQuantifier(JmpSrcVector& failures, unsigned subpatternId);
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ALWAYS_INLINE Quantifier parseGreedyQuantifier();
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Quantifier parseQuantifier();
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const int EndOfPattern = -1;
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int peek()
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_index >= m_size)
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return EndOfPattern;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return m_data[m_index];
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int consume()
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_index >= m_size)
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return EndOfPattern;
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return m_data[m_index++];
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool peekIsDigit()
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return WTF::isASCIIDigit(peek());
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned peekDigit()
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(peekIsDigit());
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return peek() - '0';
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned consumeDigit()
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(peekIsDigit());
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return consume() - '0';
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned consumeNumber()
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int n = consumeDigit();
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (peekIsDigit()) {
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                n *= 10;
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                n += consumeDigit();
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return n;
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int consumeHex(int count)
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int n = 0;
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (count--) {
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!WTF::isASCIIHexDigit(peek()))
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return -1;
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                n = (n<<4) | WTF::toASCIIHexValue(consume());
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return n;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned consumeOctal()
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned n = 0;
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (n < 32 && WTF::isASCIIOctalDigit(peek()))
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                n = n * 8 + (consume() - '0');
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return n;
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool isEndOfPattern()
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return peek() != EndOfPattern;
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WRECGenerator m_generator;
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const UChar* m_data;
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned m_size;
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned m_index;
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(WREC)
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // WREC_h
259