Skip to content

Commit e66f725

Browse files
committed
to use necromancy to _Utf8
1 parent 718a68c commit e66f725

6 files changed

Lines changed: 39 additions & 21 deletions

File tree

src/Kernel/Mnemonics/_if_acmpeq.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ public function execute(): void
2121
* @var $rightOperand _String|_Utf8|JavaClass
2222
* @var $leftOperand _String|_Utf8|JavaClass
2323
*/
24-
$rightOperand = Extractor::extractUtf8IfThisIsString($this->popFromOperandStack());
25-
$leftOperand = Extractor::extractUtf8IfThisIsString($this->popFromOperandStack());
24+
$rightOperand = $this->popFromOperandStack();
25+
$leftOperand = $this->popFromOperandStack();
2626

2727
if ($leftOperand === $rightOperand) {
2828
$this->setOffset($this->getProgramCounter() + $offset);

src/Kernel/Mnemonics/_if_acmpne.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ public function execute(): void
2121
* @var $rightOperand _String|_Utf8|JavaClass
2222
* @var $leftOperand _String|_Utf8|JavaClass
2323
*/
24-
$rightOperand = Extractor::extractUtf8IfThisIsString($this->popFromOperandStack());
25-
$leftOperand = Extractor::extractUtf8IfThisIsString($this->popFromOperandStack());
24+
$rightOperand = $this->popFromOperandStack();
25+
$leftOperand = $this->popFromOperandStack();
2626

2727
if ($leftOperand !== $rightOperand) {
2828
$this->setOffset($this->getProgramCounter() + $offset);

src/Kernel/Mnemonics/_ldc.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function execute(): void
2525
$value = $cpInfo[$data->getStringIndex()];
2626

2727
if ($value instanceof _Utf8) {
28-
$value = new \PHPJava\Packages\java\lang\_String($value);
28+
$value = $value->getStringObject();
2929
}
3030
} elseif (($data instanceof _Integer) || ($data instanceof _Float)) {
3131
$value = $data->getBytes();

src/Kernel/Structures/_Utf8.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,19 @@ class _Utf8 implements StructureInterface
1212

1313
private $length = 0;
1414
private $string = '';
15+
16+
/**
17+
* @var \PHPJava\Packages\java\lang\_String $stringObject
18+
*/
19+
private $stringObject;
20+
1521
public function execute(): void
1622
{
1723
$this->length = $this->readUnsignedShort();
1824
for ($i = 0; $i < $this->length; $i++) {
1925
$this->string .= chr($this->readUnsignedByte());
2026
}
27+
$this->stringObject = new \PHPJava\Packages\java\lang\_String($this);
2128
}
2229

2330
public function getLength()
@@ -30,8 +37,13 @@ public function getString()
3037
return $this->string;
3138
}
3239

33-
public function hashCode()
40+
public function __toString(): string
41+
{
42+
return $this->getString();
43+
}
44+
45+
public function getStringObject(): \PHPJava\Packages\java\lang\_String
3446
{
35-
return spl_object_id($this);
47+
return $this->stringObject;
3648
}
3749
}

src/Utilities/Extractor.php

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,22 @@
77

88
class Extractor
99
{
10-
public static function getRealValue($value)
10+
/**
11+
* You need to use `getRealValue` instead of `realValue`.
12+
*
13+
* @deprecated
14+
* @param $value
15+
* @return array|bool|float|int|null|Type|string
16+
*/
17+
public static function realValue($value)
1118
{
12-
if ($value instanceof Type) {
13-
return $value->getValue();
14-
}
15-
return $value;
19+
return static::getRealValue($value);
1620
}
1721

18-
public static function extractUtf8IfThisIsString($value)
22+
public static function getRealValue($value)
1923
{
20-
if ($value instanceof _String) {
21-
// NOTE: "object" property can be access from ReflectionProperty only.
22-
$reflectionProperty = (new \ReflectionClass($value))->getProperty('object');
23-
$reflectionProperty->setAccessible(true);
24-
$result = $reflectionProperty->getValue($value);
25-
if ($result instanceof _Utf8) {
26-
return $result;
27-
}
24+
if ($value instanceof Type) {
25+
return $value->getValue();
2826
}
2927
return $value;
3028
}

src/Utilities/TypeResolver.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use PHPJava\Core\JVM\Parameters\GlobalOptions;
66
use PHPJava\Core\JVM\Parameters\Runtime;
77
use PHPJava\Exceptions\TypeException;
8+
use PHPJava\Kernel\Structures\_Utf8;
89
use PHPJava\Packages\java\lang\_Object;
910
use PHPJava\Packages\java\lang\_String;
1011
use PHPJava\Kernel\Types\_Array\Collection;
@@ -150,6 +151,13 @@ public static function convertPHPtoJava($arguments, $defaultJavaArgumentType = '
150151
'deep_array' => $deepArray,
151152
];
152153
}
154+
if ($arguments instanceof _Utf8) {
155+
return [
156+
'type' => 'class',
157+
'class_name' => static::PHP_TO_JAVA_MAP['string'],
158+
'deep_array' => $deepArray,
159+
];
160+
}
153161
if ($arguments instanceof Type) {
154162
return [
155163
'type' => $arguments->getTypeNameInJava(),

0 commit comments

Comments
 (0)