diff options
author | David Walker <dwalker@n.io> | 2017-10-06 17:30:58 -0600 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2017-12-09 13:39:52 +0100 |
commit | 6d4de4cf0582cf33848826ab78aae58077dc2dea (patch) | |
tree | e12b5a758af578d0ac96100ca2089e583391f099 /ext/opcache/Optimizer/zend_optimizer.c | |
parent | 261ddb760a04fcdf8d3dd12a4745bc1f6c3f9424 (diff) | |
download | php-git-6d4de4cf0582cf33848826ab78aae58077dc2dea.tar.gz |
Implement list() reference assignments
Support list() reference assignments of the form:
list(&$a, list(&$b, $c)) = $d;
RFC: https://wiki.php.net/rfc/list_reference_assignment
Diffstat (limited to 'ext/opcache/Optimizer/zend_optimizer.c')
-rw-r--r-- | ext/opcache/Optimizer/zend_optimizer.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 1e5b4a2a73..f63c2c0383 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -269,6 +269,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_FETCH_DIM_RW: case ZEND_FETCH_DIM_FUNC_ARG: case ZEND_FETCH_DIM_UNSET: + case ZEND_FETCH_LIST_W: case ZEND_ASSIGN_DIM: case ZEND_RETURN_BY_REF: return 0; @@ -307,7 +308,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, * zend_optimizer_replace_by_const() supports this. */ return 0; case ZEND_CASE: - case ZEND_FETCH_LIST: + case ZEND_FETCH_LIST_R: return 0; case ZEND_CONCAT: case ZEND_FAST_CONCAT: @@ -450,7 +451,8 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_FETCH_DIM_IS: case ZEND_FETCH_DIM_FUNC_ARG: case ZEND_FETCH_DIM_UNSET: - case ZEND_FETCH_LIST: + case ZEND_FETCH_LIST_R: + case ZEND_FETCH_LIST_W: if (Z_TYPE_P(val) == IS_STRING) { zend_ulong index; if (ZEND_HANDLE_NUMERIC(Z_STR_P(val), index)) { @@ -571,6 +573,7 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array, case ZEND_FETCH_DIM_RW: case ZEND_FETCH_DIM_FUNC_ARG: case ZEND_FETCH_DIM_UNSET: + case ZEND_FETCH_LIST_W: case ZEND_ASSIGN_DIM: case ZEND_SEPARATE: case ZEND_RETURN_BY_REF: @@ -593,15 +596,15 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array, break; /* In most cases IS_TMP_VAR operand may be used only once. * The operands are usually destroyed by the opcode handler. - * ZEND_CASE and ZEND_FETCH_LIST are exceptions, they keeps operand + * ZEND_CASE and ZEND_FETCH_LIST_R are exceptions, they keeps operand * unchanged, and allows its reuse. these instructions * usually terminated by ZEND_FREE that finally kills the value. */ - case ZEND_FETCH_LIST: { + case ZEND_FETCH_LIST_R: { zend_op *m = opline; do { - if (m->opcode == ZEND_FETCH_LIST && + if (m->opcode == ZEND_FETCH_LIST_R && m->op1_type == type && m->op1.var == var) { zval v; |