@@ -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