X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..2656c66b5b30d5597e842a751c7f19ad6c2fe31a:/runtime/RegExpMatchesArray.h?ds=sidebyside diff --git a/runtime/RegExpMatchesArray.h b/runtime/RegExpMatchesArray.h index 3583941..8997d8e 100644 --- a/runtime/RegExpMatchesArray.h +++ b/runtime/RegExpMatchesArray.h @@ -21,67 +21,125 @@ #define RegExpMatchesArray_h #include "JSArray.h" +#include "JSGlobalObject.h" +#include "RegExpObject.h" namespace JSC { class RegExpMatchesArray : public JSArray { + private: + RegExpMatchesArray(VM&, Butterfly*, JSGlobalObject*, JSString*, RegExp*, MatchResult); + + enum ReifiedState { ReifiedNone, ReifiedMatch, ReifiedAll }; + public: - RegExpMatchesArray(ExecState*, RegExpConstructorPrivate*); - virtual ~RegExpMatchesArray(); + 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: - virtual bool getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) + ALWAYS_INLINE void reifyAllPropertiesIfNecessary(ExecState* exec) { - if (lazyCreationData()) - fillArrayInstance(exec); - return JSArray::getOwnPropertySlot(exec, propertyName, slot); + if (m_state != ReifiedAll) + reifyAllProperties(exec); } - virtual bool getOwnPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot) + ALWAYS_INLINE void reifyMatchPropertyIfNecessary(ExecState* exec) { - if (lazyCreationData()) - fillArrayInstance(exec); - return JSArray::getOwnPropertySlot(exec, propertyName, slot); + if (m_state == ReifiedNone) + reifyMatchProperty(exec); } - virtual void put(ExecState* exec, const Identifier& propertyName, JSValuePtr v, PutPropertySlot& slot) + static bool getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot& slot) { - if (lazyCreationData()) - fillArrayInstance(exec); - JSArray::put(exec, propertyName, v, slot); + RegExpMatchesArray* thisObject = jsCast(object); + thisObject->reifyAllPropertiesIfNecessary(exec); + return JSArray::getOwnPropertySlot(thisObject, exec, propertyName, slot); } - virtual void put(ExecState* exec, unsigned propertyName, JSValuePtr v) + static bool getOwnPropertySlotByIndex(JSObject* object, ExecState* exec, unsigned propertyName, PropertySlot& slot) { - if (lazyCreationData()) - fillArrayInstance(exec); - JSArray::put(exec, propertyName, v); + RegExpMatchesArray* thisObject = jsCast(object); + if (propertyName) + thisObject->reifyAllPropertiesIfNecessary(exec); + else + thisObject->reifyMatchPropertyIfNecessary(exec); + return JSArray::getOwnPropertySlotByIndex(thisObject, exec, propertyName, slot); } - virtual bool deleteProperty(ExecState* exec, const Identifier& propertyName) + static void put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue v, PutPropertySlot& slot) { - if (lazyCreationData()) - fillArrayInstance(exec); - return JSArray::deleteProperty(exec, propertyName); + 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); } - virtual bool deleteProperty(ExecState* exec, unsigned propertyName) + static bool deletePropertyByIndex(JSCell* cell, ExecState* exec, unsigned propertyName) { - if (lazyCreationData()) - fillArrayInstance(exec); - return JSArray::deleteProperty(exec, propertyName); + RegExpMatchesArray* thisObject = jsCast(cell); + thisObject->reifyAllPropertiesIfNecessary(exec); + return JSArray::deletePropertyByIndex(thisObject, exec, propertyName); } - virtual void getPropertyNames(ExecState* exec, PropertyNameArray& arr) + static void getOwnPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& arr, EnumerationMode mode = ExcludeDontEnumProperties) { - if (lazyCreationData()) - fillArrayInstance(exec); - JSArray::getPropertyNames(exec, arr); + RegExpMatchesArray* thisObject = jsCast(object); + thisObject->reifyAllPropertiesIfNecessary(exec); + JSArray::getOwnPropertyNames(thisObject, exec, arr, mode); } - void fillArrayInstance(ExecState*); + 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(); +} + } #endif // RegExpMatchesArray_h