@@ -89,7 +89,6 @@ ZEND_API zend_executor_globals executor_globals;
89
89
90
90
static zend_op * zend_emit_op (znode * result , zend_uchar opcode , znode * op1 , znode * op2 );
91
91
static bool zend_try_ct_eval_array (zval * result , zend_ast * ast );
92
- zend_bool zend_is_allowed_in_const_expr (zend_ast_kind kind );
93
92
94
93
static void init_op (zend_op * op )
95
94
{
@@ -4629,7 +4628,7 @@ void zend_compile_static_call(znode *result, zend_ast *ast, uint32_t type) /* {{
4629
4628
}
4630
4629
/* }}} */
4631
4630
4632
- zend_class_entry * zend_compile_class_decl (znode * result , zend_ast * ast , bool toplevel );
4631
+ void zend_compile_class_decl (znode * result , zend_ast * ast , bool toplevel );
4633
4632
4634
4633
void zend_compile_new (znode * result , zend_ast * ast ) /* {{{ */
4635
4634
{
@@ -7450,13 +7449,7 @@ static void zend_compile_enum_backing_type(zend_class_entry *ce, zend_ast *enum_
7450
7449
ZEND_ASSERT (ce -> ce_flags & ZEND_ACC_ENUM );
7451
7450
zend_type type = zend_compile_typename (enum_backing_type_ast , 0 );
7452
7451
uint32_t type_mask = ZEND_TYPE_PURE_MASK (type );
7453
- if (
7454
- ZEND_TYPE_HAS_CLASS (type )
7455
- || (
7456
- type_mask != MAY_BE_LONG
7457
- && type_mask != MAY_BE_STRING
7458
- )
7459
- ) {
7452
+ if (ZEND_TYPE_HAS_CLASS (type ) || (type_mask != MAY_BE_LONG && type_mask != MAY_BE_STRING )) {
7460
7453
zend_string * type_string = zend_type_to_string (type );
7461
7454
zend_error_noreturn (E_COMPILE_ERROR ,
7462
7455
"Enum backing type must be int or string, %s given" ,
@@ -7474,7 +7467,7 @@ static void zend_compile_enum_backing_type(zend_class_entry *ce, zend_ast *enum_
7474
7467
zend_hash_init (ce -> backed_enum_table , 0 , NULL , ZVAL_PTR_DTOR , 0 );
7475
7468
}
7476
7469
7477
- zend_class_entry * zend_compile_class_decl (znode * result , zend_ast * ast , bool toplevel ) /* {{{ */
7470
+ void zend_compile_class_decl (znode * result , zend_ast * ast , bool toplevel ) /* {{{ */
7478
7471
{
7479
7472
zend_ast_decl * decl = (zend_ast_decl * ) ast ;
7480
7473
zend_ast * extends_ast = decl -> child [0 ];
@@ -7579,10 +7572,6 @@ zend_class_entry *zend_compile_class_decl(znode *result, zend_ast *ast, bool top
7579
7572
zend_verify_abstract_class (ce );
7580
7573
}
7581
7574
7582
- if (ce -> ce_flags & ZEND_ACC_ENUM ) {
7583
- zend_verify_enum (ce );
7584
- }
7585
-
7586
7575
CG (active_class_entry ) = original_ce ;
7587
7576
7588
7577
if (toplevel ) {
@@ -7605,15 +7594,15 @@ zend_class_entry *zend_compile_class_decl(znode *result, zend_ast *ast, bool top
7605
7594
if (zend_try_early_bind (ce , parent_ce , lcname , NULL )) {
7606
7595
CG (zend_lineno ) = ast -> lineno ;
7607
7596
zend_string_release (lcname );
7608
- return ce ;
7597
+ return ;
7609
7598
}
7610
7599
CG (zend_lineno ) = ast -> lineno ;
7611
7600
}
7612
7601
} else if (EXPECTED (zend_hash_add_ptr (CG (class_table ), lcname , ce ) != NULL )) {
7613
7602
zend_string_release (lcname );
7614
7603
zend_build_properties_info_table (ce );
7615
7604
ce -> ce_flags |= ZEND_ACC_LINKED ;
7616
- return ce ;
7605
+ return ;
7617
7606
}
7618
7607
} else if (!extends_ast ) {
7619
7608
/* Link unbound simple class */
@@ -7667,8 +7656,6 @@ zend_class_entry *zend_compile_class_decl(znode *result, zend_ast *ast, bool top
7667
7656
opline -> result .opline_num = -1 ;
7668
7657
}
7669
7658
}
7670
-
7671
- return ce ;
7672
7659
}
7673
7660
/* }}} */
7674
7661
@@ -7698,9 +7685,15 @@ static void zend_compile_enum_case(zend_ast *ast)
7698
7685
ZSTR_VAL (enum_class_name ));
7699
7686
}
7700
7687
if (case_value_ast != NULL ) {
7688
+ zend_eval_const_expr (& ast -> child [1 ]);
7689
+ case_value_ast = ast -> child [1 ];
7690
+ if (case_value_ast -> kind != ZEND_AST_ZVAL ) {
7691
+ zend_error_noreturn (E_COMPILE_ERROR , "Enum case value must be constant" );
7692
+ }
7693
+
7694
+ zval case_value_zv ;
7695
+ ZVAL_COPY (& case_value_zv , zend_ast_get_zval (case_value_ast ));
7701
7696
if (enum_class -> enum_backing_type == IS_UNDEF ) {
7702
- zval case_value_zv ;
7703
- ZVAL_COPY (& case_value_zv , zend_ast_get_zval (case_value_ast ));
7704
7697
if (Z_TYPE (case_value_zv ) == IS_LONG || Z_TYPE (case_value_zv ) == IS_STRING ) {
7705
7698
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" ,
7706
7699
ZSTR_VAL (enum_case_name ),
@@ -7713,21 +7706,13 @@ static void zend_compile_enum_case(zend_ast *ast)
7713
7706
}
7714
7707
}
7715
7708
7716
- zend_eval_const_expr (& ast -> child [1 ]);
7717
- case_value_ast = ast -> child [1 ];
7718
- if (case_value_ast -> kind != ZEND_AST_ZVAL ) {
7719
- zend_error_noreturn (E_COMPILE_ERROR , "Enum case value must be constant" );
7720
- }
7721
-
7722
- zval case_value_zv ;
7723
- ZVAL_COPY (& case_value_zv , zend_ast_get_zval (case_value_ast ));
7724
7709
if (enum_class -> enum_backing_type != Z_TYPE (case_value_zv )) {
7725
7710
zend_error_noreturn (E_COMPILE_ERROR , "Enum case type %s does not match enum backing type %s" ,
7726
7711
zend_get_type_by_const (Z_TYPE (case_value_zv )),
7727
7712
zend_get_type_by_const (enum_class -> enum_backing_type ));
7728
7713
}
7729
- case_value_zval_ast = zend_ast_create_zval (& case_value_zv );
7730
7714
7715
+ case_value_zval_ast = zend_ast_create_zval (& case_value_zv );
7731
7716
Z_TRY_ADDREF (case_name_zval );
7732
7717
if (enum_class -> enum_backing_type == IS_LONG ) {
7733
7718
zend_long long_key = Z_LVAL (case_value_zv );
@@ -7738,18 +7723,18 @@ static void zend_compile_enum_case(zend_ast *ast)
7738
7723
Z_STRVAL_P (existing_case_name ),
7739
7724
ZSTR_VAL (enum_case_name ));
7740
7725
}
7741
- zend_hash_index_add (enum_class -> backed_enum_table , long_key , & case_name_zval );
7726
+ zend_hash_index_add_new (enum_class -> backed_enum_table , long_key , & case_name_zval );
7742
7727
} else {
7743
7728
ZEND_ASSERT (enum_class -> enum_backing_type == IS_STRING );
7744
7729
zend_string * string_key = Z_STR (case_value_zv );
7745
- zval * existing_case_name = zend_hash_find_ex (enum_class -> backed_enum_table , string_key , 1 );
7730
+ zval * existing_case_name = zend_hash_find (enum_class -> backed_enum_table , string_key );
7746
7731
if (existing_case_name != NULL ) {
7747
7732
zend_error_noreturn (E_COMPILE_ERROR , "Duplicate value in enum %s for cases %s and %s" ,
7748
7733
ZSTR_VAL (enum_class_name ),
7749
7734
Z_STRVAL_P (existing_case_name ),
7750
7735
ZSTR_VAL (enum_case_name ));
7751
7736
}
7752
- zend_hash_add (enum_class -> backed_enum_table , string_key , & case_name_zval );
7737
+ zend_hash_add_new (enum_class -> backed_enum_table , string_key , & case_name_zval );
7753
7738
}
7754
7739
}
7755
7740
@@ -7759,13 +7744,12 @@ static void zend_compile_enum_case(zend_ast *ast)
7759
7744
zend_const_expr_to_zval (& value_zv , & const_enum_init_ast );
7760
7745
zend_class_constant * c = zend_declare_class_constant_ex (enum_class , enum_case_name , & value_zv , ZEND_ACC_PUBLIC , NULL );
7761
7746
Z_ACCESS_FLAGS (c -> value ) |= ZEND_CLASS_CONST_IS_CASE ;
7747
+ zend_ast_destroy (const_enum_init_ast );
7762
7748
7763
7749
zend_ast * attr_ast = ast -> child [2 ];
7764
7750
if (attr_ast ) {
7765
7751
zend_compile_attributes (& c -> attributes , attr_ast , 0 , ZEND_ATTRIBUTE_TARGET_CLASS_CONST );
7766
7752
}
7767
-
7768
- zend_ast_destroy (const_enum_init_ast );
7769
7753
}
7770
7754
7771
7755
static HashTable * zend_get_import_ht (uint32_t type ) /* {{{ */
0 commit comments