From 548f40ceaa4777d6d9d6987b1d9f07fcae04f662 Mon Sep 17 00:00:00 2001 From: HalidOdat Date: Mon, 28 Feb 2022 00:43:16 +0100 Subject: [PATCH] Make `Object.getOwnPropertyDescriptors` spec compliant --- boa_engine/src/builtins/object/mod.rs | 36 ++++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/boa_engine/src/builtins/object/mod.rs b/boa_engine/src/builtins/object/mod.rs index efdca08993b..cf0a0f8cae8 100644 --- a/boa_engine/src/builtins/object/mod.rs +++ b/boa_engine/src/builtins/object/mod.rs @@ -198,28 +198,34 @@ impl Object { args: &[JsValue], context: &mut Context, ) -> JsResult { - let object = args.get_or_undefined(0).to_object(context)?; + // 1. Let obj be ? ToObject(O). + let obj = args.get_or_undefined(0).to_object(context)?; + + // 2. Let ownKeys be ? obj.[[OwnPropertyKeys]](). + let own_keys = obj.__own_property_keys__(context)?; + + // 3. Let descriptors be OrdinaryObjectCreate(%Object.prototype%). let descriptors = context.construct_object(); - for key in object.borrow().properties().keys() { - let descriptor = { - let desc = object.__get_own_property__(&key, context)?; - Self::from_property_descriptor(desc, context) - }; + // 4. For each element key of ownKeys, do + for key in own_keys { + // a. Let desc be ? obj.[[GetOwnProperty]](key). + let desc = obj.__get_own_property__(&key, context)?; + + // b. Let descriptor be FromPropertyDescriptor(desc). + let descriptor = Self::from_property_descriptor(desc, context); + // c. If descriptor is not undefined, + // perform ! CreateDataPropertyOrThrow(descriptors, key, descriptor). if !descriptor.is_undefined() { - descriptors.borrow_mut().insert( - key, - PropertyDescriptor::builder() - .value(descriptor) - .writable(true) - .enumerable(true) - .configurable(true), - ); + descriptors + .create_data_property_or_throw(key, descriptor, context) + .expect("should not fail according to spec"); } } - Ok(JsValue::Object(descriptors)) + // 5. Return descriptors. + Ok(descriptors.into()) } /// The abstract operation `FromPropertyDescriptor`.