/** * Deletes a variable. * * @return ecma value * Returned value must be freed with ecma_free_value */ ecma_value_t vm_op_delete_var (lit_cpointer_t name_literal, /**< name literal */ ecma_object_t *lex_env_p, /**< lexical environment */ bool is_strict) /**< strict mode */ { ecma_value_t completion_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); ecma_string_t *var_name_str_p; var_name_str_p = ecma_new_ecma_string_from_lit_cp (name_literal); ecma_reference_t ref = ecma_op_get_identifier_reference (lex_env_p, var_name_str_p, is_strict); JERRY_ASSERT (!ref.is_strict); if (ecma_is_value_undefined (ref.base)) { completion_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE); } else { ecma_object_t *ref_base_lex_env_p = ecma_op_resolve_reference_base (lex_env_p, var_name_str_p); JERRY_ASSERT (ecma_is_lexical_environment (ref_base_lex_env_p)); ECMA_TRY_CATCH (delete_op_ret_val, ecma_op_delete_binding (ref_base_lex_env_p, ECMA_GET_NON_NULL_POINTER (ecma_string_t, ref.referenced_name_cp)), completion_value); completion_value = delete_op_ret_val; ECMA_FINALIZE (delete_op_ret_val); } ecma_free_reference (ref); ecma_deref_ecma_string (var_name_str_p); return completion_value; } /* vm_op_delete_var */
/** * Resolve syntactic reference to ECMA-reference. * * @return ECMA-reference * Returned value must be freed through ecma_free_reference. */ ecma_reference_t ecma_op_get_identifier_reference (ecma_object_t *lex_env_p, /**< lexical environment */ ecma_string_t *name_p, /**< identifier's name */ bool is_strict) /**< strict reference flag */ { JERRY_ASSERT (lex_env_p != NULL); ecma_object_t *base_lex_env_p = ecma_op_resolve_reference_base (lex_env_p, name_p); if (base_lex_env_p != NULL) { return ecma_make_reference (ecma_make_object_value (base_lex_env_p), name_p, is_strict); } else { return ecma_make_reference (ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED), name_p, is_strict); } } /* ecma_op_get_identifier_reference */
/** * Deletes a variable. * * @return ecma value * Returned value must be freed with ecma_free_value */ ecma_value_t vm_op_delete_var (jmem_cpointer_t name_literal, /**< name literal */ ecma_object_t *lex_env_p) /**< lexical environment */ { ecma_value_t completion_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); ecma_string_t *var_name_str_p = JMEM_CP_GET_NON_NULL_POINTER (ecma_string_t, name_literal); ecma_object_t *ref_base_lex_env_p = ecma_op_resolve_reference_base (lex_env_p, var_name_str_p); if (ref_base_lex_env_p == NULL) { completion_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE); } else { JERRY_ASSERT (ecma_is_lexical_environment (ref_base_lex_env_p)); completion_value = ecma_op_delete_binding (ref_base_lex_env_p, var_name_str_p); } return completion_value; } /* vm_op_delete_var */