]> granicus.if.org Git - php/commitdiff
Changed exception handling. Now each op_array doesn't contain ZEND_HANDLE_EXCEPTION...
authorDmitry Stogov <dmitry@php.net>
Mon, 21 Jan 2008 19:41:41 +0000 (19:41 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 21 Jan 2008 19:41:41 +0000 (19:41 +0000)
Zend/zend_compile.c
Zend/zend_exceptions.c
Zend/zend_execute.c
Zend/zend_execute_API.c
Zend/zend_globals.h
Zend/zend_language_scanner.l

index 3c06660bc76997b71292b8b6dab7c436b81b071f..04e4d491ce1053be2efc1807ba5bc7975db506c6 100644 (file)
@@ -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);
 
index 4826860d0011add92e60e04a703bace6b5d77de1..ba99b3bc6a47191d934a4fec9e0000380b38154a 100644 (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;
@@ -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;
index 9068ed361539fb8af6201c4aa94f5020f44fef5f..d5baedd1865fe5beef7434b9ffb3e08ad91a3a5b 100644 (file)
@@ -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)); \
index 00099a95e9028fdedaef3cfb833a78043b934c76..acf0e36afb71847760fa7972c2f3caba2d89e94e 100644 (file)
@@ -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;
 }
 /* }}} */
index c532647393d8b80ba8dff1086a191513566e3519..dc3d1e87fd6c92cfa6f38d8c1a5d3a2ad3ce8c23 100644 (file)
@@ -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;
 
index 7106b2b299cc8ad2fa0c7c1ab90c5fac7bfe9a50..0c28efd6aa599a56364638e23e823c2538086ec1 100644 (file)
@@ -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);