8000 [VarDumper] Fix dumping ArrayObject and ArrayIterator instances · symfony/symfony@89aaae9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 89aaae9

Browse files
[VarDumper] Fix dumping ArrayObject and ArrayIterator instances
1 parent 5c2b2bb commit 89aaae9

File tree

3 files changed

+70
-23
lines changed

3 files changed

+70
-23
lines changed

src/Symfony/Component/VarDumper/Caster/SplCaster.php

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,30 +29,12 @@ class SplCaster
2929

3030
public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, $isNested)
3131
{
32-
$prefix = Caster::PREFIX_VIRTUAL;
33-
$class = $stub->class;
34-
$flags = $c->getFlags();
35-
36-
$b = array(
37-
$prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST),
38-
$prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS),
39-
$prefix.'iteratorClass' => $c->getIteratorClass(),
40-
$prefix.'storage' => $c->getArrayCopy(),
41-
);
42-
43-
if ('ArrayObject' === $class) {
44-
$a = $b;
45-
} else {
46-
if (!($flags & \ArrayObject::STD_PROP_LIST)) {
47-
$c->setFlags(\ArrayObject::STD_PROP_LIST);
48-
$a = Caster::castObject($c, new \ReflectionClass($class));
49-
$c->setFlags($flags);
50-
}
51-
52-
$a += $b;
53-
}
32+
return self::castSplArray($c, $a, $stub, $isNested);
33+
}
5434

55-
return $a;
35+
public static function castArrayIterator(\ArrayIterator $c, array $a, Stub $stub, $isNested)
36+
{
37+
return self::castSplArray($c, $a, $stub, $isNested);
5638
}
5739

5840
public static function castHeap(\Iterator $c, array $a, Stub $stub, $isNested)
@@ -201,4 +183,27 @@ public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub
201183

202184
return $a;
203185
}
186+
187+
private static function castSplArray($c, array $a, Stub $stub, $isNested)
188+
{
189+
$prefix = Caster::PREFIX_VIRTUAL;
190+
$class = $stub->class;
191+
$flags = $c->getFlags();
192+
193+
if (!($flags & \ArrayObject::STD_PROP_LIST)) {
194+
$c->setFlags(\ArrayObject::STD_PROP_LIST);
195+
$a = Caster::castObject($c, new \ReflectionClass($class));
196+
$c->setFlags($flags);
197+
}
198+
$a += array(
199+
$prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST),
200+
$prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS),
201+
);
202+
if ($c instanceof \ArrayObject) {
203+
$a[$prefix.'iteratorClass'] = $c->getIteratorClass();
204+
}
205+
$a[$prefix.'storage'] = $c->getArrayCopy();
206+
207+
return $a;
208+
}
204209
}

src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ abstract class AbstractCloner implements ClonerInterface
8989
'AMQPEnvelope' => 'Symfony\Component\VarDumper\Caster\AmqpCaster::castEnvelope',
9090

9191
'ArrayObject' => 'Symfony\Component\VarDumper\Caster\SplCaster::castArrayObject',
92+
'ArrayIterator' => 'Symfony\Component\VarDumper\Caster\SplCaster::castArrayIterator',
9293
'SplDoublyLinkedList' => 'Symfony\Component\VarDumper\Caster\SplCaster::castDoublyLinkedList',
9394
'SplFileInfo' => 'Symfony\Component\VarDumper\Caster\SplCaster::castFileInfo',
9495
'SplFileObject' => 'Symfony\Component\VarDumper\Caster\SplCaster::castFileObject',

src/Symfony/Component/VarDumper/Tests/Caster/SplCasterTest.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,4 +160,45 @@ public function testCastObjectStorageDumpsInfo()
160160

161161
$this->assertDumpMatchesFormat('%ADateTime%A', $var);
162162
}
163+
164+
public function testCastArrayObject()
165+
{
166+
$var = new \ArrayObject(array(123));
167+
$var->foo = 234;
168+
169+
$expected = <<<EOTXT
170+
ArrayObject {
171+
+"foo": 234
172+
flag::STD_PROP_LIST: false
173+
flag::ARRAY_AS_PROPS: false
174+
iteratorClass: "ArrayIterator"
175+
storage: array:1 [
176+
0 => 123
177+
]
178+
}
179+
EOTXT;
180+
$this->assertDumpEquals($expected, $var);
181+
}
182+
183+
public function testArrayIterator()
184+
{
185+
$var = new MyArrayIterator(array(234));
186+
187+
$expected = <<<EOTXT
188+
Symfony\Component\VarDumper\Tests\Caster\MyArrayIterator {
189+
-foo: 123
190+
flag::STD_PROP_LIST: false
191+
flag::ARRAY_AS_PROPS: false
192+
storage: array:1 [
193+
0 => 234
194+
]
195+
}
196+
EOTXT;
197+
$this->assertDumpEquals($expected, $var);
198+
}
199+
}
200+
201+
class MyArrayIterator extends \ArrayIterator
202+
{
203+
private $foo = 123;
163204
}

0 commit comments

Comments
 (0)
0