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);
#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;
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);
}
/* }}} */
{
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;
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)); \
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;
}
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;
}
/* }}} */
zend_objects_store objects_store;
zval *exception;
zend_op *opline_before_exception;
+ zend_op exception_op[3];
struct _zend_execute_data *current_execute_data;
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();
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);