Skip to content

Commit 33c0413

Browse files
committed
Unify internal property creation.
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
1 parent 9676500 commit 33c0413

10 files changed

+146
-157
lines changed

Diff for: jerry-core/ecma/base/ecma-gc.c

+63-50
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "ecma-globals.h"
2626
#include "ecma-gc.h"
2727
#include "ecma-helpers.h"
28+
#include "ecma-lcache.h"
2829
#include "ecma-objects.h"
2930
#include "ecma-property-hashmap.h"
3031
#include "ecma-proxy-object.h"
@@ -252,8 +253,17 @@ ecma_gc_mark_properties (ecma_property_pair_t *property_pair_p) /**< property pa
252253
}
253254
break;
254255
}
255-
case ECMA_PROPERTY_TYPE_INTERNAL:
256+
default:
256257
{
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+
257267
JERRY_ASSERT (ECMA_PROPERTY_GET_NAME_TYPE (property) == ECMA_DIRECT_STRING_MAGIC
258268
&& property_pair_p->names_cp[index] >= LIT_INTERNAL_MAGIC_STRING_FIRST_DATA
259269
&& 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
277287
#endif /* ENABLED (JERRY_ESNEXT) */
278288
break;
279289
}
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-
}
288290
}
289291
}
290292
} /* ecma_gc_mark_properties */
@@ -1316,65 +1318,76 @@ ecma_gc_free_properties (ecma_object_t *object_p) /**< object */
13161318
ecma_property_t *property_p = (ecma_property_t *) (prop_iter_p->types + i);
13171319
jmem_cpointer_t name_cp = prop_pair_p->names_cp[i];
13181320

1319-
if (ECMA_PROPERTY_GET_TYPE (*property_p) == ECMA_PROPERTY_TYPE_INTERNAL)
1321+
if (*property_p == ECMA_PROPERTY_TYPE_DELETED)
13201322
{
1321-
JERRY_ASSERT (ECMA_PROPERTY_GET_NAME_TYPE (*property_p) == ECMA_DIRECT_STRING_MAGIC);
1323+
continue;
1324+
}
13221325

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+
{
13261338
#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,
13311343
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,
13391351
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+
}
13431355
#endif /* ENABLED (JERRY_ESNEXT) */
13441356
#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,
13481360
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))
13501365
{
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);
13551367

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));
13591370
}
1360-
1361-
ecma_collection_destroy (refs_p);
1362-
break;
13631371
}
1372+
1373+
ecma_collection_destroy (refs_p);
1374+
break;
1375+
}
13641376
#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;
13711382
}
13721383
}
13731384

1374-
if (prop_iter_p->types[i] != ECMA_PROPERTY_TYPE_DELETED)
1385+
#if ENABLED (JERRY_LCACHE)
1386+
if (ecma_is_property_lcached (property_p))
13751387
{
1376-
ecma_free_property (object_p, name_cp, property_p);
1388+
ecma_lcache_invalidate (object_p, name_cp, property_p);
13771389
}
1390+
#endif /* ENABLED (JERRY_LCACHE) */
13781391
}
13791392

13801393
prop_iter_cp = prop_iter_p->next_property_cp;

Diff for: jerry-core/ecma/base/ecma-globals.h

+43-38
Original file line numberDiff line numberDiff line change
@@ -354,11 +354,10 @@ typedef struct
354354
*/
355355
typedef enum
356356
{
357-
ECMA_PROPERTY_TYPE_SPECIAL, /**< special purpose property (deleted / hashmap) */
357+
ECMA_PROPERTY_TYPE_SPECIAL, /**< special purpose property (deleted / hashmap / internal) */
358358
ECMA_PROPERTY_TYPE_NAMEDDATA, /**< property is named data */
359359
ECMA_PROPERTY_TYPE_NAMEDACCESSOR, /**< property is named accessor */
360-
ECMA_PROPERTY_TYPE_INTERNAL, /**< internal property with custom data field */
361-
ECMA_PROPERTY_TYPE_VIRTUAL = ECMA_PROPERTY_TYPE_INTERNAL, /**< property is virtual data property */
360+
ECMA_PROPERTY_TYPE_VIRTUAL, /**< property is virtual data property */
362361

363362
ECMA_PROPERTY_TYPE__MAX = ECMA_PROPERTY_TYPE_VIRTUAL, /**< highest value for property types. */
364363
} ecma_property_types_t;
@@ -470,45 +469,20 @@ typedef enum
470469
*(property_p) ^= ECMA_PROPERTY_TYPE_NAMEDACCESSOR ^ ECMA_PROPERTY_TYPE_NAMEDDATA;
471470

