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/RegExpConstructor.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/runtime/RegExpConstructor.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/RegExpConstructor.h | 178 |
1 files changed, 99 insertions, 79 deletions
diff --git a/Source/JavaScriptCore/runtime/RegExpConstructor.h b/Source/JavaScriptCore/runtime/RegExpConstructor.h index 9fa8ed8bf..6d7462793 100644 --- a/Source/JavaScriptCore/runtime/RegExpConstructor.h +++ b/Source/JavaScriptCore/runtime/RegExpConstructor.h @@ -1,6 +1,6 @@ /* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) - * Copyright (C) 2003, 2007, 2008 Apple Inc. All Rights Reserved. + * Copyright (C) 2003, 2007-2008, 2016 Apple Inc. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,113 +18,133 @@ * */ -#ifndef RegExpConstructor_h -#define RegExpConstructor_h +#pragma once #include "InternalFunction.h" #include "RegExp.h" #include "RegExpCachedResult.h" #include "RegExpObject.h" -#include <wtf/OwnPtr.h> - namespace JSC { - class RegExpPrototype; +class RegExpPrototype; +class GetterSetter; - class RegExpConstructor : public InternalFunction { - public: - typedef InternalFunction Base; +class RegExpConstructor : public InternalFunction { +public: + typedef InternalFunction Base; + static const unsigned StructureFlags = Base::StructureFlags | HasStaticPropertyTable; - static RegExpConstructor* create(VM& vm, Structure* structure, RegExpPrototype* regExpPrototype) - { - RegExpConstructor* constructor = new (NotNull, allocateCell<RegExpConstructor>(vm.heap)) RegExpConstructor(vm, structure, regExpPrototype); - constructor->finishCreation(vm, regExpPrototype); - return constructor; - } + static RegExpConstructor* create(VM& vm, Structure* structure, RegExpPrototype* regExpPrototype, GetterSetter* species) + { + RegExpConstructor* constructor = new (NotNull, allocateCell<RegExpConstructor>(vm.heap)) RegExpConstructor(vm, structure, regExpPrototype); + constructor->finishCreation(vm, regExpPrototype, species); + return constructor; + } - static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) - { - return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info()); - } + static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) + { + return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info()); + } - static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&); + DECLARE_INFO; - DECLARE_INFO; + MatchResult performMatch(VM&, RegExp*, JSString*, const String&, int startOffset, int** ovector); + MatchResult performMatch(VM&, RegExp*, JSString*, const String&, int startOffset); + void recordMatch(VM&, RegExp*, JSString*, const MatchResult&); - MatchResult performMatch(VM&, RegExp*, JSString*, const String&, int startOffset, int** ovector); - MatchResult performMatch(VM&, RegExp*, JSString*, const String&, int startOffset); + void setMultiline(bool multiline) { m_multiline = multiline; } + bool multiline() const { return m_multiline; } - void setMultiline(bool multiline) { m_multiline = multiline; } - bool multiline() const { return m_multiline; } + JSValue getBackref(ExecState*, unsigned); + JSValue getLastParen(ExecState*); + JSValue getLeftContext(ExecState*); + JSValue getRightContext(ExecState*); - JSValue getBackref(ExecState*, unsigned); - JSValue getLastParen(ExecState*); - JSValue getLeftContext(ExecState*); - JSValue getRightContext(ExecState*); + void setInput(ExecState* exec, JSString* string) { m_cachedResult.setInput(exec, this, string); } + JSString* input() { return m_cachedResult.input(); } - void setInput(ExecState* exec, JSString* string) { m_cachedResult.setInput(exec, this, string); } - JSString* input() { return m_cachedResult.input(); } + static void visitChildren(JSCell*, SlotVisitor&); - static void visitChildren(JSCell*, SlotVisitor&); + static ptrdiff_t offsetOfCachedResult() { return OBJECT_OFFSETOF(RegExpConstructor, m_cachedResult); } - protected: - void finishCreation(VM&, RegExpPrototype*); - static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesVisitChildren | Base::StructureFlags; +protected: + void finishCreation(VM&, RegExpPrototype*, GetterSetter* species); - private: - RegExpConstructor(VM&, Structure*, RegExpPrototype*); - static void destroy(JSCell*); - static ConstructType getConstructData(JSCell*, ConstructData&); - static CallType getCallData(JSCell*, CallData&); +private: + RegExpConstructor(VM&, Structure*, RegExpPrototype*); + static void destroy(JSCell*); + static ConstructType getConstructData(JSCell*, ConstructData&); + static CallType getCallData(JSCell*, CallData&); - RegExpCachedResult m_cachedResult; - bool m_multiline; - Vector<int, 32> m_ovector; - }; + RegExpCachedResult m_cachedResult; + bool m_multiline; + Vector<int> m_ovector; +}; - RegExpConstructor* asRegExpConstructor(JSValue); +RegExpConstructor* asRegExpConstructor(JSValue); - JSObject* constructRegExp(ExecState*, JSGlobalObject*, const ArgList&, bool callAsConstructor = false); +JSObject* constructRegExp(ExecState*, JSGlobalObject*, const ArgList&, JSObject* callee = nullptr, JSValue newTarget = jsUndefined()); - inline RegExpConstructor* asRegExpConstructor(JSValue value) - { - ASSERT(asObject(value)->inherits(RegExpConstructor::info())); - return static_cast<RegExpConstructor*>(asObject(value)); - } +inline RegExpConstructor* asRegExpConstructor(JSValue value) +{ + ASSERT(asObject(value)->inherits(*value.getObject()->vm(), RegExpConstructor::info())); + return static_cast<RegExpConstructor*>(asObject(value)); +} - /* - To facilitate result caching, exec(), test(), match(), search(), and replace() dipatch regular - expression matching through the performMatch function. We use cached results to calculate, - e.g., RegExp.lastMatch and RegExp.leftParen. - */ - ALWAYS_INLINE MatchResult RegExpConstructor::performMatch(VM& vm, RegExp* regExp, JSString* string, const String& input, int startOffset, int** ovector) - { - int position = regExp->match(vm, input, startOffset, m_ovector); +/* + To facilitate result caching, exec(), test(), match(), search(), and replace() dipatch regular + expression matching through the performMatch function. We use cached results to calculate, + e.g., RegExp.lastMatch and RegExp.leftParen. +*/ +ALWAYS_INLINE MatchResult RegExpConstructor::performMatch(VM& vm, RegExp* regExp, JSString* string, const String& input, int startOffset, int** ovector) +{ + int position = regExp->match(vm, input, startOffset, m_ovector); - if (ovector) - *ovector = m_ovector.data(); + if (ovector) + *ovector = m_ovector.data(); - if (position == -1) - return MatchResult::failed(); + if (position == -1) + return MatchResult::failed(); - ASSERT(!m_ovector.isEmpty()); - ASSERT(m_ovector[0] == position); - ASSERT(m_ovector[1] >= position); - size_t end = m_ovector[1]; + ASSERT(!m_ovector.isEmpty()); + ASSERT(m_ovector[0] == position); + ASSERT(m_ovector[1] >= position); + size_t end = m_ovector[1]; - m_cachedResult.record(vm, this, regExp, string, MatchResult(position, end)); + m_cachedResult.record(vm, this, regExp, string, MatchResult(position, end)); - return MatchResult(position, end); - } - ALWAYS_INLINE MatchResult RegExpConstructor::performMatch(VM& vm, RegExp* regExp, JSString* string, const String& input, int startOffset) - { - MatchResult result = regExp->match(vm, input, startOffset); - if (result) - m_cachedResult.record(vm, this, regExp, string, result); - return result; - } + return MatchResult(position, end); +} +ALWAYS_INLINE MatchResult RegExpConstructor::performMatch(VM& vm, RegExp* regExp, JSString* string, const String& input, int startOffset) +{ + MatchResult result = regExp->match(vm, input, startOffset); + if (result) + m_cachedResult.record(vm, this, regExp, string, result); + return result; +} -} // namespace JSC +ALWAYS_INLINE void RegExpConstructor::recordMatch(VM& vm, RegExp* regExp, JSString* string, const MatchResult& result) +{ + ASSERT(result); + m_cachedResult.record(vm, this, regExp, string, result); +} + +ALWAYS_INLINE bool isRegExp(VM& vm, ExecState* exec, JSValue value) +{ + auto scope = DECLARE_THROW_SCOPE(vm); + if (!value.isObject()) + return false; -#endif // RegExpConstructor_h + JSObject* object = asObject(value); + JSValue matchValue = object->get(exec, vm.propertyNames->matchSymbol); + RETURN_IF_EXCEPTION(scope, false); + if (!matchValue.isUndefined()) + return matchValue.toBoolean(exec); + + return object->inherits(vm, RegExpObject::info()); +} + +EncodedJSValue JSC_HOST_CALL esSpecRegExpCreate(ExecState*); + +} // namespace JSC |