diff --git a/UPGRADE-4.0.md b/UPGRADE-4.0.md index 53ecad9e1d..8eb83c830f 100644 --- a/UPGRADE-4.0.md +++ b/UPGRADE-4.0.md @@ -1,6 +1,12 @@ UPGRADE FROM 3.x to 4.0 ======================= +Debug +----- + + * `FlattenException::getTrace()` now returns additional type descriptions + `integer` and `float`. + DependencyInjection ------------------- diff --git a/src/Symfony/Bridge/Twig/Extension/CodeExtension.php b/src/Symfony/Bridge/Twig/Extension/CodeExtension.php index 5ec74b0a96..86313d02e7 100644 --- a/src/Symfony/Bridge/Twig/Extension/CodeExtension.php +++ b/src/Symfony/Bridge/Twig/Extension/CodeExtension.php @@ -92,8 +92,6 @@ class CodeExtension extends \Twig_Extension $formattedValue = sprintf('object(%s)', $item[1], $short); } elseif ('array' === $item[0]) { $formattedValue = sprintf('array(%s)', is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]); - } elseif ('string' === $item[0]) { - $formattedValue = sprintf("'%s'", htmlspecialchars($item[1], ENT_QUOTES, $this->charset)); } elseif ('null' === $item[0]) { $formattedValue = 'null'; } elseif ('boolean' === $item[0]) { @@ -101,7 +99,7 @@ class CodeExtension extends \Twig_Extension } elseif ('resource' === $item[0]) { $formattedValue = 'resource'; } else { - $formattedValue = str_replace("\n", '', var_export(htmlspecialchars((string) $item[1], ENT_QUOTES, $this->charset), true)); + $formattedValue = str_replace("\n", '', htmlspecialchars(var_export($item[1], true), ENT_COMPAT | ENT_SUBSTITUTE, $this->charset)); } $result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue); @@ -174,7 +172,7 @@ class CodeExtension extends \Twig_Extension $text = "$text at line $line"; if (false !== $link = $this->getFileLink($file, $line)) { - $flags = ENT_QUOTES | ENT_SUBSTITUTE; + $flags = ENT_COMPAT | ENT_SUBSTITUTE; return sprintf('%s', htmlspecialchars($link, $flags, $this->charset), $text); } diff --git a/src/Symfony/Component/Debug/CHANGELOG.md b/src/Symfony/Component/Debug/CHANGELOG.md index c81bccf4c1..70f7802a47 100644 --- a/src/Symfony/Component/Debug/CHANGELOG.md +++ b/src/Symfony/Component/Debug/CHANGELOG.md @@ -1,6 +1,13 @@ CHANGELOG ========= +3.2.0 +----- + +* `FlattenException::getTrace()` now returns additional type descriptions + `integer` and `float`. + + 3.0.0 ----- diff --git a/src/Symfony/Component/Debug/Exception/FlattenException.php b/src/Symfony/Component/Debug/Exception/FlattenException.php index 5802c50331..ff5ce42871 100644 --- a/src/Symfony/Component/Debug/Exception/FlattenException.php +++ b/src/Symfony/Component/Debug/Exception/FlattenException.php @@ -234,6 +234,10 @@ class FlattenException $result[$key] = array('null', null); } elseif (is_bool($value)) { $result[$key] = array('boolean', $value); + } elseif (is_integer($value)) { + $result[$key] = array('integer', $value); + } elseif (is_float($value)) { + $result[$key] = array('float', $value); } elseif (is_resource($value)) { $result[$key] = array('resource', get_resource_type($value)); } elseif ($value instanceof \__PHP_Incomplete_Class) { diff --git a/src/Symfony/Component/Debug/ExceptionHandler.php b/src/Symfony/Component/Debug/ExceptionHandler.php index 020e23ad99..69d4473d8f 100644 --- a/src/Symfony/Component/Debug/ExceptionHandler.php +++ b/src/Symfony/Component/Debug/ExceptionHandler.php @@ -376,8 +376,6 @@ EOF; $formattedValue = sprintf('object(%s)', $this->formatClass($item[1])); } elseif ('array' === $item[0]) { $formattedValue = sprintf('array(%s)', is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]); - } elseif ('string' === $item[0]) { - $formattedValue = sprintf("'%s'", $this->escapeHtml($item[1])); } elseif ('null' === $item[0]) { $formattedValue = 'null'; } elseif ('boolean' === $item[0]) { @@ -385,7 +383,7 @@ EOF; } elseif ('resource' === $item[0]) { $formattedValue = 'resource'; } else { - $formattedValue = str_replace("\n", '', var_export($this->escapeHtml((string) $item[1]), true)); + $formattedValue = str_replace("\n", '', $this->escapeHtml(var_export($item[1], true))); } $result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue); diff --git a/src/Symfony/Component/Debug/Tests/Exception/FlattenExceptionTest.php b/src/Symfony/Component/Debug/Tests/Exception/FlattenExceptionTest.php index 6c570e235d..a3b5d876de 100644 --- a/src/Symfony/Component/Debug/Tests/Exception/FlattenExceptionTest.php +++ b/src/Symfony/Component/Debug/Tests/Exception/FlattenExceptionTest.php @@ -190,6 +190,60 @@ class FlattenExceptionTest extends \PHPUnit_Framework_TestCase ); } + public function testArguments() + { + $dh = opendir(__DIR__); + + $incomplete = unserialize('O:14:"BogusTestClass":0:{}'); + + $exception = $this->createException(array( + (object) array('foo' => 1), + new NotFoundHttpException(), + $incomplete, + $dh, + function() {}, + array(1, 2), + array('foo' => 123), + null, + true, + false, + 0, + 0.0, + '0', + '', + INF, + NAN, + )); + + $flattened = FlattenException::create($exception); + $trace = $flattened->getTrace(); + $args = $trace[1]['args']; + $array = $args[0][1]; + + closedir($dh); + + $i = 0; + $this->assertSame($array[$i++], array('object', 'stdClass')); + $this->assertSame($array[$i++], array('object', 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException')); + $this->assertSame($array[$i++], array('incomplete-object', 'BogusTestClass')); + $this->assertSame($array[$i++], array('resource', 'stream')); + $this->assertSame($array[$i++], array('object', 'Closure')); + $this->assertSame($array[$i++], array('array', array(array('integer', 1), array('integer', 2)))); + $this->assertSame($array[$i++], array('array', array('foo' => array('integer', 123)))); + $this->assertSame($array[$i++], array('null', null)); + $this->assertSame($array[$i++], array('boolean', true)); + $this->assertSame($array[$i++], array('boolean', false)); + $this->assertSame($array[$i++], array('integer', 0)); + $this->assertSame($array[$i++], array('float', 0.0)); + $this->assertSame($array[$i++], array('string', '0')); + $this->assertSame($array[$i++], array('string', '')); + $this->assertSame($array[$i++], array('float', INF)); + + // assertEquals() does not like NAN values. + $this->assertEquals($array[$i][0], 'float'); + $this->assertTrue(is_nan($array[$i++][1])); + } + public function testRecursionInArguments() { $a = array('foo', array(2, &$a)); @@ -216,6 +270,9 @@ class FlattenExceptionTest extends \PHPUnit_Framework_TestCase $flattened = FlattenException::create($exception); $trace = $flattened->getTrace(); + + $this->assertSame($trace[1]['args'][0], array('array', array('array', '*SKIPPED over 10000 entries*'))); + $serializeTrace = serialize($trace); $this->assertContains('*SKIPPED over 10000 entries*', $serializeTrace); @@ -226,45 +283,4 @@ class FlattenExceptionTest extends \PHPUnit_Framework_TestCase { return new \Exception(); } - - public function testSetTraceIncompleteClass() - { - $flattened = FlattenException::create(new \Exception('test', 123)); - $flattened->setTrace( - array( - array( - 'file' => __FILE__, - 'line' => 123, - 'function' => 'test', - 'args' => array( - unserialize('O:14:"BogusTestClass":0:{}'), - ), - ), - ), - 'foo.php', 123 - ); - - $this->assertEquals(array( - array( - 'message' => 'test', - 'class' => 'Exception', - 'trace' => array( - array( - 'namespace' => '', 'short_class' => '', 'class' => '', 'type' => '', 'function' => '', - 'file' => 'foo.php', 'line' => 123, - 'args' => array(), - ), - array( - 'namespace' => '', 'short_class' => '', 'class' => '', 'type' => '', 'function' => 'test', - 'file' => __FILE__, 'line' => 123, - 'args' => array( - array( - 'incomplete-object', 'BogusTestClass', - ), - ), - ), - ), - ), - ), $flattened->toArray()); - } }