]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - runtime/GetterSetter.h
JavaScriptCore-7600.1.4.16.1.tar.gz
[apple/javascriptcore.git] / runtime / GetterSetter.h
index e6b74a1ed0cfb354be6f9fe159ca114b332d4e87..bc5cbe0afb1325f1d14f7af26fa9fc956e942ae4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
- *  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ *  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Library General Public
@@ -25,6 +25,9 @@
 
 #include "JSCell.h"
 
+#include "CallFrame.h"
+#include "Structure.h"
+
 namespace JSC {
 
     class JSObject;
@@ -32,43 +35,62 @@ namespace JSC {
     // This is an internal value object which stores getter and setter functions
     // for a property.
     class GetterSetter : public JSCell {
-    public:
-        GetterSetter()
-            : JSCell(0)
-            , m_getter(0)
-            , m_setter(0)
+        friend class JIT;
+
+    private:        
+        GetterSetter(VM& vm)
+            : JSCell(vm, vm.getterSetterStructure.get())
         {
         }
 
-        virtual void mark();
+    public:
+        typedef JSCell Base;
 
-        JSObject* getter() const { return m_getter; }
-        void setGetter(JSObject* getter) { m_getter = getter; }
-        JSObject* setter() const { return m_setter; }
-        void setSetter(JSObject* setter) { m_setter = setter; }
+        static GetterSetter* create(VM& vm)
+        {
+            GetterSetter* getterSetter = new (NotNull, allocateCell<GetterSetter>(vm.heap)) GetterSetter(vm);
+            getterSetter->finishCreation(vm);
+            return getterSetter;
+        }
 
-    private:
-        virtual bool isGetterSetter() const;
+        static void visitChildren(JSCell*, SlotVisitor&);
 
-        virtual JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
-        virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue& value);
-        virtual bool toBoolean(ExecState*) const;
-        virtual double toNumber(ExecState*) const;
-        virtual UString toString(ExecState*) const;
-        virtual JSObject* toObject(ExecState*) const;
+        JSObject* getter() const { return m_getter.get(); }
+        void setGetter(VM& vm, JSObject* getter) { m_getter.setMayBeNull(vm, this, getter); }
+        JSObject* setter() const { return m_setter.get(); }
+        void setSetter(VM& vm, JSObject* setter) { m_setter.setMayBeNull(vm, this, setter); }
+        static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
+        {
+            return Structure::create(vm, globalObject, prototype, TypeInfo(GetterSetterType, OverridesVisitChildren), info());
+        }
+        
+        static ptrdiff_t offsetOfGetter()
+        {
+            return OBJECT_OFFSETOF(GetterSetter, m_getter);
+        }
+        
+        static ptrdiff_t offsetOfSetter()
+        {
+            return OBJECT_OFFSETOF(GetterSetter, m_setter);
+        }
+        
+        DECLARE_INFO;
 
-        JSObject* m_getter;
-        JSObject* m_setter;  
+    private:
+        WriteBarrier<JSObject> m_getter;
+        WriteBarrier<JSObject> m_setter;  
     };
 
     GetterSetter* asGetterSetter(JSValue);
 
     inline GetterSetter* asGetterSetter(JSValue value)
     {
-        ASSERT(asCell(value)->isGetterSetter());
-        return static_cast<GetterSetter*>(asCell(value));
+        ASSERT_WITH_SECURITY_IMPLICATION(value.asCell()->isGetterSetter());
+        return static_cast<GetterSetter*>(value.asCell());
     }
 
+    JSValue callGetter(ExecState*, JSValue base, JSValue getterSetter);
+    void callSetter(ExecState*, JSValue base, JSValue getterSetter, JSValue value, ECMAMode);
 
 } // namespace JSC