]> granicus.if.org Git - php/commitdiff
Fixed bug #74442
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 14 Apr 2017 20:20:32 +0000 (22:20 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 14 Apr 2017 20:20:32 +0000 (22:20 +0200)
NEWS
ext/opcache/Optimizer/dfa_pass.c
ext/opcache/tests/bug74442.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 9953a673164b36f8cc5470bf919c2dfa0a185e12..6af7477ac665f9994f852ffedb2f985a40e03213 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -39,6 +39,7 @@ PHP                                                                        NEWS
 
 - Opcache:
   . Fixed bug #74431 (foreach infinite loop). (Nikita)
+  . Fixed bug #74442 (Opcached version produces a nested array). (Nikita)
 
 - OpenSSL:
   . Fixed bug #74341 (openssl_x509_parse fails to parse ASN.1 UTCTime without
index 4e4260660c0fadc556188239577c3bea9df00117..027814b5cd585fdcf72e7ce219a89d26116a6494 100644 (file)
@@ -366,6 +366,12 @@ static zend_bool opline_supports_assign_contraction(
                        && (opline->op2_type != IS_CV || opline->op2.var != cv_var);
        }
 
+       if (opline->opcode == ZEND_CAST) {
+               /* CAST to array/object may initialize the result to an empty array/object before
+                * reading the expression. */
+               return opline->extended_value != IS_ARRAY && opline->extended_value != IS_OBJECT;
+       }
+
        return 1;
 }
 
diff --git a/ext/opcache/tests/bug74442.phpt b/ext/opcache/tests/bug74442.phpt
new file mode 100644 (file)
index 0000000..6b02d49
--- /dev/null
@@ -0,0 +1,37 @@
+--TEST--
+Bug #74442: Opcached version produces a nested array
+--FILE--
+<?php
+class Schema_Base {
+    public function addField($typeclass, array $params = null) {
+        $field = new $typeclass($params);
+        return $field;
+    }
+}
+
+class Field_Base {
+    public function __construct(array $params = null) {
+        if (! is_array($params)) {
+            $params = (array) $params;
+        }
+        call_user_func_array(array($this, 'acceptParams'), $params);
+    }
+}
+
+class Field_Integer extends Field_Base {
+    protected function acceptParams($bytes = 4) {
+        echo print_r($bytes, true);
+    }
+}
+
+try {
+    $schema = new Schema_Base;
+    $schema->addField('Field_Integer');
+} catch (Throwable $ex) {
+    echo "CAUGHT EXCEPTION";
+    echo (string)$ex;
+}
+
+?>
+--EXPECT--
+4