Skip to content

Commit 36189fb

Browse files
committed
Support to inner class
1 parent 192347a commit 36189fb

5 files changed

Lines changed: 29 additions & 16 deletions

File tree

src/Core/JVM/Invoker/Invokable.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ public function call(string $name, ...$arguments)
6969
->getConstantPool()
7070
->getEntries();
7171

72+
if ($name === '<init>' && $this->javaClassInvoker->getJavaClass()->hasParentClass()) {
73+
array_unshift(
74+
$arguments,
75+
$this->javaClassInvoker->getJavaClass()->getParentClass()
76+
);
77+
}
78+
7279
// Find same method
7380
$convertedPassedArguments = Formatter::buildArgumentsSignature(
7481
array_map(
@@ -86,18 +93,13 @@ function ($argument) {
8693
$methodSignature = Formatter::buildArgumentsSignature(
8794
Formatter::parseSignature($constantPool[$methodReference->getDescriptorIndex()]->getString())['arguments']
8895
);
89-
90-
var_dump($methodSignature, $convertedPassedArguments);
91-
9296
if ($methodSignature === $convertedPassedArguments) {
9397
$method = $methodReference;
9498
break;
9599
}
96100
}
97101

98102
if ($method === null) {
99-
100-
debug_print_backtrace();
101103
throw new NoSuchMethodException('Call to undefined method ' . $name . '.');
102104
}
103105

src/Core/JavaClassInvoker.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public function __construct(JavaClass $javaClass)
9696
* @param array $arguments
9797
* @return JavaClassInvoker
9898
*/
99-
public function construct(array $arguments = []): self
99+
public function construct(...$arguments): self
100100
{
101101
$this->dynamicAccessor = new DynamicAccessor(
102102
$this,

src/Kernel/Mnemonics/_invokespecial.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public function execute(): void
3030
krsort($arguments);
3131

3232
$methodName = $cpInfo[$nameAndTypeIndex->getNameIndex()]->getString();
33+
3334
if ($this->javaClassInvoker->isInvoked($methodName, $signature)) {
3435
return;
3536
}
@@ -38,7 +39,18 @@ public function execute(): void
3839
->addToSpecialInvokedList($methodName, $signature);
3940

4041
if ($invokerClass instanceof JavaClass) {
41-
$result = $invokerClass->getInvoker()->getDynamic()->getMethods()
42+
if ($invokerClass->getInvoker()->isInvoked($methodName, $signature)) {
43+
return;
44+
}
45+
46+
$invokerClass
47+
->getInvoker()
48+
->addToSpecialInvokedList($methodName, $signature);
49+
50+
$result = $invokerClass
51+
->getInvoker()
52+
->getDynamic()
53+
->getMethods()
4254
->call(
4355
$methodName,
4456
...$arguments

src/Kernel/Mnemonics/_new.php

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,13 @@ public function execute(): void
2121
return;
2222
}
2323

24-
[$resourceType, $classObject] = ClassResolver::resolve($className);
24+
[$resourceType, $classObject] = ClassResolver::resolve($className, $this->javaClass);
2525
if ($resourceType === ClassResolver::RESOLVED_TYPE_CLASS) {
2626
/**
2727
* @var \PHPJava\Core\JavaClass $classObject
2828
*/
2929

30-
$classObjectInvoker = $classObject->getInvoker();
31-
$arguments = [];
32-
if ($classObject->hasParentClass()) {
33-
$arguments[] = $this->javaClass;
34-
}
35-
$this->pushStack($classObjectInvoker->construct(...$arguments)->getJavaClass());
30+
$this->pushStack($classObject->getInvoker()->construct()->getJavaClass());
3631
return;
3732
}
3833
$this->pushStack(new $classObject());

src/Utilities/ClassResolver.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class ClassResolver
2121
private static $resolves = [];
2222
private static $resolvedPaths = [];
2323

24-
public static function resolve($javaPath): array
24+
public static function resolve(string $javaPath, JavaClass $class = null): array
2525
{
2626
$namespaces = explode('.', str_replace('/', '.', $javaPath));
2727
$buildClassPath = [];
@@ -39,9 +39,13 @@ public static function resolve($javaPath): array
3939
return static::$resolvedPaths[$key];
4040
}
4141
if (is_file($path)) {
42+
$initiatedClass = new JavaClass(new JavaClassReader($path));
43+
if ($class !== null) {
44+
$initiatedClass->setParentClass($class);
45+
}
4246
return $resolvedPaths[] = [
4347
static::RESOLVED_TYPE_CLASS,
44-
(new JavaClass(new JavaClassReader($path)))
48+
$initiatedClass,
4549
];
4650
}
4751
break;

0 commit comments

Comments
 (0)