@@ -1240,29 +1240,54 @@ ecma_free_property_descriptor (ecma_property_descriptor_t *prop_desc_p) /**< pro
1240
1240
} /* ecma_free_property_descriptor */
1241
1241
1242
1242
/* *
1243
- * Return property descriptor of property.
1243
+ * Construct property descriptor from specified property
1244
+ *
1245
+ * @return property descriptor, corresponding to type and content of the specified property, i.e.:
1246
+ * - for named data properties: { [Value], [Writable], [Enumerable], [Configurable] };
1247
+ * - for named accessor properties: { [Get] - if defined,
1248
+ * [Set] - if defined,
1249
+ * [Enumerable], [Configurable]
1250
+ * }.
1244
1251
*/
1245
1252
ecma_property_descriptor_t
1246
1253
ecma_get_property_descriptor_from_property (ecma_property_t *prop_p) /* *< property */
1247
1254
{
1248
1255
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
1249
1256
1250
1257
prop_desc.is_enumerable = ecma_is_property_enumerable (prop_p);
1258
+ prop_desc.is_enumerable_defined = true ;
1251
1259
prop_desc.is_configurable = ecma_is_property_configurable (prop_p);
1260
+ prop_desc.is_configurable_defined = true ;
1252
1261
1253
1262
if (prop_p->type == ECMA_PROPERTY_NAMEDDATA)
1254
1263
{
1255
- prop_desc.value = ecma_get_named_data_property_value (prop_p);
1264
+ prop_desc.value = ecma_copy_value ( ecma_get_named_data_property_value (prop_p), true );
1256
1265
prop_desc.is_value_defined = true ;
1257
1266
prop_desc.is_writable = ecma_is_property_writable (prop_p);
1258
1267
prop_desc.is_writable_defined = true ;
1259
1268
}
1260
1269
else if (prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR)
1261
1270
{
1262
1271
prop_desc.get_p = ecma_get_named_accessor_property_getter (prop_p);
1263
- prop_desc.is_get_defined = prop_desc.get_p != NULL ? true : false ;
1272
+ if (prop_desc.get_p != NULL )
1273
+ {
1274
+ prop_desc.is_get_defined = true ;
1275
+ ecma_ref_object (prop_desc.get_p );
1276
+ }
1277
+ else
1278
+ {
1279
+ prop_desc.is_get_defined = false ;
1280
+ }
1264
1281
prop_desc.set_p = ecma_get_named_accessor_property_setter (prop_p);
1265
- prop_desc.is_set_defined = prop_desc.set_p != NULL ? true : false ;
1282
+ if (prop_desc.set_p != NULL )
1283
+ {
1284
+ prop_desc.is_set_defined = true ;
1285
+ ecma_ref_object (prop_desc.set_p );
1286
+ }
1287
+ else
1288
+ {
1289
+ prop_desc.is_set_defined = false ;
1290
+ }
1266
1291
}
1267
1292
1268
1293
return prop_desc;
0 commit comments