mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
08b2ab22f4
* Include the source location in Closure names This change makes stack traces involving Closures, especially multiple different Closures, much more useful, because it's more easily visible *which* closure was called for a given stack frame. The implementation is similar to that of anonymous classes which already include the file name and line number within their generated classname. * Update scripts/dev/bless_tests.php for closure naming * Adjust existing tests for closure naming * Adjust tests for closure naming that were not caught locally * Drop the namespace from closure names This is redundant with the included filename. * Include filename and line number as separate keys in Closure debug info * Fix test * Fix test * Include the surrounding class and function name in closure names * Fix test * Relax test expecations * Fix tests after merge * NEWS / UPGRADING
51 lines
1.0 KiB
PHP
51 lines
1.0 KiB
PHP
--TEST--
|
|
Bug #31102 (Exception not handled when thrown inside autoloader)
|
|
--FILE--
|
|
<?php
|
|
|
|
$test = 0;
|
|
|
|
spl_autoload_register(function ($class) {
|
|
global $test;
|
|
|
|
echo __METHOD__ . "($class,$test)\n";
|
|
switch($test)
|
|
{
|
|
case 1:
|
|
eval("class $class { function __construct(){throw new Exception('$class::__construct');}}");
|
|
return;
|
|
case 2:
|
|
eval("class $class { function __construct(){throw new Exception('$class::__construct');}}");
|
|
throw new Exception(__METHOD__);
|
|
return;
|
|
case 3:
|
|
return;
|
|
}
|
|
});
|
|
|
|
while($test++ < 5)
|
|
{
|
|
try
|
|
{
|
|
eval("\$bug = new Test$test();");
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
echo "Caught: " . $e->getMessage() . "\n";
|
|
}
|
|
}
|
|
?>
|
|
===DONE===
|
|
--EXPECTF--
|
|
{closure:%s:%d}(Test1,1)
|
|
Caught: Test1::__construct
|
|
{closure:%s:%d}(Test2,2)
|
|
Caught: {closure:%s:%d}
|
|
{closure:%s:%d}(Test3,3)
|
|
|
|
Fatal error: Uncaught Error: Class "Test3" not found in %s:%d
|
|
Stack trace:
|
|
#0 %s(%d): eval()
|
|
#1 {main}
|
|
thrown in %sbug31102.php(%d) : eval()'d code on line 1
|