@@ -993,9 +993,7 @@ ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate_inner(
993993 }
994994 case ZEND_AST_CLOSURE_CONSTEXPR :
995995 {
996- zend_ast * child = ast -> child [0 ];
997- zval * z = zend_ast_get_zval (child );
998- zend_function * func = Z_PTR_P (z );
996+ zend_function * func = Z_PTR_P (& ((zend_ast_zval * )(ast ))-> val );
999997
1000998 zend_create_closure (result , func , scope , scope , NULL );
1001999 return SUCCESS ;
@@ -1079,7 +1077,7 @@ static size_t ZEND_FASTCALL zend_ast_tree_size(zend_ast *ast)
10791077{
10801078 size_t size ;
10811079
1082- if (ast -> kind == ZEND_AST_ZVAL || ast -> kind == ZEND_AST_CONSTANT ) {
1080+ if (ast -> kind == ZEND_AST_ZVAL || ast -> kind == ZEND_AST_CONSTANT || ast -> kind == ZEND_AST_CLOSURE_CONSTEXPR ) {
10831081 size = sizeof (zend_ast_zval );
10841082 } else if (zend_ast_is_list (ast )) {
10851083 uint32_t i ;
@@ -1106,7 +1104,14 @@ static size_t ZEND_FASTCALL zend_ast_tree_size(zend_ast *ast)
11061104
11071105static void * ZEND_FASTCALL zend_ast_tree_copy (zend_ast * ast , void * buf )
11081106{
1109- if (ast -> kind == ZEND_AST_ZVAL ) {
1107+ if (ast -> kind == ZEND_AST_CLOSURE_CONSTEXPR ) {
1108+ zend_ast_zval * new = (zend_ast_zval * )buf ;
1109+ new -> kind = ZEND_AST_CLOSURE_CONSTEXPR ;
1110+ new -> attr = ast -> attr ;
1111+ ZVAL_COPY (& new -> val , & ((zend_ast_zval * ) ast )-> val );
1112+ Z_LINENO (new -> val ) = zend_ast_get_lineno (ast );
1113+ buf = (void * )((char * )buf + sizeof (zend_ast_zval ));
1114+ } else if (ast -> kind == ZEND_AST_ZVAL ) {
11101115 zend_ast_zval * new = (zend_ast_zval * )buf ;
11111116 new -> kind = ZEND_AST_ZVAL ;
11121117 new -> attr = ast -> attr ;
@@ -1187,6 +1192,8 @@ ZEND_API void ZEND_FASTCALL zend_ast_destroy(zend_ast *ast)
11871192 goto tail_call ;
11881193 } else if (EXPECTED (ast -> kind == ZEND_AST_ZVAL )) {
11891194 zval_ptr_dtor_nogc (zend_ast_get_zval (ast ));
1195+ } else if (EXPECTED (ast -> kind == ZEND_AST_CLOSURE_CONSTEXPR )) {
1196+ zval_ptr_dtor_nogc (& ((zend_ast_zval * )(ast ))-> val );
11901197 } else if (EXPECTED (zend_ast_is_list (ast ))) {
11911198 zend_ast_list * list = zend_ast_get_list (ast );
11921199 if (list -> children ) {
0 commit comments