]> granicus.if.org Git - php/commitdiff
Fixed type ingference
authorDmitry Stogov <dmitry@zend.com>
Wed, 16 Nov 2016 17:49:00 +0000 (20:49 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 16 Nov 2016 17:49:00 +0000 (20:49 +0300)
ext/opcache/Optimizer/zend_inference.c

index a25a0cef769ad5a67645c997da4329bbc9123044..4c41e2196b1f93eeb5d97aa732ee1dc5bcaa837f 100644 (file)
@@ -3474,12 +3474,15 @@ static void zend_update_type_info(const zend_op_array *op_array,
                        UPDATE_SSA_TYPE(MAY_BE_FALSE|MAY_BE_TRUE, ssa_ops[i].result_def);
                        break;
                case ZEND_VERIFY_RETURN_TYPE:
-               {
-                       zend_arg_info *ret_info = op_array->arg_info - 1;
+                       if (t1 & MAY_BE_REF) {
+                               tmp = t1;
+                       } else {
+                               zend_arg_info *ret_info = op_array->arg_info - 1;
 
-                       tmp = zend_fetch_arg_info(script, ret_info, &ce);
-                       if (tmp & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
-                               tmp |= MAY_BE_RC1 | MAY_BE_RCN;
+                               tmp = zend_fetch_arg_info(script, ret_info, &ce);
+                               if (tmp & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
+                                       tmp |= MAY_BE_RC1 | MAY_BE_RCN;
+                               }
                        }
                        if (opline->op1_type & (IS_TMP_VAR|IS_VAR|IS_CV)) {
                                UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);
@@ -3497,7 +3500,6 @@ static void zend_update_type_info(const zend_op_array *op_array,
                                }
                        }
                        break;
-               }
                case ZEND_CATCH:
                case ZEND_INCLUDE_OR_EVAL:
                        /* Forbidden opcodes */