Skip to content

Commit 5682743

Browse files
committed
Dumper: skips previously dumped objects and arrays
1 parent a9b173d commit 5682743

3 files changed

Lines changed: 155 additions & 1 deletion

File tree

src/Tracy/Dumper/Renderer.php

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,17 @@ final class Renderer
4242
/** @var array */
4343
private $parents = [];
4444

45+
/** @var array */
46+
private $above = [];
47+
4548

4649
/**
4750
* @param mixed $model
4851
* @tracySkipLocation
4952
*/
5053
public function renderHtml($model, array $location = null): string
5154
{
52-
$this->parents = [];
55+
$this->parents = $this->above = [];
5356

5457
if ($this->lazy === false) { // no lazy-loading
5558
$html = $this->renderVar($model);
@@ -188,7 +191,15 @@ private function renderArray($model, int $depth): string
188191
$out .= $count . ')';
189192
if (in_array($model->array, $this->parents, true)) {
190193
return $out . ' <i>RECURSION</i>';
194+
195+
} elseif (in_array($model->array, $this->above, true)) {
196+
if ($this->lazy !== false) {
197+
$this->copySnapshot($model);
198+
return '<span class="tracy-toggle tracy-collapsed" data-tracy-dump=\'' . json_encode($model) . "'>" . $out . "</span>\n";
199+
}
200+
return $out . ' <i>see above</i>';
191201
}
202+
$this->above[] = $model->array;
192203
}
193204

194205
if (!$items) {
@@ -258,6 +269,13 @@ private function renderObject(Model $model, int $depth): string
258269

259270
} elseif (in_array($model->object, $this->parents, true)) {
260271
return $out . ' <i>RECURSION</i>';
272+
273+
} elseif (in_array($model->object, $this->above, true)) {
274+
if ($this->lazy !== false) {
275+
$this->copySnapshot($model);
276+
return '<span class="tracy-toggle tracy-collapsed" data-tracy-dump=\'' . json_encode($model) . "'>" . $out . "</span>\n";
277+
}
278+
return $out . ' <i>see above</i>';
261279
}
262280

263281
$collapsed = $depth
@@ -274,6 +292,7 @@ private function renderObject(Model $model, int $depth): string
274292
$out = $span . '>' . $out . "</span>\n" . '<div' . ($collapsed ? ' class="tracy-collapsed"' : '') . '>';
275293
$indent = '<span class="tracy-dump-indent"> ' . str_repeat('| ', $depth) . '</span>';
276294
$this->parents[] = $model->object;
295+
$this->above[] = $model->object;
277296
$fill = [3 => null];
278297

279298
static $classes = [
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Tester\Assert;
6+
use Tracy\Dumper;
7+
8+
9+
require __DIR__ . '/../bootstrap.php';
10+
require __DIR__ . '/fixtures/DumpClass.php';
11+
12+
13+
$obj = new Test;
14+
$arr = [$obj, new Test, $obj, [$obj, new Test, $obj]];
15+
16+
17+
Assert::match(<<<'XX'
18+
<pre class="tracy-dump" data-tracy-snapshot='{"%d%":{"name":"Test","items":[["x",[[0,10],[1,null]],0],["y","hello","Test"],["z",{"number":"30.0"},1]]}}'><span class="tracy-toggle"><span class="tracy-dump-array">array</span> (4)</span>
19+
<div><span class="tracy-dump-indent"> </span><span class="tracy-dump-number">0</span> => <span class="tracy-toggle"><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
20+
<div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-public">x</span>: <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (2)</span>
21+
<div><span class="tracy-dump-indent"> | | </span><span class="tracy-dump-number">0</span> => <span class="tracy-dump-number">10</span>
22+
<span class="tracy-dump-indent"> | | </span><span class="tracy-dump-number">1</span> => <span class="tracy-dump-null">null</span>
23+
</div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-private" title="declared in Test">y</span>: <span class="tracy-dump-string" title="5 characters">'hello'</span>
24+
<span class="tracy-dump-indent"> | </span><span class="tracy-dump-protected">z</span>: <span class="tracy-dump-number">30.0</span>
25+
</div><span class="tracy-dump-indent"> </span><span class="tracy-dump-number">1</span> => <span class="tracy-toggle"><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
26+
<div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-public">x</span>: <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (2)</span>
27+
<div><span class="tracy-dump-indent"> | | </span><span class="tracy-dump-number">0</span> => <span class="tracy-dump-number">10</span>
28+
<span class="tracy-dump-indent"> | | </span><span class="tracy-dump-number">1</span> => <span class="tracy-dump-null">null</span>
29+
</div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-private" title="declared in Test">y</span>: <span class="tracy-dump-string" title="5 characters">'hello'</span>
30+
<span class="tracy-dump-indent"> | </span><span class="tracy-dump-protected">z</span>: <span class="tracy-dump-number">30.0</span>
31+
</div><span class="tracy-dump-indent"> </span><span class="tracy-dump-number">2</span> => <span class="tracy-toggle tracy-collapsed" data-tracy-dump='{"object":%d%}'><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
32+
33+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-number">3</span> => <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (3)</span>
34+
<div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">0</span> => <span class="tracy-toggle tracy-collapsed" data-tracy-dump='{"object":%d%}'><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
35+
36+
<span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">1</span> => <span class="tracy-toggle"><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
37+
<div><span class="tracy-dump-indent"> | | </span><span class="tracy-dump-public">x</span>: <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (2)</span>
38+
<div><span class="tracy-dump-indent"> | | | </span><span class="tracy-dump-number">0</span> => <span class="tracy-dump-number">10</span>
39+
<span class="tracy-dump-indent"> | | | </span><span class="tracy-dump-number">1</span> => <span class="tracy-dump-null">null</span>
40+
</div><span class="tracy-dump-indent"> | | </span><span class="tracy-dump-private" title="declared in Test">y</span>: <span class="tracy-dump-string" title="5 characters">'hello'</span>
41+
<span class="tracy-dump-indent"> | | </span><span class="tracy-dump-protected">z</span>: <span class="tracy-dump-number">30.0</span>
42+
</div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">2</span> => <span class="tracy-toggle tracy-collapsed" data-tracy-dump='{"object":%d%}'><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
43+
44+
</div></div></pre>
45+
XX
46+
, Dumper::toHtml($arr));
47+
48+
49+
$a = [1, 2, 3];
50+
$arr = [$a, &$a, [$a, &$a]];
51+
52+
Assert::match(<<<'XX'
53+
<pre class="tracy-dump" data-tracy-snapshot='{"a1":{"items":[[0,1],[1,2],[2,3]]}}'><span class="tracy-toggle"><span class="tracy-dump-array">array</span> (3)</span>
54+
<div><span class="tracy-dump-indent"> </span><span class="tracy-dump-number">0</span> => <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (3)</span>
55+
<div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">0</span> => <span class="tracy-dump-number">1</span>
56+
<span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">1</span> => <span class="tracy-dump-number">2</span>
57+
<span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">2</span> => <span class="tracy-dump-number">3</span>
58+
</div><span class="tracy-dump-indent"> </span><span class="tracy-dump-number">1</span> => <span class="tracy-dump-hash">&1</span> <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (3)</span>
59+
<div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">0</span> => <span class="tracy-dump-number">1</span>
60+
<span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">1</span> => <span class="tracy-dump-number">2</span>
61+
<span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">2</span> => <span class="tracy-dump-number">3</span>
62+
</div><span class="tracy-dump-indent"> </span><span class="tracy-dump-number">2</span> => <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (2)</span>
63+
<div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">0</span> => <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (3)</span>
64+
<div><span class="tracy-dump-indent"> | | </span><span class="tracy-dump-number">0</span> => <span class="tracy-dump-number">1</span>
65+
<span class="tracy-dump-indent"> | | </span><span class="tracy-dump-number">1</span> => <span class="tracy-dump-number">2</span>
66+
<span class="tracy-dump-indent"> | | </span><span class="tracy-dump-number">2</span> => <span class="tracy-dump-number">3</span>
67+
</div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-number">1</span> => <span class="tracy-dump-hash">&1</span> <span class="tracy-toggle tracy-collapsed" data-tracy-dump='{"array":"a1"}'><span class="tracy-dump-array">array</span> (3)</span>
68+
69+
</div></div></pre>
70+
XX
71+
, Dumper::toHtml($arr));
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Tester\Assert;
6+
use Tracy\Dumper;
7+
8+
9+
require __DIR__ . '/../bootstrap.php';
10+
require __DIR__ . '/fixtures/DumpClass.php';
11+
12+
13+
$obj = new Test;
14+
$arr = [$obj, new Test, $obj, [$obj, new Test, $obj]];
15+
16+
Assert::match(<<<'XX'
17+
array (4)
18+
0 => Test #%d%
19+
| x: array (2)
20+
| | 0 => 10
21+
| | 1 => null
22+
| y: 'hello'
23+
| z: 30.0
24+
1 => Test #%d%
25+
| x: array (2)
26+
| | 0 => 10
27+
| | 1 => null
28+
| y: 'hello'
29+
| z: 30.0
30+
2 => Test #%d% see above
31+
3 => array (3)
32+
| 0 => Test #%d% see above
33+
| 1 => Test #%d%
34+
| | x: array (2)
35+
| | | 0 => 10
36+
| | | 1 => null
37+
| | y: 'hello'
38+
| | z: 30.0
39+
| 2 => Test #%d% see above
40+
XX
41+
, Dumper::toText($arr));
42+
43+
44+
$a = [1, 2, 3];
45+
$arr = [$a, &$a, [$a, &$a]];
46+
47+
Assert::match(<<<'XX'
48+
array (3)
49+
0 => array (3)
50+
| 0 => 1
51+
| 1 => 2
52+
| 2 => 3
53+
1 => &1 array (3)
54+
| 0 => 1
55+
| 1 => 2
56+
| 2 => 3
57+
2 => array (2)
58+
| 0 => array (3)
59+
| | 0 => 1
60+
| | 1 => 2
61+
| | 2 => 3
62+
| 1 => &1 array (3) see above
63+
XX
64+
, Dumper::toText($arr));

0 commit comments

Comments
 (0)