Skip to content

Commit 9548287

Browse files
committed
Implement dynamically field
1 parent 471bb06 commit 9548287

12 files changed

Lines changed: 96 additions & 49 deletions

File tree

src/core/JavaClass.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ class JavaClass
5757

5858
private $debugTraces = [];
5959

60+
/**
61+
* @var JavaClassInvoker
62+
*/
63+
private $invoker;
64+
6065
/**
6166
* JavaClass constructor.
6267
* @param JavaClassReader $reader
@@ -121,6 +126,8 @@ public function __construct(JavaClassReader $reader)
121126
$reader->getBinaryReader()->readUnsignedShort(),
122127
$this->constantPool
123128
);
129+
130+
$this->invoker = new JavaClassInvoker($this);
124131
}
125132

126133
public function getClassName(): string
@@ -140,7 +147,7 @@ public function getMethods(): array
140147

141148
public function getInvoker(): JavaClassInvoker
142149
{
143-
return new JavaClassInvoker($this);
150+
return $this->invoker;
144151
}
145152

146153
public function appendDebug($log)

src/core/JavaClassInvoker.php

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,26 @@ class JavaClassInvoker
2727

2828
private $debugTraces;
2929

30+
/**
31+
* @var JVM\Invoker\DynamicMethodInvoker
32+
*/
33+
private $dynamicMethodAccessor;
34+
35+
/**
36+
* @var JVM\Invoker\StaticMethodInvoker
37+
*/
38+
private $staticMethodAccessor;
39+
40+
/**
41+
* @var JVM\Field\DynamicField
42+
*/
43+
private $dynamicFieldAccessor;
44+
45+
/**
46+
* @var JVM\Field\StaticField
47+
*/
48+
private $staticFieldAccessor;
49+
3050
public function __construct(JavaClass $javaClass)
3151
{
3252
$this->javaClass = $javaClass;
@@ -58,6 +78,25 @@ public function __construct(JavaClass $javaClass)
5878
}
5979
}
6080

81+
$this->dynamicMethodAccessor = new JVM\Invoker\DynamicMethodInvoker(
82+
$this,
83+
$this->dynamicMethods
84+
);
85+
86+
$this->staticMethodAccessor = new JVM\Invoker\StaticMethodInvoker(
87+
$this,
88+
$this->staticMethods
89+
);
90+
91+
$this->dynamicFieldAccessor = new JVM\Field\DynamicField(
92+
$this,
93+
[]
94+
);
95+
96+
$this->staticFieldAccessor = new JVM\Field\StaticField(
97+
$this
98+
);
99+
61100
// call <clinit>
62101
if (isset($this->staticMethods['<clinit>'])) {
63102
$this->getStaticMethods()->call('<clinit>');
@@ -71,33 +110,22 @@ public function getJavaClass(): JavaClass
71110

72111
public function getDynamicMethods(): InvokerInterface
73112
{
74-
return new JVM\Invoker\DynamicMethodInvoker(
75-
$this,
76-
$this->dynamicMethods
77-
);
113+
return $this->dynamicMethodAccessor;
78114
}
79115

80116
public function getStaticMethods(): InvokerInterface
81117
{
82-
return new JVM\Invoker\StaticMethodInvoker(
83-
$this,
84-
$this->staticMethods
85-
);
118+
return $this->staticMethodAccessor;
86119
}
87120

88121
public function getDynamicFields(): FieldInterface
89122
{
90-
return new JVM\Field\DynamicField(
91-
$this,
92-
[]
93-
);
123+
return $this->dynamicFieldAccessor;
94124
}
95125

96126
public function getStaticFields(): JVM\Field\StaticField
97127
{
98-
return new JVM\Field\StaticField(
99-
$this
100-
);
128+
return $this->staticFieldAccessor;
101129
}
102130

103131
}

