Skip to content

Commit d86faef

Browse files
Fix handling of backtrace frames (#1862)
Co-authored-by: Cursor Agent <[email protected]>
1 parent 6a1adc2 commit d86faef

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

src/FrameBuilder.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,8 @@ private function getFunctionArgumentValues(\ReflectionFunctionAbstract $reflecti
221221

222222
if ($reflectionParameter->isVariadic()) {
223223
// For variadic parameters, collect all remaining arguments into an array
224-
$variadicArgs = [];
225-
for ($i = $parameterPosition; $i < \count($backtraceFrameArgs); ++$i) {
226-
$variadicArgs[] = $backtraceFrameArgs[$i];
227-
}
228-
$argumentValues[$reflectionParameter->getName()] = $variadicArgs;
224+
$variadicArgs = \array_slice($backtraceFrameArgs, $parameterPosition);
225+
$argumentValues[$reflectionParameter->getName()] = array_values($variadicArgs);
229226
// Variadic parameter is always the last one, so we can break
230227
break;
231228
}

tests/FrameBuilderTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,4 +395,39 @@ public function testGetFunctionArgumentsWithNullValues(): void
395395
$this->assertArrayHasKey('rest', $result);
396396
$this->assertSame(['extra1', null, 'extra3'], $result['rest']);
397397
}
398+
399+
public function testGetFunctionArgumentsWithGapsInBacktraceArrayIndices(): void
400+
{
401+
$options = new Options([]);
402+
$frameBuilder = new FrameBuilder($options, new RepresentationSerializer($options));
403+
404+
$testFunction = function (string $first, int $second, ...$rest) {
405+
};
406+
407+
$backtraceFrameArgs = [];
408+
$backtraceFrameArgs[0] = 'hello'; // first parameter
409+
$backtraceFrameArgs[1] = 42; // second parameter
410+
$backtraceFrameArgs[3] = 'extra1'; // gap at index 2, starts variadic args
411+
$backtraceFrameArgs[5] = 'extra2'; // gap at index 4
412+
$backtraceFrameArgs[7] = 'extra3'; // gap at index 6
413+
414+
$backtraceFrame = [
415+
'function' => 'testGapsFunction',
416+
'args' => $backtraceFrameArgs,
417+
];
418+
419+
$reflectionClass = new \ReflectionClass($frameBuilder);
420+
$getFunctionArgumentValuesMethod = $reflectionClass->getMethod('getFunctionArgumentValues');
421+
$getFunctionArgumentValuesMethod->setAccessible(true);
422+
423+
$reflectionFunction = new \ReflectionFunction($testFunction);
424+
425+
$result = $getFunctionArgumentValuesMethod->invoke($frameBuilder, $reflectionFunction, $backtraceFrame['args']);
426+
427+
$this->assertSame('hello', $result['first']);
428+
$this->assertSame(42, $result['second']);
429+
430+
$this->assertArrayHasKey('rest', $result);
431+
$this->assertSame(['extra1', 'extra2', 'extra3'], $result['rest']);
432+
}
398433
}

0 commit comments

Comments
 (0)