@@ -7571,9 +7571,6 @@ static void zend_compile_enum_backing_type(zend_class_entry *ce, zend_ast *enum_
75717571 ce -> enum_backing_type = IS_STRING ;
75727572 }
75737573 zend_type_release (type , 0 );
7574-
7575- ce -> backed_enum_table = emalloc (sizeof (HashTable ));
7576- zend_hash_init (ce -> backed_enum_table , 0 , NULL , ZVAL_PTR_DTOR , 0 );
75777574}
75787575
75797576static void zend_compile_class_decl (znode * result , zend_ast * ast , bool toplevel ) /* {{{ */
@@ -7785,69 +7782,18 @@ static void zend_compile_enum_case(zend_ast *ast)
77857782 ZVAL_STR_COPY (& case_name_zval , enum_case_name );
77867783 zend_ast * case_name_ast = zend_ast_create_zval (& case_name_zval );
77877784
7788- zend_ast * case_value_zval_ast = NULL ;
77897785 zend_ast * case_value_ast = ast -> child [1 ];
77907786 if (enum_class -> enum_backing_type != IS_UNDEF && case_value_ast == NULL ) {
77917787 zend_error_noreturn (E_COMPILE_ERROR , "Case %s of backed enum %s must have a value" ,
77927788 ZSTR_VAL (enum_case_name ),
77937789 ZSTR_VAL (enum_class_name ));
7794- }
7795- if (case_value_ast != NULL ) {
7796- zend_eval_const_expr (& ast -> child [1 ]);
7797- case_value_ast = ast -> child [1 ];
7798- if (case_value_ast -> kind != ZEND_AST_ZVAL ) {
7799- zend_error_noreturn (
7800- E_COMPILE_ERROR , "Enum case value must be compile-time evaluatable" );
7801- }
7802-
7803- zval case_value_zv ;
7804- ZVAL_COPY (& case_value_zv , zend_ast_get_zval (case_value_ast ));
7805- if (enum_class -> enum_backing_type == IS_UNDEF ) {
7806- if (Z_TYPE (case_value_zv ) == IS_LONG || Z_TYPE (case_value_zv ) == IS_STRING ) {
7807- zend_error_noreturn (E_COMPILE_ERROR , "Case %s of non-backed enum %s must not have a value, try adding \": %s\" to the enum declaration" ,
7808- ZSTR_VAL (enum_case_name ),
7809- ZSTR_VAL (enum_class_name ),
7810- zend_zval_type_name (& case_value_zv ));
7811- } else {
7812- zend_error_noreturn (E_COMPILE_ERROR , "Case %s of non-backed enum %s must not have a value" ,
7813- ZSTR_VAL (enum_case_name ),
7814- ZSTR_VAL (enum_class_name ));
7815- }
7816- }
7817-
7818- if (enum_class -> enum_backing_type != Z_TYPE (case_value_zv )) {
7819- zend_error_noreturn (E_COMPILE_ERROR , "Enum case type %s does not match enum backing type %s" ,
7820- zend_get_type_by_const (Z_TYPE (case_value_zv )),
7821- zend_get_type_by_const (enum_class -> enum_backing_type ));
7822- }
7823-
7824- case_value_zval_ast = zend_ast_create_zval (& case_value_zv );
7825- Z_TRY_ADDREF (case_name_zval );
7826- if (enum_class -> enum_backing_type == IS_LONG ) {
7827- zend_long long_key = Z_LVAL (case_value_zv );
7828- zval * existing_case_name = zend_hash_index_find (enum_class -> backed_enum_table , long_key );
7829- if (existing_case_name ) {
7830- zend_error_noreturn (E_COMPILE_ERROR , "Duplicate value in enum %s for cases %s and %s" ,
7831- ZSTR_VAL (enum_class_name ),
7832- Z_STRVAL_P (existing_case_name ),
7833- ZSTR_VAL (enum_case_name ));
7834- }
7835- zend_hash_index_add_new (enum_class -> backed_enum_table , long_key , & case_name_zval );
7836- } else {
7837- ZEND_ASSERT (enum_class -> enum_backing_type == IS_STRING );
7838- zend_string * string_key = Z_STR (case_value_zv );
7839- zval * existing_case_name = zend_hash_find (enum_class -> backed_enum_table , string_key );
7840- if (existing_case_name != NULL ) {
7841- zend_error_noreturn (E_COMPILE_ERROR , "Duplicate value in enum %s for cases %s and %s" ,
7842- ZSTR_VAL (enum_class_name ),
7843- Z_STRVAL_P (existing_case_name ),
7844- ZSTR_VAL (enum_case_name ));
7845- }
7846- zend_hash_add_new (enum_class -> backed_enum_table , string_key , & case_name_zval );
7847- }
7790+ } else if (enum_class -> enum_backing_type == IS_UNDEF && case_value_ast != NULL ) {
7791+ zend_error_noreturn (E_COMPILE_ERROR , "Case %s of non-backed enum %s must not have a value" ,
7792+ ZSTR_VAL (enum_case_name ),
7793+ ZSTR_VAL (enum_class_name ));
78487794 }
78497795
7850- zend_ast * const_enum_init_ast = zend_ast_create (ZEND_AST_CONST_ENUM_INIT , class_name_ast , case_name_ast , case_value_zval_ast );
7796+ zend_ast * const_enum_init_ast = zend_ast_create (ZEND_AST_CONST_ENUM_INIT , class_name_ast , case_name_ast , case_value_ast );
78517797
78527798 zval value_zv ;
78537799 zend_const_expr_to_zval (& value_zv , & const_enum_init_ast , /* allow_dynamic */ false);
0 commit comments