Skip to content

Commit d8dca7e

Browse files
committed
Implemented outer class by using ClassResolver (static only)
1 parent 81f7b7f commit d8dca7e

3 files changed

Lines changed: 38 additions & 15 deletions

File tree

src/Kernel/Mnemonics/_getstatic.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,15 @@ public function execute(): void
3232
}
3333

3434
if (isset($signature[0]['class_name'])) {
35-
$className = ClassResolver::resolve($signature[0]['class_name']);
36-
$this->pushStack(new $className());
35+
[$resourceType, $classObject] = ClassResolver::resolve($signature[0]['class_name']);
36+
if ($resourceType === ClassResolver::RESOLVED_TYPE_CLASS) {
37+
/**
38+
* @var \PHPJava\Core\JavaClass $className
39+
*/
40+
$this->pushStack($classObject);
41+
return;
42+
}
43+
$this->pushStack(new $classObject());
3744
return;
3845
}
3946
}

src/Kernel/Mnemonics/_invokestatic.php

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,35 @@ public function execute(): void
1818
$methodName = $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString();
1919
$signature = Formatter::parseSignature($cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getDescriptorIndex()]->getString());
2020
$arguments = [];
21-
$className = ClassResolver::resolve($cpInfo[$cpInfo[$cp->getClassIndex()]->getClassIndex()]->getString());
21+
[$resourceType, $classObject] = ClassResolver::resolve($cpInfo[$cpInfo[$cp->getClassIndex()]->getClassIndex()]->getString());
2222
for ($i = 0; $i < $signature['arguments_count']; $i++) {
2323
$arguments[] = $this->getStack();
2424
}
2525

2626
krsort($arguments);
2727

28-
if (!class_exists($className)) {
29-
throw new \PHPJava\Imitation\java\lang\ClassNotFoundException(str_replace('\\PHPJava\\Imitation\\', '', $className) . ' class does not exist.');
28+
$return = null;
29+
if ($resourceType === ClassResolver::RESOLVED_TYPE_CLASS) {
30+
/**
31+
* @var \PHPJava\Core\JavaClass $classObject
32+
*/
33+
$return = $classObject
34+
->getInvoker()
35+
->getStatic()
36+
->getMethods()
37+
->call(
38+
$methodName,
39+
...$arguments
40+
);
41+
} elseif ($resourceType === ClassResolver::RESOLVED_TYPE_IMITATION && class_exists($classObject)) {
42+
$return = forward_static_call_array(
43+
[
44+
$classObject,
45+
$methodName
46+
],
47+
$arguments
48+
);
3049
}
31-
32-
// call Invoker
33-
$return = forward_static_call_array(
34-
[
35-
$className,
36-
$methodName
37-
],
38-
$arguments
39-
);
4050

4151
if ($signature[0]['type'] !== 'void') {
4252
$this->pushStack($return);

src/Utilities/ClassResolver.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,15 @@ public static function resolve($javaPath): array
4848
}
4949
}
5050

51+
$className = '\\PHPJava\\Imitation\\' . implode('\\', $buildClassPath);
52+
53+
if (!class_exists($className)) {
54+
throw new \PHPJava\Imitation\java\lang\ClassNotFoundException(str_replace(['\\PHPJava\\Imitation\\', '\\'], ['', '.'], $className) . ' class does not exist.');
55+
}
56+
5157
return [
5258
static::RESOLVED_TYPE_IMITATION,
53-
'\\PHPJava\\Imitation\\' . implode('\\', $buildClassPath),
59+
$className,
5460
];
5561
}
5662

0 commit comments

Comments
 (0)