1
0
mirror of https://github.com/php/php-src.git synced 2026-04-21 06:51:18 +02:00

Fixed exception handling in GOTO VM

This commit is contained in:
Dmitry Stogov
2010-05-24 14:46:31 +00:00
parent c5237d82bf
commit 04dd48ceca
2 changed files with 18 additions and 4 deletions
+9 -2
View File
@@ -2895,6 +2895,7 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV)
{
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 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV)
}
}
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_VM_HANDLER(107, ZEND_CATCH, CONST, CV)
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)
+9 -2
View File
@@ -5628,6 +5628,7 @@ static int ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
{
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 @@ static int ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
}
}
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 @@ static int ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
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)