diff --git a/src/libecmabuiltins/ecma-builtins-internal.h b/src/libecmabuiltins/ecma-builtins-internal.h index 9e9e05048..ec6f06aa4 100644 --- a/src/libecmabuiltins/ecma-builtins-internal.h +++ b/src/libecmabuiltins/ecma-builtins-internal.h @@ -57,164 +57,195 @@ ecma_builtin_bin_search_for_magic_string_id_in_array (const ecma_magic_string_id /** * List of built-in objects in format - * 'macro (builtin_id, object_type, object_class, object_prototype_builtin_id, lowercase_name)' + * 'macro (builtin_id, object_type, object_class, object_prototype_builtin_id, is_extensible, lowercase_name)' */ #define ECMA_BUILTIN_LIST(macro) \ macro (OBJECT_PROTOTYPE, \ TYPE_GENERAL, \ OBJECT_UL, \ ECMA_BUILTIN_ID__COUNT /* no prototype */, \ + true, \ object_prototype) \ macro (FUNCTION_PROTOTYPE, \ TYPE_FUNCTION, \ FUNCTION_UL, \ ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \ + true, \ function_prototype) \ macro (ARRAY_PROTOTYPE, \ TYPE_ARRAY, \ ARRAY_UL, \ ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \ + true, \ array_prototype) \ macro (STRING_PROTOTYPE, \ TYPE_GENERAL, \ STRING_UL, \ ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \ + true, \ string_prototype) \ macro (BOOLEAN_PROTOTYPE, \ TYPE_GENERAL, \ BOOLEAN_UL, \ ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \ + true, \ boolean_prototype) \ macro (NUMBER_PROTOTYPE, \ TYPE_GENERAL, \ NUMBER_UL, \ ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \ + true, \ number_prototype) \ macro (OBJECT, \ TYPE_FUNCTION, \ OBJECT_UL, \ ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \ + true, \ object) \ macro (MATH, \ TYPE_GENERAL, \ MATH_UL, \ ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \ + true, \ math) \ macro (ARRAY, \ TYPE_FUNCTION, \ ARRAY_UL, \ ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \ + true, \ array) \ macro (STRING, \ TYPE_FUNCTION, \ STRING_UL, \ ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \ + true, \ string) \ macro (BOOLEAN, \ TYPE_FUNCTION, \ BOOLEAN_UL, \ ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \ + true, \ boolean) \ macro (NUMBER, \ TYPE_FUNCTION, \ NUMBER_UL, \ ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \ + true, \ number) \ macro (FUNCTION, \ TYPE_FUNCTION, \ FUNCTION_UL, \ ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \ + true, \ function) \ macro (ERROR_PROTOTYPE, \ TYPE_GENERAL, \ ERROR_UL, \ ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \ + true, \ error_prototype) \ macro (ERROR, \ TYPE_FUNCTION, \ ERROR_UL, \ ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \ + true, \ error) \ macro (EVAL_ERROR_PROTOTYPE, \ TYPE_GENERAL, \ ERROR_UL, \ ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \ + true, \ eval_error_prototype) \ macro (EVAL_ERROR, \ TYPE_FUNCTION, \ ERROR_UL, \ ECMA_BUILTIN_ID_EVAL_ERROR_PROTOTYPE, \ + true, \ eval_error) \ macro (RANGE_ERROR_PROTOTYPE, \ TYPE_GENERAL, \ ERROR_UL, \ ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \ + true, \ range_error_prototype) \ macro (RANGE_ERROR, \ TYPE_FUNCTION, \ ERROR_UL, \ ECMA_BUILTIN_ID_RANGE_ERROR_PROTOTYPE, \ + true, \ range_error) \ macro (REFERENCE_ERROR_PROTOTYPE, \ TYPE_GENERAL, \ ERROR_UL, \ ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \ + true, \ reference_error_prototype) \ macro (REFERENCE_ERROR, \ TYPE_FUNCTION, \ ERROR_UL, \ ECMA_BUILTIN_ID_REFERENCE_ERROR_PROTOTYPE, \ + true, \ reference_error) \ macro (SYNTAX_ERROR_PROTOTYPE, \ TYPE_GENERAL, \ ERROR_UL, \ ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \ + true, \ syntax_error_prototype) \ macro (SYNTAX_ERROR, \ TYPE_FUNCTION, \ ERROR_UL, \ ECMA_BUILTIN_ID_SYNTAX_ERROR_PROTOTYPE, \ + true, \ syntax_error) \ macro (TYPE_ERROR_PROTOTYPE, \ TYPE_GENERAL, \ ERROR_UL, \ ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \ + true, \ type_error_prototype) \ macro (TYPE_ERROR, \ TYPE_FUNCTION, \ ERROR_UL, \ ECMA_BUILTIN_ID_TYPE_ERROR_PROTOTYPE, \ + true, \ type_error) \ macro (URI_ERROR_PROTOTYPE, \ TYPE_GENERAL, \ ERROR_UL, \ ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \ + true, \ uri_error_prototype) \ macro (URI_ERROR, \ TYPE_FUNCTION, \ ERROR_UL, \ ECMA_BUILTIN_ID_URI_ERROR_PROTOTYPE, \ + true, \ uri_error) \ macro (TYPE_ERROR_THROWER, \ TYPE_FUNCTION, \ FUNCTION_UL, \ ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \ + false, \ type_error_thrower) \ macro (COMPACT_PROFILE_ERROR, \ TYPE_FUNCTION, \ COMPACT_PROFILE_ERROR_UL, \ ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \ + false, \ compact_profile_error) \ macro (GLOBAL, \ TYPE_GENERAL, \ OBJECT_UL, \ ECMA_BUILTIN_ID__COUNT /* no prototype */, \ + true, \ global) #define DECLARE_DISPATCH_ROUTINES(builtin_id, \ object_type, \ object_class, \ object_prototype_builtin_id, \ + is_extensible, \ lowercase_name) \ extern ecma_completion_value_t \ ecma_builtin_ ## lowercase_name ## _dispatch_call (ecma_value_t *arguments_list_p, \ diff --git a/src/libecmabuiltins/ecma-builtins.c b/src/libecmabuiltins/ecma-builtins.c index b42fcce6a..043eb49b5 100644 --- a/src/libecmabuiltins/ecma-builtins.c +++ b/src/libecmabuiltins/ecma-builtins.c @@ -94,9 +94,10 @@ static ecma_object_t* ecma_builtin_init_object (ecma_builtin_id_t obj_builtin_id, /**< built-in ID */ ecma_object_t* prototype_obj_p, /**< prototype object */ ecma_object_type_t obj_type, /**< object's type */ - ecma_magic_string_id_t obj_class) /**< object's class */ + ecma_magic_string_id_t obj_class, /**< object's class */ + bool is_extensible) /**< value of object's [[Extensible]] property */ { - ecma_object_t *object_obj_p = ecma_create_object (prototype_obj_p, true, obj_type); + ecma_object_t *object_obj_p = ecma_create_object (prototype_obj_p, is_extensible, obj_type); ecma_property_t *class_prop_p = ecma_create_internal_property (object_obj_p, ECMA_INTERNAL_PROPERTY_CLASS); @@ -176,6 +177,7 @@ ecma_instantiate_builtin (ecma_builtin_id_t id) /**< built-in id */ object_type, \ object_class, \ object_prototype_builtin_id, \ + is_extensible, \ lowercase_name) \ case ECMA_BUILTIN_ID_ ## builtin_id: \ { \ @@ -200,7 +202,8 @@ ecma_instantiate_builtin (ecma_builtin_id_t id) /**< built-in id */ ecma_object_t *builtin_obj_p = ecma_builtin_init_object (ECMA_BUILTIN_ID_ ## builtin_id, \ prototype_obj_p, \ ECMA_OBJECT_ ## object_type, \ - ECMA_MAGIC_STRING_ ## object_class); \ + ECMA_MAGIC_STRING_ ## object_class, \ + is_extensible); \ ecma_builtin_objects [ECMA_BUILTIN_ID_ ## builtin_id] = builtin_obj_p; \ \ break; \ @@ -264,6 +267,7 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object * object_type, \ object_class, \ object_prototype_builtin_id, \ + is_extensible, \ lowercase_name) \ case ECMA_BUILTIN_ID_ ## builtin_id: \ { \ @@ -404,6 +408,7 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */ object_type, \ object_class, \ object_prototype_builtin_id, \ + is_extensible, \ lowercase_name) \ case ECMA_BUILTIN_ID_ ## builtin_id: \ { \ @@ -468,6 +473,7 @@ ecma_builtin_dispatch_construct (ecma_object_t *obj_p, /**< built-in object */ object_type, \ object_class, \ object_prototype_builtin_id, \ + is_extensible, \ lowercase_name) \ case ECMA_BUILTIN_ID_ ## builtin_id: \ { \ @@ -524,6 +530,7 @@ ecma_builtin_dispatch_routine (ecma_builtin_id_t builtin_object_id, /**< built-i object_type, \ object_class, \ object_prototype_builtin_id, \ + is_extensible, \ lowercase_name) \ case ECMA_BUILTIN_ID_ ## builtin_id: \ { \