diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/RegExpObject.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/RegExpObject.h | 150 |
1 files changed, 87 insertions, 63 deletions
diff --git a/Source/JavaScriptCore/runtime/RegExpObject.h b/Source/JavaScriptCore/runtime/RegExpObject.h index 2b49ba2a4..8a8e9bd0c 100644 --- a/Source/JavaScriptCore/runtime/RegExpObject.h +++ b/Source/JavaScriptCore/runtime/RegExpObject.h @@ -1,6 +1,6 @@ /* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) - * Copyright (C) 2003, 2007, 2008, 2012 Apple Inc. All Rights Reserved. + * Copyright (C) 2003, 2007-2008, 2012, 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,90 +18,114 @@ * */ -#ifndef RegExpObject_h -#define RegExpObject_h +#pragma once #include "JSObject.h" #include "RegExp.h" +#include "ThrowScope.h" +#include "TypeError.h" namespace JSC { - class RegExpObject : public JSNonFinalObject { - public: - typedef JSNonFinalObject Base; - - static RegExpObject* create(VM& vm, Structure* structure, RegExp* regExp) - { - RegExpObject* object = new (NotNull, allocateCell<RegExpObject>(vm.heap)) RegExpObject(vm, structure, regExp); - object->finishCreation(vm); - return object; - } +class RegExpObject : public JSNonFinalObject { +public: + typedef JSNonFinalObject Base; + static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames; + + static RegExpObject* create(VM& vm, Structure* structure, RegExp* regExp) + { + RegExpObject* object = new (NotNull, allocateCell<RegExpObject>(vm.heap)) RegExpObject(vm, structure, regExp); + object->finishCreation(vm); + return object; + } - void setRegExp(VM& vm, RegExp* r) { m_regExp.set(vm, this, r); } - RegExp* regExp() const { return m_regExp.get(); } + void setRegExp(VM& vm, RegExp* r) { m_regExp.set(vm, this, r); } + RegExp* regExp() const { return m_regExp.get(); } - void setLastIndex(ExecState* exec, size_t lastIndex) - { + bool setLastIndex(ExecState* exec, size_t lastIndex) + { + VM& vm = exec->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + + if (LIKELY(m_lastIndexIsWritable)) { m_lastIndex.setWithoutWriteBarrier(jsNumber(lastIndex)); - if (LIKELY(m_lastIndexIsWritable)) - m_lastIndex.setWithoutWriteBarrier(jsNumber(lastIndex)); - else - throwTypeError(exec, StrictModeReadonlyPropertyWriteError); - } - void setLastIndex(ExecState* exec, JSValue lastIndex, bool shouldThrow) - { - if (LIKELY(m_lastIndexIsWritable)) - m_lastIndex.set(exec->vm(), this, lastIndex); - else if (shouldThrow) - throwTypeError(exec, StrictModeReadonlyPropertyWriteError); + return true; } - JSValue getLastIndex() const - { - return m_lastIndex.get(); + throwTypeError(exec, scope, ASCIILiteral(ReadonlyPropertyWriteError)); + return false; + } + bool setLastIndex(ExecState* exec, JSValue lastIndex, bool shouldThrow) + { + VM& vm = exec->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + + if (LIKELY(m_lastIndexIsWritable)) { + m_lastIndex.set(vm, this, lastIndex); + return true; } - bool test(ExecState* exec, JSString* string) { return match(exec, string); } - JSValue exec(ExecState*, JSString*); + return typeError(exec, scope, shouldThrow, ASCIILiteral(ReadonlyPropertyWriteError)); + } + JSValue getLastIndex() const + { + return m_lastIndex.get(); + } + + bool test(ExecState* exec, JSGlobalObject* globalObject, JSString* string) { return !!match(exec, globalObject, string); } + bool testInline(ExecState* exec, JSGlobalObject* globalObject, JSString* string) { return !!matchInline(exec, globalObject, string); } + JSValue exec(ExecState*, JSGlobalObject*, JSString*); + JSValue execInline(ExecState*, JSGlobalObject*, JSString*); + MatchResult match(ExecState*, JSGlobalObject*, JSString*); + JSValue matchGlobal(ExecState*, JSGlobalObject*, JSString*); - static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&); - static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&); + static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&); + static bool put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&); - DECLARE_EXPORT_INFO; + DECLARE_EXPORT_INFO; - 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(RegExpObjectType, StructureFlags), info()); + } - protected: - JS_EXPORT_PRIVATE RegExpObject(VM&, Structure*, RegExp*); - JS_EXPORT_PRIVATE void finishCreation(VM&); + static ptrdiff_t offsetOfLastIndex() + { + return OBJECT_OFFSETOF(RegExpObject, m_lastIndex); + } - static const unsigned StructureFlags = OverridesVisitChildren | OverridesGetOwnPropertySlot | Base::StructureFlags; + static ptrdiff_t offsetOfLastIndexIsWritable() + { + return OBJECT_OFFSETOF(RegExpObject, m_lastIndexIsWritable); + } - static void visitChildren(JSCell*, SlotVisitor&); + static unsigned advanceStringUnicode(String, unsigned length, unsigned currentIndex); - JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, ExecState*, PropertyName); - JS_EXPORT_PRIVATE static void getOwnNonIndexPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); - JS_EXPORT_PRIVATE static void getPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); - JS_EXPORT_PRIVATE static bool defineOwnProperty(JSObject*, ExecState*, PropertyName, const PropertyDescriptor&, bool shouldThrow); +protected: + JS_EXPORT_PRIVATE RegExpObject(VM&, Structure*, RegExp*); + JS_EXPORT_PRIVATE void finishCreation(VM&); - private: - MatchResult match(ExecState*, JSString*); + static void visitChildren(JSCell*, SlotVisitor&); - WriteBarrier<RegExp> m_regExp; - WriteBarrier<Unknown> m_lastIndex; - bool m_lastIndexIsWritable; - }; + JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, ExecState*, PropertyName); + JS_EXPORT_PRIVATE static void getOwnNonIndexPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); + JS_EXPORT_PRIVATE static void getPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); + JS_EXPORT_PRIVATE static void getGenericPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); + JS_EXPORT_PRIVATE static bool defineOwnProperty(JSObject*, ExecState*, PropertyName, const PropertyDescriptor&, bool shouldThrow); - RegExpObject* asRegExpObject(JSValue); +private: + MatchResult matchInline(ExecState*, JSGlobalObject*, JSString*); - inline RegExpObject* asRegExpObject(JSValue value) - { - ASSERT(asObject(value)->inherits(RegExpObject::info())); - return static_cast<RegExpObject*>(asObject(value)); - } + WriteBarrier<RegExp> m_regExp; + WriteBarrier<Unknown> m_lastIndex; + bool m_lastIndexIsWritable; +}; -} // namespace JSC +RegExpObject* asRegExpObject(JSValue); + +inline RegExpObject* asRegExpObject(JSValue value) +{ + ASSERT(asObject(value)->inherits(*value.getObject()->vm(), RegExpObject::info())); + return static_cast<RegExpObject*>(asObject(value)); +} -#endif // RegExpObject_h +} // namespace JSC |