Skip to content

Commit f68312b

Browse files
committed
Dumper: changed detection of recursive arrays, marker changed to strict comparison
1 parent 5bbeb1c commit f68312b

File tree

1 file changed

+7
-13
lines changed

1 file changed

+7
-13
lines changed

src/PhpGenerator/Dumper.php

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,33 +85,27 @@ private function dumpString(string $var): string
8585

8686
private function dumpArray(array &$var, array $parents, int $level): string
8787
{
88-
static $marker;
89-
if ($marker === null) {
90-
$marker = uniqid("\x00", true);
91-
}
9288
if (empty($var)) {
9389
return '[]';
9490

95-
} elseif ($level > $this->maxDepth || isset($var[$marker])) {
91+
} elseif ($level > $this->maxDepth || in_array($var, $parents ?? [], true)) {
9692
throw new Nette\InvalidArgumentException('Nesting level too deep or recursive dependency.');
9793
}
9894

9995
$space = str_repeat("\t", $level);
10096
$outInline = '';
10197
$outWrapped = "\n$space";
102-
$var[$marker] = true;
98+
$parents[] = $var;
10399
$counter = 0;
104100

105101
foreach ($var as $k => &$v) {
106-
if ($k !== $marker) {
107-
$item = ($k === $counter ? '' : $this->dumpVar($k) . ' => ') . $this->dumpVar($v, $parents, $level + 1);
108-
$counter = is_int($k) ? max($k + 1, $counter) : $counter;
109-
$outInline .= ($outInline === '' ? '' : ', ') . $item;
110-
$outWrapped .= "\t$item,\n$space";
111-
}
102+
$item = ($k === $counter ? '' : $this->dumpVar($k) . ' => ') . $this->dumpVar($v, $parents, $level + 1);
103+
$counter = is_int($k) ? max($k + 1, $counter) : $counter;
104+
$outInline .= ($outInline === '' ? '' : ', ') . $item;
105+
$outWrapped .= "\t$item,\n$space";
112106
}
113107

114-
unset($var[$marker]);
108+
array_pop($parents);
115109
$wrap = strpos($outInline, "\n") !== false || strlen($outInline) > $this->wrapLength - $level * self::INDENT_LENGTH;
116110
return '[' . ($wrap ? $outWrapped : $outInline) . ']';
117111
}

0 commit comments

Comments
 (0)