diff --git a/jerry-core/ecma/operations/ecma-objects-arguments.cpp b/jerry-core/ecma/operations/ecma-objects-arguments.cpp index 28287ad336..1c9c2d1c17 100644 --- a/jerry-core/ecma/operations/ecma-objects-arguments.cpp +++ b/jerry-core/ecma/operations/ecma-objects-arguments.cpp @@ -475,6 +475,25 @@ ecma_op_arguments_object_define_own_property (ecma_object_t *obj_p, /**< the obj return ret_value; } /* ecma_op_arguments_object_define_own_property */ +/** + * [[HasProperty]] ecma Arguments object's operation + * + * See also: + * ECMA-262 v5, 8.6.2; ECMA-262 v5, Table 8 + * + * @return true - if property exists, + * false - otherwise + */ +bool +ecma_op_arguments_object_has_property (ecma_object_t *obj_p, /**< the object */ + ecma_string_t *property_name_p) /**< property name */ +{ + // 1. + ecma_property_t *desc_p = ecma_op_general_object_get_own_property (obj_p, property_name_p); + + return !!desc_p; +} /* ecma_op_arguments_object_has_property */ + /** * [[Delete]] ecma Arguments object's operation * diff --git a/jerry-core/ecma/operations/ecma-objects-arguments.h b/jerry-core/ecma/operations/ecma-objects-arguments.h index ebe558aa4f..d190b9e36a 100644 --- a/jerry-core/ecma/operations/ecma-objects-arguments.h +++ b/jerry-core/ecma/operations/ecma-objects-arguments.h @@ -31,6 +31,8 @@ extern ecma_completion_value_t ecma_op_arguments_object_get (ecma_object_t *obj_ ecma_string_t *property_name_p); extern ecma_property_t *ecma_op_arguments_object_get_own_property (ecma_object_t *obj_p, ecma_string_t *property_name_p); +extern bool ecma_op_arguments_object_has_property (ecma_object_t *obj_p, + ecma_string_t *property_name_p); extern ecma_completion_value_t ecma_op_arguments_object_delete (ecma_object_t *obj_p, ecma_string_t *property_name_p, bool is_throw); diff --git a/jerry-core/ecma/operations/ecma-objects-general.cpp b/jerry-core/ecma/operations/ecma-objects-general.cpp index 84d6e4fe44..88965a9f1c 100644 --- a/jerry-core/ecma/operations/ecma-objects-general.cpp +++ b/jerry-core/ecma/operations/ecma-objects-general.cpp @@ -433,6 +433,29 @@ ecma_op_general_object_can_put (ecma_object_t *obj_p, /**< the object */ JERRY_UNREACHABLE(); } /* ecma_op_general_object_can_put */ +/** + * [[HasProperty]] ecma general object's operation + * + * See also: + * ECMA-262 v5, 8.6.2; ECMA-262 v5, Table 8 + * ECMA-262 v5, 8.12.6 + * + * @return true - if property exists, + * false - otherwise. + */ +bool +ecma_op_general_object_has_property (ecma_object_t *obj_p, /**< the object */ + ecma_string_t *property_name_p) /**< property name */ +{ + JERRY_ASSERT(obj_p != NULL + && !ecma_is_lexical_environment (obj_p)); + JERRY_ASSERT(property_name_p != NULL); + + ecma_property_t *prop_p = ecma_op_object_get_own_property (obj_p, property_name_p); + + return !!prop_p; +} /* ecma_op_general_object_has_property */ + /** * [[Delete]] ecma general object's operation * diff --git a/jerry-core/ecma/operations/ecma-objects-general.h b/jerry-core/ecma/operations/ecma-objects-general.h index 3ed8e07396..635b83e0e9 100644 --- a/jerry-core/ecma/operations/ecma-objects-general.h +++ b/jerry-core/ecma/operations/ecma-objects-general.h @@ -41,6 +41,8 @@ extern ecma_completion_value_t ecma_op_general_object_put (ecma_object_t *obj_p, bool is_throw); extern bool ecma_op_general_object_can_put (ecma_object_t *obj_p, ecma_string_t *property_name_p); +extern bool ecma_op_general_object_has_property (ecma_object_t *obj_p, + ecma_string_t *property_name_p); extern ecma_completion_value_t ecma_op_general_object_delete (ecma_object_t *obj_p, ecma_string_t *property_name_p, bool is_throw); diff --git a/jerry-core/ecma/operations/ecma-objects.cpp b/jerry-core/ecma/operations/ecma-objects.cpp index a460add6ba..7780f9e4ca 100644 --- a/jerry-core/ecma/operations/ecma-objects.cpp +++ b/jerry-core/ecma/operations/ecma-objects.cpp @@ -314,6 +314,50 @@ ecma_op_object_can_put (ecma_object_t *obj_p, /**< the object */ return ecma_op_general_object_can_put (obj_p, property_name_p); } /* ecma_op_object_can_put */ +/** + * [[HasProperty]] ecma object's operation + * + * See also: + * ECMA-262 v5, 8.6.2; ECMA-262 v5, Table 8 + * + * @return true - if property exists, + * false - otherwise + */ +bool +ecma_op_object_has_property (ecma_object_t *obj_p, /**< the object */ + ecma_string_t *property_name_p) /**< property name */ +{ + JERRY_ASSERT(obj_p != NULL + && !ecma_is_lexical_environment (obj_p)); + JERRY_ASSERT(property_name_p != NULL); + + const ecma_object_type_t type = ecma_get_object_type (obj_p); + ecma_assert_object_type_is_valid (type); + + + switch (type) + { + 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_EXTERNAL_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: + case ECMA_OBJECT_TYPE_EXTENSION: + case ECMA_OBJECT_TYPE_STRING: + { + return ecma_op_general_object_has_property (obj_p, property_name_p); + } + + case ECMA_OBJECT_TYPE_ARGUMENTS: + { + return ecma_op_arguments_object_has_property (obj_p, property_name_p); + } + } + + JERRY_UNREACHABLE(); +} /* ecma_op_object_has_property */ + /** * [[Delete]] ecma object's operation * diff --git a/jerry-core/ecma/operations/ecma-objects.h b/jerry-core/ecma/operations/ecma-objects.h index 9e7cbd9929..e19d2ebc3b 100644 --- a/jerry-core/ecma/operations/ecma-objects.h +++ b/jerry-core/ecma/operations/ecma-objects.h @@ -34,6 +34,7 @@ extern ecma_completion_value_t ecma_op_object_put (ecma_object_t *obj_p, ecma_value_t value, bool is_throw); extern bool ecma_op_object_can_put (ecma_object_t *obj_p, ecma_string_t *property_name_p); +extern bool ecma_op_object_has_property (ecma_object_t *obj_p, ecma_string_t *property_name_p); extern ecma_completion_value_t ecma_op_object_delete (ecma_object_t *obj_p, ecma_string_t *property_name_p, bool is_throw);