Changed exception handling. Now each op_array doesn't contain ZEND_HANDLE_EXCEPTION opcode in the end

This commit is contained in:
Dmitry Stogov 2008-01-21 19:39:55 +00:00
parent 7390459e26
commit fa47e900e2
7 changed files with 30 additions and 14 deletions

3
NEWS
View File

@ -76,6 +76,9 @@ PHP NEWS
(Dmitry, Pierre)
- Added lcfirst() function. (David C)
- Changed exception handling. Now each op_array doesn't contain
ZEND_HANDLE_EXCEPTION opcode in the end. (Dmitry)
- Fixed possible crash in ext/soap because of uninitialized value. (Zdash Urf)
- Fixed bug #43808 (date_create never fails (even when it should)). (Derick)

View File

@ -1303,7 +1303,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);

View File

@ -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;
@ -55,7 +56,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);
}
/* }}} */
@ -567,6 +568,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;

View File

@ -1447,14 +1447,13 @@ ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_v
#define ZEND_VM_JMP(new_op) \
CHECK_SYMBOL_TABLES() \
EX(opline) = EG(exception)?EX(opline)+1:new_op; \
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)); \

View File

@ -1320,8 +1320,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;
}
@ -1365,7 +1363,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;
}
/* }}} */

View File

@ -233,6 +233,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;

View File

@ -399,7 +399,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();
@ -572,7 +571,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);
retval = op_array;