@@ -100,6 +100,18 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_constant(zend_string *name, ze
100100	return  (zend_ast  * ) ast ;
101101}
102102
103+ ZEND_API  zend_ast  *  ZEND_FASTCALL  zend_ast_create_op_array (zend_op_array  * op_array ) {
104+ 	zend_ast_op_array  * ast ;
105+ 
106+ 	ast  =  zend_ast_alloc (sizeof (zend_ast_op_array ));
107+ 	ast -> kind  =  ZEND_AST_OP_ARRAY ;
108+ 	ast -> attr  =  0 ;
109+ 	ast -> lineno  =  CG (zend_lineno );
110+ 	ast -> op_array  =  op_array ;
111+ 
112+ 	return  (zend_ast  * ) ast ;
113+ }
114+ 
103115ZEND_API  zend_ast  *  ZEND_FASTCALL  zend_ast_create_class_const_or_name (zend_ast  * class_name , zend_ast  * name ) {
104116	zend_string  * name_str  =  zend_ast_get_str (name );
105117	if  (zend_string_equals_ci (name_str , ZSTR_KNOWN (ZEND_STR_CLASS ))) {
@@ -992,7 +1004,7 @@ ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate_inner(
9921004		}
9931005		case  ZEND_AST_OP_ARRAY :
9941006		{
995- 			zend_function  * func  =  Z_PTR_P ( & (( zend_ast_zval * ) (ast )) -> val ) ;
1007+ 			zend_function  * func  =  ( zend_function   * ) zend_ast_get_op_array (ast )-> op_array ;
9961008
9971009			zend_create_closure (result , func , scope , scope , NULL );
9981010			return  SUCCESS ;
@@ -1076,8 +1088,10 @@ static size_t ZEND_FASTCALL zend_ast_tree_size(zend_ast *ast)
10761088{
10771089	size_t  size ;
10781090
1079- 	if  (ast -> kind  ==  ZEND_AST_ZVAL  ||  ast -> kind  ==  ZEND_AST_CONSTANT   ||   ast -> kind   ==   ZEND_AST_OP_ARRAY ) {
1091+ 	if  (ast -> kind  ==  ZEND_AST_ZVAL  ||  ast -> kind  ==  ZEND_AST_CONSTANT ) {
10801092		size  =  sizeof (zend_ast_zval );
1093+ 	} else  if  (ast -> kind  ==  ZEND_AST_OP_ARRAY ) {
1094+ 		size  =  sizeof (zend_ast_op_array );
10811095	} else  if  (zend_ast_is_list (ast )) {
10821096		uint32_t  i ;
10831097		zend_ast_list  * list  =  zend_ast_get_list (ast );
@@ -1138,12 +1152,13 @@ static void* ZEND_FASTCALL zend_ast_tree_copy(zend_ast *ast, void *buf)
11381152			}
11391153		}
11401154	} else  if  (ast -> kind  ==  ZEND_AST_OP_ARRAY ) {
1141- 		zend_ast_zval  * new  =  (zend_ast_zval * )buf ;
1142- 		new -> kind  =  ZEND_AST_OP_ARRAY ;
1143- 		new -> attr  =  ast -> attr ;
1144- 		ZVAL_COPY (& new -> val , & ((zend_ast_zval  * ) ast )-> val );
1145- 		Z_LINENO (new -> val ) =  zend_ast_get_lineno (ast );
1146- 		buf  =  (void * )((char * )buf  +  sizeof (zend_ast_zval ));
1155+ 		zend_ast_op_array  * old  =  zend_ast_get_op_array (ast );
1156+ 		zend_ast_op_array  * new  =  (zend_ast_op_array * )buf ;
1157+ 		new -> kind  =  old -> kind ;
1158+ 		new -> attr  =  old -> attr ;
1159+ 		new -> lineno  =  old -> lineno ;
1160+ 		new -> op_array  =  old -> op_array ;
1161+ 		buf  =  (void * )((char * )buf  +  sizeof (zend_ast_op_array ));
11471162	} else  if  (zend_ast_is_decl (ast )) {
11481163		/* Not implemented. */ 
11491164		ZEND_UNREACHABLE ();
@@ -1211,7 +1226,7 @@ ZEND_API void ZEND_FASTCALL zend_ast_destroy(zend_ast *ast)
12111226	} else  if  (EXPECTED (ast -> kind  ==  ZEND_AST_CONSTANT )) {
12121227		zend_string_release_ex (zend_ast_get_constant_name (ast ), 0 );
12131228	} else  if  (EXPECTED (ast -> kind  ==  ZEND_AST_OP_ARRAY )) {
1214- 		ZEND_ASSERT (! Z_REFCOUNTED ((( zend_ast_zval * )( ast )) -> val )); 
1229+ 		/* Nothing to do. */ 
12151230	} else  if  (EXPECTED (zend_ast_is_decl (ast ))) {
12161231		zend_ast_decl  * decl  =  (zend_ast_decl  * ) ast ;
12171232
0 commit comments