]> granicus.if.org Git - php/commitdiff
Add guard for FETCH_DIM_FUNC_ARG
authorDmitry Stogov <dmitry@zend.com>
Thu, 4 Jun 2020 11:04:21 +0000 (14:04 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 4 Jun 2020 11:04:21 +0000 (14:04 +0300)
ext/opcache/jit/zend_jit_trace.c

index 7ffa894b9050554f4f87b1d30473f1ca786235d3..d0430ccef5f60f0568572f38d7c9ef9aedf5cbf3 100644 (file)
@@ -1412,6 +1412,16 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
                                case ZEND_QM_ASSIGN:
                                        ADD_OP1_TRACE_GUARD();
                                        break;
+                               case ZEND_FETCH_DIM_FUNC_ARG:
+                                       if (!frame
+                                        || !frame->call
+                                        || !frame->call->func
+                                        || !TRACE_FRAME_IS_LAST_SEND_BY_VAL(frame->call)) {
+                                               break;
+                                       }
+                                       ADD_OP2_TRACE_GUARD();
+                                       ADD_OP1_TRACE_GUARD();
+                                       break;
                                case ZEND_PRE_INC:
                                case ZEND_PRE_DEC:
                                case ZEND_POST_INC:
@@ -1523,6 +1533,19 @@ propagate_arg:
                                                return_value_info.type &= ~MAY_BE_GUARD;
                                        }
                                        break;
+                               case ZEND_CHECK_FUNC_ARG:
+                                       if (frame
+                                        && frame->call
+                                        && frame->call->func) {
+                                               uint32_t arg_num = opline->op2.num;
+
+                                               if (ARG_SHOULD_BE_SENT_BY_REF(frame->call->func, arg_num)) {
+                                                       TRACE_FRAME_SET_LAST_SEND_BY_REF(frame->call);
+                                               } else {
+                                                       TRACE_FRAME_SET_LAST_SEND_BY_VAL(frame->call);
+                                               }
+                                       }
+                                       break;
                                default:
                                        break;
                        }