-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathExceptionTableInspectable.php
More file actions
74 lines (67 loc) Β· 2.27 KB
/
ExceptionTableInspectable.php
File metadata and controls
74 lines (67 loc) Β· 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
declare(strict_types=1);
namespace PHPJava\Kernel\Core;
use PHPJava\Core\JavaClass;
use PHPJava\Exceptions\UncaughtException;
use PHPJava\Kernel\Attributes\CodeAttribute;
use PHPJava\Kernel\Resolvers\AttributionResolver;
use PHPJava\Kernel\Structures\ExceptionTable;
use PHPJava\Packages\java\lang\NullPointerException;
use PHPJava\Utilities\Formatter;
trait ExceptionTableInspectable
{
/**
* @param $e
* @throws NullPointerException
* @throws UncaughtException
* @throws \PHPJava\Exceptions\UnableToFindAttributionException
* @return bool succeeded or failed
*/
public function inspectExceptionTable(\Exception $e): bool
{
/**
* @var CodeAttribute $codeAttribute
*/
$codeAttribute = AttributionResolver::resolve(
$this->getAttributes(),
CodeAttribute::class
);
$expectedClass = Formatter::convertPHPNamespacesToJava(
get_class($e)
);
$cpInfo = $this->getConstantPool();
foreach ($codeAttribute->getExceptionTables() as $exception) {
/**
* @var ExceptionTable $exception
*/
if ($exception->getStartPc() > $this->getProgramCounter() ||
$exception->getEndPc() < $this->getProgramCounter()
) {
continue;
}
// In finally statement.
if ($exception->getCatchType() === 0) {
$this->setOffset($exception->getHandlerPc());
return true;
}
$catchClass = Formatter::convertPHPNamespacesToJava($cpInfo[$cpInfo[$exception->getCatchType()]->getClassIndex()]->getString());
if ($catchClass === $expectedClass) {
$instance = JavaClass::load($catchClass)
->getInvoker()
->construct(
$e->getMessage(),
$e->getCode(),
$e
);
$this->pushToOperandStack($instance);
$this->setOffset($exception->getHandlerPc());
return true;
}
}
throw new UncaughtException(
$expectedClass . ': ' . $e->getMessage(),
0,
$e
);
}
}