Skip to content

Commit 8da15d3

Browse files
woessgilles-duboscq
authored andcommitted
Fix [[DefineOwnProperty]] on dictionary object with a not fully populated property descriptor.
1 parent 21e6ccc commit 8da15d3

File tree

1 file changed

+26
-1
lines changed
  • graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/runtime/builtins

1 file changed

+26
-1
lines changed

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/runtime/builtins/JSDictionary.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ public PropertyDescriptor getOwnProperty(JSDynamicObject thisObj, Object key) {
261261
public boolean defineOwnProperty(JSDynamicObject thisObj, Object key, PropertyDescriptor desc, boolean doThrow) {
262262
assert JSRuntime.isPropertyKey(key);
263263
if (!hasOwnProperty(thisObj, key) && JSObject.isExtensible(thisObj)) {
264-
getHashMap(thisObj).put(key, desc);
264+
getHashMap(thisObj).put(key, makeFullyPopulatedPropertyDescriptor(desc));
265265
return true;
266266
}
267267

@@ -271,6 +271,31 @@ public boolean defineOwnProperty(JSDynamicObject thisObj, Object key, PropertyDe
271271
return super.defineOwnProperty(thisObj, key, desc, doThrow);
272272
}
273273

274+
/**
275+
* Returns a fully populated property descriptor that is either an accessor property descriptor
276+
* or a data property descriptor that has all of the corresponding fields. Missing fields are
277+
* filled with default values.
278+
*/
279+
private static PropertyDescriptor makeFullyPopulatedPropertyDescriptor(PropertyDescriptor desc) {
280+
if (desc.isAccessorDescriptor()) {
281+
if (desc.hasGet() && desc.hasSet() && desc.hasEnumerable() && desc.hasConfigurable()) {
282+
return desc;
283+
} else {
284+
return PropertyDescriptor.createAccessor(desc.getGet(), desc.getSet(), desc.getEnumerable(), desc.getConfigurable());
285+
}
286+
} else if (desc.isDataDescriptor()) {
287+
if (desc.hasValue() && desc.hasWritable() && desc.hasEnumerable() && desc.hasConfigurable()) {
288+
return desc;
289+
} else {
290+
Object value = desc.hasValue() ? desc.getValue() : Undefined.instance;
291+
return PropertyDescriptor.createData(value, desc.getEnumerable(), desc.getWritable(), desc.getConfigurable());
292+
}
293+
} else {
294+
assert desc.isGenericDescriptor();
295+
return PropertyDescriptor.createData(Undefined.instance, desc.getEnumerable(), desc.getWritable(), desc.getConfigurable());
296+
}
297+
}
298+
274299
@SuppressWarnings("unchecked")
275300
static EconomicMap<Object, PropertyDescriptor> getHashMap(JSDynamicObject obj) {
276301
assert JSDictionary.isJSDictionaryObject(obj);

0 commit comments

Comments
 (0)