diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2017-03-17 23:45:05 +0100 |
|---|---|---|
| committer | Nikita Popov <nikita.ppv@gmail.com> | 2017-04-10 22:23:14 +0200 |
| commit | ad8652818a54790e01fcf181791aa780ac6922c9 (patch) | |
| tree | 7df0e640a877b87bde44c85410898ed8039b87fd /Zend/zend_opcode.c | |
| parent | d1a012b60270b751449de79235028295696145b2 (diff) | |
| download | php-git-ad8652818a54790e01fcf181791aa780ac6922c9.tar.gz | |
Implement jumptable optimization
Diffstat (limited to 'Zend/zend_opcode.c')
| -rw-r--r-- | Zend/zend_opcode.c | 13 |
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); |
