1 /*
2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.nashorn.internal.objects;
27
28 import static jdk.nashorn.internal.runtime.ScriptRuntime.sameValue;
29
30 import java.util.Objects;
31 import jdk.nashorn.internal.objects.annotations.Property;
32 import jdk.nashorn.internal.objects.annotations.ScriptClass;
33 import jdk.nashorn.internal.runtime.JSType;
34 import jdk.nashorn.internal.runtime.PropertyDescriptor;
35 import jdk.nashorn.internal.runtime.PropertyMap;
36 import jdk.nashorn.internal.runtime.ScriptFunction;
37 import jdk.nashorn.internal.runtime.ScriptObject;
38
39 /**
40 * Data Property descriptor is used to represent attributes an object property
41 * that has data value (instead of a getter or setter function).
42 *
43 * See ECMA 8.10 The Property Descriptor and Property Identifier Specification Types
44 *
45 */
46 @ScriptClass("DataPropertyDescriptor")
47 public final class DataPropertyDescriptor extends ScriptObject implements PropertyDescriptor {
48 /** is this property configurable */
49 @Property
50 public Object configurable;
51
52 /** is this property enumerable */
53 @Property
54 public Object enumerable;
55
56 /** is this property writable */
57 @Property
58 public Object writable;
59
60 /** value of this property */
61 @Property
62 public Object value;
63
64 // initialized by nasgen
65 private static PropertyMap $nasgenmap$;
66
67 DataPropertyDescriptor(final boolean configurable, final boolean enumerable, final boolean writable, final Object value, final Global global) {
68 super(global.getObjectPrototype(), $nasgenmap$);
69 this.configurable = configurable;
70 this.enumerable = enumerable;
71 this.writable = writable;
72 this.value = value;
73 }
74
75
76 @Override
77 public boolean isConfigurable() {
78 return JSType.toBoolean(configurable);
79 }
80
81 @Override
82 public boolean isEnumerable() {
83 return JSType.toBoolean(enumerable);
84 }
85
86 @Override
87 public boolean isWritable() {
88 return JSType.toBoolean(writable);
89 }
90
91 @Override
92 public Object getValue() {
93 return value;
94 }
95
96 @Override
97 public ScriptFunction getGetter() {
98 throw new UnsupportedOperationException("getter");
99 }
100
101 @Override
102 public ScriptFunction getSetter() {
103 throw new UnsupportedOperationException("setter");
104 }
105
106 @Override
107 public void setConfigurable(final boolean flag) {
108 this.configurable = flag;
109 }
110
111 @Override
112 public void setEnumerable(final boolean flag) {
113 this.enumerable = flag;
114 }
115
116 @Override
117 public void setWritable(final boolean flag) {
118 this.writable = flag;
119 }
120
121 @Override
122 public void setValue(final Object value) {
123 this.value = value;
124 }
125
126 @Override
127 public void setGetter(final Object getter) {
128 throw new UnsupportedOperationException("set getter");
129 }
130
131 @Override
132 public void setSetter(final Object setter) {
133 throw new UnsupportedOperationException("set setter");
134 }
135
136 @Override
137 public PropertyDescriptor fillFrom(final ScriptObject sobj) {
138 if (sobj.has(CONFIGURABLE)) {
139 this.configurable = JSType.toBoolean(sobj.get(CONFIGURABLE));
140 } else {
141 delete(CONFIGURABLE, false);
142 }
143
144 if (sobj.has(ENUMERABLE)) {
145 this.enumerable = JSType.toBoolean(sobj.get(ENUMERABLE));
146 } else {
147 delete(ENUMERABLE, false);
148 }
149
150 if (sobj.has(WRITABLE)) {
151 this.writable = JSType.toBoolean(sobj.get(WRITABLE));
152 } else {
153 delete(WRITABLE, false);
154 }
155
156 if (sobj.has(VALUE)) {
157 this.value = sobj.get(VALUE);
158 } else {
159 delete(VALUE, false);
160 }
161
162 return this;
163 }
164
165 @Override
166 public int type() {
167 return DATA;
168 }
169
170 @Override
171 public boolean hasAndEquals(final PropertyDescriptor otherDesc) {
172 if (! (otherDesc instanceof DataPropertyDescriptor)) {
173 return false;
174 }
175
176 final DataPropertyDescriptor other = (DataPropertyDescriptor)otherDesc;
177 return (!has(CONFIGURABLE) || sameValue(configurable, other.configurable)) &&
178 (!has(ENUMERABLE) || sameValue(enumerable, other.enumerable)) &&
179 (!has(WRITABLE) || sameValue(writable, other.writable)) &&
180 (!has(VALUE) || sameValue(value, other.value));
181 }
182
183 @Override
184 public boolean equals(final Object obj) {
185 if (this == obj) {
186 return true;
187 }
188 if (! (obj instanceof DataPropertyDescriptor)) {
189 return false;
190 }
191
192 final DataPropertyDescriptor other = (DataPropertyDescriptor)obj;
193 return sameValue(configurable, other.configurable) &&
194 sameValue(enumerable, other.enumerable) &&
195 sameValue(writable, other.writable) &&
196 sameValue(value, other.value);
197 }
198
199 @Override
200 public int hashCode() {
201 int hash = 5;
202 hash = 43 * hash + Objects.hashCode(this.configurable);
203 hash = 43 * hash + Objects.hashCode(this.enumerable);
204 hash = 43 * hash + Objects.hashCode(this.writable);
205 hash = 43 * hash + Objects.hashCode(this.value);
206 return hash;
207 }
208 }
--- EOF ---