summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/RegExpConstructor.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/runtime/RegExpConstructor.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/runtime/RegExpConstructor.h')
-rw-r--r--Source/JavaScriptCore/runtime/RegExpConstructor.h178
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