]> granicus.if.org Git - php/commitdiff
Fixed handling of return statement without a value.
authorDmitry Stogov <dmitry@zend.com>
Thu, 7 Apr 2016 15:59:04 +0000 (18:59 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 7 Apr 2016 15:59:04 +0000 (18:59 +0300)
ext/opcache/Optimizer/zend_inference.c
ext/opcache/Optimizer/zend_ssa.c

index 51817ab5a9cc6a0a299ddd344a52375bba9aaa8f..38a278d85d08b4e3497dd82040243321134256ee 100644 (file)
@@ -3666,19 +3666,19 @@ static void zend_update_type_info(const zend_op_array *op_array,
 
                        tmp = zend_fetch_arg_info(script, ret_info, &ce);
                        tmp |= MAY_BE_RC1 | MAY_BE_RCN;
-                       if (opline->op1_type == IS_CONST) {
-                               UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def);
+                       if (opline->op1_type & (IS_TMP_VAR|IS_VAR|IS_CV)) {
+                               UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);
                                if (ce) {
-                                       UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def);
+                                       UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].op1_def);
                                } else {
-                                       UPDATE_SSA_OBJ_TYPE(NULL, 0, ssa_ops[i].result_def);
+                                       UPDATE_SSA_OBJ_TYPE(NULL, 0, ssa_ops[i].op1_def);
                                }
                        } else {
-                               UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);
+                               UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def);
                                if (ce) {
-                                       UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].op1_def);
+                                       UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def);
                                } else {
-                                       UPDATE_SSA_OBJ_TYPE(NULL, 0, ssa_ops[i].op1_def);
+                                       UPDATE_SSA_OBJ_TYPE(NULL, 0, ssa_ops[i].result_def);
                                }
                        }
                        break;
index 438dcc5f6bc1dacb9b9dd12263546a8e2e24c139..a55ccc915aab0523e05fec61215d37ec2380dfba 100644 (file)
@@ -666,7 +666,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
                                        }
                                        break;
                                case ZEND_VERIFY_RETURN_TYPE:
-                                       if (opline->op1_type != IS_CONST) {
+                                       if (opline->op1_type & (IS_TMP_VAR|IS_VAR|IS_CV)) {
                                                ssa_ops[k].op1_def = ssa_vars_count;
                                                var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count;
                                                ssa_vars_count++;