]> granicus.if.org Git - php/commitdiff
Fixed incorrect trace type inference for top-level code
authorDmitry Stogov <dmitry@zend.com>
Thu, 28 May 2020 14:43:29 +0000 (17:43 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 28 May 2020 14:43:29 +0000 (17:43 +0300)
ext/opcache/jit/zend_jit_trace.c

index e45bef79ea09216da5d5eaee9863ac6e14da486c..41409dd953814769d7a2da6c478cf2c825d394ae 100644 (file)
@@ -1196,9 +1196,11 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
                                } else {
                                        ssa_var_info[i].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY  | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
                                }
-                       } else {
+                       } else if (op_array->function_name) {
                                ssa_vars[i].no_val = ssa->vars ? ssa->vars[i].no_val : 0;
                                ssa_var_info[i].type = MAY_BE_UNDEF;
+                       } else {
+                               ssa_var_info[i].type = MAY_BE_UNDEF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
                        }
                        i++;
                }
@@ -1591,9 +1593,11 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
                                        } else {
                                                ssa_var_info[v].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY  | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
                                        }
-                               } else {
+                               } else if (op_array->function_name) {
                                        ssa_vars[v].no_val = ssa->vars ? ssa->vars[i].no_val : 0;
                                        ssa_var_info[v].type = MAY_BE_UNDEF;
+                               } else {
+                                       ssa_var_info[v].type = MAY_BE_UNDEF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
                                }
                                if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
                                 && i < op_array->num_args) {
@@ -2588,6 +2592,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                ssa->var_info[i].type = info;
                                SET_STACK_TYPE(stack, i, concrete_type(info));
                        } else if (trace_buffer->start == ZEND_JIT_TRACE_START_ENTER
+                        && op_array->function_name
                         && i >= op_array->num_args) {
                                /* This must be already handled by trace type inference */
                                ZEND_ASSERT(0);