@@ -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