Skip to content

Commit

Permalink
[Debug] Do not quote numbers in stack trace
Browse files Browse the repository at this point in the history
  • Loading branch information
c960657 committed Jun 16, 2016
1 parent 61e5ddc commit c560ce5
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 41 deletions.
5 changes: 5 additions & 0 deletions UPGRADE-4.0.md
@@ -1,6 +1,11 @@
UPGRADE FROM 3.x to 4.0
=======================

Debug
-----
* `FlattenException::getTrace()` now returns additional type descriptions
`integer` and `float`.

DependencyInjection
-------------------

Expand Down
2 changes: 2 additions & 0 deletions src/Symfony/Bridge/Twig/Extension/CodeExtension.php
Expand Up @@ -94,6 +94,8 @@ public function formatArgs($args)
$formattedValue = sprintf('<em>array</em>(%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 ('integer' === $item[0] || 'float' === $item[0]) {
$formattedValue = var_export($item[1], true);
} elseif ('null' === $item[0]) {
$formattedValue = '<em>null</em>';
} elseif ('boolean' === $item[0]) {
Expand Down
4 changes: 4 additions & 0 deletions src/Symfony/Component/Debug/Exception/FlattenException.php
Expand Up @@ -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) {
Expand Down
2 changes: 2 additions & 0 deletions src/Symfony/Component/Debug/ExceptionHandler.php
Expand Up @@ -384,6 +384,8 @@ private function formatArgs(array $args)
$formattedValue = '<em>'.strtolower(var_export($item[1], true)).'</em>';
} elseif ('resource' === $item[0]) {
$formattedValue = '<em>resource</em>';
} elseif ('integer' === $item[0] || 'float' === $item[0]) {
$formattedValue = var_export($item[1], true);
} else {
$formattedValue = str_replace("\n", '', var_export($this->escapeHtml((string) $item[1]), true));
}
Expand Down
Expand Up @@ -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));
Expand All @@ -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);
Expand All @@ -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());
}
}

0 comments on commit c560ce5

Please sign in to comment.