summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2002-10-19 09:45:51 +0000
committerAndi Gutmans <andi@php.net>2002-10-19 09:45:51 +0000
commit536d4d8aab711e534c409f129b092cba6575be4d (patch)
tree080e4f232b2a6393cd1b76026c4f27d92cb06e9d
parent572b2a5a5aa3a5f3f23880355a79631a0ea96f5e (diff)
downloadphp-git-536d4d8aab711e534c409f129b092cba6575be4d.tar.gz
- Improve opcode dispatching
-rw-r--r--Zend/zend_compile.h9
-rw-r--r--Zend/zend_execute.c8
-rw-r--r--Zend/zend_opcode.c1
3 files changed, 11 insertions, 7 deletions
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index ef045b0a61..139b36c7de 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -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;
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 4871c474ef..5c8b8d6a86 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -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;
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index 94e587c8c2..493d276c1a 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -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);