From ae244f0148f5c0cef7040bdc47fa1343aa4f95b9 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Tue, 23 Sep 2014 15:29:08 +0400 Subject: [PATCH] Common built-in object's constructor. --- .../ecma-builtin-global-object.c | 42 +------------- .../ecma-builtin-object-object.c | 42 +------------- src/libecmabuiltins/ecma-builtins-internal.h | 8 +-- src/libecmabuiltins/ecma-builtins.c | 55 ++++++++++++++++++- 4 files changed, 61 insertions(+), 86 deletions(-) diff --git a/src/libecmabuiltins/ecma-builtin-global-object.c b/src/libecmabuiltins/ecma-builtin-global-object.c index 8af8d946d..9a50e3949 100644 --- a/src/libecmabuiltins/ecma-builtin-global-object.c +++ b/src/libecmabuiltins/ecma-builtin-global-object.c @@ -37,10 +37,6 @@ /** * List of the Global object's built-in property names - * - * Warning: - * values in the array should be sorted in ascending order - * that is checked in the ecma_builtin_init_global_object. */ static const ecma_magic_string_id_t ecma_builtin_global_property_names[] = { @@ -78,44 +74,10 @@ static const ecma_magic_string_id_t ecma_builtin_global_property_names[] = /** * Number of the Global object's built-in properties */ -static const ecma_length_t ecma_builtin_global_property_number = (sizeof (ecma_builtin_global_property_names) / - sizeof (ecma_magic_string_id_t)); +const ecma_length_t ecma_builtin_global_property_number = (sizeof (ecma_builtin_global_property_names) / + sizeof (ecma_magic_string_id_t)); JERRY_STATIC_ASSERT (sizeof (ecma_builtin_global_property_names) > sizeof (void*)); -/** - * Initialize Global object. - * - * Warning: - * the routine should be called only from ecma_init_builtins - * - * @return pointer to the object - */ -ecma_object_t* -ecma_builtin_init_global_object (void) -{ - ecma_object_t *glob_obj_p = ecma_create_object (NULL, true, ECMA_OBJECT_TYPE_GENERAL); - - ecma_property_t *class_prop_p = ecma_create_internal_property (glob_obj_p, - ECMA_INTERNAL_PROPERTY_CLASS); - class_prop_p->u.internal_property.value = ECMA_OBJECT_CLASS_OBJECT; - - ecma_property_t *built_in_id_prop_p = ecma_create_internal_property (glob_obj_p, - ECMA_INTERNAL_PROPERTY_BUILT_IN_ID); - built_in_id_prop_p->u.internal_property.value = ECMA_BUILTIN_ID_GLOBAL; - - ecma_property_t *mask_0_31_prop_p; - mask_0_31_prop_p = ecma_create_internal_property (glob_obj_p, - ECMA_INTERNAL_PROPERTY_NON_INSTANTIATED_BUILT_IN_MASK_0_31); - - JERRY_STATIC_ASSERT (ecma_builtin_global_property_number < sizeof (uint32_t) * JERRY_BITSINBYTE); - uint32_t builtin_mask = ((uint32_t)1u << ecma_builtin_global_property_number) - 1; - mask_0_31_prop_p->u.internal_property.value = builtin_mask; - - ecma_set_object_is_builtin (glob_obj_p, true); - - return glob_obj_p; -} /* ecma_builtin_init_global_object */ - /** * The Global object's 'eval' routine * diff --git a/src/libecmabuiltins/ecma-builtin-object-object.c b/src/libecmabuiltins/ecma-builtin-object-object.c index bb95346ff..9b0dde930 100644 --- a/src/libecmabuiltins/ecma-builtin-object-object.c +++ b/src/libecmabuiltins/ecma-builtin-object-object.c @@ -40,10 +40,6 @@ /** * List of the Object object's built-in property names - * - * Warning: - * values in the array should be sorted in ascending order - * that is checked in the ecma_builtin_init_global_object. */ static const ecma_magic_string_id_t ecma_builtin_object_property_names[] = { @@ -67,44 +63,10 @@ static const ecma_magic_string_id_t ecma_builtin_object_property_names[] = /** * Number of the Object object's built-in properties */ -static const ecma_length_t ecma_builtin_object_property_number = (sizeof (ecma_builtin_object_property_names) / - sizeof (ecma_magic_string_id_t)); +const ecma_length_t ecma_builtin_object_property_number = (sizeof (ecma_builtin_object_property_names) / + sizeof (ecma_magic_string_id_t)); JERRY_STATIC_ASSERT (sizeof (ecma_builtin_object_property_names) > sizeof (void*)); -/** - * Initialize Object object. - * - * Warning: - * the routine should be called only from ecma_init_builtins - * - * @return pointer to the object - */ -ecma_object_t* -ecma_builtin_init_object_object (void) -{ - ecma_object_t *object_obj_p = ecma_create_object (NULL, true, ECMA_OBJECT_TYPE_FUNCTION); - - ecma_property_t *class_prop_p = ecma_create_internal_property (object_obj_p, - ECMA_INTERNAL_PROPERTY_CLASS); - class_prop_p->u.internal_property.value = ECMA_OBJECT_CLASS_OBJECT; - - ecma_property_t *built_in_id_prop_p = ecma_create_internal_property (object_obj_p, - ECMA_INTERNAL_PROPERTY_BUILT_IN_ID); - built_in_id_prop_p->u.internal_property.value = ECMA_BUILTIN_ID_OBJECT; - - ecma_property_t *mask_0_31_prop_p; - mask_0_31_prop_p = ecma_create_internal_property (object_obj_p, - ECMA_INTERNAL_PROPERTY_NON_INSTANTIATED_BUILT_IN_MASK_0_31); - - JERRY_STATIC_ASSERT (ecma_builtin_object_property_number < sizeof (uint32_t) * JERRY_BITSINBYTE); - uint32_t builtin_mask = ((uint32_t) 1u << ecma_builtin_object_property_number) - 1; - mask_0_31_prop_p->u.internal_property.value = builtin_mask; - - ecma_set_object_is_builtin (object_obj_p, true); - - return object_obj_p; -} /* ecma_builtin_init_object_object */ - /** * Get number of routine's parameters * diff --git a/src/libecmabuiltins/ecma-builtins-internal.h b/src/libecmabuiltins/ecma-builtins-internal.h index 9d9c0ce8b..e2751b497 100644 --- a/src/libecmabuiltins/ecma-builtins-internal.h +++ b/src/libecmabuiltins/ecma-builtins-internal.h @@ -51,8 +51,6 @@ ecma_builtin_make_function_object_for_routine (ecma_builtin_id_t builtin_id, ecma_magic_string_id_t routine_id); /* ecma-builtin-global-object.c */ -extern ecma_object_t* ecma_builtin_init_global_object (void); - extern ecma_length_t ecma_builtin_global_get_routine_parameters_number (ecma_magic_string_id_t routine_id); extern ecma_completion_value_t @@ -63,9 +61,9 @@ extern ecma_property_t* ecma_builtin_global_try_to_instantiate_property (ecma_object_t *obj_p, ecma_string_t *prop_name_p); -/* ecma-builtin-object-object.c */ -extern ecma_object_t* ecma_builtin_init_object_object (void); +extern const ecma_length_t ecma_builtin_global_property_number; +/* ecma-builtin-object-object.c */ extern ecma_length_t ecma_builtin_object_get_routine_parameters_number (ecma_magic_string_id_t routine_id); extern ecma_completion_value_t @@ -82,6 +80,8 @@ extern ecma_completion_value_t ecma_builtin_object_dispatch_construct (ecma_value_t *arguments_list_p, ecma_length_t arguments_list_len); +extern const ecma_length_t ecma_builtin_object_property_number; + extern void ecma_builtin_init_object_prototype_object (void); extern void ecma_builtin_finalize_object_prototype_object (void); extern ecma_property_t* diff --git a/src/libecmabuiltins/ecma-builtins.c b/src/libecmabuiltins/ecma-builtins.c index 4c3b6bac1..f3da544fd 100644 --- a/src/libecmabuiltins/ecma-builtins.c +++ b/src/libecmabuiltins/ecma-builtins.c @@ -75,6 +75,51 @@ ecma_builtin_get (ecma_builtin_id_t builtin_id) /**< id of built-in to check on return ecma_builtin_objects [builtin_id]; } /* ecma_builtin_get */ +/** + * Initialize specified built-in object. + * + * Warning: + * the routine should be called only from ecma_init_builtins + * + * @return pointer to the object + */ +static ecma_object_t* +ecma_builtin_init_object (ecma_builtin_id_t obj_builtin_id, /**< built-in ID */ + ecma_object_type_t obj_type, /**< object's type */ + ecma_object_class_t obj_class, /**< object's class */ + ecma_length_t property_number) /**< number of the object's properties */ +{ + ecma_object_t *object_obj_p = ecma_create_object (NULL, true, obj_type); + + ecma_property_t *class_prop_p = ecma_create_internal_property (object_obj_p, + ECMA_INTERNAL_PROPERTY_CLASS); + class_prop_p->u.internal_property.value = obj_class; + + ecma_property_t *built_in_id_prop_p = ecma_create_internal_property (object_obj_p, + ECMA_INTERNAL_PROPERTY_BUILT_IN_ID); + built_in_id_prop_p->u.internal_property.value = obj_builtin_id; + + JERRY_STATIC_ASSERT (property_number < sizeof (uint64_t) * JERRY_BITSINBYTE); + uint64_t builtin_mask = ((uint32_t) 1u << property_number) - 1; + + ecma_property_t *mask_0_31_prop_p; + mask_0_31_prop_p = ecma_create_internal_property (object_obj_p, + ECMA_INTERNAL_PROPERTY_NON_INSTANTIATED_BUILT_IN_MASK_0_31); + mask_0_31_prop_p->u.internal_property.value = (uint32_t) builtin_mask; + + if (jrt_extract_bit_field (builtin_mask, 32, 32) != 0) + { + ecma_property_t *mask_32_63_prop_p; + mask_32_63_prop_p = ecma_create_internal_property (object_obj_p, + ECMA_INTERNAL_PROPERTY_NON_INSTANTIATED_BUILT_IN_MASK_32_63); + mask_32_63_prop_p->u.internal_property.value = (uint32_t) jrt_extract_bit_field (builtin_mask, 32, 32); + } + + ecma_set_object_is_builtin (object_obj_p, true); + + return object_obj_p; +} /* ecma_builtin_init_object */ + /** * Initialize ECMA built-in objects */ @@ -88,9 +133,15 @@ ecma_init_builtins (void) ecma_builtin_objects [id] = NULL; } - ecma_builtin_objects [ECMA_BUILTIN_ID_OBJECT] = ecma_builtin_init_object_object (); + ecma_builtin_objects [ECMA_BUILTIN_ID_OBJECT] = ecma_builtin_init_object (ECMA_BUILTIN_ID_OBJECT, + ECMA_OBJECT_TYPE_FUNCTION, + ECMA_OBJECT_CLASS_OBJECT, + ecma_builtin_object_property_number); - ecma_builtin_objects [ECMA_BUILTIN_ID_GLOBAL] = ecma_builtin_init_global_object (); + ecma_builtin_objects [ECMA_BUILTIN_ID_GLOBAL] = ecma_builtin_init_object (ECMA_BUILTIN_ID_GLOBAL, + ECMA_OBJECT_TYPE_GENERAL, + ECMA_OBJECT_CLASS_OBJECT, + ecma_builtin_global_property_number); } /* ecma_init_builtins */ /**