]> granicus.if.org Git - php/commitdiff
Fixed SCCP support for ZEND_ASSIGN_OBJ_REF
authorDmitry Stogov <dmitry@zend.com>
Wed, 3 Apr 2019 08:22:59 +0000 (11:22 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 3 Apr 2019 08:22:59 +0000 (11:22 +0300)
ext/opcache/Optimizer/sccp.c
ext/opcache/tests/opt/sccp_027.phpt [new file with mode: 0644]

index 3cbaa87b4c55c5f9f0ae3218519ac66fd6340be2..9358afdf0c3729d28428fefb161bb194b11276c6 100644 (file)
@@ -1803,6 +1803,16 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
                        SET_RESULT_BOT(result);
                        break;
                }
+               case ZEND_ASSIGN_STATIC_PROP_REF:
+               case ZEND_ASSIGN_OBJ_REF:
+                       SET_RESULT_BOT(result);
+                       SET_RESULT_BOT(op1);
+                       SET_RESULT_BOT(op2);
+                       opline++;
+                       ssa_op++;
+                       op1 = get_op1_value(ctx, opline, ssa_op);
+                       SET_RESULT_BOT(op1);
+                       break;
                default:
                {
                        /* If we have no explicit implementation return BOT */
diff --git a/ext/opcache/tests/opt/sccp_027.phpt b/ext/opcache/tests/opt/sccp_027.phpt
new file mode 100644 (file)
index 0000000..3818959
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+SCCP 027: Support for ASSIGN_OBJ_REF
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.preload=
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+class Foo {
+       protected $arr;
+       public function init($a) {
+               $this->arr =& $a;
+               if (isset($a[0])) {
+                       return 1;
+               } else {
+                       return 2;
+               }
+       }
+}
+$x = new Foo();
+var_dump($x->init([1]));
+?>
+--EXPECT--
+int(1)