From: Dmitry Stogov Date: Mon, 21 Jan 2008 19:41:41 +0000 (+0000) Subject: Changed exception handling. Now each op_array doesn't contain ZEND_HANDLE_EXCEPTION... X-Git-Tag: RELEASE_2_0_0a1~820 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=27d1e925e2759793dc1c36714dcdd54d8bc3f6c6;p=php Changed exception handling. Now each op_array doesn't contain ZEND_HANDLE_EXCEPTION opcode in the end --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3c06660bc7..04e4d491ce 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1376,7 +1376,6 @@ void zend_do_end_function_declaration(znode *function_token TSRMLS_DC) /* {{{ */ zend_do_extended_info(TSRMLS_C); zend_do_return(NULL, 0 TSRMLS_CC); - zend_do_handle_exception(TSRMLS_C); pass_two(CG(active_op_array) TSRMLS_CC); diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 4826860d00..ba99b3bc6a 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -26,6 +26,7 @@ #include "zend_builtin_functions.h" #include "zend_interfaces.h" #include "zend_exceptions.h" +#include "zend_vm.h" zend_class_entry *default_exception_ce; zend_class_entry *error_exception_ce; @@ -56,7 +57,7 @@ void zend_throw_exception_internal(zval *exception TSRMLS_DC) /* {{{ */ return; } EG(opline_before_exception) = EG(current_execute_data)->opline; - EG(current_execute_data)->opline = &EG(active_op_array)->opcodes[EG(active_op_array)->last-1-1]; + EG(current_execute_data)->opline = EG(exception_op); } /* }}} */ @@ -653,6 +654,23 @@ void zend_register_default_exception(TSRMLS_D) /* {{{ */ { zend_class_entry ce; + memset(EG(exception_op), 0, sizeof(EG(exception_op))); + EG(exception_op)[0].opcode = ZEND_HANDLE_EXCEPTION; + EG(exception_op)[0].op1.op_type = IS_UNUSED; + EG(exception_op)[0].op2.op_type = IS_UNUSED; + EG(exception_op)[0].result.op_type = IS_UNUSED; + ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op)); + EG(exception_op)[1].opcode = ZEND_HANDLE_EXCEPTION; + EG(exception_op)[1].op1.op_type = IS_UNUSED; + EG(exception_op)[1].op2.op_type = IS_UNUSED; + EG(exception_op)[1].result.op_type = IS_UNUSED; + ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op)+1); + EG(exception_op)[2].opcode = ZEND_HANDLE_EXCEPTION; + EG(exception_op)[2].op1.op_type = IS_UNUSED; + EG(exception_op)[2].op2.op_type = IS_UNUSED; + EG(exception_op)[2].result.op_type = IS_UNUSED; + ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op)+2); + INIT_CLASS_ENTRY(ce, "Exception", default_exception_functions); default_exception_ce = zend_register_internal_class(&ce TSRMLS_CC); default_exception_ce->create_object = zend_default_exception_new; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9068ed3615..d5baedd186 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1461,15 +1461,14 @@ ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_v EX(opline) = new_op #define ZEND_VM_JMP(new_op) \ - CHECK_SYMBOL_TABLES() \ - EX(opline) = EG(exception)?EX(opline)+1:new_op; \ - ZEND_VM_CONTINUE() + CHECK_SYMBOL_TABLES() \ + if (EXPECTED(!EG(exception))) { \ + EX(opline) = new_op; \ + } \ + ZEND_VM_CONTINUE() #define ZEND_VM_INC_OPCODE() \ - if (!EG(exception)) { \ - CHECK_SYMBOL_TABLES() \ - EX(opline)++; \ - } + EX(opline)++ #define ZEND_VM_EXIT_FROM_EXECUTE_LOOP() \ free_alloca(EX(CVs), EX(use_heap)); \ diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 00099a95e9..acf0e36afb 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1490,8 +1490,6 @@ void execute_new_code(TSRMLS_D) /* {{{ */ INIT_ZVAL(ret_opline->op1.u.constant); SET_UNUSED(ret_opline->op2); - zend_do_handle_exception(TSRMLS_C); - if (!CG(active_op_array)->start_op) { CG(active_op_array)->start_op = CG(active_op_array)->opcodes; } @@ -1542,7 +1540,7 @@ void execute_new_code(TSRMLS_D) /* {{{ */ zend_exception_error(EG(exception) TSRMLS_CC); } - CG(active_op_array)->last -= 2; /* get rid of that ZEND_RETURN and ZEND_HANDLE_EXCEPTION */ + CG(active_op_array)->last -= 1; /* get rid of that ZEND_RETURN */ CG(active_op_array)->start_op = CG(active_op_array)->opcodes+CG(active_op_array)->last; } /* }}} */ diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index c532647393..dc3d1e87fd 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -227,6 +227,7 @@ struct _zend_executor_globals { zend_objects_store objects_store; zval *exception; zend_op *opline_before_exception; + zend_op exception_op[3]; struct _zend_execute_data *current_execute_data; diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 7106b2b299..0c28efd6aa 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -778,7 +778,6 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSR CG(active_op_array) = op_array; compiler_result = zendparse(TSRMLS_C); zend_do_return(&retval_znode, 0 TSRMLS_CC); - zend_do_handle_exception(TSRMLS_C); CG(in_compilation) = original_in_compilation; if (compiler_result==1) { /* parser error */ zend_bailout(); @@ -934,7 +933,6 @@ zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC) retval = NULL; } else { zend_do_return(NULL, 0 TSRMLS_CC); - zend_do_handle_exception(TSRMLS_C); CG(active_op_array) = original_active_op_array; pass_two(op_array TSRMLS_CC); zend_release_labels(TSRMLS_C);