X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/4e4e5a6f2694187498445a6ac6f1634ce8141119..1981f5dfe8d77d97469d20652f712a09400c48ed:/runtime/RegExp.h diff --git a/runtime/RegExp.h b/runtime/RegExp.h index 04022bc..ad10203 100644 --- a/runtime/RegExp.h +++ b/runtime/RegExp.h @@ -22,62 +22,105 @@ #ifndef RegExp_h #define RegExp_h -#include "UString.h" #include "ExecutableAllocator.h" +#include "MatchResult.h" +#include "RegExpKey.h" +#include "Structure.h" +#include "UString.h" +#include "yarr/Yarr.h" #include #include -#include "yarr/RegexJIT.h" -#include "yarr/RegexInterpreter.h" -struct JSRegExp; +#if ENABLE(YARR_JIT) +#include "yarr/YarrJIT.h" +#endif namespace JSC { + struct RegExpRepresentation; class JSGlobalData; - class RegExp : public RefCounted { + JS_EXPORT_PRIVATE RegExpFlags regExpFlags(const UString&); + + class RegExp : public JSCell { public: - static PassRefPtr create(JSGlobalData* globalData, const UString& pattern); - static PassRefPtr create(JSGlobalData* globalData, const UString& pattern, const UString& flags); -#if !ENABLE(YARR) - ~RegExp(); -#endif + typedef JSCell Base; + + JS_EXPORT_PRIVATE static RegExp* create(JSGlobalData&, const UString& pattern, RegExpFlags); + static void destroy(JSCell*); - bool global() const { return m_flagBits & Global; } - bool ignoreCase() const { return m_flagBits & IgnoreCase; } - bool multiline() const { return m_flagBits & Multiline; } + bool global() const { return m_flags & FlagGlobal; } + bool ignoreCase() const { return m_flags & FlagIgnoreCase; } + bool multiline() const { return m_flags & FlagMultiline; } - const UString& pattern() const { return m_pattern; } + const UString& pattern() const { return m_patternString; } - bool isValid() const { return !m_constructionError; } + bool isValid() const { return !m_constructionError && m_flags != InvalidFlags; } const char* errorMessage() const { return m_constructionError; } - int match(const UString&, int startOffset, Vector* ovector = 0); + JS_EXPORT_PRIVATE int match(JSGlobalData&, const UString&, unsigned startOffset, Vector& 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); + + enum RegExpState { + ParseError, + JITCode, + ByteCode, + NotCompiled + } m_state; - void compile(JSGlobalData*); + void compile(JSGlobalData*, Yarr::YarrCharSize); + void compileIfNecessary(JSGlobalData&, Yarr::YarrCharSize); - enum FlagBits { Global = 1, IgnoreCase = 2, Multiline = 4 }; + void compileMatchOnly(JSGlobalData*, Yarr::YarrCharSize); + void compileIfNecessaryMatchOnly(JSGlobalData&, Yarr::YarrCharSize); - UString m_pattern; // FIXME: Just decompile m_regExp instead of storing this. - int m_flagBits; +#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; - UString m_lastMatchString; - int m_lastMatchStart; - Vector m_lastOVector; +#if ENABLE(REGEXP_TRACING) + unsigned m_rtMatchCallCount; + unsigned m_rtMatchFoundCount; +#endif #if ENABLE(YARR_JIT) - Yarr::RegexCodeBlock m_regExpJITCode; -#elif ENABLE(YARR) - OwnPtr m_regExpBytecode; -#else - JSRegExp* m_regExp; + Yarr::YarrCodeBlock m_regExpJITCode; #endif + OwnPtr m_regExpBytecode; }; } // namespace JSC