@@ -5836,10 +5836,15 @@ static void zend_compile_using(zend_ast *ast)
58365836 zend_ast_create_znode (& tmp ),
58375837 zend_ast_create_zval_from_str (ZSTR_KNOWN (ZEND_STR_ENTER_CONTEXT )),
58385838 zend_ast_create_list (0 , ZEND_AST_ARG_LIST ));
5839+ znode var_backup ;
5840+ znode var_node ;
58395841 if (var_ast ) {
5840- if (var_ast -> kind != ZEND_AST_VAR ) {
5841- zend_throw_error (NULL , "TODO: support non-var on right side of 'as'" );
5842- }
5842+ /* backup $var */
5843+ zend_compile_var (& var_node , var_ast , BP_VAR_IS , false);
5844+ zend_emit_op (& var_backup , ZEND_BACKUP_CV , & var_node , NULL );
5845+
5846+ /* assign $var */
5847+ zend_compile_stmt (zend_ast_create (ZEND_AST_UNSET , var_ast ));
58435848 zend_compile_assign (& tmp , zend_ast_create (ZEND_AST_ASSIGN , var_ast , enter_ast ));
58445849 } else {
58455850 zend_compile_method_call (& tmp , enter_ast , BP_VAR_R );
@@ -5940,13 +5945,32 @@ static void zend_compile_using(zend_ast *ast)
59405945 /* unset($var) */
59415946 finally_stmt = zend_ast_list_add (finally_stmt ,
59425947 zend_ast_create (ZEND_AST_UNSET , var_ast ));
5948+ /* restore $var */
5949+ finally_stmt = zend_ast_list_add (finally_stmt ,
5950+ zend_ast_create (ZEND_AST_RESTORE_CV , var_ast ,
5951+ zend_ast_create_znode (& var_backup )));
59435952 }
59445953
59455954 zend_compile_try (zend_ast_create (ZEND_AST_TRY , stmts_ast , catch_list , finally_stmt ));
59465955
59475956 zend_end_loop (get_next_op_number (), NULL );
59485957}
59495958
5959+ static void zend_compile_restore_cv (zend_ast * ast )
5960+ {
5961+ zend_ast * var_ast = ast -> child [0 ];
5962+ zend_ast * backup_ast = ast -> child [1 ];
5963+
5964+ znode var_node ;
5965+ znode backup_node ;
5966+
5967+ zend_compile_expr (& var_node , var_ast );
5968+ zend_compile_expr (& backup_node , backup_ast );
5969+
5970+ zend_op * opline = zend_emit_op (NULL , ZEND_RESTORE_CV , & backup_node , NULL );
5971+ SET_NODE (opline -> result , & var_node );
5972+ }
5973+
59505974static void zend_compile_echo (zend_ast * ast ) /* {{{ */
59515975{
59525976 zend_op * opline ;
@@ -11982,6 +12006,9 @@ static void zend_compile_stmt(zend_ast *ast) /* {{{ */
1198212006 case ZEND_AST_USING :
1198312007 zend_compile_using (ast );
1198412008 break ;
12009+ case ZEND_AST_RESTORE_CV :
12010+ zend_compile_restore_cv (ast );
12011+ break ;
1198512012 default :
1198612013 {
1198712014 znode result ;
0 commit comments