src/core/jvm/field/FieldGettable.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
trait FieldGettable
77
{
8-
public function __get($name)
8+
public function get(string $name)
99
{
1010
return $this->fields[$name];
1111
}

src/core/jvm/field/FieldInterface.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
interface FieldInterface
77
{
88
public function __construct(JavaClassInvoker $javaClassInvoker, array $fields);
9-
public function __get($name);
9+
public function get(string $name);
10+
public function set(string $name, $value);
1011
}

src/core/jvm/field/FieldSettable.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
trait FieldSettable
77
{
8-
public function __set($name, $value)
8+
public function set(string $name, $value)
99
{
1010
$this->fields[$name] = $value;
1111
}

src/core/jvm/field/StaticField.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
class StaticField
99
{
10-
private static $fields = [];
10+
public $fields = [];
1111

1212
private $javaClassInvoker;
1313

@@ -21,18 +21,20 @@ public function __construct(JavaClassInvoker $javaClassInvoker)
2121
* @return mixed
2222
* @throws NoSuchFieldException
2323
*/
24-
public function get($name)
24+
public function get(string $name)
2525
{
26-
if (!isset(static::$fields[$name])) {
26+
if (!isset($this->fields[$name])) {
2727
throw new NoSuchFieldException('Get to undefined static field ' . $name);
2828
}
29-
if (static::$fields[$name] instanceof _String) {
30-
return (string) static::$fields[$name];
29+
if ($this->fields[$name] instanceof _String) {
30+
return (string) $this->fields[$name];
3131
}
32-
return static::$fields[$name];
32+
return $this->fields[$name];
3333
}
34-
public function set($name, $value)
34+
35+
public function set(string $name, $value)
3536
{
36-
static::$fields[$name] = $value;
37+
$this->fields[$name] = $value;
38+
return $this;
3739
}
3840
}

src/imitation/java/io/PrintStream.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,19 @@ public function println($arg)
1111
{
1212
if ($arg instanceof _Utf8) {
1313
echo $arg->getString() . "\n";
14-
} elseif (
14+
return;
15+
}
16+
if (
1517
is_string($arg) ||
1618
is_int($arg) ||
1719
$arg instanceof Type ||
1820
$arg instanceof \PHPJava\Imitation\java\lang\_String
1921
) {
2022
echo $arg . "\n";
21-
} elseif ($arg === null) {
22-
echo "\n";
23+
return;
2324
}
25+
26+
echo "\n";
2427
}
2528

2629
public function append($string)

src/kernel/mnemonics/_getfield.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ public function execute(): void
2121

2222
if ($return !== null) {
2323
$this->pushStack($return);
24-
} else {
25-
throw new Exception('Cannot get ' . $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString() . '');
24+
return;
2625
}
26+
throw new Exception('Cannot get to undefined field ' . $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString() . '');
2727
}
2828
}

src/kernel/mnemonics/_getstatic.php

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
namespace PHPJava\Kernel\Mnemonics;
33

44
use PHPJava\Exceptions\NotImplementedException;
5+
use PHPJava\Kernel\Structures\_Fieldref;
56
use PHPJava\Utilities\BinaryTool;
67
use PHPJava\Utilities\ClassResolver;
78
use PHPJava\Utilities\Formatter;
@@ -16,27 +17,25 @@ public function execute(): void
1617
$cpInfo = $this->getConstantPool()->getEntries();
1718

1819
$cp = $cpInfo[$this->readUnsignedShort()];
19-
2020
$class = $cpInfo[$cpInfo[$cp->getClassIndex()]->getClassIndex()]->getString();
21-
2221
$signature = Formatter::parseSignature($cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getDescriptorIndex()]->getString());
2322

23+
if ($cp instanceof _Fieldref) {
24+
foreach ($this->javaClass->getFields() as $field) {
25+
if ($cpInfo[$field->getNameIndex()]->getString() === $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString()) {
26+
27+
// push stack
28+
$fieldName = $cpInfo[$field->getNameIndex()]->getString();
29+
$this->pushStack($this->javaClassInvoker->getStaticFields()->get($fieldName));
30+
return;
31+
}
32+
}
33+
}
34+
2435
if (isset($signature[0]['class_name'])) {
2536
$className = ClassResolver::resolve($signature[0]['class_name']);
2637
$this->pushStack(new $className());
2738
return;
2839
}
29-
30-
foreach ($this->javaClass->getFields() as $field) {
31-
if ($cpInfo[$field->getNameIndex()]->getString() === $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString()) {
32-
33-
// push stack
34-
$fieldName = $cpInfo[$field->getNameIndex()]->getString();
35-
$this->pushStack($this->javaClassInvoker->getStaticFields()->get($fieldName));
36-
return;
37-
}
38-
}
39-
40-
throw new \Exception('にゃ〜ん');
4140
}
4241
}

tools/Test.class

26 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)