svn: /php/php-src/trunk/Zend/ zend_vm_def.h zend_vm_execute.h
| From: | Dmitry Stogov | Date: | Mon, 24 May 2010 14:46:31 +0000 |
| Subject: | svn: /php/php-src/trunk/Zend/ zend_vm_def.h zend_vm_execute.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-62693@lists.php.net to get a copy of this message | ||
dmitry Mon, 24 May 2010 14:46:31 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=299693
Log:
Fixed exception handling in GOTO VM
Changed paths:
U php/php-src/trunk/Zend/zend_vm_def.h
U php/php-src/trunk/Zend/zend_vm_execute.h
Modified: php/php-src/trunk/Zend/zend_vm_def.h
===================================================================
--- php/php-src/trunk/Zend/zend_vm_def.h 2010-05-24 14:11:39 UTC (rev 299692)
+++ php/php-src/trunk/Zend/zend_vm_def.h 2010-05-24 14:46:31 UTC (rev 299693)
@@ -2895,6 +2895,7 @@
{
USE_OPLINE
zend_class_entry *ce, *catch_ce;
+ zval *exception;
SAVE_OPLINE();
/* Check whether an exception has been thrown, if not, jump over code */
@@ -2928,6 +2929,7 @@
}
}
+ exception = EG(exception);
if (!EG(active_symbol_table)) {
if (EX_CV(opline->op2.var)) {
zval_ptr_dtor(EX_CV(opline->op2.var));
@@ -2939,8 +2941,13 @@
zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1,
cv->hash_value,
&EG(exception), sizeof(zval *), (void**)&EX_CV(opline->op2.var));
}
- EG(exception) = NULL;
- ZEND_VM_NEXT_OPCODE();
+ if (UNEXPECTED(EG(exception) != exception)) {
+ EG(exception) = NULL;
+ HANDLE_EXCEPTION();
+ } else {
+ EG(exception) = NULL;
+ ZEND_VM_NEXT_OPCODE();
+ }
}
ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMP|VAR|CV, ANY)
Modified: php/php-src/trunk/Zend/zend_vm_execute.h
===================================================================
--- php/php-src/trunk/Zend/zend_vm_execute.h 2010-05-24 14:11:39 UTC (rev 299692)
+++ php/php-src/trunk/Zend/zend_vm_execute.h 2010-05-24 14:46:31 UTC (rev 299693)
@@ -5628,6 +5628,7 @@
{
USE_OPLINE
zend_class_entry *ce, *catch_ce;
+ zval *exception;
SAVE_OPLINE();
/* Check whether an exception has been thrown, if not, jump over code */
@@ -5661,6 +5662,7 @@
}
}
+ exception = EG(exception);
if (!EG(active_symbol_table)) {
if (EX_CV(opline->op2.var)) {
zval_ptr_dtor(EX_CV(opline->op2.var));
@@ -5672,8 +5674,13 @@
zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1,
cv->hash_value,
&EG(exception), sizeof(zval *), (void**)&EX_CV(opline->op2.var));
}
- EG(exception) = NULL;
- ZEND_VM_NEXT_OPCODE();
+ if (UNEXPECTED(EG(exception) != exception)) {
+ EG(exception) = NULL;
+ HANDLE_EXCEPTION();
+ } else {
+ EG(exception) = NULL;
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)