cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_language_parser.y
| From: | Andi Gutmans | Date: | Wed, 13 Feb 2002 19:26:07 +0000 |
| Subject: | cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_language_parser.y | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-9365@lists.php.net to get a copy of this message | ||
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