diff options
| author | Dmitry Stogov <dmitry@php.net> | 2010-05-24 14:46:31 +0000 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@php.net> | 2010-05-24 14:46:31 +0000 |
| commit | 04dd48ceca34cb5e6a65cc5236cea06096aaf057 (patch) | |
| tree | d05fd12aa033b23abd2e20308a83598f4479fe28 | |
| parent | c5237d82bf01a762bb38f80def59b9c16cb84dc1 (diff) | |
| download | php-git-04dd48ceca34cb5e6a65cc5236cea06096aaf057.tar.gz | |
Fixed exception handling in GOTO VM
| -rw-r--r-- | Zend/zend_vm_def.h | 11 | ||||
| -rw-r--r-- | Zend/zend_vm_execute.h | 11 |
2 files changed, 18 insertions, 4 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 5dfcaa0555..5804dd3e2a 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 7254fc3933..f0bb0bffda 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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) |
