diff --git a/UPGRADE-4.0.md b/UPGRADE-4.0.md
index 53ecad9e1dfb6..8eb83c830f304 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 5ec74b0a96788..86313d02e7988 100644
--- a/src/Symfony/Bridge/Twig/Extension/CodeExtension.php
+++ b/src/Symfony/Bridge/Twig/Extension/CodeExtension.php
@@ -92,8 +92,6 @@ public function formatArgs($args)
$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 @@ public function formatArgs($args)
} 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 @@ public function formatFile($file, $line, $text = null)
$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 c81bccf4c1016..70f7802a4757b 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 5802c50331b46..ff5ce428710be 100644
--- a/src/Symfony/Component/Debug/Exception/FlattenException.php
+++ b/src/Symfony/Component/Debug/Exception/FlattenException.php
@@ -234,6 +234,10 @@ private function flattenArgs($args, $level = 0, &$count = 0)
$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 020e23ad99ef0..69d4473d8f151 100644
--- a/src/Symfony/Component/Debug/ExceptionHandler.php
+++ b/src/Symfony/Component/Debug/ExceptionHandler.php
@@ -376,8 +376,6 @@ private function formatArgs(array $args)
$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 @@ private function formatArgs(array $args)
} 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 6c570e235def7..a3b5d876de58b 100644
--- a/src/Symfony/Component/Debug/Tests/Exception/FlattenExceptionTest.php
+++ b/src/Symfony/Component/Debug/Tests/Exception/FlattenExceptionTest.php
@@ -190,6 +190,60 @@ public function flattenDataProvider()
);
}
+ 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 @@ public function testTooBigArray()
$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 @@ private function createException($foo)
{
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());
- }
}