Skip to content

Commit 86eeb97

Browse files
committed
Exposer: recognizes virtual properties of native classes
'(array) $obj' and 'get_mangled_object_vars($obj)' differ in that the function does not return a virtual properties. So it can be used to recognize them.
1 parent 9f3bdbc commit 86eeb97

File tree

3 files changed

+71
-4
lines changed

3 files changed

+71
-4
lines changed

src/Tracy/Dumper/Exposer.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@ final class Exposer
1919
{
2020
public static function exposeObject(object $obj, Value $value, Describer $describer): void
2121
{
22-
$values = (array) $obj;
22+
$values = get_mangled_object_vars($obj);
2323
$props = self::getProperties($obj::class);
2424

25+
foreach (array_diff_key((array) $obj, $values) as $k => $v) {
26+
$describer->addPropertyTo($value, (string) $k, $v);
27+
}
28+
2529
foreach (array_diff_key($values, $props) as $k => $v) {
2630
$describer->addPropertyTo(
2731
$value,

tests/Tracy/Dumper.toHtml().specials.phpt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,53 @@ Assert::match(
145145
XX,
146146
Dumper::toHtml($obj),
147147
);
148+
149+
150+
// ArrayIterator
151+
$obj = new ArrayIterator(['a', 'b']);
152+
Assert::match(
153+
<<<'XX'
154+
<pre class="tracy-dump tracy-light"
155+
><span class="tracy-toggle"><span class="tracy-dump-object">ArrayIterator</span> <span class="tracy-dump-hash">#%d%</span></span>
156+
<div><span class="tracy-dump-indent"> </span><span class="tracy-dump-virtual">0</span>: <span class="tracy-dump-string"><span>'</span>a<span>'</span></span>
157+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-virtual">1</span>: <span class="tracy-dump-string"><span>'</span>b<span>'</span></span>
158+
</div></pre>
159+
XX,
160+
Dumper::toHtml($obj),
161+
);
162+
163+
164+
// DateTime
165+
$obj = new DateTime('1978-01-23');
166+
Assert::match(
167+
<<<'XX'
168+
<pre class="tracy-dump tracy-light"
169+
><span class="tracy-toggle"><span class="tracy-dump-object">DateTime</span> <span class="tracy-dump-hash">#%d%</span></span>
170+
<div><span class="tracy-dump-indent"> </span><span class="tracy-dump-virtual">date</span>: <span class="tracy-dump-string" title="26 characters"><span>'</span>1978-01-23 00:00:00.000000<span>'</span></span>
171+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-virtual">timezone_type</span>: <span class="tracy-dump-number">3</span>
172+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-virtual">timezone</span>: <span class="tracy-dump-string" title="%d% characters"><span>'</span>%a%<span>'</span></span>
173+
</div></pre>
174+
XX,
175+
Dumper::toHtml($obj),
176+
);
177+
178+
179+
// Tracy\Dumper\Value
180+
$obj = new Tracy\Dumper\Value(Tracy\Dumper\Value::TypeText, 'ahoj');
181+
Assert::match(
182+
<<<'XX'
183+
<pre class="tracy-dump tracy-light"
184+
><span class="tracy-toggle"><span class="tracy-dump-object">Tracy\Dumper\<b>Value</b></span> <span class="tracy-dump-hash">#%d%</span></span>
185+
<div><span class="tracy-dump-indent"> </span><span class="tracy-dump-public">type</span>: <span class="tracy-dump-string" title="4 characters"><span>'</span>text<span>'</span></span>
186+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-public">value</span>: <span class="tracy-dump-string" title="4 characters"><span>'</span>ahoj<span>'</span></span>
187+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-public">length</span>: <span class="tracy-dump-null">null</span>
188+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-public">depth</span>: <span class="tracy-dump-null">null</span>
189+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-public">id</span>: <span class="tracy-dump-null">null</span>
190+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-public">holder</span>: <span class="tracy-dump-virtual">unset</span>
191+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-public">items</span>: <span class="tracy-dump-null">null</span>
192+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-public">editor</span>: <span class="tracy-dump-null">null</span>
193+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-public">collapsed</span>: <span class="tracy-dump-null">null</span>
194+
</div></pre>
195+
XX,
196+
Dumper::toHtml($obj),
197+
);

tests/Tracy/Dumper.toText().specials.phpt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,25 @@ Assert::match(<<<'XX'
107107

108108

109109
// ArrayIterator
110-
$obj = new ArrayIterator(['a' => 1, 'b' => 2]);
110+
$obj = new ArrayIterator(['a', 'b']);
111111
Assert::match(
112112
<<<'XX'
113113
ArrayIterator #%d%
114-
a: 1
115-
b: 2
114+
0: 'a'
115+
1: 'b'
116+
XX,
117+
Dumper::toText($obj),
118+
);
119+
120+
121+
// DateTime
122+
$obj = new DateTime('1978-01-23');
123+
Assert::match(
124+
<<<'XX'
125+
DateTime #%d%
126+
date: '1978-01-23 00:00:00.000000'
127+
timezone_type: %d%
128+
timezone: '%a%'
116129
XX,
117130
Dumper::toText($obj),
118131
);

0 commit comments

Comments
 (0)