@@ -1081,6 +1081,49 @@ static void ast_to_zval(zval *zv, zend_ast *ast, ast_state_info_t *state) {
10811081 ast -> attr = IS_VOID ;
10821082 break ;
10831083#endif
1084+ case ZEND_AST_CALL :
1085+ if (state -> version < 120 ) {
1086+ // Convert clone($expr) call to ZEND_AST_CLONE node.
1087+ zend_ast * name_ast = ast -> child [0 ];
1088+ if (name_ast -> kind != ZEND_AST_ZVAL || name_ast -> attr != ZEND_NAME_FQ ||
1089+ Z_TYPE_P (zend_ast_get_zval (name_ast )) != IS_STRING ||
1090+ ast -> child [1 ]-> kind != ZEND_AST_ARG_LIST ) {
1091+ break ;
1092+ }
1093+
1094+ zend_ast_list * args = zend_ast_get_list (ast -> child [1 ]);
1095+ if (args -> children != 1 ) {
1096+ break ;
1097+ }
1098+
1099+ zend_ast * arg = args -> child [0 ];
1100+ if (arg -> kind == ZEND_AST_NAMED_ARG || arg -> kind == ZEND_AST_UNPACK ) {
1101+ break ;
1102+ }
1103+
1104+ zend_string * name = zend_ast_get_str (name_ast );
1105+ if (zend_string_equals_literal_ci (name , "clone" )) {
1106+ ast_create_virtual_node (zv , ZEND_AST_CLONE , 0 , arg , state );
1107+ return ;
1108+ }
1109+ }
1110+ break ;
1111+ case ZEND_AST_CLONE :
1112+ if (state -> version >= 120 ) {
1113+ // Convert to call node.
1114+ uint32_t lineno = zend_ast_get_lineno (ast );
1115+ zval name_str_zv , name_node_zv , args_zv , arg_zv ;
1116+ ZVAL_STR (& name_str_zv , AST_STR (str_clone ));
1117+ ast_to_zval (& arg_zv , ast -> child [0 ], state );
1118+ ast_create_virtual_node_ex (
1119+ & name_node_zv , AST_NAME , ZEND_NAME_FQ , lineno , state , 1 , & name_str_zv );
1120+ ast_create_virtual_node_ex (
1121+ & args_zv , ZEND_AST_ARG_LIST , 0 , lineno , state , 1 , & arg_zv );
1122+ ast_create_virtual_node_ex (
1123+ zv , ZEND_AST_CALL , 0 , lineno , state , 2 , & name_node_zv , & args_zv );
1124+ return ;
1125+ }
1126+ break ;
10841127 }
10851128
10861129 object_init_ex (zv , ast_node_ce );
@@ -1171,7 +1214,7 @@ static void ast_to_zval(zval *zv, zend_ast *ast, ast_state_info_t *state) {
11711214#endif
11721215}
11731216
1174- static const zend_long versions [] = {50 , 60 , 70 , 80 , 85 , 90 , 100 , 110 };
1217+ static const zend_long versions [] = {50 , 60 , 70 , 80 , 85 , 90 , 100 , 110 , 120 };
11751218static const size_t versions_count = sizeof (versions )/sizeof (versions [0 ]);
11761219
11771220static inline zend_bool ast_version_deprecated (zend_long version ) {
0 commit comments