Skip to content

Commit 4e5486f

Browse files
committed
Fix #139
1 parent 3e5102b commit 4e5486f

6 files changed

Lines changed: 62 additions & 35 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
namespace PHPJava\Core\JVM\Cache;
3+
4+
class ResolvedClassesCache extends Cache
5+
{
6+
public static function resolve(string $classPath, callable $callback)
7+
{
8+
static $cache = null;
9+
if ($cache === null) {
10+
$cache = new static();
11+
}
12+
return $cache->fetchOrPush($classPath, $callback);
13+
}
14+
}

src/Core/JVM/Invoker/Invokable.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ public function call(string $name, ...$arguments)
7272
$constantPool = $currentConstantPool->getEntries();
7373
$convertedPassedArguments = $this->stringifyArguments(...$arguments);
7474

75+
/**
76+
* @var _MethodInfo $method
77+
*/
7578
$method = $operationCache->fetchOrPush(
7679
"{$name}.{$convertedPassedArguments}",
7780
function () use ($name, $arguments) {
@@ -82,6 +85,8 @@ function () use ($name, $arguments) {
8285
}
8386
);
8487

88+
$currentConstantPool = $method->getConstantPool() ?? $currentConstantPool;
89+
8590
if ($method instanceof FlexibleMethod) {
8691
/**
8792
* @var FlexibleMethod $method

src/Core/JavaClass.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,17 +135,15 @@ public function __construct(ReaderInterface $reader, array $options = [])
135135
$reader->getBinaryReader()->readUnsignedShort()
136136
);
137137

138-
$constantPoolEntries = $this->constantPool->getEntries();
139-
140-
$this->debugTool->getLogger()->info('Constant Pools: ' . count($constantPoolEntries));
138+
$this->debugTool->getLogger()->info('Constant Pools: ' . count($this->constantPool));
141139

142140
// read access flag
143141
$this->accessFlag = $reader->getBinaryReader()->readUnsignedShort();
144142

145143
// read this class
146144
$this->thisClass = $reader->getBinaryReader()->readUnsignedShort();
147145

148-
$this->className = $constantPoolEntries[$constantPoolEntries[$this->thisClass]->getClassIndex()];
146+
$this->className = $this->constantPool[$this->constantPool[$this->thisClass]->getClassIndex()];
149147

150148
// read super class
151149
$this->superClassIndex = $reader->getBinaryReader()->readUnsignedShort();
@@ -205,14 +203,26 @@ public function __construct(ReaderInterface $reader, array $options = [])
205203

206204
$this->debugTool->getLogger()->info('Extracted attributes: ' . count($this->attributePool));
207205

206+
$innerClasses = [];
208207
foreach ($this->attributePool as $entry) {
209208
if ($entry->getAttributeData() instanceof InnerClassesAttribute) {
210-
$this->innerClasses = array_merge(
211-
$this->innerClasses,
209+
$innerClasses = array_merge(
210+
$innerClasses,
212211
$entry->getAttributeData()->getClasses()
213212
);
214213
}
215214
}
215+
216+
// Add to class resolver
217+
foreach ($innerClasses as $innerClass) {
218+
$this->options['class_resolver']->add([
219+
[
220+
ClassResolver::RESOURCE_TYPE_INNER_CLASS,
221+
$innerClass
222+
],
223+
]);
224+
}
225+
216226
$this->debugTool->getLogger()->info('End of Class');
217227

218228
$this->invoker = new JavaClassInvoker(

src/Kernel/Attributes/InnerClassesAttribute.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ public function execute(): void
1717
{
1818
$this->numberOfClasses = $this->readUnsignedShort();
1919
for ($i = 0; $i < $this->numberOfClasses; $i++) {
20-
$this->classes[$i] = new _Classes($this->reader);
21-
$this->classes[$i]->setInnerClassInfoIndex($this->readUnsignedShort());
22-
$this->classes[$i]->setOuterClassInfoIndex($this->readUnsignedShort());
23-
$this->classes[$i]->setInnerNameIndex($this->readUnsignedShort());
24-
$this->classes[$i]->setInnerClassAccessFlag($this->readUnsignedShort());
20+
$class = new _Classes($this->reader);
21+
$class->setConstantPool($this->getConstantPool())
22+
->setDebugTool($this->getDebugTool());
23+
$class->execute();
24+
$this->classes[] = $class;
2525
}
2626
}
2727

src/Kernel/Structures/_Classes.php

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,10 @@ class _Classes implements StructureInterface
1414

1515
public function execute(): void
1616
{
17-
}
18-
19-
public function setInnerClassInfoIndex($innerClassInfoIndex)
20-
{
21-
$this->innerClassInfoIndex = $innerClassInfoIndex;
22-
}
23-
24-
public function setOuterClassInfoIndex($outerClassInfoIndex)
25-
{
26-
$this->outerClassInfoIndex = $outerClassInfoIndex;
27-
}
28-
29-
public function setInnerNameIndex($innerNameIndex)
30-
{
31-
$this->innerNameIndex = $innerNameIndex;
32-
}
33-
34-
public function setInnerClassAccessFlag($innerClassAccessFlag)
35-
{
36-
$this->innerClassAccessFlag = $innerClassAccessFlag;
17+
$this->innerClassInfoIndex = $this->readUnsignedShort();
18+
$this->outerClassInfoIndex = $this->readUnsignedShort();
19+
$this->innerNameIndex = $this->readUnsignedShort();
20+
$this->innerClassAccessFlag = $this->readUnsignedShort();
3721
}
3822

3923
public function getInnerClassInfoIndex()

src/Utilities/ClassResolver.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33

44
use PHPJava\Core\JavaArchive;
55
use PHPJava\Core\JavaClass;
6+
use PHPJava\Core\JVM\Cache\ResolvedClassesCache;
67
use PHPJava\Core\JVM\Parameters\Runtime;
78
use PHPJava\Core\Stream\Reader\FileReader;
89
use PHPJava\Core\Stream\Reader\ReaderInterface;
10+
use PHPJava\Kernel\Structures\_Classes;
911
use PHPJava\Packages\java\lang\ClassNotFoundException;
1012

1113
class ClassResolver
@@ -16,6 +18,7 @@ class ClassResolver
1618
const RESOURCE_TYPE_FILE = 'RESOURCE_TYPE_FILE';
1719
const RESOURCE_TYPE_JAR = 'RESOURCE_TYPE_JAR';
1820
const RESOURCE_TYPE_CLASS = 'RESOURCE_TYPE_CLASS';
21+
const RESOURCE_TYPE_INNER_CLASS = 'RESOURCE_TYPE_INNER_CLASS';
1922

2023
// resolved types
2124
const RESOLVED_TYPE_CLASS = 'RESOLVED_TYPE_CLASS';
@@ -42,15 +45,26 @@ public function resolve(string $javaPath, JavaClass $class = null): array
4245
$relativePath = implode('/', $namespaces);
4346
foreach ($this->resolves as [$resourceType, $value]) {
4447
switch ($resourceType) {
48+
case static::RESOURCE_TYPE_INNER_CLASS:
49+
// TODO: Implement here
50+
break;
4551
case static::RESOURCE_TYPE_FILE:
4652
$path = realpath($value . '/' . $relativePath . '.class');
4753
if (($key = array_search($path, $this->resolvedPaths, true)) !== false) {
4854
return $this->resolvedPaths[$key];
4955
}
56+
/**
57+
* @var JavaClass $initiatedClass
58+
*/
5059
if (is_file($path)) {
51-
$initiatedClass = new JavaClass(
52-
new FileReader($path),
53-
$this->options
60+
$initiatedClass = ResolvedClassesCache::resolve(
61+
$path,
62+
function () use ($path) {
63+
return new JavaClass(
64+
new FileReader($path),
65+
$this->options
66+
);
67+
}
5468
);
5569
if (strpos($relativePath, '$') !== false && $class !== null) {
5670
$initiatedClass->setParentClass($class);
@@ -73,7 +87,7 @@ public function resolve(string $javaPath, JavaClass $class = null): array
7387
} catch (ClassNotFoundException $e) {
7488
}
7589
break;
76-
case static::RESOLVED_TYPE_CLASS:
90+
case static::RESOURCE_TYPE_CLASS:
7791
/**
7892
* @var ReaderInterface $value
7993
*/

0 commit comments

Comments
 (0)