Skip to content

Commit 115097f

Browse files
committed
Avoid garbage memory references on PHP < 7.4
1 parent f561c4e commit 115097f

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

src/DnsConnector.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,26 @@ function ($resolve, $reject) use (&$promise, &$resolved, $uri, $connector, $host
5959
$e->getCode(),
6060
$e
6161
);
62+
63+
// avoid garbage references by replacing all closures in call stack.
64+
// what a lovely piece of code!
65+
$r = new \ReflectionProperty('Exception', 'trace');
66+
$r->setAccessible(true);
67+
$trace = $r->getValue($e);
68+
69+
// Exception trace arguments are not available on some PHP 7.4 installs
70+
// @codeCoverageIgnoreStart
71+
foreach ($trace as &$one) {
72+
if (isset($one['args'])) {
73+
foreach ($one['args'] as &$arg) {
74+
if ($arg instanceof \Closure) {
75+
$arg = 'Object(' . \get_class($arg) . ')';
76+
}
77+
}
78+
}
79+
}
80+
// @codeCoverageIgnoreEnd
81+
$r->setValue($e, $trace);
6282
}
6383

6484
throw $e;

src/SecureConnector.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,26 @@ public function connect($uri)
7474
$e->getCode(),
7575
$e
7676
);
77+
78+
// avoid garbage references by replacing all closures in call stack.
79+
// what a lovely piece of code!
80+
$r = new \ReflectionProperty('Exception', 'trace');
81+
$r->setAccessible(true);
82+
$trace = $r->getValue($e);
83+
84+
// Exception trace arguments are not available on some PHP 7.4 installs
85+
// @codeCoverageIgnoreStart
86+
foreach ($trace as &$one) {
87+
if (isset($one['args'])) {
88+
foreach ($one['args'] as &$arg) {
89+
if ($arg instanceof \Closure) {
90+
$arg = 'Object(' . \get_class($arg) . ')';
91+
}
92+
}
93+
}
94+
}
95+
// @codeCoverageIgnoreEnd
96+
$r->setValue($e, $trace);
7797
}
7898

7999
throw $e;

0 commit comments

Comments
 (0)