1 /* 2 * Copyright (C) 2009 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef PropertyDescriptor_h 27 #define PropertyDescriptor_h 28 29 #include "JSValue.h" 30 31 namespace JSC { 32 class PropertyDescriptor { 33 public: 34 PropertyDescriptor() 35 : m_attributes(defaultAttributes) 36 , m_seenAttributes(0) 37 { 38 } 39 bool writable() const; 40 bool enumerable() const; 41 bool configurable() const; 42 bool isDataDescriptor() const; 43 bool isGenericDescriptor() const; 44 bool isAccessorDescriptor() const; 45 unsigned attributes() const { return m_attributes; } 46 JSValue value() const { return m_value; } 47 JSValue getter() const; 48 JSValue setter() const; 49 void setUndefined(); 50 void setDescriptor(JSValue value, unsigned attributes); 51 void setAccessorDescriptor(JSValue getter, JSValue setter, unsigned attributes); 52 void setWritable(bool); 53 void setEnumerable(bool); 54 void setConfigurable(bool); 55 void setValue(JSValue value) { m_value = value; } 56 void setSetter(JSValue); 57 void setGetter(JSValue); 58 bool isEmpty() const { return !(m_value || m_getter || m_setter || m_seenAttributes); } 59 bool writablePresent() const { return m_seenAttributes & WritablePresent; } 60 bool enumerablePresent() const { return m_seenAttributes & EnumerablePresent; } 61 bool configurablePresent() const { return m_seenAttributes & ConfigurablePresent; } 62 bool setterPresent() const { return m_setter; } 63 bool getterPresent() const { return m_getter; } 64 bool equalTo(ExecState* exec, const PropertyDescriptor& other) const; 65 bool attributesEqual(const PropertyDescriptor& other) const; 66 unsigned attributesWithOverride(const PropertyDescriptor& other) const; 67 private: 68 static unsigned defaultAttributes; 69 bool operator==(const PropertyDescriptor&){ return false; } 70 enum { WritablePresent = 1, EnumerablePresent = 2, ConfigurablePresent = 4}; 71 // May be a getter/setter 72 JSValue m_value; 73 JSValue m_getter; 74 JSValue m_setter; 75 unsigned m_attributes; 76 unsigned m_seenAttributes; 77 }; 78 } 79 80 #endif 81