]> granicus.if.org Git - php/commitdiff
- Improve opcode dispatching
authorAndi Gutmans <andi@php.net>
Sat, 19 Oct 2002 09:45:51 +0000 (09:45 +0000)
committerAndi Gutmans <andi@php.net>
Sat, 19 Oct 2002 09:45:51 +0000 (09:45 +0000)
Zend/zend_compile.h
Zend/zend_execute.c
Zend/zend_opcode.c

index ef045b0a61586ff6a3e53ed5e5ea537594805e5f..139b36c7def36e5479fa8e2f7b3bc1208ef55d6c 100644 (file)
@@ -59,6 +59,14 @@ typedef struct _znode {
        } u;
 } znode;
 
+typedef struct _zend_execute_data zend_execute_data;
+
+#define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data, zend_op_array *op_array TSRMLS_DC
+#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data, op_array TSRMLS_CC
+
+typedef int (*opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS);
+
+extern opcode_handler_t zend_opcode_handlers[512];
 
 typedef struct _zend_op {
        zend_uchar opcode;
@@ -67,6 +75,7 @@ typedef struct _zend_op {
        znode op2;
        ulong extended_value;
        uint lineno;
+       opcode_handler_t handler;
 } zend_op;
 
 
index 4871c474ef6dfaee6ee65dbbc37961cfd8b50158..5c8b8d6a8632177e27814b83ad5da80657c42aaf 100644 (file)
@@ -1167,11 +1167,6 @@ static int zend_check_symbol(zval **pz TSRMLS_DC)
        EG(current_execute_data) = EX(prev_execute_data);                                               \
        return 1; /* CHECK_ME */
 
-#define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data, zend_op_array *op_array TSRMLS_DC
-#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data, op_array TSRMLS_CC
-
-typedef int (*opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS);
-
 opcode_handler_t zend_opcode_handlers[512];
 
 ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
@@ -1220,7 +1215,7 @@ ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
 #endif
 
                zend_clean_garbage(TSRMLS_C);
-               if (zend_opcode_handlers[EX(opline)->opcode](&execute_data, op_array TSRMLS_CC)) {
+               if (EX(opline)->handler(&execute_data, op_array TSRMLS_CC)) {
                        return;
                }
        }
@@ -3471,7 +3466,6 @@ int zend_isset_isempty_dim_obj_handler(ZEND_OPCODE_HANDLER_ARGS)
        int result = 0;
 
        if (container) {
-
                if ((*container)->type == IS_ARRAY) {
                        HashTable *ht;
                        int isset = 0;
index 94e587c8c2c567280ef6c8ec87b1e41cbeabfcb8..493d276c1a8f08a4e096f717f263023d4c2c8ba3 100644 (file)
@@ -306,6 +306,7 @@ int pass_two(zend_op_array *op_array TSRMLS_DC)
                        opline->op2.u.constant.is_ref = 1;
                        opline->op2.u.constant.refcount = 2;
                }
+               opline->handler = zend_opcode_handlers[opline->opcode];
                opline++;
        }
        op_array->opcodes = (zend_op *) erealloc(op_array->opcodes, sizeof(zend_op)*op_array->last);