Browse Source

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

experimental/first_unicode_implementation
Dmitry Stogov 19 years ago
parent
commit
27d1e925e2
  1. 1
      Zend/zend_compile.c
  2. 20
      Zend/zend_exceptions.c
  3. 13
      Zend/zend_execute.c
  4. 4
      Zend/zend_execute_API.c
  5. 1
      Zend/zend_globals.h
  6. 2
      Zend/zend_language_scanner.l

1
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);

20
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;

13
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)); \

4
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;
}
/* }}} */

1
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;

2
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);

Loading…
Cancel
Save