25
25
#include "ecma-globals.h"
26
26
#include "ecma-gc.h"
27
27
#include "ecma-helpers.h"
28
+ #include "ecma-lcache.h"
28
29
#include "ecma-objects.h"
29
30
#include "ecma-property-hashmap.h"
30
31
#include "ecma-proxy-object.h"
@@ -252,8 +253,17 @@ ecma_gc_mark_properties (ecma_property_pair_t *property_pair_p) /**< property pa
252
253
}
253
254
break ;
254
255
}
255
- case ECMA_PROPERTY_TYPE_INTERNAL :
256
+ default :
256
257
{
258
+ JERRY_ASSERT (ECMA_PROPERTY_GET_TYPE (property ) == ECMA_PROPERTY_TYPE_SPECIAL );
259
+
260
+ if (!ECMA_PROPERTY_IS_NAMED_PROPERTY (property ))
261
+ {
262
+ JERRY_ASSERT (property == ECMA_PROPERTY_TYPE_DELETED
263
+ || property == ECMA_PROPERTY_TYPE_HASHMAP );
264
+ break ;
265
+ }
266
+
257
267
JERRY_ASSERT (ECMA_PROPERTY_GET_NAME_TYPE (property ) == ECMA_DIRECT_STRING_MAGIC
258
268
&& property_pair_p -> names_cp [index ] >= LIT_INTERNAL_MAGIC_STRING_FIRST_DATA
259
269
&& property_pair_p -> names_cp [index ] < LIT_MAGIC_STRING__COUNT );
@@ -277,14 +287,6 @@ ecma_gc_mark_properties (ecma_property_pair_t *property_pair_p) /**< property pa
277
287
#endif /* ENABLED (JERRY_ESNEXT) */
278
288
break ;
279
289
}
280
- default :
281
- {
282
- JERRY_ASSERT (ECMA_PROPERTY_GET_TYPE (property ) == ECMA_PROPERTY_TYPE_SPECIAL );
283
-
284
- JERRY_ASSERT (property == ECMA_PROPERTY_TYPE_HASHMAP
285
- || property == ECMA_PROPERTY_TYPE_DELETED );
286
- break ;
287
- }
288
290
}
289
291
}
290
292
} /* ecma_gc_mark_properties */
@@ -1316,65 +1318,76 @@ ecma_gc_free_properties (ecma_object_t *object_p) /**< object */
1316
1318
ecma_property_t * property_p = (ecma_property_t * ) (prop_iter_p -> types + i );
1317
1319
jmem_cpointer_t name_cp = prop_pair_p -> names_cp [i ];
1318
1320
1319
- if (ECMA_PROPERTY_GET_TYPE ( * property_p ) == ECMA_PROPERTY_TYPE_INTERNAL )
1321
+ if (* property_p == ECMA_PROPERTY_TYPE_DELETED )
1320
1322
{
1321
- JERRY_ASSERT (ECMA_PROPERTY_GET_NAME_TYPE (* property_p ) == ECMA_DIRECT_STRING_MAGIC );
1323
+ continue ;
1324
+ }
1322
1325
1323
- /* Call the native's free callback. */
1324
- switch (name_cp )
1325
- {
1326
+ if (ECMA_PROPERTY_GET_TYPE (* property_p ) != ECMA_PROPERTY_TYPE_SPECIAL )
1327
+ {
1328
+ ecma_free_property (object_p , name_cp , property_p );
1329
+ continue ;
1330
+ }
1331
+
1332
+ JERRY_ASSERT (ECMA_PROPERTY_IS_INTERNAL (* property_p ));
1333
+ JERRY_ASSERT (ECMA_PROPERTY_GET_NAME_TYPE (* property_p ) == ECMA_DIRECT_STRING_MAGIC );
1334
+
1335
+ /* Call the native's free callback. */
1336
+ switch (name_cp )
1337
+ {
1326
1338
#if ENABLED (JERRY_ESNEXT )
1327
- case LIT_INTERNAL_MAGIC_STRING_ENVIRONMENT_RECORD :
1328
- {
1329
- ecma_environment_record_t * environment_record_p ;
1330
- environment_record_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_environment_record_t ,
1339
+ case LIT_INTERNAL_MAGIC_STRING_ENVIRONMENT_RECORD :
1340
+ {
1341
+ ecma_environment_record_t * environment_record_p ;
1342
+ environment_record_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_environment_record_t ,
1331
1343
prop_pair_p -> values [i ].value );
1332
- jmem_heap_free_block (environment_record_p , sizeof (ecma_environment_record_t ));
1333
- break ;
1334
- }
1335
- case LIT_INTERNAL_MAGIC_STRING_CLASS_FIELD_COMPUTED :
1336
- {
1337
- ecma_value_t * compact_collection_p ;
1338
- compact_collection_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_value_t ,
1344
+ jmem_heap_free_block (environment_record_p , sizeof (ecma_environment_record_t ));
1345
+ break ;
1346
+ }
1347
+ case LIT_INTERNAL_MAGIC_STRING_CLASS_FIELD_COMPUTED :
1348
+ {
1349
+ ecma_value_t * compact_collection_p ;
1350
+ compact_collection_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_value_t ,
1339
1351
prop_pair_p -> values [i ].value );
1340
- ecma_compact_collection_free (compact_collection_p );
1341
- break ;
1342
- }
1352
+ ecma_compact_collection_free (compact_collection_p );
1353
+ break ;
1354
+ }
1343
1355
#endif /* ENABLED (JERRY_ESNEXT) */
1344
1356
#if ENABLED (JERRY_BUILTIN_WEAKMAP ) || ENABLED (JERRY_BUILTIN_WEAKSET )
1345
- case LIT_INTERNAL_MAGIC_STRING_WEAK_REFS :
1346
- {
1347
- ecma_collection_t * refs_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_collection_t ,
1357
+ case LIT_INTERNAL_MAGIC_STRING_WEAK_REFS :
1358
+ {
1359
+ ecma_collection_t * refs_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_collection_t ,
1348
1360
prop_pair_p -> values [i ].value );
1349
- for (uint32_t j = 0 ; j < refs_p -> item_count ; j ++ )
1361
+ for (uint32_t j = 0 ; j < refs_p -> item_count ; j ++ )
1362
+ {
1363
+ const ecma_value_t value = refs_p -> buffer_p [j ];
1364
+ if (!ecma_is_value_empty (value ))
1350
1365
{
1351
- const ecma_value_t value = refs_p -> buffer_p [j ];
1352
- if (!ecma_is_value_empty (value ))
1353
- {
1354
- ecma_object_t * container_p = ecma_get_object_from_value (value );
1366
+ ecma_object_t * container_p = ecma_get_object_from_value (value );
1355
1367
1356
- ecma_op_container_remove_weak_entry (container_p ,
1357
- ecma_make_object_value (object_p ));
1358
- }
1368
+ ecma_op_container_remove_weak_entry (container_p ,
1369
+ ecma_make_object_value (object_p ));
1359
1370
}
1360
-
1361
- ecma_collection_destroy (refs_p );
1362
- break ;
1363
1371
}
1372
+
1373
+ ecma_collection_destroy (refs_p );
1374
+ break ;
1375
+ }
1364
1376
#endif /* ENABLED (JERRY_BUILTIN_WEAKMAP) || ENABLED (JERRY_BUILTIN_WEAKSET) */
1365
- default :
1366
- {
1367
- JERRY_ASSERT (name_cp == LIT_INTERNAL_MAGIC_STRING_NATIVE_POINTER );
1368
- ecma_gc_free_native_pointer (property_p );
1369
- break ;
1370
- }
1377
+ default :
1378
+ {
1379
+ JERRY_ASSERT (name_cp == LIT_INTERNAL_MAGIC_STRING_NATIVE_POINTER );
1380
+ ecma_gc_free_native_pointer (property_p );
1381
+ break ;
1371
1382
}
1372
1383
}
1373
1384
1374
- if (prop_iter_p -> types [i ] != ECMA_PROPERTY_TYPE_DELETED )
1385
+ #if ENABLED (JERRY_LCACHE )
1386
+ if (ecma_is_property_lcached (property_p ))
1375
1387
{
1376
- ecma_free_property (object_p , name_cp , property_p );
1388
+ ecma_lcache_invalidate (object_p , name_cp , property_p );
1377
1389
}
1390
+ #endif /* ENABLED (JERRY_LCACHE) */
1378
1391
}
1379
1392
1380
1393
prop_iter_cp = prop_iter_p -> next_property_cp ;
0 commit comments