diff --git a/src/libecmaobjects/ecma-globals.h b/src/libecmaobjects/ecma-globals.h index b55cde152..201c1688a 100644 --- a/src/libecmaobjects/ecma-globals.h +++ b/src/libecmaobjects/ecma-globals.h @@ -333,7 +333,8 @@ typedef enum of ECMA-262 v5 specification */ ECMA_OBJECT_TYPE_ARGUMENTS, /**< Arguments object (10.6) */ ECMA_OBJECT_TYPE_ARRAY, /**< Array object (15.4) */ - ECMA_OBJECT_TYPE_HOST /**< Host object */ + // ECMA_OBJECT_TYPE_HOST, /**< Host object */ + ECMA_OBJECT_TYPE__COUNT /**< number of object types */ } ecma_object_type_t; /** diff --git a/src/libecmaoperations/ecma-objects.c b/src/libecmaoperations/ecma-objects.c index a02402ac2..f23b9ba2b 100644 --- a/src/libecmaoperations/ecma-objects.c +++ b/src/libecmaoperations/ecma-objects.c @@ -48,31 +48,21 @@ ecma_op_object_get (ecma_object_t *obj_p, /**< the object */ JERRY_ASSERT(property_name_p != NULL); const ecma_object_type_t type = ecma_get_object_type (obj_p); + JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT); - switch (type) + typedef ecma_completion_value_t (*get_ptr_t) (ecma_object_t *, ecma_string_t *); + static const get_ptr_t get [ECMA_OBJECT_TYPE__COUNT] = { - case ECMA_OBJECT_TYPE_GENERAL: - case ECMA_OBJECT_TYPE_ARRAY: - case ECMA_OBJECT_TYPE_STRING: - case ECMA_OBJECT_TYPE_FUNCTION: - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: - { - return ecma_op_general_object_get (obj_p, property_name_p); - } + [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_get, + [ECMA_OBJECT_TYPE_ARRAY] = &ecma_op_general_object_get, + [ECMA_OBJECT_TYPE_FUNCTION] = &ecma_op_general_object_get, + [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_get, + [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_get, + [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_get, + [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_arguments_object_get + }; - case ECMA_OBJECT_TYPE_ARGUMENTS: - { - return ecma_op_arguments_object_get (obj_p, property_name_p); - } - - case ECMA_OBJECT_TYPE_HOST: - { - JERRY_UNIMPLEMENTED("Host objects support is not implemented."); - } - } - - JERRY_UNREACHABLE(); + return get[type] (obj_p, property_name_p); } /* ecma_op_object_get */ /** @@ -93,42 +83,24 @@ ecma_op_object_get_own_property (ecma_object_t *obj_p, /**< the object */ JERRY_ASSERT(property_name_p != NULL); const ecma_object_type_t type = ecma_get_object_type (obj_p); + JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT); + const bool is_builtin = ecma_get_object_is_builtin (obj_p); ecma_property_t *prop_p = NULL; - - switch (type) + typedef ecma_property_t* (*get_own_property_ptr_t) (ecma_object_t *, ecma_string_t *); + static const get_own_property_ptr_t get_own_property [ECMA_OBJECT_TYPE__COUNT] = { - case ECMA_OBJECT_TYPE_GENERAL: - case ECMA_OBJECT_TYPE_ARRAY: - case ECMA_OBJECT_TYPE_FUNCTION: - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: - { - prop_p = ecma_op_general_object_get_own_property (obj_p, property_name_p); + [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_get_own_property, + [ECMA_OBJECT_TYPE_ARRAY] = &ecma_op_general_object_get_own_property, + [ECMA_OBJECT_TYPE_FUNCTION] = &ecma_op_general_object_get_own_property, + [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_get_own_property, + [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_get_own_property, + [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_arguments_object_get_own_property, + [ECMA_OBJECT_TYPE_STRING] = &ecma_op_string_object_get_own_property + }; - break; - } - - case ECMA_OBJECT_TYPE_ARGUMENTS: - { - prop_p = ecma_op_arguments_object_get_own_property (obj_p, property_name_p); - - break; - } - - case ECMA_OBJECT_TYPE_STRING: - { - prop_p = ecma_op_string_object_get_own_property (obj_p, property_name_p); - - break; - } - - case ECMA_OBJECT_TYPE_HOST: - { - JERRY_UNIMPLEMENTED("Host objects support is not implemented."); - } - } + prop_p = get_own_property[type] (obj_p, property_name_p); if (unlikely (prop_p == NULL)) { @@ -160,27 +132,25 @@ ecma_op_object_get_property (ecma_object_t *obj_p, /**< the object */ JERRY_ASSERT(property_name_p != NULL); const ecma_object_type_t type = ecma_get_object_type (obj_p); + JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT); - switch (type) - { - case ECMA_OBJECT_TYPE_GENERAL: - case ECMA_OBJECT_TYPE_ARGUMENTS: - case ECMA_OBJECT_TYPE_ARRAY: - case ECMA_OBJECT_TYPE_FUNCTION: - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: - case ECMA_OBJECT_TYPE_STRING: - { - return ecma_op_general_object_get_property (obj_p, property_name_p); - } + /* + * typedef ecma_property_t* (*get_property_ptr_t) (ecma_object_t *, ecma_string_t *); + * static const get_property_ptr_t get_property [ECMA_OBJECT_TYPE__COUNT] = + * { + * [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_get_property, + * [ECMA_OBJECT_TYPE_ARRAY] = &ecma_op_general_object_get_property, + * [ECMA_OBJECT_TYPE_FUNCTION] = &ecma_op_general_object_get_property, + * [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_get_property, + * [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_get_property, + * [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_general_object_get_property, + * [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_get_property + * }; + * + * return get_property[type] (obj_p, property_name_p); + */ - case ECMA_OBJECT_TYPE_HOST: - { - JERRY_UNIMPLEMENTED("Host objects support is not implemented."); - } - } - - JERRY_UNREACHABLE(); + return ecma_op_general_object_get_property (obj_p, property_name_p); } /* ecma_op_object_get_property */ /** @@ -203,27 +173,25 @@ ecma_op_object_put (ecma_object_t *obj_p, /**< the object */ JERRY_ASSERT(property_name_p != NULL); const ecma_object_type_t type = ecma_get_object_type (obj_p); + JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT); - switch (type) - { - case ECMA_OBJECT_TYPE_GENERAL: - case ECMA_OBJECT_TYPE_ARGUMENTS: - case ECMA_OBJECT_TYPE_ARRAY: - case ECMA_OBJECT_TYPE_FUNCTION: - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: - case ECMA_OBJECT_TYPE_STRING: - { - return ecma_op_general_object_put (obj_p, property_name_p, value, is_throw); - } + /* + * typedef ecma_property_t* (*put_ptr_t) (ecma_object_t *, ecma_string_t *); + * static const put_ptr_t put [ECMA_OBJECT_TYPE__COUNT] = + * { + * [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_put, + * [ECMA_OBJECT_TYPE_ARRAY] = &ecma_op_general_object_put, + * [ECMA_OBJECT_TYPE_FUNCTION] = &ecma_op_general_object_put, + * [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_put, + * [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_put, + * [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_general_object_put, + * [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_put + * }; + * + * return put[type] (obj_p, property_name_p); + */ - case ECMA_OBJECT_TYPE_HOST: - { - JERRY_UNIMPLEMENTED("Host objects support is not implemented."); - } - } - - JERRY_UNREACHABLE(); + return ecma_op_general_object_put (obj_p, property_name_p, value, is_throw); } /* ecma_op_object_put */ /** @@ -244,27 +212,25 @@ ecma_op_object_can_put (ecma_object_t *obj_p, /**< the object */ JERRY_ASSERT(property_name_p != NULL); const ecma_object_type_t type = ecma_get_object_type (obj_p); + JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT); - switch (type) - { - case ECMA_OBJECT_TYPE_GENERAL: - case ECMA_OBJECT_TYPE_ARGUMENTS: - case ECMA_OBJECT_TYPE_ARRAY: - case ECMA_OBJECT_TYPE_FUNCTION: - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: - case ECMA_OBJECT_TYPE_STRING: - { - return ecma_op_general_object_can_put (obj_p, property_name_p); - } + /* + * typedef ecma_property_t* (*can_put_ptr_t) (ecma_object_t *, ecma_string_t *); + * static const can_put_ptr_t can_put [ECMA_OBJECT_TYPE__COUNT] = + * { + * [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_can_put, + * [ECMA_OBJECT_TYPE_ARRAY] = &ecma_op_general_object_can_put, + * [ECMA_OBJECT_TYPE_FUNCTION] = &ecma_op_general_object_can_put, + * [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_can_put, + * [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_can_put, + * [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_general_object_can_put, + * [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_can_put + * }; + * + * return can_put[type] (obj_p, property_name_p); + */ - case ECMA_OBJECT_TYPE_HOST: - { - JERRY_UNIMPLEMENTED("Host objects support is not implemented."); - } - } - - JERRY_UNREACHABLE(); + return ecma_op_general_object_can_put (obj_p, property_name_p); } /* ecma_op_object_can_put */ /** @@ -285,27 +251,25 @@ ecma_op_object_has_property (ecma_object_t *obj_p, /**< the object */ JERRY_ASSERT(property_name_p != NULL); const ecma_object_type_t type = ecma_get_object_type (obj_p); + JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT); - switch (type) - { - case ECMA_OBJECT_TYPE_GENERAL: - case ECMA_OBJECT_TYPE_ARGUMENTS: - case ECMA_OBJECT_TYPE_ARRAY: - case ECMA_OBJECT_TYPE_FUNCTION: - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: - case ECMA_OBJECT_TYPE_STRING: - { - return ecma_op_general_object_has_property (obj_p, property_name_p); - } + /* + * typedef ecma_property_t* (*has_property_ptr_t) (ecma_object_t *, ecma_string_t *); + * static const has_property_ptr_t has_property [ECMA_OBJECT_TYPE__COUNT] = + * { + * [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_has_property, + * [ECMA_OBJECT_TYPE_ARRAY] = &ecma_op_general_object_has_property, + * [ECMA_OBJECT_TYPE_FUNCTION] = &ecma_op_general_object_has_property, + * [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_has_property, + * [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_has_property, + * [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_general_object_has_property, + * [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_has_property + * }; + * + * return has_property[type] (obj_p, property_name_p); + */ - case ECMA_OBJECT_TYPE_HOST: - { - JERRY_UNIMPLEMENTED("Host objects support is not implemented."); - } - } - - JERRY_UNREACHABLE(); + return ecma_op_general_object_has_property (obj_p, property_name_p); } /* ecma_op_object_has_property */ /** @@ -327,31 +291,21 @@ ecma_op_object_delete (ecma_object_t *obj_p, /**< the object */ JERRY_ASSERT(property_name_p != NULL); const ecma_object_type_t type = ecma_get_object_type (obj_p); + JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT); - switch (type) + typedef ecma_completion_value_t (*delete_ptr_t) (ecma_object_t *, ecma_string_t *, bool); + static const delete_ptr_t delete [ECMA_OBJECT_TYPE__COUNT] = { - case ECMA_OBJECT_TYPE_GENERAL: - case ECMA_OBJECT_TYPE_ARRAY: - case ECMA_OBJECT_TYPE_FUNCTION: - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: - case ECMA_OBJECT_TYPE_STRING: - { - return ecma_op_general_object_delete (obj_p, property_name_p, is_throw); - } + [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_delete, + [ECMA_OBJECT_TYPE_ARRAY] = &ecma_op_general_object_delete, + [ECMA_OBJECT_TYPE_FUNCTION] = &ecma_op_general_object_delete, + [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_delete, + [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_delete, + [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_delete, + [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_arguments_object_delete + }; - case ECMA_OBJECT_TYPE_ARGUMENTS: - { - return ecma_op_arguments_object_delete (obj_p, property_name_p, is_throw); - } - - case ECMA_OBJECT_TYPE_HOST: - { - JERRY_UNIMPLEMENTED("Host objects support is not implemented."); - } - } - - JERRY_UNREACHABLE(); + return delete[type] (obj_p, property_name_p, is_throw); } /* ecma_op_object_delete */ /** @@ -371,27 +325,25 @@ ecma_op_object_default_value (ecma_object_t *obj_p, /**< the object */ && !ecma_is_lexical_environment (obj_p)); const ecma_object_type_t type = ecma_get_object_type (obj_p); + JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT); - switch (type) - { - case ECMA_OBJECT_TYPE_GENERAL: - case ECMA_OBJECT_TYPE_ARGUMENTS: - case ECMA_OBJECT_TYPE_ARRAY: - case ECMA_OBJECT_TYPE_FUNCTION: - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: - case ECMA_OBJECT_TYPE_STRING: - { - return ecma_op_general_object_default_value (obj_p, hint); - } + /* + * typedef ecma_property_t* (*default_value_ptr_t) (ecma_object_t *, ecma_string_t *); + * static const default_value_ptr_t default_value [ECMA_OBJECT_TYPE__COUNT] = + * { + * [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_default_value, + * [ECMA_OBJECT_TYPE_ARRAY] = &ecma_op_general_object_default_value, + * [ECMA_OBJECT_TYPE_FUNCTION] = &ecma_op_general_object_default_value, + * [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_default_value, + * [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_default_value, + * [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_general_object_default_value, + * [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_default_value + * }; + * + * return default_value[type] (obj_p, property_name_p); + */ - case ECMA_OBJECT_TYPE_HOST: - { - JERRY_UNIMPLEMENTED("Host objects support is not implemented."); - } - } - - JERRY_UNREACHABLE(); + return ecma_op_general_object_default_value (obj_p, hint); } /* ecma_op_object_default_value */ /** @@ -414,35 +366,27 @@ ecma_op_object_define_own_property (ecma_object_t *obj_p, /**< the object */ JERRY_ASSERT(property_name_p != NULL); const ecma_object_type_t type = ecma_get_object_type (obj_p); + JERRY_ASSERT (type < ECMA_OBJECT_TYPE__COUNT); - switch (type) + typedef ecma_completion_value_t (*define_own_property_ptr_t) (ecma_object_t *, + ecma_string_t *, + ecma_property_descriptor_t, + bool); + static const define_own_property_ptr_t define_own_property [ECMA_OBJECT_TYPE__COUNT] = { - case ECMA_OBJECT_TYPE_GENERAL: - case ECMA_OBJECT_TYPE_FUNCTION: - case ECMA_OBJECT_TYPE_BOUND_FUNCTION: - case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: - case ECMA_OBJECT_TYPE_STRING: - { - return ecma_op_general_object_define_own_property (obj_p, property_name_p, property_desc, is_throw); - } + [ECMA_OBJECT_TYPE_GENERAL] = &ecma_op_general_object_define_own_property, + [ECMA_OBJECT_TYPE_FUNCTION] = &ecma_op_general_object_define_own_property, + [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_define_own_property, + [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_define_own_property, + [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_define_own_property, + [ECMA_OBJECT_TYPE_ARRAY] = &ecma_op_array_object_define_own_property, + [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_arguments_object_define_own_property + }; - case ECMA_OBJECT_TYPE_ARGUMENTS: - { - return ecma_op_arguments_object_define_own_property (obj_p, property_name_p, property_desc, is_throw); - } - - case ECMA_OBJECT_TYPE_ARRAY: - { - return ecma_op_array_object_define_own_property (obj_p, property_name_p, property_desc, is_throw); - } - - case ECMA_OBJECT_TYPE_HOST: - { - JERRY_UNIMPLEMENTED("Host objects support is not implemented."); - } - } - - JERRY_UNREACHABLE(); + return define_own_property[type] (obj_p, + property_name_p, + property_desc, + is_throw); } /* ecma_op_object_define_own_property */ /** @@ -477,9 +421,9 @@ ecma_op_object_has_instance (ecma_object_t *obj_p, /**< the object */ return ecma_op_function_has_instance (obj_p, value); } - case ECMA_OBJECT_TYPE_HOST: + case ECMA_OBJECT_TYPE__COUNT: { - JERRY_UNIMPLEMENTED("Host objects support is not implemented."); + break; } }