@@ -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,25 @@ 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
+ if (ast -> kind != ZEND_AST_CLASS_NAME && ast -> kind != ZEND_AST_COALESCE && ast -> kind != ZEND_AST_CONDITIONAL ) {
10583
+ zend_ast_apply (ast , zend_eval_const_expr_inner , ctx );
10584
+ }
10585
+
10569
10586
switch (ast -> kind ) {
10570
10587
case ZEND_AST_BINARY_OP :
10571
- zend_eval_const_expr (& ast -> child [0 ]);
10572
- zend_eval_const_expr (& ast -> child [1 ]);
10573
10588
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL || ast -> child [1 ]-> kind != ZEND_AST_ZVAL ) {
10574
10589
return ;
10575
10590
}
@@ -10582,8 +10597,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10582
10597
break ;
10583
10598
case ZEND_AST_GREATER :
10584
10599
case ZEND_AST_GREATER_EQUAL :
10585
- zend_eval_const_expr (& ast -> child [0 ]);
10586
- zend_eval_const_expr (& ast -> child [1 ]);
10587
10600
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL || ast -> child [1 ]-> kind != ZEND_AST_ZVAL ) {
10588
10601
return ;
10589
10602
}
@@ -10595,8 +10608,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10595
10608
case ZEND_AST_OR :
10596
10609
{
10597
10610
bool child0_is_true , child1_is_true ;
10598
- zend_eval_const_expr (& ast -> child [0 ]);
10599
- zend_eval_const_expr (& ast -> child [1 ]);
10600
10611
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL ) {
10601
10612
return ;
10602
10613
}
@@ -10620,7 +10631,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10620
10631
break ;
10621
10632
}
10622
10633
case ZEND_AST_UNARY_OP :
10623
- zend_eval_const_expr (& ast -> child [0 ]);
10624
10634
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL ) {
10625
10635
return ;
10626
10636
}
@@ -10631,7 +10641,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10631
10641
break ;
10632
10642
case ZEND_AST_UNARY_PLUS :
10633
10643
case ZEND_AST_UNARY_MINUS :
10634
- zend_eval_const_expr (& ast -> child [0 ]);
10635
10644
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL ) {
10636
10645
return ;
10637
10646
}
@@ -10702,13 +10711,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10702
10711
zend_error (E_COMPILE_ERROR , "Array and string offset access syntax with curly braces is no longer supported" );
10703
10712
}
10704
10713
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
10714
if (ast -> child [0 ]-> kind != ZEND_AST_ZVAL || ast -> child [1 ]-> kind != ZEND_AST_ZVAL ) {
10713
10715
return ;
10714
10716
}
@@ -10786,9 +10788,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10786
10788
zend_ast * name_ast ;
10787
10789
zend_string * resolved_name ;
10788
10790
10789
- zend_eval_const_expr (& ast -> child [0 ]);
10790
- zend_eval_const_expr (& ast -> child [1 ]);
10791
-
10792
10791
if (UNEXPECTED (ast -> child [1 ]-> kind != ZEND_AST_ZVAL
10793
10792
|| Z_TYPE_P (zend_ast_get_zval (ast -> child [1 ])) != IS_STRING )) {
10794
10793
return ;
@@ -10818,33 +10817,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10818
10817
}
10819
10818
break ;
10820
10819
}
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
10820
default :
10849
10821
return ;
10850
10822
}
@@ -10853,3 +10825,9 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
10853
10825
* ast_ptr = zend_ast_create_zval (& result );
10854
10826
}
10855
10827
/* }}} */
10828
+
10829
+
10830
+ static void zend_eval_const_expr (zend_ast * * ast_ptr ) /* {{{ */
10831
+ {
10832
+ zend_eval_const_expr_inner (ast_ptr , NULL );
10833
+ }
0 commit comments