Skip to content

Commit da7e9d9

Browse files
Fixing retrieval of [[Class]] properties for built-in function objects, optimizing memory related to [[Class]] property.
- introduced ecma_object_get_class_name interface; - removed creation of [[Class]] internal property for types of objects that unambiguously determine the [[Class]] value. Related issue: #112 JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
1 parent bc7c28c commit da7e9d9

18 files changed

+284
-92
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ ecma_builtin_array_prototype_object_concat (ecma_value_t this_arg, /**< this arg
139139
{
140140
/* 5.b */
141141
if (ecma_is_value_object (args[arg_index]) &&
142-
(ecma_get_object_type (ecma_get_object_from_value (args[arg_index])) == ECMA_OBJECT_TYPE_ARRAY))
142+
(ecma_object_get_class_name (ecma_get_object_from_value (args[arg_index])) == ECMA_MAGIC_STRING_ARRAY_UL))
143143
{
144144
/* 5.b.ii */
145145
ECMA_TRY_CATCH (arg_len_value,

jerry-core/ecma/builtin-objects/ecma-builtin-array.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,7 @@ ecma_builtin_array_object_is_array (ecma_value_t this_arg __attr_unused___, /**<
6363
{
6464
ecma_object_t *obj_p = ecma_get_object_from_value (arg);
6565

66-
ecma_property_t *class_prop_p = ecma_get_internal_property (obj_p,
67-
ECMA_INTERNAL_PROPERTY_CLASS);
68-
69-
if (class_prop_p->u.internal_property.value == ECMA_MAGIC_STRING_ARRAY_UL)
66+
if (ecma_object_get_class_name (obj_p) == ECMA_MAGIC_STRING_ARRAY_UL)
7067
{
7168
is_array = ECMA_SIMPLE_VALUE_TRUE;
7269
}

jerry-core/ecma/builtin-objects/ecma-builtin-boolean-prototype.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,7 @@ ecma_builtin_boolean_prototype_object_value_of (ecma_value_t this_arg) /**< this
102102
{
103103
ecma_object_t *obj_p = ecma_get_object_from_value (this_arg);
104104

105-
ecma_property_t *class_prop_p = ecma_get_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
106-
107-
if (class_prop_p->u.internal_property.value == ECMA_MAGIC_STRING_BOOLEAN_UL)
105+
if (ecma_object_get_class_name (obj_p) == ECMA_MAGIC_STRING_BOOLEAN_UL)
108106
{
109107
ecma_property_t *prim_value_prop_p = ecma_get_internal_property (obj_p,
110108
ECMA_INTERNAL_PROPERTY_PRIMITIVE_BOOLEAN_VALUE);

jerry-core/ecma/builtin-objects/ecma-builtin-helpers.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,7 @@ ecma_builtin_helper_object_to_string (const ecma_value_t this_arg) /**< this arg
7171

7272
ecma_object_t *obj_p = ecma_get_object_from_completion_value (obj_this);
7373

74-
ecma_property_t *class_prop_p = ecma_get_internal_property (obj_p,
75-
ECMA_INTERNAL_PROPERTY_CLASS);
76-
type_string = (ecma_magic_string_id_t) class_prop_p->u.internal_property.value;
74+
type_string = ecma_object_get_class_name (obj_p);
7775

7876
ecma_free_completion_value (obj_this);
7977
}

jerry-core/ecma/builtin-objects/ecma-builtin-number-prototype.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,7 @@ ecma_builtin_number_prototype_object_to_string (ecma_value_t this_arg, /**< this
7070
{
7171
ecma_object_t *obj_p = ecma_get_object_from_value (this_arg);
7272

73-
ecma_property_t *class_prop_p = ecma_get_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
74-
75-
if (class_prop_p->u.internal_property.value == ECMA_MAGIC_STRING_NUMBER_UL)
73+
if (ecma_object_get_class_name (obj_p) == ECMA_MAGIC_STRING_NUMBER_UL)
7674
{
7775
ecma_property_t *prim_value_prop_p = ecma_get_internal_property (obj_p,
7876
ECMA_INTERNAL_PROPERTY_PRIMITIVE_NUMBER_VALUE);
@@ -137,9 +135,7 @@ ecma_builtin_number_prototype_object_value_of (ecma_value_t this_arg) /**< this
137135
{
138136
ecma_object_t *obj_p = ecma_get_object_from_value (this_arg);
139137

140-
ecma_property_t *class_prop_p = ecma_get_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
141-
142-
if (class_prop_p->u.internal_property.value == ECMA_MAGIC_STRING_NUMBER_UL)
138+
if (ecma_object_get_class_name (obj_p) == ECMA_MAGIC_STRING_NUMBER_UL)
143139
{
144140
ecma_property_t *prim_value_prop_p = ecma_get_internal_property (obj_p,
145141
ECMA_INTERNAL_PROPERTY_PRIMITIVE_NUMBER_VALUE);

jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ ecma_builtin_string_prototype_object_to_string (ecma_value_t this_arg) /**< this
6464
{
6565
ecma_object_t *obj_p = ecma_get_object_from_value (this_arg);
6666

67-
ecma_property_t *class_prop_p = ecma_get_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
68-
69-
if (class_prop_p->u.internal_property.value == ECMA_MAGIC_STRING_STRING_UL)
67+
if (ecma_object_get_class_name (obj_p) == ECMA_MAGIC_STRING_STRING_UL)
7068
{
7169
ecma_property_t *prim_value_prop_p = ecma_get_internal_property (obj_p,
7270
ECMA_INTERNAL_PROPERTY_PRIMITIVE_STRING_VALUE);

jerry-core/ecma/builtin-objects/ecma-builtins-internal.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ ecma_builtin_bin_search_for_magic_string_id_in_array (const ecma_magic_string_id
5757

5858
#define BUILTIN(builtin_id, \
5959
object_type, \
60-
object_class, \
6160
object_prototype_builtin_id, \
6261
is_extensible, \
6362
is_static, \

jerry-core/ecma/builtin-objects/ecma-builtins.cpp

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,16 @@ ecma_builtin_is (ecma_object_t *obj_p, /**< pointer to an object */
5454
JERRY_ASSERT (obj_p != NULL && !ecma_is_lexical_environment (obj_p));
5555
JERRY_ASSERT (builtin_id < ECMA_BUILTIN_ID__COUNT);
5656

57-
if (unlikely (ecma_builtin_objects[builtin_id] == NULL))
57+
if (ecma_builtin_objects[builtin_id] == NULL)
5858
{
59-
ecma_instantiate_builtin (builtin_id);
59+
/* If a built-in object is not instantiated,
60+
* the specified object cannot be the built-in object */
61+
return false;
62+
}
63+
else
64+
{
65+
return (obj_p == ecma_builtin_objects[builtin_id]);
6066
}
61-
62-
return (obj_p == ecma_builtin_objects[builtin_id]);
6367
} /* ecma_builtin_is */
6468

6569
/**
@@ -94,14 +98,15 @@ static ecma_object_t*
9498
ecma_builtin_init_object (ecma_builtin_id_t obj_builtin_id, /**< built-in ID */
9599
ecma_object_t* prototype_obj_p, /**< prototype object */
96100
ecma_object_type_t obj_type, /**< object's type */
97-
ecma_magic_string_id_t obj_class, /**< object's class */
98101
bool is_extensible) /**< value of object's [[Extensible]] property */
99102
{
100103
ecma_object_t *object_obj_p = ecma_create_object (prototype_obj_p, is_extensible, obj_type);
101104

102-
ecma_property_t *class_prop_p = ecma_create_internal_property (object_obj_p,
103-
ECMA_INTERNAL_PROPERTY_CLASS);
104-
class_prop_p->u.internal_property.value = obj_class;
105+
/*
106+
* [[Class]] property of built-in object is not stored explicitly.
107+
*
108+
* See also: ecma_object_get_class_name
109+
*/
105110

106111
ecma_property_t *built_in_id_prop_p = ecma_create_internal_property (object_obj_p,
107112
ECMA_INTERNAL_PROPERTY_BUILT_IN_ID);
@@ -183,7 +188,6 @@ ecma_instantiate_builtin (ecma_builtin_id_t id) /**< built-in id */
183188
{
184189
#define BUILTIN(builtin_id, \
185190
object_type, \
186-
object_class, \
187191
object_prototype_builtin_id, \
188192
is_extensible, \
189193
is_static, \
@@ -211,11 +215,10 @@ ecma_instantiate_builtin (ecma_builtin_id_t id) /**< built-in id */
211215
JERRY_ASSERT (prototype_obj_p != NULL); \
212216
} \
213217
\
214-
ecma_object_t *builtin_obj_p = ecma_builtin_init_object (builtin_id, \
215-
prototype_obj_p, \
216-
object_type, \
217-
object_class, \
218-
is_extensible); \
218+
ecma_object_t *builtin_obj_p = ecma_builtin_init_object (builtin_id, \
219+
prototype_obj_p, \
220+
object_type, \
221+
is_extensible); \
219222
ecma_builtin_objects[builtin_id] = builtin_obj_p; \
220223
\
221224
break; \
@@ -274,7 +277,6 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
274277
{
275278
#define BUILTIN(builtin_id, \
276279
object_type, \
277-
object_class, \
278280
object_prototype_builtin_id, \
279281
is_extensible, \
280282
is_static, \
@@ -411,7 +413,6 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */
411413
{
412414
#define BUILTIN(builtin_id, \
413415
object_type, \
414-
object_class, \
415416
object_prototype_builtin_id, \
416417
is_extensible, \
417418
is_static, \
@@ -474,7 +475,6 @@ ecma_builtin_dispatch_construct (ecma_object_t *obj_p, /**< built-in object */
474475
{
475476
#define BUILTIN(builtin_id, \
476477
object_type, \
477-
object_class, \
478478
object_prototype_builtin_id, \
479479
is_extensible, \
480480
is_static, \
@@ -530,7 +530,6 @@ ecma_builtin_dispatch_routine (ecma_builtin_id_t builtin_object_id, /**< built-i
530530
{
531531
#define BUILTIN(builtin_id, \
532532
object_type, \
533-
object_class, \
534533
object_prototype_builtin_id, \
535534
is_extensible, \
536535
is_static, \

jerry-core/ecma/builtin-objects/ecma-builtins.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ typedef enum
2525
{
2626
#define BUILTIN(builtin_id, \
2727
object_type, \
28-
object_class, \
2928
object_prototype_builtin_id, \
3029
is_extensible, \
3130
is_static, \

0 commit comments

Comments
 (0)