Permalink
Browse files

bug #21542 [VarDumper] Fixed dumping of terminated generator (lyrixx)

This PR was merged into the 2.8 branch.

Discussion
----------

[VarDumper] Fixed dumping of terminated generator

| 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        | -

Commits
-------

c5094a0 [VarDumper] Fixed dumping of terminated generator
  • Loading branch information...
2 parents 013e405 + c5094a0 commit c346f2a8aa183d1b2132efd985ca0428a3e40139 @nicolas-grekas nicolas-grekas committed Feb 6, 2017
@@ -76,7 +76,20 @@ public static function castClosure(\Closure $c, array $a, Stub $stub, $isNested)
public static function castGenerator(\Generator $c, array $a, Stub $stub, $isNested)
{
- return class_exists('ReflectionGenerator', false) ? self::castReflectionGenerator(new \ReflectionGenerator($c), $a, $stub, $isNested) : $a;
+ if (!class_exists('ReflectionGenerator', false)) {
+ return $a;
+ }
+
+ // Cannot create ReflectionGenerator based on a terminated Generator
+ try {
+ $reflectionGenerator = new \ReflectionGenerator($c);
+ } catch (\Exception $e) {
+ $a[Caster::PREFIX_VIRTUAL.'closed'] = true;
+
+ return $a;
+ }
+
+ return self::castReflectionGenerator($reflectionGenerator, $a, $stub, $isNested);
}
public static function castType(\ReflectionType $c, array $a, Stub $stub, $isNested)
@@ -99,31 +112,33 @@ public static function castReflectionGenerator(\ReflectionGenerator $c, array $a
if ($c->getThis()) {
$a[$prefix.'this'] = new CutStub($c->getThis());
}
- $x = $c->getFunction();
+ $function = $c->getFunction();
$frame = array(
- 'class' => isset($x->class) ? $x->class : null,
- 'type' => isset($x->class) ? ($x->isStatic() ? '::' : '->') : null,
- 'function' => $x->name,
+ 'class' => isset($function->class) ? $function->class : null,
+ 'type' => isset($function->class) ? ($function->isStatic() ? '::' : '->') : null,
+ 'function' => $function->name,
'file' => $c->getExecutingFile(),
'line' => $c->getExecutingLine(),
);
if ($trace = $c->getTrace(DEBUG_BACKTRACE_IGNORE_ARGS)) {
- $x = new \ReflectionGenerator($c->getExecutingGenerator());
+ $function = new \ReflectionGenerator($c->getExecutingGenerator());
array_unshift($trace, array(
'function' => 'yield',
- 'file' => $x->getExecutingFile(),
- 'line' => $x->getExecutingLine() - 1,
+ 'file' => $function->getExecutingFile(),
+ 'line' => $function->getExecutingLine() - 1,
));
$trace[] = $frame;
$a[$prefix.'trace'] = new TraceStub($trace, false, 0, -1, -1);
} else {
- $x = new FrameStub($frame, false, true);
- $x = ExceptionCaster::castFrameStub($x, array(), $x, true);
+ $function = new FrameStub($frame, false, true);
+ $function = ExceptionCaster::castFrameStub($function, array(), $function, true);
$a[$prefix.'executing'] = new EnumStub(array(
- $frame['class'].$frame['type'].$frame['function'].'()' => $x[$prefix.'src'],
+ $frame['class'].$frame['type'].$frame['function'].'()' => $function[$prefix.'src'],
));
}
+ $a[Caster::PREFIX_VIRTUAL.'closed'] = false;
+
return $a;
}
@@ -149,11 +149,10 @@ public function testGenerator()
$this->markTestSkipped('xdebug is active');
}
- $g = new GeneratorDemo();
- $g = $g->baz();
- $r = new \ReflectionGenerator($g);
+ $generator = new GeneratorDemo();
+ $generator = $generator->baz();
- $xDump = <<<'EODUMP'
+ $expectedDump = <<<'EODUMP'
Generator {
this: Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo { …}
executing: {
@@ -165,16 +164,17 @@ public function testGenerator()
"""
}
}
+ closed: false
}
EODUMP;
- $this->assertDumpMatchesFormat($xDump, $g);
+ $this->assertDumpMatchesFormat($expectedDump, $generator);
- foreach ($g as $v) {
+ foreach ($generator as $v) {
break;
}
- $xDump = <<<'EODUMP'
+ $expectedDump = <<<'EODUMP'
array:2 [
0 => ReflectionGenerator {
this: Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo { …}
@@ -207,6 +207,7 @@ public function testGenerator()
}
}
}
+ closed: false
}
1 => Generator {
executing: {
@@ -218,11 +219,23 @@ public function testGenerator()
"""
}
}
+ closed: false
}
]
EODUMP;
- $this->assertDumpMatchesFormat($xDump, array($r, $r->getExecutingGenerator()));
+ $r = new \ReflectionGenerator($generator);
+ $this->assertDumpMatchesFormat($expectedDump, array($r, $r->getExecutingGenerator()));
+
+ foreach ($generator as $v) {
+ }
+
+ $expectedDump = <<<'EODUMP'
+Generator {
+ closed: true
+}
+EODUMP;
+ $this->assertDumpMatchesFormat($expectedDump, $generator);
}
}

0 comments on commit c346f2a

Please sign in to comment.