@@ -10557,7 +10557,7 @@ static zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t
1055710557}
1055810558/* }}} */ 
1055910559
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 ) /* {{{ */ 
1056110561{
1056210562	zend_ast  * ast  =  * ast_ptr ;
1056310563	zval  result ;
@@ -10566,10 +10566,25 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
1056610566		return ;
1056710567	}
1056810568
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+ 
1056910586	switch  (ast -> kind ) {
1057010587		case  ZEND_AST_BINARY_OP :
10571- 			zend_eval_const_expr (& ast -> child [0 ]);
10572- 			zend_eval_const_expr (& ast -> child [1 ]);
1057310588			if  (ast -> child [0 ]-> kind  !=  ZEND_AST_ZVAL  ||  ast -> child [1 ]-> kind  !=  ZEND_AST_ZVAL ) {
1057410589				return ;
1057510590			}
@@ -10582,8 +10597,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
1058210597			break ;
1058310598		case  ZEND_AST_GREATER :
1058410599		case  ZEND_AST_GREATER_EQUAL :
10585- 			zend_eval_const_expr (& ast -> child [0 ]);
10586- 			zend_eval_const_expr (& ast -> child [1 ]);
1058710600			if  (ast -> child [0 ]-> kind  !=  ZEND_AST_ZVAL  ||  ast -> child [1 ]-> kind  !=  ZEND_AST_ZVAL ) {
1058810601				return ;
1058910602			}
@@ -10595,8 +10608,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
1059510608		case  ZEND_AST_OR :
1059610609		{
1059710610			bool  child0_is_true , child1_is_true ;
10598- 			zend_eval_const_expr (& ast -> child [0 ]);
10599- 			zend_eval_const_expr (& ast -> child [1 ]);
1060010611			if  (ast -> child [0 ]-> kind  !=  ZEND_AST_ZVAL ) {
1060110612				return ;
1060210613			}
@@ -10620,7 +10631,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
1062010631			break ;
1062110632		}
1062210633		case  ZEND_AST_UNARY_OP :
10623- 			zend_eval_const_expr (& ast -> child [0 ]);
1062410634			if  (ast -> child [0 ]-> kind  !=  ZEND_AST_ZVAL ) {
1062510635				return ;
1062610636			}
@@ -10631,7 +10641,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
1063110641			break ;
1063210642		case  ZEND_AST_UNARY_PLUS :
1063310643		case  ZEND_AST_UNARY_MINUS :
10634- 			zend_eval_const_expr (& ast -> child [0 ]);
1063510644			if  (ast -> child [0 ]-> kind  !=  ZEND_AST_ZVAL ) {
1063610645				return ;
1063710646			}
@@ -10702,13 +10711,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
1070210711				zend_error (E_COMPILE_ERROR , "Array and string offset access syntax with curly braces is no longer supported" );
1070310712			}
1070410713
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 ]);
1071210714			if  (ast -> child [0 ]-> kind  !=  ZEND_AST_ZVAL  ||  ast -> child [1 ]-> kind  !=  ZEND_AST_ZVAL ) {
1071310715				return ;
1071410716			}
@@ -10786,9 +10788,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
1078610788			zend_ast  * name_ast ;
1078710789			zend_string  * resolved_name ;
1078810790
10789- 			zend_eval_const_expr (& ast -> child [0 ]);
10790- 			zend_eval_const_expr (& ast -> child [1 ]);
10791- 
1079210791			if  (UNEXPECTED (ast -> child [1 ]-> kind  !=  ZEND_AST_ZVAL 
1079310792				||  Z_TYPE_P (zend_ast_get_zval (ast -> child [1 ])) !=  IS_STRING )) {
1079410793				return ;
@@ -10818,33 +10817,6 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
1081810817			}
1081910818			break ;
1082010819		}
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 ;
1084810820		default :
1084910821			return ;
1085010822	}
@@ -10853,3 +10825,9 @@ static void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
1085310825	* ast_ptr  =  zend_ast_create_zval (& result );
1085410826}
1085510827/* }}} */ 
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