https://bugs.webkit.org/show_bug.cgi?id=120052
[WebKit-https.git] / Source / JavaScriptCore / runtime / PropertyDescriptor.h
index ff9f160..7a9bd28 100644 (file)
 #ifndef PropertyDescriptor_h
 #define PropertyDescriptor_h
 
-#include "JSValue.h"
+#include "JSCJSValue.h"
 
 namespace JSC {
+    class GetterSetter;
+
+    // See ES5.1 9.12
+    bool sameValue(ExecState*, JSValue, JSValue);
+
     class PropertyDescriptor {
     public:
         PropertyDescriptor()
@@ -36,25 +41,27 @@ namespace JSC {
             , m_seenAttributes(0)
         {
         }
-        bool writable() const;
-        bool enumerable() const;
-        bool configurable() const;
-        bool isDataDescriptor() const;
+        JS_EXPORT_PRIVATE bool writable() const;
+        JS_EXPORT_PRIVATE bool enumerable() const;
+        JS_EXPORT_PRIVATE bool configurable() const;
+        JS_EXPORT_PRIVATE bool isDataDescriptor() const;
         bool isGenericDescriptor() const;
-        bool isAccessorDescriptor() const;
+        JS_EXPORT_PRIVATE bool isAccessorDescriptor() const;
         unsigned attributes() const { return m_attributes; }
         JSValue value() const { return m_value; }
-        JSValue getter() const;
-        JSValue setter() const;
-        void setUndefined();
-        void setDescriptor(JSValue value, unsigned attributes);
-        void setAccessorDescriptor(JSValue getter, JSValue setter, unsigned attributes);
-        void setWritable(bool);
-        void setEnumerable(bool);
-        void setConfigurable(bool);
+        JS_EXPORT_PRIVATE JSValue getter() const;
+        JS_EXPORT_PRIVATE JSValue setter() const;
+        JSObject* getterObject() const;
+        JSObject* setterObject() const;
+        JS_EXPORT_PRIVATE void setUndefined();
+        JS_EXPORT_PRIVATE void setDescriptor(JSValue value, unsigned attributes);
+        JS_EXPORT_PRIVATE void setAccessorDescriptor(GetterSetter* accessor, unsigned attributes);
+        JS_EXPORT_PRIVATE void setWritable(bool);
+        JS_EXPORT_PRIVATE void setEnumerable(bool);
+        JS_EXPORT_PRIVATE void setConfigurable(bool);
         void setValue(JSValue value) { m_value = value; }
-        void setSetter(JSValue);
-        void setGetter(JSValue);
+        JS_EXPORT_PRIVATE void setSetter(JSValue);
+        JS_EXPORT_PRIVATE void setGetter(JSValue);
         bool isEmpty() const { return !(m_value || m_getter || m_setter || m_seenAttributes); }
         bool writablePresent() const { return m_seenAttributes & WritablePresent; }
         bool enumerablePresent() const { return m_seenAttributes & EnumerablePresent; }
@@ -63,9 +70,10 @@ namespace JSC {
         bool getterPresent() const { return m_getter; }
         bool equalTo(ExecState* exec, const PropertyDescriptor& other) const;
         bool attributesEqual(const PropertyDescriptor& other) const;
-        unsigned attributesWithOverride(const PropertyDescriptor& other) const;
+        unsigned attributesOverridingCurrent(const PropertyDescriptor& current) const;
+
     private:
-        static unsigned defaultAttributes;
+        JS_EXPORTDATA static unsigned defaultAttributes;
         bool operator==(const PropertyDescriptor&){ return false; }
         enum { WritablePresent = 1, EnumerablePresent = 2, ConfigurablePresent = 4};
         // May be a getter/setter
@@ -77,4 +85,20 @@ namespace JSC {
     };
 }
 
+#define GET_OWN_PROPERTY_DESCRIPTOR_IMPL(ClassName) \
+bool ClassName::getOwnPropertyDescriptor(JSC::JSObject* object, JSC::ExecState* exec, JSC::PropertyName propertyName, JSC::PropertyDescriptor& descriptor) \
+{ \
+    JSC::PropertySlot slot(object); \
+    if (!getOwnPropertySlot(object, exec, propertyName, slot)) \
+        return false; \
+    /* Workaround, JSDOMWindow::getOwnPropertySlot searches the prototype chain. :-( */ \
+    if (slot.slotBase() != object && slot.slotBase() && slot.slotBase()->methodTable()->toThis(slot.slotBase(), exec, NotStrictMode) != object) \
+        return false; \
+    if (slot.isGetter()) \
+        descriptor.setAccessorDescriptor(slot.getterSetter(), slot.attributes()); \
+    else \
+        descriptor.setDescriptor(slot.getValue(exec, propertyName), slot.attributes()); \
+    return true; \
+}
+
 #endif