472471
/**
473-
* Convert data property to internal property.
474-
*/
475-
#define ECMA_CONVERT_DATA_PROPERTY_TO_INTERNAL_PROPERTY(property_p) \
476-
*(property_p) = (uint8_t) (*(property_p) + (ECMA_PROPERTY_TYPE_INTERNAL - ECMA_PROPERTY_TYPE_NAMEDDATA))
477-
478-
/**
479-
* Convert internal property to data property.
472+
* Type of hash-map property.
480473
*/
481-
#define ECMA_CONVERT_INTERNAL_PROPERTY_TO_DATA_PROPERTY(property_p) \
482-
*(property_p) = (uint8_t) (*(property_p) - (ECMA_PROPERTY_TYPE_INTERNAL - ECMA_PROPERTY_TYPE_NAMEDDATA))
474+
#define ECMA_PROPERTY_TYPE_HASHMAP ((uint8_t) ECMA_PROPERTY_TYPE_SPECIAL)
483475

484476
/**
485-
* Special property identifiers.
477+
* Type of special properties with direct magic string name.
486478
*/
487-
typedef enum
488-
{
489-
/* Note: when new special types are added
490-
* ECMA_PROPERTY_IS_PROPERTY_PAIR must be updated as well. */
491-
ECMA_SPECIAL_PROPERTY_HASHMAP, /**< hashmap property */
492-
ECMA_SPECIAL_PROPERTY_DELETED, /**< deleted property */
493-
494-
ECMA_SPECIAL_PROPERTY__COUNT /**< Number of special property types */
495-
} ecma_special_property_id_t;
496-
497-
/**
498-
* Define special property type.
499-
*/
500-
#define ECMA_SPECIAL_PROPERTY_VALUE(type) \
501-
((uint8_t) (ECMA_PROPERTY_TYPE_SPECIAL | ((type) << ECMA_PROPERTY_NAME_TYPE_SHIFT)))
479+
#define ECMA_PROPERTY_TYPE_DIRECT \
480+
(ECMA_PROPERTY_TYPE_SPECIAL | (ECMA_DIRECT_STRING_MAGIC << ECMA_PROPERTY_NAME_TYPE_SHIFT))
502481

503482
/**
504483
* Type of deleted property.
505484
*/
506-
#define ECMA_PROPERTY_TYPE_DELETED ECMA_SPECIAL_PROPERTY_VALUE (ECMA_SPECIAL_PROPERTY_DELETED)
507-
508-
/**
509-
* Type of hash-map property.
510-
*/
511-
#define ECMA_PROPERTY_TYPE_HASHMAP ECMA_SPECIAL_PROPERTY_VALUE (ECMA_SPECIAL_PROPERTY_HASHMAP)
485+
#define ECMA_PROPERTY_TYPE_DELETED ((uint8_t) ECMA_PROPERTY_TYPE_DIRECT)
512486

