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