diff --git a/src/libecmabuiltins/ecma-builtins-internal.h b/src/libecmabuiltins/ecma-builtins-internal.h index d4e828580..5c26b8ed1 100644 --- a/src/libecmabuiltins/ecma-builtins-internal.h +++ b/src/libecmabuiltins/ecma-builtins-internal.h @@ -54,103 +54,74 @@ ecma_builtin_bin_search_for_magic_string_id_in_array (const ecma_magic_string_id ecma_length_t array_length, ecma_magic_string_id_t key); -/* ecma-builtin-global-object.c */ -extern ecma_length_t -ecma_builtin_global_get_routine_parameters_number (ecma_magic_string_id_t routine_id); -extern ecma_completion_value_t -ecma_builtin_global_dispatch_routine (ecma_magic_string_id_t builtin_routine_id, - ecma_value_t this_arg_value, - ecma_value_t arguments_list [], - ecma_length_t arguments_number); -extern ecma_property_t* -ecma_builtin_global_try_to_instantiate_property (ecma_object_t *obj_p, - ecma_string_t *prop_name_p); +/** + * List of built-in objects in format + * 'macro (builtin_id, object_type, object_class, object_prototype_builtin_id, lowercase_name)' + */ +#define ECMA_BUILTIN_LIST(macro) \ + macro (STRING_PROTOTYPE, \ + TYPE_GENERAL, \ + CLASS_STRING, \ + ECMA_BUILTIN_ID__COUNT /* FIXME: ECMA_BUILTIN_ID_OBJECT_PROTOTYPE */, \ + string_prototype) \ + macro (OBJECT, \ + TYPE_FUNCTION, \ + CLASS_OBJECT, \ + ECMA_BUILTIN_ID__COUNT /* FIXME: ECMA_BUILTIN_ID_OBJECT_PROTOTYPE */, \ + object) \ + macro (MATH, \ + TYPE_GENERAL, \ + CLASS_MATH, \ + ECMA_BUILTIN_ID__COUNT /* FIXME: ECMA_BUILTIN_ID_OBJECT_PROTOTYPE */, \ + math) \ + macro (ARRAY, \ + TYPE_FUNCTION, \ + CLASS_ARRAY, \ + ECMA_BUILTIN_ID__COUNT /* FIXME: ECMA_BUILTIN_ID_ARRAY_PROTOTYPE */, \ + array) \ + macro (STRING, \ + TYPE_FUNCTION, \ + CLASS_STRING, \ + ECMA_BUILTIN_ID_STRING_PROTOTYPE, \ + string) \ + macro (GLOBAL, \ + TYPE_GENERAL, \ + CLASS_OBJECT, \ + ECMA_BUILTIN_ID__COUNT /* no prototype */, \ + global) -extern const ecma_length_t ecma_builtin_global_property_number; +#define DECLARE_DISPATCH_ROUTINES(builtin_id, \ + object_type, \ + object_class, \ + object_prototype_builtin_id, \ + lowercase_name) \ +extern ecma_completion_value_t \ +ecma_builtin_ ## lowercase_name ## _dispatch_call (ecma_value_t *arguments_list_p, \ + ecma_length_t arguments_list_len); \ +extern ecma_completion_value_t \ +ecma_builtin_ ## lowercase_name ## _dispatch_construct (ecma_value_t *arguments_list_p, \ + ecma_length_t arguments_list_len); \ +extern ecma_length_t \ +ecma_builtin_ ## lowercase_name ## _get_routine_parameters_number (ecma_magic_string_id_t routine_id); \ +extern ecma_completion_value_t \ +ecma_builtin_ ## lowercase_name ## _dispatch_routine (ecma_magic_string_id_t builtin_routine_id, \ + ecma_value_t this_arg_value, \ + ecma_value_t arguments_list [], \ + ecma_length_t arguments_number); \ +extern ecma_property_t* \ +ecma_builtin_ ## lowercase_name ## _try_to_instantiate_property (ecma_object_t *obj_p, \ + ecma_string_t *prop_name_p); +#define DECLARE_PROPERTY_NUMBER_VARIABLES(builtin_id, \ + object_type, \ + object_class, \ + object_prototype_builtin_id, \ + lowercase_name) \ +extern const ecma_length_t ecma_builtin_ ## lowercase_name ## _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 -ecma_builtin_object_dispatch_routine (ecma_magic_string_id_t builtin_routine_id, - ecma_value_t this_arg_value, - ecma_value_t arguments_list [], - ecma_length_t arguments_number); -extern ecma_property_t* -ecma_builtin_object_try_to_instantiate_property (ecma_object_t *obj_p, - ecma_string_t *prop_name_p); -extern ecma_completion_value_t -ecma_builtin_object_dispatch_call (ecma_value_t *arguments_list_p, - ecma_length_t arguments_list_len); -extern ecma_completion_value_t -ecma_builtin_object_dispatch_construct (ecma_value_t *arguments_list_p, - ecma_length_t arguments_list_len); +ECMA_BUILTIN_LIST (DECLARE_PROPERTY_NUMBER_VARIABLES) +ECMA_BUILTIN_LIST (DECLARE_DISPATCH_ROUTINES) -extern const ecma_length_t ecma_builtin_object_property_number; +#undef DECLARE_PROPERTY_NUMBER_VARIABLES +#undef DECLARE_DISPATCH_ROUTINES -extern void ecma_builtin_init_object_prototype_object (void); -extern void ecma_builtin_finalize_object_prototype_object (void); -extern ecma_property_t* -ecma_builtin_object_prototype_try_to_instantiate_property (ecma_object_t *obj_p, - ecma_string_t *prop_name_p); - -/* ecma-builtin-math-object.c */ -extern const ecma_length_t ecma_builtin_math_property_number; -extern ecma_length_t -ecma_builtin_math_get_routine_parameters_number (ecma_magic_string_id_t routine_id); -extern ecma_completion_value_t -ecma_builtin_math_dispatch_routine (ecma_magic_string_id_t builtin_routine_id, - ecma_value_t this_arg_value, - ecma_value_t arguments_list [], - ecma_length_t arguments_number); -extern ecma_property_t* -ecma_builtin_math_try_to_instantiate_property (ecma_object_t *obj_p, ecma_string_t *prop_name_p); - -/* ecma-builtin-string-object.c */ -extern const ecma_length_t ecma_builtin_string_property_number; -extern ecma_length_t -ecma_builtin_string_get_routine_parameters_number (ecma_magic_string_id_t routine_id); -extern ecma_completion_value_t -ecma_builtin_string_dispatch_routine (ecma_magic_string_id_t builtin_routine_id, - ecma_value_t this_arg_value, - ecma_value_t arguments_list [], - ecma_length_t arguments_number); -extern ecma_property_t* -ecma_builtin_string_try_to_instantiate_property (ecma_object_t *obj_p, ecma_string_t *prop_name_p); -extern ecma_completion_value_t -ecma_builtin_string_dispatch_call (ecma_value_t *arguments_list_p, - ecma_length_t arguments_list_len); -extern ecma_completion_value_t -ecma_builtin_string_dispatch_construct (ecma_value_t *arguments_list_p, - ecma_length_t arguments_list_len); - -/* ecma-builtin-string-prototype-object.c */ -extern const ecma_length_t ecma_builtin_string_prototype_property_number; -extern ecma_length_t -ecma_builtin_string_prototype_get_routine_parameters_number (ecma_magic_string_id_t routine_id); -extern ecma_completion_value_t -ecma_builtin_string_prototype_dispatch_routine (ecma_magic_string_id_t builtin_routine_id, - ecma_value_t this_arg_value, - ecma_value_t arguments_list [], - ecma_length_t arguments_number); -extern ecma_property_t* -ecma_builtin_string_prototype_try_to_instantiate_property (ecma_object_t *obj_p, ecma_string_t *prop_name_p); - -/* ecma-builtin-array-object.c */ -extern const ecma_length_t ecma_builtin_array_property_number; -extern ecma_length_t -ecma_builtin_array_get_routine_parameters_number (ecma_magic_string_id_t routine_id); -extern ecma_completion_value_t -ecma_builtin_array_dispatch_routine (ecma_magic_string_id_t builtin_routine_id, - ecma_value_t this_arg_value, - ecma_value_t arguments_list [], - ecma_length_t arguments_number); -extern ecma_property_t* -ecma_builtin_array_try_to_instantiate_property (ecma_object_t *obj_p, ecma_string_t *prop_name_p); -extern ecma_completion_value_t -ecma_builtin_array_dispatch_call (ecma_value_t *arguments_list_p, - ecma_length_t arguments_list_len); -extern ecma_completion_value_t -ecma_builtin_array_dispatch_construct (ecma_value_t *arguments_list_p, - ecma_length_t arguments_list_len); #endif /* !ECMA_BUILTINS_INTERNAL_H */ diff --git a/src/libecmabuiltins/ecma-builtins.c b/src/libecmabuiltins/ecma-builtins.c index 8bae7c13f..329fc3df7 100644 --- a/src/libecmabuiltins/ecma-builtins.c +++ b/src/libecmabuiltins/ecma-builtins.c @@ -135,47 +135,34 @@ ecma_init_builtins (void) ecma_builtin_objects [id] = NULL; } - ecma_builtin_id_t id = ECMA_BUILTIN_ID_OBJECT; - ecma_builtin_objects [id] = ecma_builtin_init_object (id, - NULL, /* FIXME */ - ECMA_OBJECT_TYPE_FUNCTION, - ECMA_OBJECT_CLASS_OBJECT, - ecma_builtin_object_property_number); +#define INIT_BUILTIN(builtin_id, \ + object_type, \ + object_class, \ + object_prototype_builtin_id, \ + lowercase_name) \ + { \ + ecma_object_t *prototype_obj_p; \ + if (object_prototype_builtin_id == ECMA_BUILTIN_ID__COUNT) \ + { \ + prototype_obj_p = NULL; \ + } \ + else \ + { \ + prototype_obj_p = ecma_builtin_objects [object_prototype_builtin_id]; \ + JERRY_ASSERT (prototype_obj_p != NULL); \ + } \ + \ + ecma_object_t *builtin_obj_p = ecma_builtin_init_object (ECMA_BUILTIN_ID_ ## builtin_id, \ + prototype_obj_p, \ + ECMA_OBJECT_ ## object_type, \ + ECMA_OBJECT_ ## object_class, \ + ecma_builtin_ ## lowercase_name ## _property_number); \ + ecma_builtin_objects [ECMA_BUILTIN_ID_ ## builtin_id] = builtin_obj_p; \ + } - id = ECMA_BUILTIN_ID_STRING_PROTOTYPE; - ecma_builtin_objects [id] = ecma_builtin_init_object (id, - NULL, - ECMA_OBJECT_TYPE_GENERAL, - ECMA_OBJECT_CLASS_STRING, - ecma_builtin_string_prototype_property_number); + ECMA_BUILTIN_LIST (INIT_BUILTIN); - id = ECMA_BUILTIN_ID_STRING; - ecma_builtin_objects [id] = ecma_builtin_init_object (id, - ecma_builtin_objects [ECMA_BUILTIN_ID_STRING_PROTOTYPE], - ECMA_OBJECT_TYPE_FUNCTION, - ECMA_OBJECT_CLASS_STRING, - ecma_builtin_string_property_number); - - id = ECMA_BUILTIN_ID_ARRAY; - ecma_builtin_objects [id] = ecma_builtin_init_object (id, - NULL, /* FIXME */ - ECMA_OBJECT_TYPE_FUNCTION, - ECMA_OBJECT_CLASS_ARRAY, - ecma_builtin_array_property_number); - - id = ECMA_BUILTIN_ID_MATH; - ecma_builtin_objects [id] = ecma_builtin_init_object (id, - NULL, /* FIXME */ - ECMA_OBJECT_TYPE_GENERAL, - ECMA_OBJECT_CLASS_MATH, - ecma_builtin_math_property_number); - - id = ECMA_BUILTIN_ID_GLOBAL; - ecma_builtin_objects [id] = ecma_builtin_init_object (id, - NULL, /* FIXME */ - ECMA_OBJECT_TYPE_GENERAL, - ECMA_OBJECT_CLASS_OBJECT, - ecma_builtin_global_property_number); +#undef INIT_BUILTIN } /* ecma_init_builtins */ /** @@ -219,64 +206,30 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object * switch (builtin_id) { - case ECMA_BUILTIN_ID_GLOBAL: - { - return ecma_builtin_global_try_to_instantiate_property (object_p, string_p); +#define TRY_TO_INSTANTIATE_PROPERTY(builtin_id, \ + object_type, \ + object_class, \ + object_prototype_builtin_id, \ + lowercase_name) \ + case ECMA_BUILTIN_ID_ ## builtin_id: \ + { \ + return ecma_builtin_ ## lowercase_name ## _try_to_instantiate_property (object_p, \ + string_p); \ } - case ECMA_BUILTIN_ID_OBJECT: - { - return ecma_builtin_object_try_to_instantiate_property (object_p, string_p); - } + ECMA_BUILTIN_LIST (TRY_TO_INSTANTIATE_PROPERTY) - case ECMA_BUILTIN_ID_MATH: - { - return ecma_builtin_math_try_to_instantiate_property (object_p, string_p); - } - - case ECMA_BUILTIN_ID_STRING: - { - return ecma_builtin_string_try_to_instantiate_property (object_p, string_p); - } - - case ECMA_BUILTIN_ID_ARRAY: - { - return ecma_builtin_array_try_to_instantiate_property (object_p, string_p); - } - - case ECMA_BUILTIN_ID_STRING_PROTOTYPE: - { - return ecma_builtin_string_prototype_try_to_instantiate_property (object_p, string_p); - } - - case ECMA_BUILTIN_ID_OBJECT_PROTOTYPE: - case ECMA_BUILTIN_ID_FUNCTION: - case ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE: - case ECMA_BUILTIN_ID_ARRAY_PROTOTYPE: - case ECMA_BUILTIN_ID_BOOLEAN: - case ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE: - case ECMA_BUILTIN_ID_NUMBER: - case ECMA_BUILTIN_ID_NUMBER_PROTOTYPE: - case ECMA_BUILTIN_ID_DATE: - case ECMA_BUILTIN_ID_REGEXP: - case ECMA_BUILTIN_ID_REGEXP_PROTOTYPE: - case ECMA_BUILTIN_ID_ERROR: - case ECMA_BUILTIN_ID_ERROR_PROTOTYPE: - case ECMA_BUILTIN_ID_EVAL_ERROR: - case ECMA_BUILTIN_ID_RANGE_ERROR: - case ECMA_BUILTIN_ID_REFERENCE_ERROR: - case ECMA_BUILTIN_ID_SYNTAX_ERROR: - case ECMA_BUILTIN_ID_TYPE_ERROR: - case ECMA_BUILTIN_ID_SYNTAX_URI_ERROR: - case ECMA_BUILTIN_ID_JSON: - { - JERRY_UNIMPLEMENTED (); - } +#undef TRY_TO_INSTANTIATE_PROPERTY case ECMA_BUILTIN_ID__COUNT: { JERRY_UNREACHABLE (); } + + default: + { + JERRY_UNIMPLEMENTED (); + } } JERRY_UNREACHABLE (); @@ -383,56 +336,37 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */ switch (builtin_id) { - case ECMA_BUILTIN_ID_OBJECT: - { - return ecma_builtin_object_dispatch_call (arguments_list_p, arguments_list_len); +#define DISPATCH_CALL(builtin_id, \ + object_type, \ + object_class, \ + object_prototype_builtin_id, \ + lowercase_name) \ + case ECMA_BUILTIN_ID_ ## builtin_id: \ + { \ + if (ECMA_OBJECT_ ## object_type == ECMA_OBJECT_TYPE_FUNCTION) \ + { \ + return ecma_builtin_ ## lowercase_name ## _dispatch_call (arguments_list_p, \ + arguments_list_len); \ + } \ + else \ + { \ + JERRY_UNREACHABLE (); \ + } \ } - case ECMA_BUILTIN_ID_STRING: - { - return ecma_builtin_string_dispatch_call (arguments_list_p, arguments_list_len); - } + ECMA_BUILTIN_LIST (DISPATCH_CALL) - case ECMA_BUILTIN_ID_ARRAY: - { - return ecma_builtin_array_dispatch_call (arguments_list_p, arguments_list_len); - } - - case ECMA_BUILTIN_ID_FUNCTION: - case ECMA_BUILTIN_ID_BOOLEAN: - case ECMA_BUILTIN_ID_NUMBER: - case ECMA_BUILTIN_ID_DATE: - case ECMA_BUILTIN_ID_REGEXP: - case ECMA_BUILTIN_ID_ERROR: - case ECMA_BUILTIN_ID_EVAL_ERROR: - case ECMA_BUILTIN_ID_RANGE_ERROR: - case ECMA_BUILTIN_ID_REFERENCE_ERROR: - case ECMA_BUILTIN_ID_SYNTAX_ERROR: - case ECMA_BUILTIN_ID_TYPE_ERROR: - case ECMA_BUILTIN_ID_SYNTAX_URI_ERROR: - { - JERRY_UNIMPLEMENTED (); - } - - case ECMA_BUILTIN_ID_GLOBAL: - case ECMA_BUILTIN_ID_MATH: - case ECMA_BUILTIN_ID_JSON: - case ECMA_BUILTIN_ID_OBJECT_PROTOTYPE: - case ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE: - case ECMA_BUILTIN_ID_ARRAY_PROTOTYPE: - case ECMA_BUILTIN_ID_STRING_PROTOTYPE: - case ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE: - case ECMA_BUILTIN_ID_NUMBER_PROTOTYPE: - case ECMA_BUILTIN_ID_REGEXP_PROTOTYPE: - case ECMA_BUILTIN_ID_ERROR_PROTOTYPE: - { - JERRY_UNREACHABLE (); - } +#undef DISPATCH_CALL case ECMA_BUILTIN_ID__COUNT: { JERRY_UNREACHABLE (); } + + default: + { + JERRY_UNIMPLEMENTED (); + } } } @@ -462,56 +396,37 @@ ecma_builtin_dispatch_construct (ecma_object_t *obj_p, /**< built-in object */ switch (builtin_id) { - case ECMA_BUILTIN_ID_OBJECT: - { - return ecma_builtin_object_dispatch_construct (arguments_list_p, arguments_list_len); - } +#define DISPATCH_CONSTRUCT(builtin_id, \ + object_type, \ + object_class, \ + object_prototype_builtin_id, \ + lowercase_name) \ + case ECMA_BUILTIN_ID_ ## builtin_id: \ + { \ + if (ECMA_OBJECT_ ## object_type == ECMA_OBJECT_TYPE_FUNCTION) \ + { \ + return ecma_builtin_ ## lowercase_name ## _dispatch_construct (arguments_list_p, \ + arguments_list_len); \ + } \ + else \ + { \ + JERRY_UNREACHABLE (); \ + } \ + } - case ECMA_BUILTIN_ID_STRING: - { - return ecma_builtin_string_dispatch_construct (arguments_list_p, arguments_list_len); - } + ECMA_BUILTIN_LIST (DISPATCH_CONSTRUCT) - case ECMA_BUILTIN_ID_ARRAY: - { - return ecma_builtin_array_dispatch_construct (arguments_list_p, arguments_list_len); - } - - case ECMA_BUILTIN_ID_FUNCTION: - case ECMA_BUILTIN_ID_BOOLEAN: - case ECMA_BUILTIN_ID_NUMBER: - case ECMA_BUILTIN_ID_DATE: - case ECMA_BUILTIN_ID_REGEXP: - case ECMA_BUILTIN_ID_ERROR: - case ECMA_BUILTIN_ID_EVAL_ERROR: - case ECMA_BUILTIN_ID_RANGE_ERROR: - case ECMA_BUILTIN_ID_REFERENCE_ERROR: - case ECMA_BUILTIN_ID_SYNTAX_ERROR: - case ECMA_BUILTIN_ID_TYPE_ERROR: - case ECMA_BUILTIN_ID_SYNTAX_URI_ERROR: - { - JERRY_UNIMPLEMENTED (); - } - - case ECMA_BUILTIN_ID_GLOBAL: - case ECMA_BUILTIN_ID_MATH: - case ECMA_BUILTIN_ID_JSON: - case ECMA_BUILTIN_ID_OBJECT_PROTOTYPE: - case ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE: - case ECMA_BUILTIN_ID_ARRAY_PROTOTYPE: - case ECMA_BUILTIN_ID_STRING_PROTOTYPE: - case ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE: - case ECMA_BUILTIN_ID_NUMBER_PROTOTYPE: - case ECMA_BUILTIN_ID_REGEXP_PROTOTYPE: - case ECMA_BUILTIN_ID_ERROR_PROTOTYPE: - { - JERRY_UNREACHABLE (); - } +#undef DISPATCH_CONSTRUCT case ECMA_BUILTIN_ID__COUNT: { JERRY_UNREACHABLE (); } + + default: + { + JERRY_UNIMPLEMENTED (); + } } JERRY_UNREACHABLE (); @@ -531,59 +446,29 @@ ecma_builtin_get_routine_parameters_number (ecma_builtin_id_t builtin_id, /**< i { switch (builtin_id) { - case ECMA_BUILTIN_ID_GLOBAL: - { - return ecma_builtin_global_get_routine_parameters_number (routine_id); - } - case ECMA_BUILTIN_ID_OBJECT: - { - return ecma_builtin_object_get_routine_parameters_number (routine_id); - } - case ECMA_BUILTIN_ID_STRING: - { - return ecma_builtin_string_get_routine_parameters_number (routine_id); - } - case ECMA_BUILTIN_ID_MATH: - { - return ecma_builtin_math_get_routine_parameters_number (routine_id); - } - case ECMA_BUILTIN_ID_ARRAY: - { - return ecma_builtin_array_get_routine_parameters_number (routine_id); - } - case ECMA_BUILTIN_ID_STRING_PROTOTYPE: - { - return ecma_builtin_string_prototype_get_routine_parameters_number (routine_id); - } +#define DISPATCH_GET_ROUTINE_PARAMETERS_NUMBER(builtin_id, \ + object_type, \ + object_class, \ + object_prototype_builtin_id, \ + lowercase_name) \ + case ECMA_BUILTIN_ID_ ## builtin_id: \ + { \ + return ecma_builtin_ ## lowercase_name ## _get_routine_parameters_number (routine_id); \ + } - case ECMA_BUILTIN_ID_OBJECT_PROTOTYPE: - case ECMA_BUILTIN_ID_FUNCTION: - case ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE: - case ECMA_BUILTIN_ID_ARRAY_PROTOTYPE: - case ECMA_BUILTIN_ID_BOOLEAN: - case ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE: - case ECMA_BUILTIN_ID_NUMBER: - case ECMA_BUILTIN_ID_NUMBER_PROTOTYPE: - case ECMA_BUILTIN_ID_DATE: - case ECMA_BUILTIN_ID_REGEXP: - case ECMA_BUILTIN_ID_REGEXP_PROTOTYPE: - case ECMA_BUILTIN_ID_ERROR: - case ECMA_BUILTIN_ID_ERROR_PROTOTYPE: - case ECMA_BUILTIN_ID_EVAL_ERROR: - case ECMA_BUILTIN_ID_RANGE_ERROR: - case ECMA_BUILTIN_ID_REFERENCE_ERROR: - case ECMA_BUILTIN_ID_SYNTAX_ERROR: - case ECMA_BUILTIN_ID_TYPE_ERROR: - case ECMA_BUILTIN_ID_SYNTAX_URI_ERROR: - case ECMA_BUILTIN_ID_JSON: - { - JERRY_UNIMPLEMENTED_REF_UNUSED_VARS (routine_id); - } + ECMA_BUILTIN_LIST (DISPATCH_GET_ROUTINE_PARAMETERS_NUMBER) + +#undef DISPATCH_GET_ROUTINE_PARAMETERS_NUMBER case ECMA_BUILTIN_ID__COUNT: { JERRY_UNREACHABLE (); } + + default: + { + JERRY_UNIMPLEMENTED (); + } } JERRY_UNREACHABLE (); @@ -605,80 +490,32 @@ ecma_builtin_dispatch_routine (ecma_builtin_id_t builtin_object_id, /**< built-i { switch (builtin_object_id) { - case ECMA_BUILTIN_ID_GLOBAL: - { - return ecma_builtin_global_dispatch_routine (builtin_routine_id, - this_arg_value, - arguments_list, - arguments_number); - } - case ECMA_BUILTIN_ID_OBJECT: - { - return ecma_builtin_object_dispatch_routine (builtin_routine_id, - this_arg_value, - arguments_list, - arguments_number); - } - case ECMA_BUILTIN_ID_STRING: - { - return ecma_builtin_string_dispatch_routine (builtin_routine_id, - this_arg_value, - arguments_list, - arguments_number); - } - case ECMA_BUILTIN_ID_MATH: - { - return ecma_builtin_math_dispatch_routine (builtin_routine_id, - this_arg_value, - arguments_list, - arguments_number); - } - case ECMA_BUILTIN_ID_ARRAY: - { - return ecma_builtin_array_dispatch_routine (builtin_routine_id, - this_arg_value, - arguments_list, - arguments_number); - } - case ECMA_BUILTIN_ID_STRING_PROTOTYPE: - { - return ecma_builtin_string_prototype_dispatch_routine (builtin_routine_id, - this_arg_value, - arguments_list, - arguments_number); - } +#define DISPATCH_ROUTINE(builtin_id, \ + object_type, \ + object_class, \ + object_prototype_builtin_id, \ + lowercase_name) \ + case ECMA_BUILTIN_ID_ ## builtin_id: \ + { \ + return ecma_builtin_ ## lowercase_name ## _dispatch_routine (builtin_routine_id, \ + this_arg_value, \ + arguments_list, \ + arguments_number); \ + } - case ECMA_BUILTIN_ID_OBJECT_PROTOTYPE: - case ECMA_BUILTIN_ID_FUNCTION: - case ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE: - case ECMA_BUILTIN_ID_ARRAY_PROTOTYPE: - case ECMA_BUILTIN_ID_BOOLEAN: - case ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE: - case ECMA_BUILTIN_ID_NUMBER: - case ECMA_BUILTIN_ID_NUMBER_PROTOTYPE: - case ECMA_BUILTIN_ID_DATE: - case ECMA_BUILTIN_ID_REGEXP: - case ECMA_BUILTIN_ID_REGEXP_PROTOTYPE: - case ECMA_BUILTIN_ID_ERROR: - case ECMA_BUILTIN_ID_ERROR_PROTOTYPE: - case ECMA_BUILTIN_ID_EVAL_ERROR: - case ECMA_BUILTIN_ID_RANGE_ERROR: - case ECMA_BUILTIN_ID_REFERENCE_ERROR: - case ECMA_BUILTIN_ID_SYNTAX_ERROR: - case ECMA_BUILTIN_ID_TYPE_ERROR: - case ECMA_BUILTIN_ID_SYNTAX_URI_ERROR: - case ECMA_BUILTIN_ID_JSON: - { - JERRY_UNIMPLEMENTED_REF_UNUSED_VARS (builtin_routine_id, - this_arg_value, - arguments_list, - arguments_number); - } + ECMA_BUILTIN_LIST (DISPATCH_ROUTINE) + +#undef DISPATCH_ROUTINE case ECMA_BUILTIN_ID__COUNT: { JERRY_UNREACHABLE (); } + + default: + { + JERRY_UNIMPLEMENTED (); + } } JERRY_UNREACHABLE ();