@@ -10557,7 +10557,7 @@ static zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t
10557
10557
}
10558
10558
/* }}} */
10559
10559
10560
- static void zend_eval_const_expr (zend_ast * * ast_ptr ) /* {{{ */
10560
+ static void zend_eval_const_expr_inner (zend_ast * * ast_ptr , void * ctx ) /* {{{ */
10561
10561
{
10562
10562
zend_ast * ast = * ast_ptr ;
10563
10563
zval result ;
@@ -10566,10 +10566,26 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10566
10566
return ;
10567
10567
}
10568
10568
10569
+ /* Set isset fetch indicator here, opcache disallows runtime altering of the AST */
10570
+ if (ast -> kind == ZEND_AST_DIM
10571
+ && (ast -> attr & ZEND_DIM_IS )
10572
+ && ast -> child [0 ]-> kind == ZEND_AST_DIM ) {
10573
+ ast -> child [0 ]-> attr |= ZEND_DIM_IS ;
10574
+ }
10575
+
10576
+ /* We don't want to evaluate the class name of ZEND_AST_CLASS_NAME nodes. We need to be able to
10577
+ * differenciate between literal class names and expressions that evaluate to strings. Strings
10578
+ * are not actually allowed in ::class expressions.
10579
+ *
10580
+ * ZEND_AST_COALESCE and ZEND_AST_CONDITIONAL will manually evaluate only the children for the
10581
+ * taken paths.
10582
+ */
10583
+ if (ast -> kind != ZEND_AST_CLASS_NAME && ast -> kind != ZEND_AST_COALESCE && ast -> kind != ZEND_AST_CONDITIONAL ) {
10584
+ zend_ast_apply (ast , zend_eval_const_expr_inner , ctx );
10585
+ }
10586
+
10569
10587
switch (ast -> kind ) {
10570
10588
case ZEND_AST_BINARY_OP :
10571
- zend_eval_const_expr (& ast -> child [0 ]);
10572
- zend_eval_const_expr (& ast -> child [1 ]);
10573
10589
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL || ast -> child [1 ]-> kind != ZEND_AST_ZVAL ) {
10574
10590
return ;
10575
10591
}
@@ -10582,8 +10598,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10582
10598
break ;
10583
10599
case ZEND_AST_GREATER :
10584
10600
case ZEND_AST_GREATER_EQUAL :
10585
- zend_eval_const_expr (& ast -> child [0 ]);
10586
- zend_eval_const_expr (& ast -> child [1 ]);
10587
10601
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL || ast -> child [1 ]-> kind != ZEND_AST_ZVAL ) {
10588
10602
return ;
10589
10603
}
@@ -10595,8 +10609,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10595
10609
case ZEND_AST_OR :
10596
10610
{
10597
10611
bool child0_is_true , child1_is_true ;
10598
- zend_eval_const_expr (& ast -> child [0 ]);
10599
- zend_eval_const_expr (& ast -> child [1 ]);
10600
10612
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL ) {
10601
10613
return ;
10602
10614
}
@@ -10620,7 +10632,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10620
10632
break ;
10621
10633
}
10622
10634
case ZEND_AST_UNARY_OP :
10623
- zend_eval_const_expr (& ast -> child [0 ]);
10624
10635
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL ) {
10625
10636
return ;
10626
10637
}
@@ -10631,7 +10642,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10631
10642
break ;
10632
10643
case ZEND_AST_UNARY_PLUS :
10633
10644
case ZEND_AST_UNARY_MINUS :
10634
- zend_eval_const_expr (& ast -> child [0 ]);
10635
10645
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL ) {
10636
10646
return ;
10637
10647
}
@@ -10702,13 +10712,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10702
10712
zend_error (E_COMPILE_ERROR , "Array and string offset access syntax with curly braces is no longer supported" );
10703
10713
}
10704
10714
10705
- /* Set isset fetch indicator here, opcache disallows runtime altering of the AST */
10706
- if ((ast -> attr & ZEND_DIM_IS ) && ast -> child [0 ]-> kind == ZEND_AST_DIM ) {
10707
- ast -> child [0 ]-> attr |= ZEND_DIM_IS ;
10708
- }
10709
-
10710
- zend_eval_const_expr (& ast -> child [0 ]);
10711
- zend_eval_const_expr (& ast -> child [1 ]);
10712
10715
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL || ast -> child [1 ]-> kind != ZEND_AST_ZVAL ) {
10713
10716
return ;
10714
10717
}
@@ -10786,9 +10789,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10786
10789
zend_ast * name_ast ;
10787
10790
zend_string * resolved_name ;
10788
10791
10789
- zend_eval_const_expr (& ast -> child [0 ]);
10790
- zend_eval_const_expr (& ast -> child [1 ]);
10791
-
10792
10792
if (UNEXPECTED (ast -> child [1 ]-> kind != ZEND_AST_ZVAL
10793
10793
|| Z_TYPE_P (zend_ast_get_zval (ast -> child [1 ])) != IS_STRING )) {
10794
10794
return ;
@@ -10818,33 +10818,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10818
10818
}
10819
10819
break ;
10820
10820
}
10821
- // TODO: We should probably use zend_ast_apply to recursively walk nodes without
10822
- // special handling. It is required that all nodes that are part of a const expr
10823
- // are visited. Probably we should be distinguishing evaluation of const expr and
10824
- // normal exprs here.
10825
- case ZEND_AST_ARG_LIST :
10826
- {
10827
- zend_ast_list * list = zend_ast_get_list (ast );
10828
- for (uint32_t i = 0 ; i < list -> children ; i ++ ) {
10829
- zend_eval_const_expr (& list -> child [i ]);
10830
- }
10831
- return ;
10832
- }
10833
- case ZEND_AST_NEW :
10834
- zend_eval_const_expr (& ast -> child [0 ]);
10835
- zend_eval_const_expr (& ast -> child [1 ]);
10836
- return ;
10837
- case ZEND_AST_NAMED_ARG :
10838
- zend_eval_const_expr (& ast -> child [1 ]);
10839
- return ;
10840
- case ZEND_AST_CONST_ENUM_INIT :
10841
- zend_eval_const_expr (& ast -> child [2 ]);
10842
- return ;
10843
- case ZEND_AST_PROP :
10844
- case ZEND_AST_NULLSAFE_PROP :
10845
- zend_eval_const_expr (& ast -> child [0 ]);
10846
- zend_eval_const_expr (& ast -> child [1 ]);
10847
- return ;
10848
10821
default :
10849
10822
return ;
10850
10823
}
@@ -10853,3 +10826,9 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10853
10826
* ast_ptr = zend_ast_create_zval (& result );
10854
10827
}
10855
10828
/* }}} */
10829
+
10830
+
10831
+ static void zend_eval_const_expr (zend_ast * * ast_ptr ) /* {{{ */
10832
+ {
10833
+ zend_eval_const_expr_inner (ast_ptr , NULL );
10834
+ }
0 commit comments