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;
}