]> granicus.if.org Git - php/commitdiff
Fixed bug #73746 (Method that returns string returns UNKNOWN:0 instead)
authorXinchen Hui <laruence@gmail.com>
Fri, 16 Dec 2016 03:06:27 +0000 (11:06 +0800)
committerXinchen Hui <laruence@gmail.com>
Fri, 16 Dec 2016 03:06:27 +0000 (11:06 +0800)
NEWS
ext/opcache/Optimizer/zend_optimizer.c
ext/opcache/tests/bug73746.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index e6e9c3480d956e15f90e3d083843f9d4cd1c78e7..1f22b923d105bef5e0ad7644a3c313c6a86591ed 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,8 @@ PHP                                                                        NEWS
     usage. (Andrey)
 
 - Opcache:
+  . Fixed bug #73746 (Method that returns string returns UNKNOWN:0 instead).
+    (Laruence)
   . Fixed bug #73654 (Segmentation fault in zend_call_function). (Nikita)
   . Fixed bug #73668 ("SIGFPE Arithmetic exception" in opcache when divide by
     minus 1). (Nikita)
index b6506e01756c76701735ac8b117ba72e6dd89596..ef79eb86dc1867afe0fe79f239f4cc0e86c3b1fd 100644 (file)
@@ -506,7 +506,6 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
                                }
                                case ZEND_VERIFY_RETURN_TYPE: {
                                        zend_arg_info *ret_info = op_array->arg_info - 1;
-                                       ZEND_ASSERT((opline + 1)->opcode == ZEND_RETURN || (opline + 1)->opcode == ZEND_RETURN_BY_REF);
                                        if (ret_info->class_name
                                                || ret_info->type_hint == IS_CALLABLE
                                                || !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(val))
@@ -515,7 +514,10 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
                                                return 0;
                                        }
                                        MAKE_NOP(opline);
-                                       opline++;
+                                       /* zend_handle_loops_and_finally may inserts other oplines */
+                                       do {
+                                               ++opline;
+                                       } while (opline->opcode != ZEND_RETURN && opline->opcode != ZEND_RETURN_BY_REF);
                                        break;
                                  }
                                default:
diff --git a/ext/opcache/tests/bug73746.phpt b/ext/opcache/tests/bug73746.phpt
new file mode 100644 (file)
index 0000000..c97833a
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Bug #73746 (Method that returns string returns UNKNOWN:0 instead)
+--FILE--
+<?php
+namespace Core\Bundle\Service\Property\Room\Rooms;
+
+class CountryMapping
+{
+       const CZ = 'CZ';
+       const EN = 'EN';
+
+       public function get(string $countryIsoCode = null) : string // Works correctly if return type is removed
+       {
+               switch (strtoupper($countryIsoCode)) {
+               case 'CZ':
+               case 'SK':
+                       return self::CZ; // Works correctly if changed to CountryMapping::CZ
+               default:
+                       return self::EN; // Works correctly if changed to CountryMapping::EN
+               }
+       }
+}
+
+$mapping = new CountryMapping();
+var_dump($mapping->get('CZ'));
+?>
+--EXPECT--
+string(2) "CZ"