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 "JSCJSValue.h" 30 31namespace JSC { 32 class GetterSetter; 33 34 // See ES5.1 9.12 35 bool sameValue(ExecState*, JSValue, JSValue); 36 37 class PropertyDescriptor { 38 public: 39 PropertyDescriptor() 40 : m_attributes(defaultAttributes) 41 , m_seenAttributes(0) 42 { 43 } 44 PropertyDescriptor(JSValue value, unsigned attributes) 45 : m_value(value) 46 , m_attributes(attributes) 47 , m_seenAttributes(EnumerablePresent | ConfigurablePresent | WritablePresent) 48 { 49 ASSERT(m_value); 50 ASSERT(!m_value.isGetterSetter()); 51 ASSERT(!m_value.isCustomGetterSetter()); 52 } 53 JS_EXPORT_PRIVATE bool writable() const; 54 JS_EXPORT_PRIVATE bool enumerable() const; 55 JS_EXPORT_PRIVATE bool configurable() const; 56 JS_EXPORT_PRIVATE bool isDataDescriptor() const; 57 bool isGenericDescriptor() const; 58 JS_EXPORT_PRIVATE bool isAccessorDescriptor() const; 59 unsigned attributes() const { return m_attributes; } 60 JSValue value() const { return m_value; } 61 JS_EXPORT_PRIVATE JSValue getter() const; 62 JS_EXPORT_PRIVATE JSValue setter() const; 63 JSObject* getterObject() const; 64 JSObject* setterObject() const; 65 JS_EXPORT_PRIVATE void setUndefined(); 66 JS_EXPORT_PRIVATE void setDescriptor(JSValue value, unsigned attributes); 67 JS_EXPORT_PRIVATE void setCustomDescriptor(unsigned attributes); 68 JS_EXPORT_PRIVATE void setAccessorDescriptor(GetterSetter* accessor, unsigned attributes); 69 JS_EXPORT_PRIVATE void setWritable(bool); 70 JS_EXPORT_PRIVATE void setEnumerable(bool); 71 JS_EXPORT_PRIVATE void setConfigurable(bool); 72 void setValue(JSValue value) { m_value = value; } 73 JS_EXPORT_PRIVATE void setSetter(JSValue); 74 JS_EXPORT_PRIVATE void setGetter(JSValue); 75 bool isEmpty() const { return !(m_value || m_getter || m_setter || m_seenAttributes); } 76 bool writablePresent() const { return m_seenAttributes & WritablePresent; } 77 bool enumerablePresent() const { return m_seenAttributes & EnumerablePresent; } 78 bool configurablePresent() const { return m_seenAttributes & ConfigurablePresent; } 79 bool setterPresent() const { return m_setter; } 80 bool getterPresent() const { return m_getter; } 81 bool equalTo(ExecState* exec, const PropertyDescriptor& other) const; 82 bool attributesEqual(const PropertyDescriptor& other) const; 83 unsigned attributesOverridingCurrent(const PropertyDescriptor& current) const; 84 85 private: 86 JS_EXPORTDATA static unsigned defaultAttributes; 87 bool operator==(const PropertyDescriptor&){ return false; } 88 enum { WritablePresent = 1, EnumerablePresent = 2, ConfigurablePresent = 4}; 89 // May be a getter/setter 90 JSValue m_value; 91 JSValue m_getter; 92 JSValue m_setter; 93 unsigned m_attributes; 94 unsigned m_seenAttributes; 95 }; 96} 97 98#endif 99