/** * 'in' opcode handler. * * See also: ECMA-262 v5, 11.8.7 * * @return ecma value * returned value must be freed with ecma_free_value. */ ecma_value_t opfunc_in (ecma_value_t left_value, /**< left value */ ecma_value_t right_value) /**< right value */ { if (!ecma_is_value_object (right_value)) { return ecma_raise_type_error (ECMA_ERR_MSG ("Expected an object in 'in' check.")); } bool to_string = !ecma_is_value_string (left_value); if (to_string) { left_value = ecma_op_to_string (left_value); if (ECMA_IS_VALUE_ERROR (left_value)) { return left_value; } } ecma_string_t *left_value_prop_name_p = ecma_get_string_from_value (left_value); ecma_object_t *right_value_obj_p = ecma_get_object_from_value (right_value); ecma_value_t result = ecma_make_boolean_value (ecma_op_object_has_property (right_value_obj_p, left_value_prop_name_p)); if (to_string) { ecma_free_value (left_value); } return result; } /* opfunc_in */
/** * 'in' opcode handler. * * See also: ECMA-262 v5, 11.8.7 * * @return ecma value * returned value must be freed with ecma_free_value. */ ecma_value_t opfunc_in (ecma_value_t left_value, /**< left value */ ecma_value_t right_value) /**< right value */ { ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); if (!ecma_is_value_object (right_value)) { ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("Expected an object in 'in' check.")); } else { ECMA_TRY_CATCH (str_left_value, ecma_op_to_string (left_value), ret_value); ecma_string_t *left_value_prop_name_p = ecma_get_string_from_value (str_left_value); ecma_object_t *right_value_obj_p = ecma_get_object_from_value (right_value); ret_value = ecma_make_boolean_value (ecma_op_object_has_property (right_value_obj_p, left_value_prop_name_p)); ECMA_FINALIZE (str_left_value); } return ret_value; } /* opfunc_in */
/** * HasBinding operation. * * See also: ECMA-262 v5, 10.2.1 * * @return true / false */ bool ecma_op_has_binding (ecma_object_t *lex_env_p, /**< lexical environment */ ecma_string_t *name_p) /**< argument N */ { JERRY_ASSERT (lex_env_p != NULL && ecma_is_lexical_environment (lex_env_p)); ecma_lexical_environment_type_t lex_env_type = ecma_get_lex_env_type (lex_env_p); if (lex_env_type == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE) { ecma_property_t *property_p = ecma_find_named_property (lex_env_p, name_p); return (property_p != NULL); } else { JERRY_ASSERT (lex_env_type == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND); ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); return ecma_op_object_has_property (binding_obj_p, name_p); } } /* ecma_op_has_binding */