Skip to content

Commit 62d16f0

Browse files
Merge branch '4.4' into 5.2
* 4.4: [SecurityBundle] role_names variable instead of roles [PhpUnitBridge] fix reporting deprecations when they come from DebugClassLoader [ErrorHandler] fix parsing return types in DebugClassLoader [ErrorHandler] fix handling messages with null bytes from anonymous classes Restore priority for eventSubscribers
2 parents 48f18b3 + 24279f9 commit 62d16f0

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

DebugClassLoader.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ public function checkAnnotations(\ReflectionClass $refl, string $class): array
534534
if (null !== (self::INTERNAL_TYPES[$use] ?? null)) {
535535
foreach (self::INTERNAL_TYPES[$use] as $method => $returnType) {
536536
if ('void' !== $returnType) {
537-
self::$returnTypes[$class] += [$method => [$returnType, $returnType, $class, '']];
537+
self::$returnTypes[$class] += [$method => [$returnType, $returnType, $use, '']];
538538
}
539539
}
540540
}
@@ -611,7 +611,7 @@ public function checkAnnotations(\ReflectionClass $refl, string $class): array
611611
$this->patchMethod($method, $returnType, $declaringFile, $normalizedType);
612612
}
613613

614-
if (strncmp($ns, $declaringClass, $len)) {
614+
if (false === strpos($doc, '@deprecated') && strncmp($ns, $declaringClass, $len)) {
615615
if ($canAddReturnType && 'docblock' === $this->patchTypes['force'] && false === strpos($method->getFileName(), \DIRECTORY_SEPARATOR.'vendor'.\DIRECTORY_SEPARATOR)) {
616616
$this->patchMethod($method, $returnType, $declaringFile, $normalizedType);
617617
} elseif ('' !== $declaringClass && $this->patchTypes['deprecations']) {

ErrorHandler.php

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -428,11 +428,7 @@ public function handleError(int $type, string $message, string $file, int $line)
428428
return false;
429429
}
430430

431-
if (false !== strpos($message, "@anonymous\0")) {
432-
$logMessage = $this->parseAnonymousClass($message);
433-
} else {
434-
$logMessage = $this->levels[$type].': '.$message;
435-
}
431+
$logMessage = $this->levels[$type].': '.$message;
436432

437433
if (null !== self::$toStringException) {
438434
$errorAsException = self::$toStringException;
@@ -461,6 +457,23 @@ public function handleError(int $type, string $message, string $file, int $line)
461457
return true;
462458
}
463459
} else {
460+
if (false !== strpos($message, '@anonymous')) {
461+
$backtrace = debug_backtrace(false, 5);
462+
463+
for ($i = 1; isset($backtrace[$i]); ++$i) {
464+
if (isset($backtrace[$i]['function'], $backtrace[$i]['args'][0])
465+
&& ('trigger_error' === $backtrace[$i]['function'] || 'user_error' === $backtrace[$i]['function'])
466+
) {
467+
if ($backtrace[$i]['args'][0] !== $message) {
468+
$message = $this->parseAnonymousClass($backtrace[$i]['args'][0]);
469+
$logMessage = $this->levels[$type].': '.$message;
470+
}
471+
472+
break;
473+
}
474+
}
475+
}
476+
464477
$errorAsException = new \ErrorException($logMessage, 0, $type, $file, $line);
465478

466479
if ($throw || $this->tracedErrors & $type) {

Tests/ErrorHandlerTest.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -368,22 +368,20 @@ public function testHandleUserError()
368368

369369
public function testHandleErrorWithAnonymousClass()
370370
{
371+
$anonymousObject = new class() extends \stdClass {
372+
};
373+
371374
$handler = ErrorHandler::register();
372-
$handler->throwAt(3, true);
373375
try {
374-
$handler->handleError(3, 'foo '.\get_class(new class() extends \stdClass {
375-
}).' bar', 'foo.php', 12);
376+
trigger_error('foo '.\get_class($anonymousObject).' bar', \E_USER_WARNING);
376377
$this->fail('Exception expected.');
377378
} catch (\ErrorException $e) {
378379
} finally {
379380
restore_error_handler();
380381
restore_exception_handler();
381382
}
382383

383-
$this->assertSame('foo stdClass@anonymous bar', $e->getMessage());
384-
$this->assertSame(3, $e->getSeverity());
385-
$this->assertSame('foo.php', $e->getFile());
386-
$this->assertSame(12, $e->getLine());
384+
$this->assertSame('User Warning: foo stdClass@anonymous bar', $e->getMessage());
387385
}
388386

389387
public function testHandleDeprecation()

0 commit comments

Comments
 (0)