513487
/**
514488
* Type of property not found.
@@ -614,11 +588,37 @@ typedef struct
614588
#define ECMA_PROPERTY_IS_PROPERTY_PAIR(property_header_p) \
615589
((property_header_p)->types[0] != ECMA_PROPERTY_TYPE_HASHMAP)
616590

591+
/**
592+
* Property type of all internal properties
593+
*/
594+
#define ECMA_PROPERTY_TYPE_INTERNAL (ECMA_PROPERTY_TYPE_DIRECT | ECMA_PROPERTY_FLAG_WRITABLE)
595+
596+
/**
597+
* Property type of all internal properties
598+
*/
599+
#define ECMA_PROPERTY_IS_INTERNAL(property) \
600+
(((property) | ECMA_PROPERTY_FLAG_LCACHED) == (ECMA_PROPERTY_TYPE_INTERNAL | ECMA_PROPERTY_FLAG_LCACHED))
601+
602+
/**
603+
* Create internal property.
604+
*/
605+
#define ECMA_CREATE_INTERNAL_PROPERTY(object_p, name_p, property_p, property_value_p) \
606+
do \
607+
{ \
608+
(property_value_p) = ecma_create_named_data_property ((object_p), \
609+
(name_p), \
610+
ECMA_PROPERTY_FLAG_WRITABLE, \
611+
&(property_p)); \
612+
JERRY_ASSERT (*(property_p) == (ECMA_PROPERTY_TYPE_INTERNAL | ECMA_PROPERTY_TYPE_NAMEDDATA)); \
613+
*(property_p) = ECMA_PROPERTY_TYPE_INTERNAL; \
614+
} \
615+
while (0)
616+
617617
/**
618618
* Returns true if the property is named property.
619619
*/
620620
#define ECMA_PROPERTY_IS_NAMED_PROPERTY(property) \
621-
(ECMA_PROPERTY_GET_TYPE (property) != ECMA_PROPERTY_TYPE_SPECIAL)
621+
(((property) & (ECMA_PROPERTY_TYPE_MASK | ECMA_PROPERTY_FLAG_WRITABLE)) != ECMA_PROPERTY_TYPE_SPECIAL)
622622

623623
/**
624624
* Add the offset part to a property for computing its property data pointer.
@@ -1219,19 +1219,24 @@ typedef struct
12191219
* - is_value_defined : true
12201220
* - is_configurable_defined, is_writable_defined, is_enumerable_defined : true
12211221
*/
1222-
#define ECMA_NAME_DATA_PROPERTY_DESCRIPTOR_BITS 0x3c0
1222+
#define ECMA_NAME_DATA_PROPERTY_DESCRIPTOR_BITS ((uint16_t) (ECMA_PROP_IS_VALUE_DEFINED \
1223+
| ECMA_PROP_IS_CONFIGURABLE_DEFINED \
1224+
| ECMA_PROP_IS_ENUMERABLE_DEFINED \
1225+
| ECMA_PROP_IS_WRITABLE_DEFINED))
12231226

12241227
/**
12251228
* Bitmask to get a the physical property flags from an ecma_property_descriptor
12261229
*/
1227-
#define ECMA_PROPERTY_FLAGS_MASK 0x1c
1230+
#define ECMA_PROPERTY_FLAGS_MASK ((uint16_t) (ECMA_PROP_IS_CONFIGURABLE \
1231+
| ECMA_PROP_IS_ENUMERABLE \
1232+
| ECMA_PROP_IS_WRITABLE))
12281233

12291234
/**
12301235
* Flag that controls failure handling during defining property
12311236
*
12321237
* Note: This flags represents the [[DefineOwnProperty]] (P, Desc, Throw) 3rd argument
12331238
*/
1234-
#define ECMA_IS_THROW (1 << 5)
1239+
#define ECMA_IS_THROW ((uint8_t) ECMA_PROP_IS_THROW)
12351240

12361241
#if !ENABLED (JERRY_NUMBER_TYPE_FLOAT64)
12371242
/**

Diff for: jerry-core/ecma/base/ecma-helpers-external-pointers.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,9 @@ ecma_create_native_pointer_property (ecma_object_t *obj_p, /**< object to create
5454
if (property_p == NULL)
5555
{
5656
ecma_property_value_t *value_p;
57-
value_p = ecma_create_named_data_property (obj_p, name_p, ECMA_PROPERTY_CONFIGURABLE_WRITABLE, &property_p);
58-
59-
ECMA_CONVERT_DATA_PROPERTY_TO_INTERNAL_PROPERTY (property_p);
57+
ECMA_CREATE_INTERNAL_PROPERTY (obj_p, name_p, property_p, value_p);
6058

6159
native_pointer_p = jmem_heap_alloc_block (sizeof (ecma_native_pointer_t));
62-
6360
ECMA_SET_INTERNAL_VALUE_POINTER (value_p->value, native_pointer_p);
6461
}
6562
else

0 commit comments

Comments
 (0)