summaryrefslogtreecommitdiff
path: root/Zend/zend_opcode.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-03-17 23:45:05 +0100
committerNikita Popov <nikita.ppv@gmail.com>2017-04-10 22:23:14 +0200
commitad8652818a54790e01fcf181791aa780ac6922c9 (patch)
tree7df0e640a877b87bde44c85410898ed8039b87fd /Zend/zend_opcode.c
parentd1a012b60270b751449de79235028295696145b2 (diff)
downloadphp-git-ad8652818a54790e01fcf181791aa780ac6922c9.tar.gz
Implement jumptable optimization
Diffstat (limited to 'Zend/zend_opcode.c')
-rw-r--r--Zend/zend_opcode.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index 7c79703338..e8764e964a 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -670,6 +670,19 @@ ZEND_API int pass_two(zend_op_array *op_array)
opline->opcode = ZEND_GENERATOR_RETURN;
}
break;
+ case ZEND_SWITCH_LONG:
+ case ZEND_SWITCH_STRING:
+ {
+ /* absolute indexes to relative offsets */
+ HashTable *jumptable = Z_ARRVAL_P(CT_CONSTANT(opline->op2));
+ zval *zv;
+ ZEND_HASH_FOREACH_VAL(jumptable, zv) {
+ Z_LVAL_P(zv) = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, Z_LVAL_P(zv));
+ } ZEND_HASH_FOREACH_END();
+
+ opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, opline->extended_value);
+ break;
+ }
}
if (opline->op1_type == IS_CONST) {
ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op1);