X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/f9bf01c6616d5ddcf65b13b33cedf9e387ff7a63..refs/heads/master:/runtime/RegExpObject.h?ds=inline diff --git a/runtime/RegExpObject.h b/runtime/RegExpObject.h index 4ad11ef..a1f571d 100644 --- a/runtime/RegExpObject.h +++ b/runtime/RegExpObject.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, 2012 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 @@ -25,62 +25,82 @@ #include "RegExp.h" namespace JSC { + +class RegExpObject : public JSNonFinalObject { +public: + typedef JSNonFinalObject Base; + static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames; - class RegExpObject : public JSObject { - public: - RegExpObject(NonNullPassRefPtr, NonNullPassRefPtr); - virtual ~RegExpObject(); - - void setRegExp(PassRefPtr r) { d->regExp = r; } - RegExp* regExp() const { return d->regExp.get(); } + static RegExpObject* create(VM& vm, Structure* structure, RegExp* regExp) + { + RegExpObject* object = new (NotNull, allocateCell(vm.heap)) RegExpObject(vm, structure, regExp); + object->finishCreation(vm); + return object; + } - void setLastIndex(double lastIndex) { d->lastIndex = lastIndex; } - double lastIndex() const { return d->lastIndex; } + void setRegExp(VM& vm, RegExp* r) { m_regExp.set(vm, this, r); } + RegExp* regExp() const { return m_regExp.get(); } - JSValue test(ExecState*, const ArgList&); - JSValue exec(ExecState*, const ArgList&); + void setLastIndex(ExecState* exec, size_t lastIndex) + { + 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); + } + JSValue getLastIndex() const + { + return m_lastIndex.get(); + } - virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&); - virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&); - virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&); + bool test(ExecState* exec, JSString* string) { return match(exec, string); } + JSValue exec(ExecState*, JSString*); - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; + static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&); + static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&); - static PassRefPtr createStructure(JSValue prototype) - { - return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount); - } + DECLARE_EXPORT_INFO; - protected: - static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags; + static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) + { + return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info()); + } - private: - bool match(ExecState*, const ArgList&); +protected: + JS_EXPORT_PRIVATE RegExpObject(VM&, Structure*, RegExp*); + JS_EXPORT_PRIVATE void finishCreation(VM&); - virtual CallType getCallData(CallData&); + static void visitChildren(JSCell*, SlotVisitor&); - struct RegExpObjectData : FastAllocBase { - RegExpObjectData(NonNullPassRefPtr regExp, double lastIndex) - : regExp(regExp) - , lastIndex(lastIndex) - { - } + 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); - RefPtr regExp; - double lastIndex; - }; +private: + MatchResult match(ExecState*, JSString*); - OwnPtr d; - }; + WriteBarrier m_regExp; + WriteBarrier m_lastIndex; + bool m_lastIndexIsWritable; +}; - RegExpObject* asRegExpObject(JSValue); +RegExpObject* asRegExpObject(JSValue); - inline RegExpObject* asRegExpObject(JSValue value) - { - ASSERT(asObject(value)->inherits(&RegExpObject::info)); - return static_cast(asObject(value)); - } +inline RegExpObject* asRegExpObject(JSValue value) +{ + ASSERT(asObject(value)->inherits(RegExpObject::info())); + return static_cast(asObject(value)); +} } // namespace JSC