diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/runtime/RegExp.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/runtime/RegExp.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/RegExp.h | 153 |
1 files changed, 88 insertions, 65 deletions
diff --git a/Source/JavaScriptCore/runtime/RegExp.h b/Source/JavaScriptCore/runtime/RegExp.h index d982ce4c3..bbe93f5bf 100644 --- a/Source/JavaScriptCore/runtime/RegExp.h +++ b/Source/JavaScriptCore/runtime/RegExp.h @@ -1,6 +1,6 @@ /* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) - * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2007, 2008, 2009, 2016 Apple Inc. All rights reserved. * Copyright (C) 2009 Torch Mobile, Inc. * * This library is free software; you can redistribute it and/or @@ -19,16 +19,15 @@ * */ -#ifndef RegExp_h -#define RegExp_h +#pragma once +#include "ConcurrentJSLock.h" #include "ExecutableAllocator.h" #include "MatchResult.h" #include "RegExpKey.h" #include "Structure.h" #include "yarr/Yarr.h" #include <wtf/Forward.h> -#include <wtf/RefCounted.h> #include <wtf/text/WTFString.h> #if ENABLE(YARR_JIT) @@ -37,94 +36,118 @@ namespace JSC { - struct RegExpRepresentation; - class VM; +struct RegExpRepresentation; +class VM; - JS_EXPORT_PRIVATE RegExpFlags regExpFlags(const String&); +JS_EXPORT_PRIVATE RegExpFlags regExpFlags(const String&); - class RegExp : public JSCell { - public: - typedef JSCell Base; +class RegExp final : public JSCell { +public: + typedef JSCell Base; + static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal; - 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*); + JS_EXPORT_PRIVATE static RegExp* create(VM&, const String& pattern, RegExpFlags); + static const bool needsDestruction = true; + static void destroy(JSCell*); + static size_t estimatedSize(JSCell*); - bool global() const { return m_flags & FlagGlobal; } - bool ignoreCase() const { return m_flags & FlagIgnoreCase; } - bool multiline() const { return m_flags & FlagMultiline; } + bool global() const { return m_flags & FlagGlobal; } + bool ignoreCase() const { return m_flags & FlagIgnoreCase; } + bool multiline() const { return m_flags & FlagMultiline; } + bool sticky() const { return m_flags & FlagSticky; } + bool globalOrSticky() const { return global() || sticky(); } + bool unicode() const { return m_flags & FlagUnicode; } - const String& pattern() const { return m_patternString; } + const String& pattern() const { return m_patternString; } - bool isValid() const { return !m_constructionError && m_flags != InvalidFlags; } - const char* errorMessage() const { return m_constructionError; } + bool isValid() const { return !m_constructionError && m_flags != InvalidFlags; } + const char* errorMessage() const { return m_constructionError; } - JS_EXPORT_PRIVATE int match(VM&, const String&, unsigned startOffset, Vector<int, 32>& ovector); - MatchResult match(VM&, const String&, unsigned startOffset); - unsigned numSubpatterns() const { return m_numSubpatterns; } + JS_EXPORT_PRIVATE int match(VM&, const String&, unsigned startOffset, Vector<int>& ovector); - bool hasCode() - { - return m_state != NotCompiled; - } + // Returns false if we couldn't run the regular expression for any reason. + bool matchConcurrently(VM&, const String&, unsigned startOffset, int& position, Vector<int>& ovector); + + JS_EXPORT_PRIVATE MatchResult match(VM&, const String&, unsigned startOffset); + + bool matchConcurrently(VM&, const String&, unsigned startOffset, MatchResult&); + + // Call these versions of the match functions if you're desperate for performance. + template<typename VectorType> + int matchInline(VM&, const String&, unsigned startOffset, VectorType& ovector); + MatchResult matchInline(VM&, const String&, unsigned startOffset); + + unsigned numSubpatterns() const { return m_numSubpatterns; } + + bool hasCode() + { + return m_state != NotCompiled; + } + + bool hasCodeFor(Yarr::YarrCharSize); + bool hasMatchOnlyCodeFor(Yarr::YarrCharSize); + + void deleteCode(); - void invalidateCode(); - #if ENABLE(REGEXP_TRACING) - void printTraceData(); + void printTraceData(); #endif - static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) - { - return Structure::create(vm, globalObject, prototype, TypeInfo(LeafType, 0), info()); - } - - DECLARE_INFO; + static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) + { + return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info()); + } - RegExpKey key() { return RegExpKey(m_flags, m_patternString); } + DECLARE_INFO; - protected: - void finishCreation(VM&); + RegExpKey key() { return RegExpKey(m_flags, m_patternString); } - private: - friend class RegExpCache; - RegExp(VM&, const String&, RegExpFlags); +protected: + void finishCreation(VM&); - static RegExp* createWithoutCaching(VM&, const String&, RegExpFlags); +private: + friend class RegExpCache; + RegExp(VM&, const String&, RegExpFlags); - enum RegExpState { - ParseError, - JITCode, - ByteCode, - NotCompiled - } m_state; + static RegExp* createWithoutCaching(VM&, const String&, RegExpFlags); - void compile(VM*, Yarr::YarrCharSize); - void compileIfNecessary(VM&, Yarr::YarrCharSize); + enum RegExpState { + ParseError, + JITCode, + ByteCode, + NotCompiled + }; + + RegExpState m_state; + + void compile(VM*, Yarr::YarrCharSize); + void compileIfNecessary(VM&, Yarr::YarrCharSize); - void compileMatchOnly(VM*, Yarr::YarrCharSize); - void compileIfNecessaryMatchOnly(VM&, Yarr::YarrCharSize); + void compileMatchOnly(VM*, Yarr::YarrCharSize); + void compileIfNecessaryMatchOnly(VM&, Yarr::YarrCharSize); #if ENABLE(YARR_JIT_DEBUG) - void matchCompareWithInterpreter(const String&, int startOffset, int* offsetVector, int jitResult); + void matchCompareWithInterpreter(const String&, int startOffset, int* offsetVector, int jitResult); #endif - String m_patternString; - RegExpFlags m_flags; - const char* m_constructionError; - unsigned m_numSubpatterns; + String m_patternString; + RegExpFlags m_flags; + const char* m_constructionError; + unsigned m_numSubpatterns; #if ENABLE(REGEXP_TRACING) - unsigned m_rtMatchCallCount; - unsigned m_rtMatchFoundCount; + double m_rtMatchOnlyTotalSubjectStringLen; + double m_rtMatchTotalSubjectStringLen; + unsigned m_rtMatchOnlyCallCount; + unsigned m_rtMatchOnlyFoundCount; + unsigned m_rtMatchCallCount; + unsigned m_rtMatchFoundCount; #endif + ConcurrentJSLock m_lock; #if ENABLE(YARR_JIT) - Yarr::YarrCodeBlock m_regExpJITCode; + Yarr::YarrCodeBlock m_regExpJITCode; #endif - OwnPtr<Yarr::BytecodePattern> m_regExpBytecode; - }; + std::unique_ptr<Yarr::BytecodePattern> m_regExpBytecode; +}; } // namespace JSC - -#endif // RegExp_h |