-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathAbstractOperationCode.php
More file actions
122 lines (104 loc) Β· 2.64 KB
/
AbstractOperationCode.php
File metadata and controls
122 lines (104 loc) Β· 2.64 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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
declare(strict_types=1);
namespace PHPJava\Kernel\Mnemonics;
use PHPJava\Exceptions\OperationException;
use PHPJava\Kernel\Maps\OpCode;
abstract class AbstractOperationCode implements OperationCodeInterface
{
use \PHPJava\Kernel\Core\Accumulator;
use \PHPJava\Kernel\Core\ConstantPool;
use \PHPJava\Kernel\Core\DebugTool;
/**
* @var null|Operands
*/
protected $operands;
protected $returnValue;
/**
* @var bool
*/
protected $isExecuted = false;
/**
* @var array
*/
protected $freezeOperandStacks = [];
protected $isStackingOperation = false;
public function getOperands(): ?Operands
{
return $this->operands ?? null;
}
/**
* Execute.
*/
public function execute(): void
{
$this->beforeExecute();
$this->isExecuted = true;
}
public function returnValue()
{
return $this->returnValue;
}
public function isExecuted(): bool
{
return $this->isExecuted;
}
public function isStackingOperation(): bool
{
return $this->isStackingOperation;
}
public function getName(): string
{
return ltrim(
preg_replace(
'/.+\\\\([^$]+)$/',
'$1',
get_class($this)
),
'_'
);
}
public function getCode(): int
{
return (new \ReflectionClassConstant(
OpCode::class,
preg_replace(
'/.+\\\\([^$]+)$/',
'$1',
get_class($this)
)
))->getValue();
}
/**
* Prepare an execution.
*/
public function beforeExecute(): void
{
}
/**
* After treatment an execution.
*/
public function afterExecute(): void
{
// Clear references.
$this->poppedOperandStacks = [];
$this->pushedOperandStacks = [];
}
public function getPoppedOperandStacks(): array
{
if (!$this->isExecuted) {
throw new OperationException(
__METHOD__ . ' cannot call before executing an operation because PHPJava cannot understands that popping several operand stacks beforehand.'
);
}
return $this->poppedOperandStacks;
}
public function getPushedOperandStacks(): array
{
if (!$this->isExecuted) {
throw new OperationException(
__METHOD__ . ' cannot call before executing an operation because PHPJava cannot understands that pushing several operand stacks beforehand.'
);
}
return $this->pushedOperandStacks;
}
}