@@ -7588,9 +7588,6 @@ static void zend_compile_enum_backing_type(zend_class_entry *ce, zend_ast *enum_
75887588 ce -> enum_backing_type = IS_STRING ;
75897589 }
75907590 zend_type_release (type , 0 );
7591-
7592- ce -> backed_enum_table = emalloc (sizeof (HashTable ));
7593- zend_hash_init (ce -> backed_enum_table , 0 , NULL , ZVAL_PTR_DTOR , 0 );
75947591}
75957592
75967593static void zend_compile_class_decl (znode * result , zend_ast * ast , bool toplevel ) /* {{{ */
@@ -7802,69 +7799,20 @@ static void zend_compile_enum_case(zend_ast *ast)
78027799 ZVAL_STR_COPY (& case_name_zval , enum_case_name );
78037800 zend_ast * case_name_ast = zend_ast_create_zval (& case_name_zval );
78047801
7805- zend_ast * case_value_zval_ast = NULL ;
78067802 zend_ast * case_value_ast = ast -> child [1 ];
7803+ // Remove case_value_ast from the original AST to avoid freeing it, as it will be freed by zend_const_expr_to_zval
7804+ ast -> child [1 ] = NULL ;
78077805 if (enum_class -> enum_backing_type != IS_UNDEF && case_value_ast == NULL ) {
78087806 zend_error_noreturn (E_COMPILE_ERROR , "Case %s of backed enum %s must have a value" ,
78097807 ZSTR_VAL (enum_case_name ),
78107808 ZSTR_VAL (enum_class_name ));
7811- }
7812- if (case_value_ast != NULL ) {
7813- zend_eval_const_expr (& ast -> child [1 ]);
7814- case_value_ast = ast -> child [1 ];
7815- if (case_value_ast -> kind != ZEND_AST_ZVAL ) {
7816- zend_error_noreturn (
7817- E_COMPILE_ERROR , "Enum case value must be compile-time evaluatable" );
7818- }
7819-
7820- zval case_value_zv ;
7821- ZVAL_COPY (& case_value_zv , zend_ast_get_zval (case_value_ast ));
7822- if (enum_class -> enum_backing_type == IS_UNDEF ) {
7823- if (Z_TYPE (case_value_zv ) == IS_LONG || Z_TYPE (case_value_zv ) == IS_STRING ) {
7824- 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" ,
7825- ZSTR_VAL (enum_case_name ),
7826- ZSTR_VAL (enum_class_name ),
7827- zend_zval_type_name (& case_value_zv ));
7828- } else {
7829- zend_error_noreturn (E_COMPILE_ERROR , "Case %s of non-backed enum %s must not have a value" ,
7830- ZSTR_VAL (enum_case_name ),
7831- ZSTR_VAL (enum_class_name ));
7832- }
7833- }
7834-
7835- if (enum_class -> enum_backing_type != Z_TYPE (case_value_zv )) {
7836- zend_error_noreturn (E_COMPILE_ERROR , "Enum case type %s does not match enum backing type %s" ,
7837- zend_get_type_by_const (Z_TYPE (case_value_zv )),
7838- zend_get_type_by_const (enum_class -> enum_backing_type ));
7839- }
7840-
7841- case_value_zval_ast = zend_ast_create_zval (& case_value_zv );
7842- Z_TRY_ADDREF (case_name_zval );
7843- if (enum_class -> enum_backing_type == IS_LONG ) {
7844- zend_long long_key = Z_LVAL (case_value_zv );
7845- zval * existing_case_name = zend_hash_index_find (enum_class -> backed_enum_table , long_key );
7846- if (existing_case_name ) {
7847- zend_error_noreturn (E_COMPILE_ERROR , "Duplicate value in enum %s for cases %s and %s" ,
7848- ZSTR_VAL (enum_class_name ),
7849- Z_STRVAL_P (existing_case_name ),
7850- ZSTR_VAL (enum_case_name ));
7851- }
7852- zend_hash_index_add_new (enum_class -> backed_enum_table , long_key , & case_name_zval );
7853- } else {
7854- ZEND_ASSERT (enum_class -> enum_backing_type == IS_STRING );
7855- zend_string * string_key = Z_STR (case_value_zv );
7856- zval * existing_case_name = zend_hash_find (enum_class -> backed_enum_table , string_key );
7857- if (existing_case_name != NULL ) {
7858- zend_error_noreturn (E_COMPILE_ERROR , "Duplicate value in enum %s for cases %s and %s" ,
7859- ZSTR_VAL (enum_class_name ),
7860- Z_STRVAL_P (existing_case_name ),
7861- ZSTR_VAL (enum_case_name ));
7862- }
7863- zend_hash_add_new (enum_class -> backed_enum_table , string_key , & case_name_zval );
7864- }
7809+ } else if (enum_class -> enum_backing_type == IS_UNDEF && case_value_ast != NULL ) {
7810+ zend_error_noreturn (E_COMPILE_ERROR , "Case %s of non-backed enum %s must not have a value" ,
7811+ ZSTR_VAL (enum_case_name ),
7812+ ZSTR_VAL (enum_class_name ));
78657813 }
78667814
7867- zend_ast * const_enum_init_ast = zend_ast_create (ZEND_AST_CONST_ENUM_INIT , class_name_ast , case_name_ast , case_value_zval_ast );
7815+ zend_ast * const_enum_init_ast = zend_ast_create (ZEND_AST_CONST_ENUM_INIT , class_name_ast , case_name_ast , case_value_ast );
78687816
78697817 zval value_zv ;
78707818 zend_const_expr_to_zval (& value_zv , & const_enum_init_ast , /* allow_dynamic */ false);
0 commit comments