From 6c6560e5f503fc6139416ec8a0e0dccc1249ffa0 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 30 Mar 2015 18:14:17 +0200 Subject: [PATCH] [VarDumper] Fix dumping references as properties --- .../VarDumper/Cloner/AbstractCloner.php | 17 +++++------ .../VarDumper/Tests/CliDumperTest.php | 28 +++++++++++++++++++ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php b/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php index 5c615bb7c7..5d582b449f 100644 --- a/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php +++ b/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php @@ -199,18 +199,19 @@ abstract class AbstractCloner implements ClonerInterface } if ($classInfo[1]) { - $p = $this->callCaster(function ($obj) {return $obj->__debugInfo();}, $obj, array(), null, $isNested); + $a = $this->callCaster(function ($obj) {return $obj->__debugInfo();}, $obj, array(), null, $isNested); } else { - $p = (array) $obj; + $a = (array) $obj; } - $a = array(); - foreach ($p as $k => $p) { - if (!isset($k[0]) || ("\0" !== $k[0] && !$classInfo[2]->hasProperty($k))) { - $a["\0+\0".$k] = $p; - } else { - $a[$k] = $p; + if ($a) { + $p = array_keys($a); + foreach ($p as $i => $k) { + if (!isset($k[0]) || ("\0" !== $k[0] && !$classInfo[2]->hasProperty($k))) { + $p[$i] = "\0+\0".$k; + } } + $a = array_combine($p, $a); } foreach ($classInfo[3] as $p) { diff --git a/src/Symfony/Component/VarDumper/Tests/CliDumperTest.php b/src/Symfony/Component/VarDumper/Tests/CliDumperTest.php index 67e51db456..05cff61088 100644 --- a/src/Symfony/Component/VarDumper/Tests/CliDumperTest.php +++ b/src/Symfony/Component/VarDumper/Tests/CliDumperTest.php @@ -154,6 +154,34 @@ EOTXT } } +EOTXT + , + $out + ); + } + + public function testRefsInProperties() + { + $var = (object) array('foo' => 'foo'); + $var->bar =& $var->foo; + + $dumper = new CliDumper(); + $dumper->setColors(false); + $cloner = new VarCloner(); + + $out = fopen('php://memory', 'r+b'); + $data = $cloner->cloneVar($var); + $dumper->dump($data, $out); + rewind($out); + $out = stream_get_contents($out); + + $this->assertStringMatchesFormat( + <<