feat: added support for invoke static
This commit is contained in:
2
.idea/JavaClassFileParser.iml
generated
2
.idea/JavaClassFileParser.iml
generated
@@ -4,7 +4,7 @@
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Pipenv (JavaClassFileParser)" jdkType="Python SDK" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<component name="PackageRequirementsSettings">
|
||||
|
||||
5
.idea/misc.xml
generated
5
.idea/misc.xml
generated
@@ -1,7 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Pipenv (PJVM)" />
|
||||
</component>
|
||||
<component name="JavaScriptSettings">
|
||||
<option name="languageLevel" value="ES6" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Pipenv (JavaClassFileParser)" project-jdk-type="Python SDK" />
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Pipenv (PJVM)" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
@@ -85,13 +85,30 @@ def op_ldc(vm: "PJVirtualMachine", opcode: int, frame: Frame):
|
||||
frame.stack.append(resulting_value)
|
||||
|
||||
|
||||
@Opcode(0xb8, size=3, no_ret=True)
|
||||
def op_invokestatic(vm: "PJVirtualMachine", opcode: int, frame: Frame):
|
||||
index = frame.get_short(frame.ip + 1)
|
||||
class_name, method_name, descriptor = frame.clazz.cp_get_methodref(index)
|
||||
LOGGER.info(f"Calling static {class_name} -> {method_name} {descriptor}")
|
||||
args_types = utils.get_argument_count_types_descriptor(descriptor)
|
||||
# todo type check
|
||||
args = []
|
||||
for _ in args_types:
|
||||
args.append(frame.stack.pop())
|
||||
|
||||
result = vm.execute_static_method(class_name, method_name, args)
|
||||
|
||||
if descriptor[-1] != 'V':
|
||||
frame.stack.append(result)
|
||||
|
||||
|
||||
@Opcode(0xb6, size=3, no_ret=True)
|
||||
def op_invokevirtual(vm: "PJVirtualMachine", opcode: int, frame: Frame):
|
||||
index = frame.get_short(frame.ip + 1)
|
||||
result: JObj
|
||||
|
||||
class_name, method_name, descriptor = frame.clazz.cp_get_methodref(index)
|
||||
LOGGER.info(f"Calling {class_name} -> {method_name} {descriptor}")
|
||||
LOGGER.info(f"Calling virtual {class_name} -> {method_name} {descriptor}")
|
||||
args_types = utils.get_argument_count_types_descriptor(descriptor)
|
||||
# todo type check
|
||||
args = []
|
||||
|
||||
@@ -49,7 +49,7 @@ class PJVirtualMachine:
|
||||
if main_class not in self.classes:
|
||||
raise PJVMException("main_class not found!")
|
||||
|
||||
self.execute_static_method(main_class, 'Main', [j_args])
|
||||
self.execute_static_method(main_class, 'main', [j_args])
|
||||
|
||||
def execute_static_method(self, class_name: str, method_name: str, args: List[JObj]):
|
||||
clazz = self.classes[class_name]
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
package testclass;
|
||||
|
||||
public class AdvancedTest {
|
||||
public static void Main(String[] args) throws Exception{
|
||||
private static void method() {
|
||||
System.out.println("Hello");
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception{
|
||||
method();
|
||||
char c = (char) System.in.read();
|
||||
if (c == 'a') {
|
||||
System.out.println("Is a");
|
||||
|
||||
@@ -3,7 +3,7 @@ package testclass;
|
||||
public class Test {
|
||||
String testfield;
|
||||
public static int otherField;
|
||||
public static void Main(String[] args) {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Hello World!");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user