]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - runtime/RegExpObject.h
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / runtime / RegExpObject.h
index 4c99c30133d095192b7e51c65185408517b14748..a1f571d9f695baa57043851f297374b7535b53ed 100644 (file)
@@ -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
 #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(PassRefPtr<Structure>, PassRefPtr<RegExp>);
-        virtual ~RegExpObject();
+    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(PassRefPtr<RegExp> r) { d->regExp = r; }
-        RegExp* regExp() const { return d->regExp.get(); }
+    void setRegExp(VM& vm, RegExp* r) { m_regExp.set(vm, this, r); }
+    RegExp* regExp() const { return m_regExp.get(); }
 
-        void setLastIndex(double lastIndex) { d->lastIndex = lastIndex; }
-        double lastIndex() const { return d->lastIndex; }
+    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();
+    }
 
-        JSValuePtr test(ExecState*, const ArgList&);
-        JSValuePtr exec(ExecState*, const ArgList&);
+    bool test(ExecState* exec, JSString* string) { return match(exec, string); }
+    JSValue exec(ExecState*, JSString*);
 
-        virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
-        virtual void put(ExecState*, const Identifier& propertyName, JSValuePtr, PutPropertySlot&);
+    static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
+    static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&);
 
-        virtual const ClassInfo* classInfo() const { return &info; }
-        static const ClassInfo info;
+    DECLARE_EXPORT_INFO;
 
-        static PassRefPtr<Structure> createStructure(JSValuePtr prototype)
-        {
-            return Structure::create(prototype, TypeInfo(ObjectType));
-        }
+    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 {
-            RegExpObjectData(PassRefPtr<RegExp> 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> regExp;
-            double lastIndex;
-        };
+private:
+    MatchResult match(ExecState*, JSString*);
 
-        OwnPtr<RegExpObjectData> d;
-    };
+    WriteBarrier<RegExp> m_regExp;
+    WriteBarrier<Unknown> m_lastIndex;
+    bool m_lastIndexIsWritable;
+};
 
-    RegExpObject* asRegExpObject(JSValuePtr);
+RegExpObject* asRegExpObject(JSValue);
 
-    inline RegExpObject* asRegExpObject(JSValuePtr value)
-    {
-        ASSERT(asObject(value)->inherits(&RegExpObject::info));
-        return static_cast<RegExpObject*>(asObject(value));
-    }
+inline RegExpObject* asRegExpObject(JSValue value)
+{
+    ASSERT(asObject(value)->inherits(RegExpObject::info()));
+    return static_cast<RegExpObject*>(asObject(value));
+}
 
 } // namespace JSC