X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..2d39b0e377c0896910ee49ae70082ba665faf986:/runtime/RegExp.h diff --git a/runtime/RegExp.h b/runtime/RegExp.h index 139c754..fec8f6a 100644 --- a/runtime/RegExp.h +++ b/runtime/RegExp.h @@ -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 @@ -21,56 +22,113 @@ #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 "yarr/Yarr.h" #include #include +#include -struct JSRegExp; +#if ENABLE(YARR_JIT) +#include "yarr/YarrJIT.h" +#endif namespace JSC { - class JSGlobalData; + struct RegExpRepresentation; + class VM; + + JS_EXPORT_PRIVATE RegExpFlags regExpFlags(const String&); - class RegExp : public RefCounted { + class RegExp : public JSCell { public: - static PassRefPtr create(JSGlobalData* globalData, const UString& pattern); - static PassRefPtr 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(VM&, const String& pattern, RegExpFlags); + static const bool needsDestruction = true; + static const bool hasImmortalStructure = true; + 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 String& 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* ovector = 0); + JS_EXPORT_PRIVATE int match(VM&, const String&, unsigned startOffset, Vector& ovector); + MatchResult match(VM&, const String&, 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(VM& vm, JSGlobalObject* globalObject, JSValue prototype) + { + return Structure::create(vm, globalObject, prototype, TypeInfo(LeafType, StructureFlags), info()); + } + + DECLARE_INFO; + + RegExpKey key() { return RegExpKey(m_flags, m_patternString); } + + protected: + static const unsigned StructureFlags = StructureIsImmortal; + + void finishCreation(VM&); + private: - RegExp(JSGlobalData* globalData, const UString& pattern); - RegExp(JSGlobalData* globalData, const UString& pattern, const UString& flags); + friend class RegExpCache; + RegExp(VM&, const String&, RegExpFlags); + + static RegExp* createWithoutCaching(VM&, const String&, RegExpFlags); + + enum RegExpState { + ParseError, + JITCode, + ByteCode, + NotCompiled + } m_state; - void compile(); + void compile(VM*, Yarr::YarrCharSize); + void compileIfNecessary(VM&, Yarr::YarrCharSize); - enum FlagBits { Global = 1, IgnoreCase = 2, Multiline = 4 }; + void compileMatchOnly(VM*, Yarr::YarrCharSize); + void compileIfNecessaryMatchOnly(VM&, 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; +#if ENABLE(YARR_JIT_DEBUG) + void matchCompareWithInterpreter(const String&, int startOffset, int* offsetVector, int jitResult); +#endif + + String m_patternString; + RegExpFlags m_flags; const char* m_constructionError; unsigned m_numSubpatterns; +#if ENABLE(REGEXP_TRACING) + double m_rtMatchOnlyTotalSubjectStringLen; + double m_rtMatchTotalSubjectStringLen; + unsigned m_rtMatchOnlyCallCount; + unsigned m_rtMatchOnlyFoundCount; + unsigned m_rtMatchCallCount; + unsigned m_rtMatchFoundCount; +#endif -#if ENABLE(WREC) - WREC::CompiledRegExp m_wrecFunction; - RefPtr m_executablePool; +#if ENABLE(YARR_JIT) + Yarr::YarrCodeBlock m_regExpJITCode; #endif + OwnPtr m_regExpBytecode; }; } // namespace JSC