Re: cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_language_parser.y

From: Date: Wed, 13 Feb 2002 19:33:08 +0000
Subject: Re: cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_language_parser.y
References: 1  Groups: php.dev 
Request: Send a blank email to php-dev+get-80024@lists.php.net to get a copy of this message
Can we change the commit address to zend-cvs@lists.php.net? I like to filter my mail with the Qmail Delivered-To: directive so it help if the mailing list name would be different. Andi At 07:26 PM 2/13/2002 +0000, Andi Gutmans wrote:
andi            Wed Feb 13 14:26:07 2002 EDT
Modified files:
    /ZendEngine2        zend_compile.c zend_compile.h zend_language_parser.y
Log: @ Allow a series of consecutive catch() statements (Andi, Zend Engine) <?php
        class MyException1 {
        }
        class MyException2 {
        }
        try {
                throw new MyException2();
        } catch (MyException1 $m) {
                print "Caught MyException1";
        } catch (MyException2 $m) {
                print "Caught MyException2";
        }
Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.268 ZendEngine2/zend_compile.c:1.269
--- ZendEngine2/zend_compile.c:1.268    Thu Feb  7 09:08:43 2002
+++ ZendEngine2/zend_compile.c Wed Feb 13 14:26:07 2002 @@ -1255,7 +1255,7 @@
        }
} -void zend_do_begin_catch(znode *try_token, znode *catch_class, znode *catch_var TSRMLS_DC) +void zend_do_begin_catch(znode *try_token, znode *catch_class, znode *catch_var, zend_bool first_catch TSRMLS_DC) {
        long catch_op_number = get_next_op_number(CG(active_op_array));
        zend_op *opline;
@@ -1266,11 +1266,12 @@
        SET_UNUSED(opline->op1); /* FIXME: Define IS_CLASS or something like that */
        opline->op2 = *catch_var;
-       zend_llist_apply_with_argument(CG(throw_list), (llist_apply_with_arg_func_t) throw_list_applier, &CG(catch_begin) TSRMLS_CC);
-       zend_llist_destroy(CG(throw_list));
-       efree(CG(throw_list));
-       CG(throw_list) = (void *) try_token->throw_list;
-
+       if (first_catch) {
+               zend_llist_apply_with_argument(CG(throw_list), (llist_apply_with_arg_func_t) throw_list_applier, &CG(catch_begin) TSRMLS_CC);
+               zend_llist_destroy(CG(throw_list));
+               efree(CG(throw_list));
+               CG(throw_list) = (void *) try_token->throw_list;
+       }
        try_token->u.opline_num = catch_op_number;
} Index: ZendEngine2/zend_compile.h diff -u ZendEngine2/zend_compile.h:1.165 ZendEngine2/zend_compile.h:1.166
--- ZendEngine2/zend_compile.h:1.165    Sun Feb 10 07:54:02 2002
+++ ZendEngine2/zend_compile.h Wed Feb 13 14:26:07 2002 @@ -279,7 +279,7 @@ void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC); void zend_do_try(znode *try_token TSRMLS_DC); -void zend_do_begin_catch(znode *try_token, znode *catch_class, znode *catch_var TSRMLS_DC); +void zend_do_begin_catch(znode *try_token, znode *catch_class, znode *catch_var, zend_bool first_catch TSRMLS_DC); void zend_do_end_catch(znode *try_token TSRMLS_DC); void zend_do_throw(znode *expr TSRMLS_DC); Index: ZendEngine2/zend_language_parser.y diff -u ZendEngine2/zend_language_parser.y:1.46 ZendEngine2/zend_language_parser.y:1.47
--- ZendEngine2/zend_language_parser.y:1.46     Sun Jan 20 15:42:15 2002
+++ ZendEngine2/zend_language_parser.y Wed Feb 13 14:26:07 2002 @@ -206,10 +206,16 @@
        |       T_DECLARE { zend_do_declare_begin(TSRMLS_C); } '(' declare_list ')' declare_statement { zend_do_declare_end(TSRMLS_C); }
        |       ';'             /* empty statement */
        |       T_TRY { zend_do_try(&$1 TSRMLS_CC); } '{' inner_statement_list '}'
-                       T_CATCH '(' catch_class_entry T_VARIABLE ')' { zend_do_begin_catch(&$1, &$8, &$9 TSRMLS_CC); } '{' inner_statement_list '}' { zend_do_end_catch(&$1 TSRMLS_CC); }
+                       catches
        |       T_THROW expr ';' { zend_do_throw(&$2 TSRMLS_CC); }
        |       T_DELETE  cvar  ';' { zend_do_end_variable_parse(BP_VAR_UNSET, 0 TSRMLS_CC); zend_do_unset(&$1, ZEND_UNSET_OBJ TSRMLS_CC); }
; + +catches:
+               catches T_CATCH '(' catch_class_entry T_VARIABLE ')' { zend_do_begin_catch(&$2, &$4, &$5, 0 TSRMLS_CC); } '{' inner_statement_list '}' { zend_do_end_catch(&$2 TSRMLS_CC); }
+       |       T_CATCH '(' catch_class_entry T_VARIABLE ')' { zend_do_begin_catch(&$1, &$3, &$4, 1 TSRMLS_CC); } '{' inner_statement_list '}' { zend_do_end_catch(&$1 TSRMLS_CC); }
+; + unset_variables:
                unset_variable
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php


« previous php.dev (#80024) next »