]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - runtime/RegExp.h
JavaScriptCore-1097.3.tar.gz
[apple/javascriptcore.git] / runtime / RegExp.h
index 139c754f2b5a2d5828770805016ecc6f130e1164..ad1020376cb12b7eea0e9d62da32a669d25baa8b 100644 (file)
@@ -1,6 +1,7 @@
 /*
  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
  *  Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
+ *  Copyright (C) 2009 Torch Mobile, Inc.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
 #ifndef RegExp_h
 #define RegExp_h
 
-#include "UString.h"
-#include "WREC.h"
 #include "ExecutableAllocator.h"
+#include "MatchResult.h"
+#include "RegExpKey.h"
+#include "Structure.h"
+#include "UString.h"
+#include "yarr/Yarr.h"
 #include <wtf/Forward.h>
 #include <wtf/RefCounted.h>
 
-struct JSRegExp;
+#if ENABLE(YARR_JIT)
+#include "yarr/YarrJIT.h"
+#endif
 
 namespace JSC {
 
+    struct RegExpRepresentation;
     class JSGlobalData;
 
-    class RegExp : public RefCounted<RegExp> {
+    JS_EXPORT_PRIVATE RegExpFlags regExpFlags(const UString&);
+
+    class RegExp : public JSCell {
     public:
-        static PassRefPtr<RegExp> create(JSGlobalData* globalData, const UString& pattern);
-        static PassRefPtr<RegExp> create(JSGlobalData* globalData, const UString& pattern, const UString& flags);
-        ~RegExp();
+        typedef JSCell Base;
 
-        bool global() const { return m_flagBits & Global; }
-        bool ignoreCase() const { return m_flagBits & IgnoreCase; }
-        bool multiline() const { return m_flagBits & Multiline; }
+        JS_EXPORT_PRIVATE static RegExp* create(JSGlobalData&, const UString& pattern, RegExpFlags);
+        static void destroy(JSCell*);
 
-        const UString& pattern() const { return m_pattern; }
-        const UString& flags() const { return m_flags; }
+        bool global() const { return m_flags & FlagGlobal; }
+        bool ignoreCase() const { return m_flags & FlagIgnoreCase; }
+        bool multiline() const { return m_flags & FlagMultiline; }
 
-        bool isValid() const { return !m_constructionError; }
+        const UString& pattern() const { return m_patternString; }
+
+        bool isValid() const { return !m_constructionError && m_flags != InvalidFlags; }
         const char* errorMessage() const { return m_constructionError; }
 
-        int match(const UString&, int startOffset, OwnArrayPtr<int>* ovector = 0);
+        JS_EXPORT_PRIVATE int match(JSGlobalData&, const UString&, unsigned startOffset, Vector<int, 32>& ovector);
+        MatchResult match(JSGlobalData&, const UString&, unsigned startOffset);
         unsigned numSubpatterns() const { return m_numSubpatterns; }
 
+        bool hasCode()
+        {
+            return m_state != NotCompiled;
+        }
+
+        void invalidateCode();
+        
+#if ENABLE(REGEXP_TRACING)
+        void printTraceData();
+#endif
+
+        static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
+        {
+            return Structure::create(globalData, globalObject, prototype, TypeInfo(LeafType, 0), &s_info);
+        }
+        
+        static const ClassInfo s_info;
+
+        RegExpKey key() { return RegExpKey(m_flags, m_patternString); }
+
+    protected:
+        void finishCreation(JSGlobalData&);
+
     private:
-        RegExp(JSGlobalData* globalData, const UString& pattern);
-        RegExp(JSGlobalData* globalData, const UString& pattern, const UString& flags);
+        friend class RegExpCache;
+        RegExp(JSGlobalData&, const UString&, RegExpFlags);
+
+        static RegExp* createWithoutCaching(JSGlobalData&, const UString&, RegExpFlags);
 
-        void compile();
+        enum RegExpState {
+            ParseError,
+            JITCode,
+            ByteCode,
+            NotCompiled
+        } m_state;
 
-        enum FlagBits { Global = 1, IgnoreCase = 2, Multiline = 4 };
+        void compile(JSGlobalData*, Yarr::YarrCharSize);
+        void compileIfNecessary(JSGlobalData&, Yarr::YarrCharSize);
 
-        UString m_pattern; // FIXME: Just decompile m_regExp instead of storing this.
-        UString m_flags; // FIXME: Just decompile m_regExp instead of storing this.
-        int m_flagBits;
-        JSRegExp* m_regExp;
+        void compileMatchOnly(JSGlobalData*, Yarr::YarrCharSize);
+        void compileIfNecessaryMatchOnly(JSGlobalData&, Yarr::YarrCharSize);
+
+#if ENABLE(YARR_JIT_DEBUG)
+        void matchCompareWithInterpreter(const UString&, int startOffset, int* offsetVector, int jitResult);
+#endif
+
+        UString m_patternString;
+        RegExpFlags m_flags;
         const char* m_constructionError;
         unsigned m_numSubpatterns;
+#if ENABLE(REGEXP_TRACING)
+        unsigned m_rtMatchCallCount;
+        unsigned m_rtMatchFoundCount;
+#endif
 
-#if ENABLE(WREC)
-        WREC::CompiledRegExp m_wrecFunction;
-        RefPtr<ExecutablePool> m_executablePool;
+#if ENABLE(YARR_JIT)
+        Yarr::YarrCodeBlock m_regExpJITCode;
 #endif
+        OwnPtr<Yarr::BytecodePattern> m_regExpBytecode;
     };
 
 } // namespace JSC