src/jdk/nashorn/internal/objects/DataPropertyDescriptor.java

Tue, 25 Feb 2014 18:56:10 +0530

author
sundar
date
Tue, 25 Feb 2014 18:56:10 +0530
changeset 765
316ee513df62
parent 414
ec84ba68ad39
child 766
06ee95f094b4
permissions
-rw-r--r--

8030197: Nashorn: Object.defineProperty() can be lured to change fixed NaN property
Reviewed-by: attila, jlaskey

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

mercurial