summaryrefslogtreecommitdiff
path: root/ext/opcache/Optimizer/zend_optimizer.c
diff options
context:
space:
mode:
authorDavid Walker <dwalker@n.io>2017-10-06 17:30:58 -0600
committerNikita Popov <nikita.ppv@gmail.com>2017-12-09 13:39:52 +0100
commit6d4de4cf0582cf33848826ab78aae58077dc2dea (patch)
treee12b5a758af578d0ac96100ca2089e583391f099 /ext/opcache/Optimizer/zend_optimizer.c
parent261ddb760a04fcdf8d3dd12a4745bc1f6c3f9424 (diff)
downloadphp-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.c13
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;