Skip to content

Commit

Permalink
bug #27591 [VarDumper] Fix dumping ArrayObject and ArrayIterator inst…
Browse files Browse the repository at this point in the history
…ances (nicolas-grekas)

This PR was merged into the 2.8 branch.

Discussion
----------

[VarDumper] Fix dumping ArrayObject and ArrayIterator instances

| Q             | A
| ------------- | ---
| Branch?       | 2.8
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

Properties added on child classes of `ArrayObject` and `ArrayIterator`, or dynamic properties added on instances of them were now properly dumped. This fixes it.

![image](https://user-images.githubusercontent.com/243674/41349429-2660cbc6-6f10-11e8-8015-a3d6ad8b0c9c.png)

Commits
-------

3ecabfc [VarDumper] Fix dumping ArrayObject and ArrayIterator instances
  • Loading branch information
nicolas-grekas committed Jun 15, 2018
2 parents 2643ec8 + 3ecabfc commit 2627c16
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 24 deletions.
53 changes: 29 additions & 24 deletions src/Symfony/Component/VarDumper/Caster/SplCaster.php
Expand Up @@ -29,30 +29,12 @@ class SplCaster

public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, $isNested)
{
$prefix = Caster::PREFIX_VIRTUAL;
$class = $stub->class;
$flags = $c->getFlags();

$b = array(
$prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST),
$prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS),
$prefix.'iteratorClass' => $c->getIteratorClass(),
$prefix.'storage' => $c->getArrayCopy(),
);

if ('ArrayObject' === $class) {
$a = $b;
} else {
if (!($flags & \ArrayObject::STD_PROP_LIST)) {
$c->setFlags(\ArrayObject::STD_PROP_LIST);
$a = Caster::castObject($c, new \ReflectionClass($class));
$c->setFlags($flags);
}

$a += $b;
}
return self::castSplArray($c, $a, $stub, $isNested);
}

return $a;
public static function castArrayIterator(\ArrayIterator $c, array $a, Stub $stub, $isNested)
{
return self::castSplArray($c, $a, $stub, $isNested);
}

public static function castHeap(\Iterator $c, array $a, Stub $stub, $isNested)
Expand Down Expand Up @@ -182,7 +164,7 @@ public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $s

$clone = clone $c;
foreach ($clone as $obj) {
$storage[spl_object_hash($obj)] = array(
$storage[] = array(
'object' => $obj,
'info' => $clone->getInfo(),
);
Expand All @@ -201,4 +183,27 @@ public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub

return $a;
}

private static function castSplArray($c, array $a, Stub $stub, $isNested)
{
$prefix = Caster::PREFIX_VIRTUAL;
$class = $stub->class;
$flags = $c->getFlags();

if (!($flags & \ArrayObject::STD_PROP_LIST)) {
$c->setFlags(\ArrayObject::STD_PROP_LIST);
$a = Caster::castObject($c, new \ReflectionClass($class));
$c->setFlags($flags);
}
$a += array(
$prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST),
$prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS),
);
if ($c instanceof \ArrayObject) {
$a[$prefix.'iteratorClass'] = $c->getIteratorClass();
}
$a[$prefix.'storage'] = $c->getArrayCopy();

return $a;
}
}
1 change: 1 addition & 0 deletions src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php
Expand Up @@ -89,6 +89,7 @@ abstract class AbstractCloner implements ClonerInterface
'AMQPEnvelope' => 'Symfony\Component\VarDumper\Caster\AmqpCaster::castEnvelope',

'ArrayObject' => 'Symfony\Component\VarDumper\Caster\SplCaster::castArrayObject',
'ArrayIterator' => 'Symfony\Component\VarDumper\Caster\SplCaster::castArrayIterator',
'SplDoublyLinkedList' => 'Symfony\Component\VarDumper\Caster\SplCaster::castDoublyLinkedList',
'SplFileInfo' => 'Symfony\Component\VarDumper\Caster\SplCaster::castFileInfo',
'SplFileObject' => 'Symfony\Component\VarDumper\Caster\SplCaster::castFileObject',
Expand Down
47 changes: 47 additions & 0 deletions src/Symfony/Component/VarDumper/Tests/Caster/SplCasterTest.php
Expand Up @@ -160,4 +160,51 @@ public function testCastObjectStorageDumpsInfo()

$this->assertDumpMatchesFormat('%ADateTime%A', $var);
}

public function testCastArrayObject()
{
if (\defined('HHVM_VERSION')) {
$this->markTestSkipped('HHVM as different internal details.');
}
$var = new \ArrayObject(array(123));
$var->foo = 234;

$expected = <<<EOTXT
ArrayObject {
+"foo": 234
flag::STD_PROP_LIST: false
flag::ARRAY_AS_PROPS: false
iteratorClass: "ArrayIterator"
storage: array:1 [
0 => 123
]
}
EOTXT;
$this->assertDumpEquals($expected, $var);
}

public function testArrayIterator()
{
if (\defined('HHVM_VERSION')) {
$this->markTestSkipped('HHVM as different internal details.');
}
$var = new MyArrayIterator(array(234));

$expected = <<<EOTXT
Symfony\Component\VarDumper\Tests\Caster\MyArrayIterator {
-foo: 123
flag::STD_PROP_LIST: false
flag::ARRAY_AS_PROPS: false
storage: array:1 [
0 => 234
]
}
EOTXT;
$this->assertDumpEquals($expected, $var);
}
}

class MyArrayIterator extends \ArrayIterator
{
private $foo = 123;
}

0 comments on commit 2627c16

Please sign in to comment.