private function extendOpenFrames()

in agent/php/ElasticApm/Impl/InferredSpansBuilder.php [109:160]


    private function extendOpenFrames(
        array $newStackTrace,
        int &$bottomNotExtendedFrameIndex,
        ?ClassicFormatStackTraceFrame &$frameCopy,
        ?int &$frameCopyIndex
    ): void {
        $openFramesCount = count($this->openFramesReverseOrder);
        $newStackTraceCount = count($newStackTrace);
        /** @var ?ClassicFormatStackTraceFrame $newStackTraceParentFrame */
        $newStackTraceParentFrame = null;
        /** @var ?InferredSpanFrame $openParentFrame */
        $openParentFrame = null;
        for ($i = 0; $i != $openFramesCount && $i != $newStackTraceCount; ++$i) {
            // If we are inside the same frame but at the different line we should not extend child frame
            if (
                $newStackTraceParentFrame !== null
                && $openParentFrame !== null
                && $openParentFrame->stackFrame->line !== $newStackTraceParentFrame->line
            ) {
                // We need to capture stack trace we update line below
                $frameCopy = clone $openParentFrame->stackFrame;
                $frameCopyIndex = $i - 1;
                $openParentFrame->stackFrame->line = $newStackTraceParentFrame->line;
                ($loggerProxy = $this->logger->ifTraceLevelEnabled(__LINE__, __FUNCTION__))
                && $loggerProxy->log(
                    'Cannot be extended because parent frames lines do not match',
                    [
                        'newStackTraceParentFrame' => $newStackTraceParentFrame,
                        'openParentFrame'          => $openParentFrame,
                        'i'                        => $i,
                        'newStackTrace'            => $newStackTrace,
                    ]
                );
                break;
            }
            $openFrame = $this->openFramesReverseOrder[$i];
            $newFrame = $newStackTrace[$newStackTraceCount - $i - 1];
            if (!$openFrame->canBeExtendedWith($newFrame)) {
                ($loggerProxy = $this->logger->ifTraceLevelEnabled(__LINE__, __FUNCTION__))
                && $loggerProxy->log(
                    'Cannot be extended because frames do not match',
                    ['newStackTrace' => $newStackTrace, 'i' => $i]
                );
                break;
            }

            $openParentFrame = $openFrame;
            $newStackTraceParentFrame = $newFrame;
        }

        $bottomNotExtendedFrameIndex = $i;
    }