Permalink
Browse files

Changed exception handling. Now each op_array doesn't contain ZEND_HA…

…NDLE_EXCEPTION opcode in the end
  • Loading branch information...
1 parent 7390459 commit fa47e900e28fe5dd2c408288a7d43d48cf2706fa Dmitry Stogov committed Jan 21, 2008
Showing with 30 additions and 14 deletions.
  1. +3 −0 NEWS
  2. +0 −1 Zend/zend_compile.c
  3. +19 −1 Zend/zend_exceptions.c
  4. +6 −7 Zend/zend_execute.c
  5. +1 −3 Zend/zend_execute_API.c
  6. +1 −0 Zend/zend_globals.h
  7. +0 −2 Zend/zend_language_scanner.l
View
@@ -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
@@ -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);
@@ -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
@@ -1446,15 +1446,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)); \
@@ -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
@@ -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;
@@ -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;

0 comments on commit fa47e90

Please sign in to comment.