X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/2d39b0e377c0896910ee49ae70082ba665faf986..HEAD:/runtime/RegExpMatchesArray.h diff --git a/runtime/RegExpMatchesArray.h b/runtime/RegExpMatchesArray.h index 8997d8e..669dd39 100644 --- a/runtime/RegExpMatchesArray.h +++ b/runtime/RegExpMatchesArray.h @@ -26,119 +26,8 @@ namespace JSC { - class RegExpMatchesArray : public JSArray { - private: - RegExpMatchesArray(VM&, Butterfly*, JSGlobalObject*, JSString*, RegExp*, MatchResult); - - enum ReifiedState { ReifiedNone, ReifiedMatch, ReifiedAll }; - - public: - typedef JSArray Base; - - static RegExpMatchesArray* create(ExecState*, JSString*, RegExp*, MatchResult); - - JSString* leftContext(ExecState*); - JSString* rightContext(ExecState*); - - DECLARE_INFO; - - static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) - { - return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info(), ArrayWithSlowPutArrayStorage); - } - - static void visitChildren(JSCell*, SlotVisitor&); - - protected: - void finishCreation(VM&); - - static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesVisitChildren | OverridesGetPropertyNames | Base::StructureFlags; - - private: - ALWAYS_INLINE void reifyAllPropertiesIfNecessary(ExecState* exec) - { - if (m_state != ReifiedAll) - reifyAllProperties(exec); - } - - ALWAYS_INLINE void reifyMatchPropertyIfNecessary(ExecState* exec) - { - if (m_state == ReifiedNone) - reifyMatchProperty(exec); - } - - static bool getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot& slot) - { - RegExpMatchesArray* thisObject = jsCast(object); - thisObject->reifyAllPropertiesIfNecessary(exec); - return JSArray::getOwnPropertySlot(thisObject, exec, propertyName, slot); - } - - static bool getOwnPropertySlotByIndex(JSObject* object, ExecState* exec, unsigned propertyName, PropertySlot& slot) - { - RegExpMatchesArray* thisObject = jsCast(object); - if (propertyName) - thisObject->reifyAllPropertiesIfNecessary(exec); - else - thisObject->reifyMatchPropertyIfNecessary(exec); - return JSArray::getOwnPropertySlotByIndex(thisObject, exec, propertyName, slot); - } - - static void put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue v, PutPropertySlot& slot) - { - RegExpMatchesArray* thisObject = jsCast(cell); - thisObject->reifyAllPropertiesIfNecessary(exec); - JSArray::put(thisObject, exec, propertyName, v, slot); - } - - static void putByIndex(JSCell* cell, ExecState* exec, unsigned propertyName, JSValue v, bool shouldThrow) - { - RegExpMatchesArray* thisObject = jsCast(cell); - thisObject->reifyAllPropertiesIfNecessary(exec); - JSArray::putByIndex(thisObject, exec, propertyName, v, shouldThrow); - } - - static bool deleteProperty(JSCell* cell, ExecState* exec, PropertyName propertyName) - { - RegExpMatchesArray* thisObject = jsCast(cell); - thisObject->reifyAllPropertiesIfNecessary(exec); - return JSArray::deleteProperty(thisObject, exec, propertyName); - } - - static bool deletePropertyByIndex(JSCell* cell, ExecState* exec, unsigned propertyName) - { - RegExpMatchesArray* thisObject = jsCast(cell); - thisObject->reifyAllPropertiesIfNecessary(exec); - return JSArray::deletePropertyByIndex(thisObject, exec, propertyName); - } - - static void getOwnPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& arr, EnumerationMode mode = ExcludeDontEnumProperties) - { - RegExpMatchesArray* thisObject = jsCast(object); - thisObject->reifyAllPropertiesIfNecessary(exec); - JSArray::getOwnPropertyNames(thisObject, exec, arr, mode); - } - - static bool defineOwnProperty(JSObject* object, ExecState* exec, PropertyName propertyName, const PropertyDescriptor& descriptor, bool shouldThrow) - { - RegExpMatchesArray* thisObject = jsCast(object); - thisObject->reifyAllPropertiesIfNecessary(exec); - return JSArray::defineOwnProperty(object, exec, propertyName, descriptor, shouldThrow); - } - - void reifyAllProperties(ExecState*); - void reifyMatchProperty(ExecState*); - - WriteBarrier m_input; - WriteBarrier m_regExp; - MatchResult m_result; - ReifiedState m_state; -}; - -inline bool isRegExpMatchesArray(JSValue value) -{ - return value.isCell() && value.asCell()->classInfo() == RegExpMatchesArray::info(); -} +JSArray* createRegExpMatchesArray(ExecState*, JSString*, RegExp*, MatchResult); +Structure* createRegExpMatchesArrayStructure(VM&, JSGlobalObject&); }