1 /* 2 * Copyright (C) 1999-2000 Harri Porten (porten (at) kde.org) 3 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. 4 * Copyright (C) 2009 Torch Mobile, Inc. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 * 20 */ 21 22 #ifndef RegExp_h 23 #define RegExp_h 24 25 #include "UString.h" 26 #include "WREC.h" 27 #include "ExecutableAllocator.h" 28 #include <wtf/Forward.h> 29 #include <wtf/RefCounted.h> 30 #include "yarr/RegexJIT.h" 31 #include "yarr/RegexInterpreter.h" 32 33 struct JSRegExp; 34 35 namespace JSC { 36 37 class JSGlobalData; 38 39 class RegExp : public RefCounted<RegExp> { 40 public: 41 static PassRefPtr<RegExp> create(JSGlobalData* globalData, const UString& pattern); 42 static PassRefPtr<RegExp> create(JSGlobalData* globalData, const UString& pattern, const UString& flags); 43 #if !ENABLE(YARR) 44 ~RegExp(); 45 #endif 46 47 bool global() const { return m_flagBits & Global; } 48 bool ignoreCase() const { return m_flagBits & IgnoreCase; } 49 bool multiline() const { return m_flagBits & Multiline; } 50 51 const UString& pattern() const { return m_pattern; } 52 53 bool isValid() const { return !m_constructionError; } 54 const char* errorMessage() const { return m_constructionError; } 55 56 int match(const UString&, int startOffset, Vector<int, 32>* ovector = 0); 57 unsigned numSubpatterns() const { return m_numSubpatterns; } 58 59 private: 60 RegExp(JSGlobalData* globalData, const UString& pattern); 61 RegExp(JSGlobalData* globalData, const UString& pattern, const UString& flags); 62 63 void compile(JSGlobalData*); 64 65 enum FlagBits { Global = 1, IgnoreCase = 2, Multiline = 4 }; 66 67 UString m_pattern; // FIXME: Just decompile m_regExp instead of storing this. 68 int m_flagBits; 69 const char* m_constructionError; 70 unsigned m_numSubpatterns; 71 72 #if ENABLE(YARR_JIT) 73 Yarr::RegexCodeBlock m_regExpJITCode; 74 #elif ENABLE(YARR) 75 OwnPtr<Yarr::BytecodePattern> m_regExpBytecode; 76 #else 77 #if ENABLE(WREC) 78 WREC::CompiledRegExp m_wrecFunction; 79 RefPtr<ExecutablePool> m_executablePool; 80 #endif 81 JSRegExp* m_regExp; 82 #endif 83 }; 84 85 } // namespace JSC 86 87 #endif // RegExp_h 88