diff --git a/.DS_Store b/.DS_Store
deleted file mode 100644
index 5008ddfc..00000000
Binary files a/.DS_Store and /dev/null differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..da836b39
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+.DS_Store
+old
+.idea
+vendor
+composer.lock
+.php_cs.cache
+.phpunit.result.cache
+tests/caches/
+!tests/caches/.gitkeep
diff --git a/JavaTest/build.xml b/JavaTest/build.xml
deleted file mode 100644
index 8cd24b09..00000000
--- a/JavaTest/build.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- Builds, tests, and runs the project JavaTest.
-
-
-
diff --git a/JavaTest/build/built-jar.properties b/JavaTest/build/built-jar.properties
deleted file mode 100644
index 4d862759..00000000
--- a/JavaTest/build/built-jar.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-#Sat, 27 Sep 2014 16:16:26 +0900
-
-
-D\:\\PHPJava\\JavaTest=
diff --git a/JavaTest/build/classes/javatest/JavaTest$testClass$testClass2.class b/JavaTest/build/classes/javatest/JavaTest$testClass$testClass2.class
deleted file mode 100644
index 32d943b4..00000000
Binary files a/JavaTest/build/classes/javatest/JavaTest$testClass$testClass2.class and /dev/null differ
diff --git a/JavaTest/build/classes/javatest/JavaTest$testClass.class b/JavaTest/build/classes/javatest/JavaTest$testClass.class
deleted file mode 100644
index f9de7514..00000000
Binary files a/JavaTest/build/classes/javatest/JavaTest$testClass.class and /dev/null differ
diff --git a/JavaTest/build/classes/javatest/JavaTest.class b/JavaTest/build/classes/javatest/JavaTest.class
deleted file mode 100644
index a8c34408..00000000
Binary files a/JavaTest/build/classes/javatest/JavaTest.class and /dev/null differ
diff --git a/JavaTest/dist/JavaTest.jar b/JavaTest/dist/JavaTest.jar
deleted file mode 100644
index 4582f54b..00000000
Binary files a/JavaTest/dist/JavaTest.jar and /dev/null differ
diff --git a/JavaTest/dist/README.TXT b/JavaTest/dist/README.TXT
deleted file mode 100644
index 123b9552..00000000
--- a/JavaTest/dist/README.TXT
+++ /dev/null
@@ -1,32 +0,0 @@
-========================
-BUILD OUTPUT DESCRIPTION
-========================
-
-When you build an Java application project that has a main class, the IDE
-automatically copies all of the JAR
-files on the projects classpath to your projects dist/lib folder. The IDE
-also adds each of the JAR files to the Class-Path element in the application
-JAR files manifest file (MANIFEST.MF).
-
-To run the project from the command line, go to the dist folder and
-type the following:
-
-java -jar "JavaTest.jar"
-
-To distribute this project, zip up the dist folder (including the lib folder)
-and distribute the ZIP file.
-
-Notes:
-
-* If two JAR files on the project classpath have the same name, only the first
-JAR file is copied to the lib folder.
-* Only JAR files are copied to the lib folder.
-If the classpath contains other types of files or folders, these files (folders)
-are not copied.
-* If a library on the projects classpath also has a Class-Path element
-specified in the manifest,the content of the Class-Path element has to be on
-the projects runtime path.
-* To set a main class in a standard Java project, right-click the project node
-in the Projects window and choose Properties. Then click Run and enter the
-class name in the Main Class field. Alternatively, you can manually type the
-class name in the manifest Main-Class element.
diff --git a/JavaTest/manifest.mf b/JavaTest/manifest.mf
deleted file mode 100644
index 328e8e5b..00000000
--- a/JavaTest/manifest.mf
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-X-COMMENT: Main-Class will be added automatically by build
-
diff --git a/JavaTest/nbproject/build-impl.xml b/JavaTest/nbproject/build-impl.xml
deleted file mode 100644
index 21b9380e..00000000
--- a/JavaTest/nbproject/build-impl.xml
+++ /dev/null
@@ -1,1413 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must set src.dir
- Must set test.src.dir
- Must set build.dir
- Must set dist.dir
- Must set build.classes.dir
- Must set dist.javadoc.dir
- Must set build.test.classes.dir
- Must set build.test.results.dir
- Must set build.classes.excludes
- Must set dist.jar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must set javac.includes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- No tests executed.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must set JVM to use for profiling in profiler.info.jvm
- Must set profiler agent JVM arguments in profiler.info.jvmargs.agent
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select some files in the IDE or set javac.includes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- To run this application from the command line without Ant, try:
-
- java -jar "${dist.jar.resolved}"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set debug.class
-
-
-
-
- Must select one file in the IDE or set debug.class
-
-
-
-
- Must set fix.includes
-
-
-
-
-
-
-
-
-
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set profile.class
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
-
-
-
-
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
-
-
- Must select some files in the IDE or set test.includes
-
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
-
- Must select one file in the IDE or set applet.url
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select some files in the IDE or set javac.includes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Some tests failed; see details above.
-
-
-
-
-
-
-
-
- Must select some files in the IDE or set test.includes
-
-
-
- Some tests failed; see details above.
-
-
-
- Must select some files in the IDE or set test.class
- Must select some method in the IDE or set test.method
-
-
-
- Some tests failed; see details above.
-
-
-
-
- Must select one file in the IDE or set test.class
-
-
-
- Must select one file in the IDE or set test.class
- Must select some method in the IDE or set test.method
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set applet.url
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set applet.url
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/JavaTest/nbproject/genfiles.properties b/JavaTest/nbproject/genfiles.properties
deleted file mode 100644
index 92b78354..00000000
--- a/JavaTest/nbproject/genfiles.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-build.xml.data.CRC32=e3ffc9d9
-build.xml.script.CRC32=74429054
-build.xml.stylesheet.CRC32=8064a381@1.75.1.48
-# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
-# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=e3ffc9d9
-nbproject/build-impl.xml.script.CRC32=11fe2361
-nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.75.1.48
diff --git a/JavaTest/nbproject/private/private.properties b/JavaTest/nbproject/private/private.properties
deleted file mode 100644
index 9ce0e3cf..00000000
--- a/JavaTest/nbproject/private/private.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-compile.on.save=true
-user.properties.file=C:\\Users\\memory\\AppData\\Roaming\\NetBeans\\8.0.1\\build.properties
diff --git a/JavaTest/nbproject/private/private.xml b/JavaTest/nbproject/private/private.xml
deleted file mode 100644
index 6807a2ba..00000000
--- a/JavaTest/nbproject/private/private.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/JavaTest/nbproject/project.properties b/JavaTest/nbproject/project.properties
deleted file mode 100644
index b2e9ea5a..00000000
--- a/JavaTest/nbproject/project.properties
+++ /dev/null
@@ -1,73 +0,0 @@
-annotation.processing.enabled=true
-annotation.processing.enabled.in.editor=false
-annotation.processing.processor.options=
-annotation.processing.processors.list=
-annotation.processing.run.all.processors=true
-annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
-build.classes.dir=${build.dir}/classes
-build.classes.excludes=**/*.java,**/*.form
-# This directory is removed when the project is cleaned:
-build.dir=build
-build.generated.dir=${build.dir}/generated
-build.generated.sources.dir=${build.dir}/generated-sources
-# Only compile against the classpath explicitly listed here:
-build.sysclasspath=ignore
-build.test.classes.dir=${build.dir}/test/classes
-build.test.results.dir=${build.dir}/test/results
-# Uncomment to specify the preferred debugger connection transport:
-#debug.transport=dt_socket
-debug.classpath=\
- ${run.classpath}
-debug.test.classpath=\
- ${run.test.classpath}
-# \u914d\u7f6ejar\u304b\u3089\u9664\u5916\u3059\u308b\u5fc5\u8981\u304c\u3042\u308bbuild.classes.dir\u5185\u306e\u30d5\u30a1\u30a4\u30eb
-dist.archive.excludes=
-# This directory is removed when the project is cleaned:
-dist.dir=dist
-dist.jar=${dist.dir}/JavaTest.jar
-dist.javadoc.dir=${dist.dir}/javadoc
-excludes=
-includes=**
-jar.compress=false
-javac.classpath=
-# Space-separated list of extra javac options
-javac.compilerargs=
-javac.deprecation=false
-javac.processorpath=\
- ${javac.classpath}
-javac.source=1.7
-javac.target=1.7
-javac.test.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-javac.test.processorpath=\
- ${javac.test.classpath}
-javadoc.additionalparam=
-javadoc.author=false
-javadoc.encoding=${source.encoding}
-javadoc.noindex=false
-javadoc.nonavbar=false
-javadoc.notree=false
-javadoc.private=false
-javadoc.splitindex=true
-javadoc.use=true
-javadoc.version=false
-javadoc.windowtitle=
-main.class=javatest.JavaTest
-manifest.file=manifest.mf
-meta.inf.dir=${src.dir}/META-INF
-mkdist.disabled=false
-platform.active=default_platform
-run.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-# Space-separated list of JVM arguments used when running the project.
-# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
-# To set system properties for unit tests define test-sys-prop.name=value:
-run.jvmargs=
-run.test.classpath=\
- ${javac.test.classpath}:\
- ${build.test.classes.dir}
-source.encoding=UTF-8
-src.dir=src
-test.src.dir=test
diff --git a/JavaTest/nbproject/project.xml b/JavaTest/nbproject/project.xml
deleted file mode 100644
index 6a319e33..00000000
--- a/JavaTest/nbproject/project.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
- org.netbeans.modules.java.j2seproject
-
-
- JavaTest
-
-
-
-
-
-
-
-
-
diff --git a/JavaTest/src/javatest/JavaTest.java b/JavaTest/src/javatest/JavaTest.java
deleted file mode 100644
index 767ede0c..00000000
--- a/JavaTest/src/javatest/JavaTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-
-package javatest;
-
-public class JavaTest {
-
- long z = -22222222222222222L;
- static int c = 100;
- static String b = "Hello World";
-
- public static void main (String[] args) {
-
- String x = "String";
-
- // new instance
- JavaTest _a = new JavaTest();
-
- // test call
- _a.javaTest();
-
-
- int t = 2;
- //t *= 1;
- //t = ~1;
- t <<= 1;
- System.out.println(t);
- t >>= 1;
- System.out.println(t);
- t -= 1;
- System.out.println(t);
- t += 1;
- System.out.println(t);
- t = 1;
- System.out.println(t);
- t >>>= 1;
- System.out.println(t);
- t |= 1;
- System.out.println(t);
- t &= 1;
- System.out.println(t);
- t = 345321;
- System.out.println((short) t);
-/*
- long t1 = 111;
- t1 *= 1;
- t1 = ~1;
- t1 <<= 1;
- t1 >>= 1;
- t1 -= 1;
- t1 += 1;
- t1 = 1;
- t1 >>>= 1;
- t1 |= 1;
- t1 &= 1;
-
- double t2 = 111;
- t2 *= 1;
- t2 = ~1;
- t2 -= 1;
- t2 += 1;
- t2 = 1;
-
- boolean _b = false;
- _b = true && true;
- _b = true && false;
- _b = true || true;
- _b = true || false;*/
-
- try {
-
- for (int i = 0; i < JavaTest.c; i++) {
-
- StringBuilder b = new StringBuilder();
-
- switch (i + 1) {
-
- case -1:
-
- b.append("a");
-
- break;
- case 1:
-
- b.append("b");
-
- break;
- case 2:
-
- b.append("c");
-
- break;
-
- }
-
- if (!x.equals(i + "")) {
-
-
- System.out.println("Test:" + JavaTest.b + "/" + x + "*****" + i + "/" + b);
-
- }
-
- if (i == 10) {
-
- throw new NullPointerException();
-
- }
-
- }
-
- } catch (NullPointerException e) {
-
- System.out.println("ぬるぷっぷー");
-
- }
-
- }
-
- public static String test (int n, String m, int l, int i, int v, int k) {
-
- int j = 1;
-
- for (; j <= 10; j++) {
-
- j++;
-
- }
-
- return "Java emulate by php " + n + "/" + m + "/" + l + "/" + i + "/" + v + "/" + k + "/" + j;
-
- }
-
- public void javaTest () {
-
- testClass _c = new testClass();
- _c.t();
-
- }
-
- public class testClass {
-
- public void t () {
-
- System.out.println("testClass.t method." + JavaTest.this.z);
-
- testClass2 _c = new testClass2();
- _c.t();
-
-
- }
-
- public class testClass2 {
-
- public void t () {
-
- System.out.println("testClass2.t method." + JavaTest.this.z);
-
- }
-
- }
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Attributes/JavaAnnotationDefaultAttribute.php b/PHPJava/Attributes/JavaAnnotationDefaultAttribute.php
deleted file mode 100644
index 1a22aacb..00000000
--- a/PHPJava/Attributes/JavaAnnotationDefaultAttribute.php
+++ /dev/null
@@ -1,13 +0,0 @@
-AttributeNameIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->AttributeLength = $this->Class->getJavaBinaryStream()->readUnsignedInt();
-
- $cpInfo = $this->Class->getCpInfo();
-
- $classAttributeName = 'Java' . $cpInfo[$this->AttributeNameIndex]->getString() . 'Attribute';
-
- $this->AttributeData = new $classAttributeName($Class);
-
-
- }
-
- public function getAttributeData () {
-
- return $this->AttributeData;
-
- }
-
- public function getAttributeNameIndex () {
-
- return $this->AttributeNameIndex;
-
- }
-
- public function getAttributeLength () {
-
- return $this->AttributeLength;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Attributes/JavaBootstrapMethodsAttribute.php b/PHPJava/Attributes/JavaBootstrapMethodsAttribute.php
deleted file mode 100644
index e745a0c8..00000000
--- a/PHPJava/Attributes/JavaBootstrapMethodsAttribute.php
+++ /dev/null
@@ -1,13 +0,0 @@
-MaxStack = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->MaxLocals = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->CodeLength = $this->Class->getJavaBinaryStream()->readUnsignedInt();
-
- // read opcode
- $this->Code = array();
-
- for ($i = 0; $i < $this->CodeLength; $i++) {
-
- $this->Code[$i] = $this->Class->getJavaBinaryStream()->readUnsignedByte();
- $this->RawCode .= chr($this->Code[$i]);
-
- }
-
- // read exception table
- $this->ExceptionTableLength = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->ExceptionTableLength; $i++) {
-
- $this->ExceptionTables[$i] = new JavaStructureExceptionTable($this->Class);
-
- $this->ExceptionTables[$i]->setStartPc($this->Class->getJavaBinaryStream()->readUnsignedShort());
- $this->ExceptionTables[$i]->setEndPc($this->Class->getJavaBinaryStream()->readUnsignedShort());
- $this->ExceptionTables[$i]->setHandlerPc($this->Class->getJavaBinaryStream()->readUnsignedShort());
- $this->ExceptionTables[$i]->setCatchType($this->Class->getJavaBinaryStream()->readUnsignedShort());
-
- }
-
- $this->AttributesCount = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->AttributesCount; $i++) {
-
- $this->AttributeInfo[] = new JavaAttributeInfo($this->Class);
-
- }
-
- }
-
- public function getExceptionTables () {
-
- return $this->ExceptionTables;
-
- }
-
- public function getCode () {
-
- return $this->RawCode;
-
- }
-
- public function getOpCodes () {
-
- return $this->Code;
-
- }
-
- public function getOpCodeLength () {
-
- return $this->CodeLength;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Attributes/JavaConstantValueAttribute.php b/PHPJava/Attributes/JavaConstantValueAttribute.php
deleted file mode 100644
index 3156370d..00000000
--- a/PHPJava/Attributes/JavaConstantValueAttribute.php
+++ /dev/null
@@ -1,13 +0,0 @@
-NumberOfClasses = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->NumberOfClasses; $i++) {
-
- $this->Classes[$i] = new JavaStructureClasses($this->Class);
-
- $this->Classes[$i]->setInnerClassInfoIndex($this->Class->getJavaBinaryStream()->readUnsignedShort());
- $this->Classes[$i]->setOuterClassInfoIndex($this->Class->getJavaBinaryStream()->readUnsignedShort());
- $this->Classes[$i]->setInnerNameIndex($this->Class->getJavaBinaryStream()->readUnsignedShort());
- $this->Classes[$i]->setInnerClassAccessFlag($this->Class->getJavaBinaryStream()->readUnsignedShort());
-
- }
-
- }
-
- public function getClasses () {
-
- return $this->Classes;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Attributes/JavaLineNumberTableAttribute.php b/PHPJava/Attributes/JavaLineNumberTableAttribute.php
deleted file mode 100644
index 6de564f4..00000000
--- a/PHPJava/Attributes/JavaLineNumberTableAttribute.php
+++ /dev/null
@@ -1,32 +0,0 @@
-LineNumberTableLength = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->LineNumberTableLength; $i++) {
-
- $this->LineNumberTables[$i] = new JavaStructureLineNumberTable($Class);
-
- $this->LineNumberTables[$i]->setStartPc($this->Class->getJavaBinaryStream()->readUnsignedShort());
- $this->LineNumberTables[$i]->setLineNumber($this->Class->getJavaBinaryStream()->readUnsignedShort());
-
- }
-
- }
-
- public function getLineNumberTables () {
-
- return $this->LineNumberTables;
-
- }
-
-
-}
\ No newline at end of file
diff --git a/PHPJava/Attributes/JavaLocalVariableTableAttribute.php b/PHPJava/Attributes/JavaLocalVariableTableAttribute.php
deleted file mode 100644
index 8470175e..00000000
--- a/PHPJava/Attributes/JavaLocalVariableTableAttribute.php
+++ /dev/null
@@ -1,22 +0,0 @@
-LocalVariableTableLength = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->LocalVariableTableLength; $i++) {
-
- $this->LocalVariableTables[] = new JavaStructureLocalVariableTable($Class);
-
- }
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Attributes/JavaLocalVariableTypeTableAttribute.php b/PHPJava/Attributes/JavaLocalVariableTypeTableAttribute.php
deleted file mode 100644
index 94780ca3..00000000
--- a/PHPJava/Attributes/JavaLocalVariableTypeTableAttribute.php
+++ /dev/null
@@ -1,13 +0,0 @@
-SourceFileIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
-
- }
-
- public function getSourceFileIndex () {
-
- return $this->SourceFileIndex;
-
- }
-
-
-}
\ No newline at end of file
diff --git a/PHPJava/Attributes/JavaStackMapTableAttribute.php b/PHPJava/Attributes/JavaStackMapTableAttribute.php
deleted file mode 100644
index 96c91210..00000000
--- a/PHPJava/Attributes/JavaStackMapTableAttribute.php
+++ /dev/null
@@ -1,31 +0,0 @@
-NumberOfEntries = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->NumberOfEntries; $i++) {
-
- $this->StackMapFrames[] = new JavaStructureStackMapFrame($Class);
-
-
- }
-
- }
-
- public function getStackMapFrames () {
-
- return $this->StackMapFrames;
-
- }
-
-}
-
\ No newline at end of file
diff --git a/PHPJava/Attributes/JavaSyntheticAttribute.php b/PHPJava/Attributes/JavaSyntheticAttribute.php
deleted file mode 100644
index 571682b1..00000000
--- a/PHPJava/Attributes/JavaSyntheticAttribute.php
+++ /dev/null
@@ -1,13 +0,0 @@
-Class = &$Class;
-
- }
-
- public function getClass () {
-
- return $this->Class;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Common/JavaBinaryStream.php b/PHPJava/Common/JavaBinaryStream.php
deleted file mode 100644
index 49e65843..00000000
--- a/PHPJava/Common/JavaBinaryStream.php
+++ /dev/null
@@ -1,102 +0,0 @@
-Handle = &$handle;
-
- }
-
-
- public final function read ($bytes = 1) {
-
- $this->Offset += $bytes;
-
- return fread($this->Handle, $bytes);
-
- }
-
- public function readByte () {
-
- return current(unpack('c', $this->read(1)));
-
- }
-
- public function readUnsignedByte () {
-
- return (int) sprintf('%u', ord($this->read(1)));
-
- }
-
- public function readUnsignedInt () {
-
- return base_convert(bin2hex($this->read(4)), 16, 10);
-
- }
-
- public function readUnsignedShort () {
-
- return (int) sprintf('%u', hexdec(bin2hex($this->read(2))));
-
- }
-
- public function readInt () {
-
- return BinaryTools::toSigned($this->readUnsignedInt(), 4);
-
- }
-
- public function readShort () {
-
- $short = (int) sprintf('%u', hexdec(bin2hex($this->read(2))));
-
- return (($short & 0x8000) > 0) ? ($short - 0xFFFF - 1) : $short ;
-
- }
-
- public function readUnsignedLong () {
-
- if (PHP_INT_MAX === 2147483647) {
-
- return base_convert(bin2hex($this->read(8)), 16, 10);
-
- }
-
- return (int) sprintf('%u', hexdec(bin2hex($this->read(8))));
-
- }
-
- public function readLong () {
-
- return BinaryTools::toSigned($this->readUnsignedLong(), 8);
-
- }
-
- public function seek ($bytes) {
-
- $this->Offset += $bytes;
-
- fseek($this->Handle, $bytes, SEEK_CUR);
-
- }
-
- public function setOffset ($pointer) {
-
- $this->Offset = $pointer;
-
- fseek($this->Handle, $pointer, SEEK_SET);
-
- }
-
- public function getOffset () {
-
- return $this->Offset;
-
- }
-
-
-}
\ No newline at end of file
diff --git a/PHPJava/Common/JavaEnum.php b/PHPJava/Common/JavaEnum.php
deleted file mode 100644
index 93714047..00000000
--- a/PHPJava/Common/JavaEnum.php
+++ /dev/null
@@ -1,36 +0,0 @@
-getConstants();
-
- $keys = array_keys($constants);
- $values = array_values($constants);
-
- foreach ($values as $i => $constantValue) {
-
- if ($value === $constantValue) {
-
- return $keys[$i];
-
- }
-
- }
-
- return null;
-
- }
-
- public function getValues () {
-
- $reflectionClass = new ReflectionClass($this);
-
- return array_values($reflectionClass->getConstants());
-
- }
-
-}
diff --git a/PHPJava/Common/JavaInvoker.php b/PHPJava/Common/JavaInvoker.php
deleted file mode 100644
index 49c89e96..00000000
--- a/PHPJava/Common/JavaInvoker.php
+++ /dev/null
@@ -1,58 +0,0 @@
-Class = &$Class;
- $this->Platform = __DIR__ . '/../Platform';
-
- }
-
- public function getClass () {
-
- return $this->Class;
-
- }
-
- public function loadInnerClass ($class) {
-
- if ($this->getClass()->getClassFile() . '/../' . $class . '.class') {
-
- $this->Loaded[] = str_replace('.', '/', $class);
-
-
- }
-
- }
-
- public function loadPlatform ($class) {
-
- $className = str_replace('.', '/', $class);
-
- if (is_file($this->Platform . '/' . $className . '.php')) {
-
- if (in_array($className, $this->Loaded)) {
-
- return;
- }
-
- require_once $this->Platform . '/' . $className . '.php';
-
- $this->Loaded[] = str_replace('.', '/', $class);
-
- } else {
-
- throw new JavaPlatformHasNotClass($class);
-
- }
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Common/JavaStatement.php b/PHPJava/Common/JavaStatement.php
deleted file mode 100644
index ef4215c1..00000000
--- a/PHPJava/Common/JavaStatement.php
+++ /dev/null
@@ -1,126 +0,0 @@
-MethodName = $methodName;
- $this->Invoker = &$invoker;
- $this->ByteCodeStream = &$byteCodeStream;
- $this->Stacks = &$stacks;
- $this->Localstorage = &$localstorage;
- $this->CpInfo = &$CpInfo;
- $this->AttributeData = &$attributeData;
- $this->Pointer = $pointer;
-
- }
-
- public function pushStack ($value) {
-
- $this->Stacks[] = $value;
-
- }
-
- public function pushStackByReference (&$value) {
-
- $this->Stacks[] = &$value;
-
- }
-
- public function dupStack () {
-
- $this->pushStack($this->Stacks[sizeof($this->Stacks) - 1]);
-
- }
-
- public function getStack () {
-
- return array_pop($this->Stacks);
-
- }
-
- public function popStack () {
-
- array_pop($this->Stacks);
-
- }
-
- public function getStacks () {
-
- return $this->Stacks;
-
- }
-
- public function getOperands () {
-
- return $this->Operands;
-
- }
-
- public function setLocalstorage ($index, $value) {
-
- $this->Localstorage[(int) $index] = $value;
-
- }
-
-
- public function getLocalstorage ($index) {
-
- return $this->Localstorage[(int) $index];
-
- }
-
- public function getLocalstorages () {
-
- return $this->Localstorage;
-
- }
-
- public function getByteCodeStream () {
-
- return $this->ByteCodeStream;
-
- }
-
- public function getPointer () {
-
- return $this->Pointer;
-
- }
-
- public function getCpInfo () {
-
- return $this->CpInfo;
-
- }
-
- public function getInvoker () {
-
- return $this->Invoker;
-
- }
-
- public function getMethodName () {
-
- return $this->MethodName;
-
- }
-
- public function getAttributeData () {
-
- return $this->AttributeData;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Common/JavaStructure.php b/PHPJava/Common/JavaStructure.php
deleted file mode 100644
index 4e6f750b..00000000
--- a/PHPJava/Common/JavaStructure.php
+++ /dev/null
@@ -1,19 +0,0 @@
-Class = &$Class;
-
- }
-
- public function getClass () {
-
- return $this->Class;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Common/JavaType.php b/PHPJava/Common/JavaType.php
deleted file mode 100644
index 2e9484fc..00000000
--- a/PHPJava/Common/JavaType.php
+++ /dev/null
@@ -1,38 +0,0 @@
-value = $value;
- }
-
- /**
- * 設定されている値を返します。
- *
- * @return mixed 設定されている値を返します
- */
- public function getValue () {
- return $this->value;
- }
-
- /**
- * 値を出力します。
- *
- * @return string
- */
- public function __toString() {
- return (string) $this->getValue();
- }
-
-}
diff --git a/PHPJava/Core/JavaArchive.php b/PHPJava/Core/JavaArchive.php
deleted file mode 100644
index c71f9fe1..00000000
--- a/PHPJava/Core/JavaArchive.php
+++ /dev/null
@@ -1,123 +0,0 @@
-open($file)) {
-
- for ($i = 0; $i < $archive->numFiles; $i++) {
-
- $name = $archive->getNameIndex($i);
-
- if ($name[strlen($name) - 1] !== '/') {
-
- $this->Files[$name] = $archive->getFromIndex($i);
-
- }
-
- }
-
- }
-
- foreach (glob(__DIR__ . '/../{Common,Exceptions,Enums,Stream,Invoker,Attributes,Structures,Utils}/*.php', GLOB_BRACE) as $file) {
-
- require_once($file);
-
- }
-
- $this->Manipulator = new JavaManipulator();
-
-
- foreach ($this->Files as $fileName => $data) {
-
- if (!preg_match('/\.class$/', $fileName)) {
-
- // load class only
-
- continue;
-
- }
-
- if (strpos($fileName, '$') === false) {
-
- $this->Manipulator->registerClass(new JavaClass($fileName, $data), $this);
-
- }
-
- }
-
- }
-
- public function getClassBytecode ($name) {
-
- $className = str_replace('.', '/', $name);
- $name = $className . '.class';
-
- // search
- foreach ($this->Files as $fileName => $data) {
-
- if ($name === $fileName) {
-
- return $data;
-
- }
-
- }
-
- throw new JavaArchiveException('Not found class');
-
- }
-
- public function getClass ($name) {
-
- $className = str_replace('.', '/', $name);
- $name = $className . '.class';
-
- // search
- foreach ($this->Files as $fileName => $data) {
-
- if ($name === $fileName) {
-
- return $this->Manipulator->$className->getClass()->getMethodInvoker();
-
- }
-
- }
-
- throw new JavaArchiveException('Not found class');
-
- }
-
- public function hasClass ($name) {
-
- $className = str_replace('.', '/', $name);
- $name = $className . '.class';
-
- // search
- foreach ($this->Files as $fileName => $data) {
-
- if ($name === $fileName) {
-
- return true;
-
- }
-
- }
-
- return false;
-
- }
-
- public function getFiles () {
-
- return $this->Files;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Core/JavaClass.php b/PHPJava/Core/JavaClass.php
deleted file mode 100644
index fcf0b9a2..00000000
--- a/PHPJava/Core/JavaClass.php
+++ /dev/null
@@ -1,785 +0,0 @@
- null,
- 'Instances' => null
- );
-
- /**
- * @var int 読み込まれているメソッドの数を格納します。
- */
- private $MethodCount = 0;
-
- /**
- * @var JavaStructureMethodInfo[] メソッドの情報を格納したオブジェクトを格納します。
- */
- private $Methods = array();
-
- /**
- * @var int Constant Poolの数を格納します。
- */
- private $cpPool = 0;
-
- /**
- * @var object Constant Poolの情報を格納したオブジェクトを格納します。
- */
- private $cpInfo = array();
-
- /**
- * @var int アトリビュートの数を格納します。
- */
- private $AttributesCount = 0;
-
- /**
- * @var JavaAttributeInfo[] アトリビュートの情報を格納したオブジェクトを格納します。
- */
- private $AttributeInfo = array();
-
- /**
- * @var JavaMethodInvoker Javaのメソッドを呼ぶためのオブジェクトを格納します。
- */
- private $MethodInvoker = null;
-
- /**
- * @var string ニーモニックを読み込んだログを書き込みます。
- */
- private $Trace = '';
-
- /**
- * @var string ニーモニックを読み込んだログを書き込みます。
- */
- private $TraceHeader = '';
-
- /**
- * @var string ニーモニックを読み込んだログを書き込みます。
- */
- private $TraceBuffering = '';
-
- /**
- * @var JavaManipulator このクラスを管理しているJARの情報を格納します。
- */
- private $Manipulator = null;
-
- /**
- * @var JavaBinaryStream Javaのバイトコード読んでいくためのクラスを格納します。
- */
- protected $JavaBinaryStream = null;
-
- /**
- * JavaClassを読み込みます。
- *
- * @param string $file ファイル名を指定します。
- * @param string|null $byteCode Javaのバイトコードを渡します。nullの場合$fileから読み込みます。
- * @return void
- */
- public function __construct ($file, $byteCode = null) {
-
- $this->ClassFile = $file;
-
- foreach (glob(__DIR__ . '/../{Common,Exceptions,Enums,Stream,Invoker,Attributes,Structures,Types,Utils}/*.php', GLOB_BRACE) as $loadFile) {
-
- require_once($loadFile);
-
- }
-
- if ($byteCode === null) {
-
- $this->Handle = fopen($file, 'r');
-
- } else {
-
- $this->Handle = fopen('php://memory', 'rw');
- fwrite($this->Handle, $byteCode);
- rewind($this->Handle);
-
- }
-
- $this->ClassFields = (object) $this->ClassFields;
- $this->ClassFields->Statics = (object) $this->ClassFields->Statics;
- $this->ClassFields->Instances = (object) $this->ClassFields->Instances;
-
- $this->JavaBinaryStream = new JavaBinaryStream($this->Handle);
-
- // read magic byte
- if ($this->MagicBytes !== BinaryTools::toHex($this->JavaBinaryStream->readUnsignedInt())) {
-
- throw new JavaClassException($this->ClassFile . ' is not java class');
-
- }
-
- // read minor version
- $this->MinorVersion = $this->JavaBinaryStream->readUnsignedShort();
-
- // read major version
- $this->MajorVersion = $this->JavaBinaryStream->readUnsignedShort();
-
- // read cp_pool
- $this->cpPool = $this->JavaBinaryStream->readUnsignedShort();
-
- for ($entry = 1; $entry < $this->cpPool; $entry++) {
-
- $this->cpInfo[$entry] = $this->__CpInfo($entry);
-
- if ($this->cpInfo[$entry] instanceof \JavaStructureLong ||
- $this->cpInfo[$entry] instanceof \JavaStructureDouble) {
-
- // Java ConstantPool Problem
- $entry++;
-
- }
-
- }
-
- // read access flag
- $this->AccessFlag = $this->JavaBinaryStream->readUnsignedShort();
-
- // read this class
- $this->ThisClass = $this->JavaBinaryStream->readUnsignedShort();
-
- // read super class
- $this->SuperClass = $this->JavaBinaryStream->readUnsignedShort();
-
- // read interfaces
- $this->InterfaceCount = $this->JavaBinaryStream->readUnsignedShort();
-
- for ($i = 0; $i < $this->InterfaceCount; $i++) {
-
- $this->Interfaces[] = $this->JavaBinaryStream->readUnsignedShort();
-
- }
-
- // read fields
- $this->FieldCount = $this->JavaBinaryStream->readUnsignedShort();
-
- for ($i = 0; $i < $this->FieldCount; $i++) {
-
- $this->Fields[] = $this->__Fields();
-
- }
-
- // read methods
- $this->MethodCount = $this->JavaBinaryStream->readUnsignedShort();
-
- for ($i = 0; $i < $this->MethodCount; $i++) {
-
- $this->Methods[] = $this->__Method();
-
- }
-
- $this->AttributesCount = $this->JavaBinaryStream->readUnsignedShort();
-
- for ($i = 0; $i < $this->AttributesCount; $i++) {
-
- $this->AttributeInfo[] = new JavaAttributeInfo($this);
-
- }
-
- $this->MethodInvoker = new JavaMethodInvoker($this);
-
- // find clinit
- foreach ($this->getMethods() as $method) {
-
- if ($this->cpInfo[$method->getNameIndex()]->getString() === '') {
-
- // call clinit
- call_user_func_array(array(
- $this->MethodInvoker,
- ''
- ), array());
-
- }
-
- }
-
- }
-
- /**
- * Constant Poolの情報を取得します。
- */
- private function __CpInfo () {
-
- // read tag
- switch ($this->JavaBinaryStream->readUnsignedByte()) {
-
- case JavaClassConstantEnum::CONSTANT_Class:
-
- return new JavaStructureClass($this);
-
- break;
- case JavaClassConstantEnum::CONSTANT_Fieldref:
-
- return new JavaStructureFieldref($this);
-
- break;
- case JavaClassConstantEnum::CONSTANT_Methodref:
-
- return new JavaStructureMethodref($this);
-
- break;
- case JavaClassConstantEnum::CONSTANT_InterfaceMethodref:
-
- return new JavaStructureInterfaceMethodref($this);
-
- break;
- case JavaClassConstantEnum::CONSTANT_String:
-
- return new JavaStructureString($this);
-
- break;
- case JavaClassConstantEnum::CONSTANT_Integer:
-
- return new JavaStructureInteger($this);
-
- break;
- case JavaClassConstantEnum::CONSTANT_Float:
-
- return new JavaStructureFloat($this);
-
- break;
- case JavaClassConstantEnum::CONSTANT_Long:
-
- return new JavaStructureLong($this);
-
- break;
- case JavaClassConstantEnum::CONSTANT_Double:
-
-
- return new JavaStructureDouble($this);
-
- break;
- case JavaClassConstantEnum::CONSTANT_NameAndType:
-
- return new JavaStructureNameAndType($this);
-
- break;
- case JavaClassConstantEnum::CONSTANT_Utf8:
-
- return new JavaStructureUtf8($this);
-
- break;
-
- }
-
- }
-
- /**
- * フィールドの情報を取得します。
- * @return JavaStructureFieldInfo
- */
- private function __Fields () {
-
- return new JavaStructureFieldInfo($this);
-
- }
-
- /**
- * メソッドの情報を取得します。
- * @return JavaStructureMethodInfo
- */
- private function __Method () {
-
- return new JavaStructureMethodInfo($this);
-
- }
-
- /**
- * 読み込まれているファイルのハンドルを取得します。
- * @return resource
- */
- public function getHandle () {
-
- return $this->Handle;
-
- }
-
- /**
- * Constant Poolの情報を取得します。
- * @return object
- */
- public function getCpInfo () {
-
- return $this->cpInfo;
-
- }
-
- /**
- * メソッドの情報を取得します。
- * @return JavaStructureMethodInfo[]
- */
- public function getMethods () {
-
- return $this->Methods;
-
- }
-
- /**
- * メソッドの情報を取得します。
- * @return JavaStructureFieldInfo[]
- */
- public function getFields () {
-
- return $this->Fields;
-
- }
-
- /**
- * Javaのメソッドを呼び出すオブジェクトを取得します。
- * @return JavaMethodInvoker
- */
- public function getMethodInvoker () {
-
- return $this->MethodInvoker;
-
- }
-
- /**
- * Javaの引数やクラス定義におけるシグネチャを取得します。
- * @return array
- */
- public static function parseSignature ($signature) {
-
- return self::_parseSignature($signature);
-
- }
-
- /**
- * Javaの引数やクラス定義におけるシグネチャを取得します。
- * @return array
- */
- private static function _parseSignature ($signature, $i = 0) {
-
- $data = array();
- $deepArray = 0;
-
- for ($size = strlen($signature); $i < $size; ) {
-
- switch ($signature[$i]) {
-
- case 'B':
- case 'C':
- case 'D':
- case 'F':
- case 'I':
- case 'J':
- case 'S':
- case 'V':
- case 'Z':
-
- $data[] = array(
-
- 'type' => self::_getSignatureType($signature[$i]),
- 'deepArray' => $deepArray
-
- );
-
- $deepArray = 0;
-
-
-
- break;
- case 'L':
-
- // class name
- $build = '';
-
- // read to ;
- for ($i++; $i < $size && $signature[$i] !== ';'; $i++) {
-
- $build .= $signature[$i];
-
- }
-
- $data[] = array(
-
- 'type' => 'class',
- 'deepArray' => $deepArray,
- 'className' => $build
-
- );
-
- $deepArray = 0;
-
- break;
- case '[':
-
- // array
- $deepArray++;
-
- for ($i++; $signature[$i] === '['; $i++) {
-
- $deepArray++;
-
- }
-
- // loop
- continue 2;
-
- break;
- case '(':
-
- $build = '';
-
- // read to )
- for ($i++; $i < $size && $signature[$i] !== ')'; $i++) {
-
- $build .= $signature[$i];
-
- }
-
- $data['arguments'] = ($build !== '') ? self::_parseSignature($build) : array();
- $data['argumentsCount'] = sizeof($data['arguments']);
-
- break;
-
- }
-
- $i++;
-
- }
-
- return $data;
-
- }
-
- /**
- * シグネチャにおける型付を取得します。
- * @return string
- */
- public static function _getSignatureType ($signature) {
-
- switch ($signature) {
-
- case 'B': return 'byte';
- case 'C': return 'char';
- case 'D': return 'double';
- case 'F': return 'float';
- case 'I': return 'int';
- case 'J': return 'long';
- case 'S': return 'short';
- case 'V': return 'void';
- case 'Z': return 'boolean';
-
- }
-
- return 'Undefined';
-
- }
-
- /**
- * メソッド実行時のトレース情報を格納します。
- *
- * @param string $methodName 実行されたメソッド名を指定します。
- * @param string $accessibility メソッドにおけるアクセス修飾子を指定します。
- * @param array $signature パースされたシグネチャの情報を指定します。
- * @return void
- */
- public function appendMethodTrace ($methodName, $accessibility, $signature) {
-
- $arguments = array();
-
- foreach ($signature['arguments'] as $argument) {
-
- $arguments[] = str_replace('/', '.', ($argument['type'] === 'class' ? $argument['className'] : $argument['type'])) . str_repeat('[]', $argument['deepArray']);
-
- }
-
- $this->TraceHeader .= implode(' ', $accessibility) . ' ' . str_replace('/', '.', ($signature[0]['type'] === 'class' ? $signature[0]['className'] : $signature[0]['type'])) . ' ' . $methodName . ' (' . implode(', ', $arguments) . ')' . "\n";
-
- }
-
- /**
- * 実行されたバイトコードのトレースをします。
- *
- * @param int $opcode オペレーションコードを指定します。
- * @param int $programCounter オペレーションコードがどこまで実行されたか指定します。
- * @param array $stacks 現状のスタックの状況を指定します。
- * @param array $operands 渡されているオペランドの情報を指定します。
- * @return void
- */
- public function appendTrace ($opcode, $programCounter, $stacks, $operands) {
-
- $mnemonic = new JavaMnemonicEnum();
-
- $mnemonicName = preg_replace('/^MNEMONIC_/', '', $mnemonic->getName($opcode));
-
- foreach ($operands as $key => $operand) {
-
- if (is_object($operands[$key])) {
-
- $operands[$key] = '#' . get_class($operands[$key]);
-
- }
-
- }
-
- $this->Trace .= '#' . $programCounter . "\t" . sprintf('0x%02X', $opcode) . "\t" . $mnemonicName . (strlen($mnemonicName) < 8 ? "\t" : '') . "\t" . sizeof($stacks) . "\t" . implode("\t", $operands) . "\n";
-
- }
-
- /**
- * トレースのヘッダー情報を定義します。
- *
- * @return string
- */
- private function traceHeader () {
-
- $trace = '';
-
- $trace .= $this->TraceHeader;
- $trace .= "PC\tOPCODE\tMNEMONIC\tSTACKS\tOPERAND(s)\n";
- $trace .= "----------------------------------------------------------------\n";
- return $trace;
-
- }
-
- /**
- * トレース情報を別の変数に移し替えます。
- * @return void
- */
- public function traceCompletion () {
-
- $trace = $this->traceHeader();
- $this->TraceBuffering[] = $trace . $this->Trace;
-
- $this->TraceHeader = '';
- $this->Trace = '';
-
-
- }
-
- /**
- * 現時点までに実行されたオペコードのトレース情報を出力します。
- *
- * @return string
- */
- public function traceDump () {
- echo $this->traceHeader();
- echo $this->Trace;
- }
-
- /**
- * トレース情報を出力します。
- *
- * @return void
- */
- public function trace () {
-
- echo implode("\n", $this->TraceBuffering);
-
- }
-
- /**
- * Javaのバイトコードを読み取っているストリームを返します。
- *
- * @return JavaBinaryStream
- */
- public function getJavaBinaryStream () {
-
- return $this->JavaBinaryStream;
-
- }
-
- /**
- * 読み込んでいる対象のクラスの情報を返します。
- *
- * @return object
- */
- public function getThisClass () {
-
- return $this->cpInfo[$this->ThisClass];
-
- }
-
- /**
- * 読み込んでいる対象の親クラスの情報を返します。
- *
- * @return object
- */
- public function getSuperClass () {
-
- return $this->cpInfo[$this->SuperClass];
-
- }
-
- /**
- * 管理しているjarファイルを定義します。
- *
- * @return void
- */
- public function setManipulator (JavaManipulator &$manipulator) {
-
- $this->Manipulator = $manipulator;
-
- }
-
- /**
- * 管理しているjarファイルを返します
- *
- * @return JavaManipulator
- */
- public function getManipulator () {
-
- return $this->Manipulator;
-
- }
-
- /**
- * アトリビュートの情報を返します
- *
- * @return JavaAttributeInfo[]
- */
- public function getAttributeInfo () {
-
- return $this->AttributeInfo;
-
- }
-
- /**
- * 読み込んでいるクラスファイルの情報を返します
- *
- * @return string
- */
- public function getClassFile () {
-
- return $this->ClassFile;
-
- }
-
- /**
- * このクラスにおける静的なメンバを定義します。
- *
- * @return void
- */
- public function setStatic ($key, $value) {
-
- $this->ClassFields->Statics->{$key} = $value;
-
- }
-
- /**
- * このクラスにおける動的なメンバを定義します。
- *
- * @return void
- */
- public function setInstance ($key, $value) {
-
- $this->ClassFields->Instances->{$key} = $value;
-
- }
-
- /**
- * このクラスにおける静的なメンバを返します
- *
- * @param mixed $key Javaで定義されている変数名を指定
- * @return mixed
- */
- public function getStatic ($key) {
-
- return isset($this->ClassFields->Statics->{$key}) ? $this->ClassFields->Statics->{$key} : null;
-
- }
-
- /**
- * このクラスにおける動的なメンバを返します
- *
- * @param mixed $key Javaで定義されている変数名を指定
- * @return mixed
- */
- public function getInstance ($key) {
-
- return isset($this->ClassFields->Instances->{$key}) ? $this->ClassFields->Instances->{$key} : null;
-
- }
-
- /**
- * Javaのコンストラクタを呼びます。
- *
- * @param mixed $... コンストラクタに渡す引数を指定します。
- * @return JavaMethodInvoker
- */
- public function construct () {
- $instance = new JavaMethodInvoker($this, true);
-
- $args = func_get_args();
-
- // find init
- foreach ($this->getMethods() as $method) {
-
- if ($this->cpInfo[$method->getNameIndex()]->getString() === '') {
-
- // call init
- call_user_func_array(array(
- $instance,
- ''
- ), $args);
- break;
-
- }
-
- }
-
- return $instance;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Core/JavaDecompile.php b/PHPJava/Core/JavaDecompile.php
deleted file mode 100644
index 413c3266..00000000
--- a/PHPJava/Core/JavaDecompile.php
+++ /dev/null
@@ -1,7 +0,0 @@
-Classes[] = new JavaManipulatorInfo($class, $archive);
-
- $class->setManipulator($this);
-
- return $class->getMethodInvoker();
-
- }
-
- public function __get ($className) {
-
- foreach ($this->Classes as &$class) {
-
- $cpInfo = $class->getClass()->getCpInfo();
-
- if ($cpInfo[$class->getClass()->getThisClass()->getClassIndex()]->getString() === $className) {
-
- return $class;
-
- }
-
- }
-
- throw new JavaManipulatorException('Not found class');
-
- }
-
- public function getRegisteredClasses () {
-
- return sizeof($this->Classses);
-
- }
-
- public function getRegisteredArchives () {
-
- return sizeof($this->Archives);
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Core/JavaManipulatorInfo.php b/PHPJava/Core/JavaManipulatorInfo.php
deleted file mode 100644
index be05602c..00000000
--- a/PHPJava/Core/JavaManipulatorInfo.php
+++ /dev/null
@@ -1,27 +0,0 @@
-Class = $class;
- $this->Archive = $archive;
-
- }
-
- public function getClass () {
-
- return $this->Class;
-
- }
-
- public function getArchive () {
-
- return $this->Archive;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Enums/JavaAccessFlagEnum.php b/PHPJava/Enums/JavaAccessFlagEnum.php
deleted file mode 100644
index 42594b1f..00000000
--- a/PHPJava/Enums/JavaAccessFlagEnum.php
+++ /dev/null
@@ -1,14 +0,0 @@
-_constructed = $constructed;
- }
-
- /**
- * Javaのメンバをコールします。
- *
- * @param $fieldName フィールド名
- * @return mixed
- */
- public function __get ($fieldName) {
-
- $cpInfo = $this->getClass()->getCpInfo();
-
- foreach ($this->getClass()->getFields() as $fieldInfo) {
-
- $cpFieldName = $cpInfo[$fieldInfo->getNameIndex()]->getString();
-
- if ($fieldName === $cpFieldName) {
-
- $accessibility = $this->_getAccessiblity($fieldInfo);
- $fieldSignature = JavaClass::parseSignature($cpInfo[$fieldInfo->getDescriptorIndex()]->getString());
-
- // 静的メンバの場合
- if (in_array('static', $accessibility)) {
- return $this->getClass()->getStatic($fieldName);
- }
- $type = 'JavaType' . ucfirst($fieldSignature[0]['type']);
- return new $type($this->getClass()->getInstance($fieldName));
- }
- }
-
- throw new JavaInvokerException('undefined field "' . $fieldName . '"');
-
- }
-
- /**
- * Javaのメンバの値を設定します。
- *
- * @param string $fieldName フィールド名
- * @param mixed $value 書き換える値
- * @return mixed
- */
- public function __set($fieldName, $value) {
-
- $cpInfo = $this->getClass()->getCpInfo();
-
- foreach ($this->getClass()->getFields() as $fieldInfo) {
-
- $cpFieldName = $cpInfo[$fieldInfo->getNameIndex()]->getString();
-
- if ($fieldName === $cpFieldName) {
-
- $accessibility = $this->_getAccessiblity($fieldInfo);
- $fieldSignature = JavaClass::parseSignature($cpInfo[$fieldInfo->getDescriptorIndex()]->getString());
-
- // 静的メンバの場合
- if (in_array('static', $accessibility)) {
- $this->getClass()->setStatic($fieldName, $value);
- return;
- }
- $this->getClass()->setInstance($fieldName, $value);
- return;
- }
- }
-
- throw new JavaInvokerException('undefined field "' . $fieldName . '"');
- }
-
- /**
- * Javaのメソッドをエミュレートします。
- *
- * @param $fieldName フィールド名
- * @return mixed
- */
- public function __call ($methodName, $arguments) {
-
- $cpInfo = $this->getClass()->getCpInfo();
-
- foreach ($this->getClass()->getMethods() as $methodInfo) {
-
- $cpMethodName = $cpInfo[$methodInfo->getNameIndex()]->getString();
-
- if ($methodName === $cpMethodName) {
-
- $accessibility = $this->_getAccessiblity($methodInfo);
-
- // メソッドのシグネチャを取得する
- $javaArguments = JavaClass::parseSignature($cpInfo[$methodInfo->getDescriptorIndex()]->getString());
-
- $argumentsCount = sizeof($arguments);
-
- if ($argumentsCount !== $javaArguments['argumentsCount']) {
-
- // 引数の配列の大きさが違う
- continue;
-
- } else {
-
- foreach ($arguments as $argument) {
-
- // 型比較
-
-
- }
-
- }
-
- $this->getClass()->appendMethodTrace($methodName, $accessibility, $javaArguments);
-
- foreach ($methodInfo->getAttributes() as $attribute) {
-
- $attributeData = $attribute->getAttributeData();
-
- if ($attributeData instanceof \JavaCodeAttribute) {
-
- $handle = fopen('php://memory', 'rw');
- fwrite($handle, $attributeData->getCode());
- rewind($handle);
-
- $byteCodeStream = new JavaByteCodeStream($handle);
-
- // 局所変数格納用
- $localstorage = array(
- 0 => null,
- 1 => null,
- 2 => null,
- 3 => null
- );
-
- $i = 0;
- if ($this->_constructed) {
- $localstorage[0] = $this->getClass();
- $i = 1;
- }
-
- foreach ($arguments as $argument) {
-
- $localstorage[$i] = $argument;
- $i++;
-
- }
-
- $stacks = array();
-
- $mnemonic = new JavaMnemonicEnum();
-
- for (; $byteCodeStream->getOffset() < $attributeData->getOpCodeLength(); ) {
-
- $opcode = $byteCodeStream->readUnsignedByte();
-
- $pointer = $byteCodeStream->getOffset() - 1;
-
- $name = 'JavaStatement_' . preg_replace('/^MNEMONIC_/', '', $mnemonic->getName($opcode));
-
- $mnemonicExecutor = dirname(__DIR__) . '/Statements/' . $name . '.php';
-
- if (!is_file($mnemonicExecutor)) {
- throw new JavaInvokerException('"' . $name . ' (' . sprintf('0x02X', $opcode) . ')" of mnemonic is not implemented. please report this message to administrator.');
- }
-
- require_once $mnemonicExecutor;
-
- $statement = new $name($methodName, $this, $byteCodeStream, $stacks, $localstorage, $cpInfo, $attributeData, $pointer);
- $returnValue = $statement->execute();
-
- // write trace
- $this->getClass()->appendTrace($opcode, $pointer, $stacks, $byteCodeStream->getOperands());
-
- if ($returnValue !== null) {
- $this->getClass()->traceCompletion();
- return $returnValue;
- }
-
- }
-
- $this->getClass()->traceCompletion();
- return;
-
- }
-
- }
-
- return;
-
- }
-
-
- }
-
- throw new JavaInvokerException('undefined method "' . $methodName . '"');
-
- }
-
- /**
- * 型の変換を行います
- *
- * @param mixed $value 変換対象を指定
- * @return int 変換された型を返します。
- */
- public function valueOf ($value) {
-
- return (int) $value;
-
- }
-
- /**
- * アクセス修飾子を取得します。
- *
- * @param JavaMethodInfo|JavaFieldInfo $info アクセス修飾子を取得したいストラクチャを指定
- * @return array アクセス修飾子を返します。
- */
- private function _getAccessiblity ($info) {
-
- $accessFlag = new JavaAccessFlagEnum();
- $accessibility = array();
-
- foreach ($accessFlag->getValues() as $value) {
-
- if (($info->getAccessFlag() & $value) != 0) {
-
- $accessibility[] = strtolower(preg_replace('/^CONSTANT_/', '', $accessFlag->getName($value)));
-
- }
-
- }
-
- return $accessibility;
- }
-
-}
diff --git a/PHPJava/Platform/java/io/PrintStream.php b/PHPJava/Platform/java/io/PrintStream.php
deleted file mode 100644
index d89fb0c9..00000000
--- a/PHPJava/Platform/java/io/PrintStream.php
+++ /dev/null
@@ -1,34 +0,0 @@
-getString() . "\n";
-
- } else if (is_string($arg) ||
- is_int($arg) ||
- $arg instanceof \JavaType ||
- $arg instanceof \java\lang\String) {
-
- echo $arg . "\n";
-
- } else if ($arg === null) {
-
- echo "\n";
-
- } else {
-
- throw new \JavaPlatformException('cannot convert to string');
-
- }
-
- }
-
-}
diff --git a/PHPJava/Platform/java/lang/NullPointerException.php b/PHPJava/Platform/java/lang/NullPointerException.php
deleted file mode 100644
index 6a6d89a6..00000000
--- a/PHPJava/Platform/java/lang/NullPointerException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-Object = $Object;
-
- }
-
- public function equals ($Object) {
-
- if ($this->Object instanceof \JavaStructureUtf8) {
-
- if ($Object instanceof \Java\lang\String) {
-
- if ($this->toString() === $Object->toString()) {
-
- return true;
-
- }
-
- } else if ($this->toString() === $Object) {
-
- return true;
-
- }
-
- }
-
- return false;
-
- }
-
- public function toString () {
-
- return $this->Object->getString();
-
- }
-
- public function rawObject () {
-
- return $this->Object;
-
- }
-
- // php magic method
- public function __toString () {
-
- if (!($this->Object instanceof \JavaStructureUtf8)) {
- return (string) $this->Object;
- }
-
- return $this->Object->getString();
-
- }
-
-}
diff --git a/PHPJava/Platform/java/lang/StringBuilder.php b/PHPJava/Platform/java/lang/StringBuilder.php
deleted file mode 100644
index 90222760..00000000
--- a/PHPJava/Platform/java/lang/StringBuilder.php
+++ /dev/null
@@ -1,42 +0,0 @@
-sequence .= $arg->toString();
-
- } else {
-
- $this->sequence .= $arg;
-
- }
-
- return $this;
-
- }
-
- public function toString ($arg = null) {
-
- return $this->sequence;
-
- }
-
- // php magic method
- public function __toString () {
-
- return $this->sequence;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Platform/java/lang/System.php b/PHPJava/Platform/java/lang/System.php
deleted file mode 100644
index 6d743052..00000000
--- a/PHPJava/Platform/java/lang/System.php
+++ /dev/null
@@ -1,9 +0,0 @@
-getStack();
- $arrayref = $this->getStack();
-
- if (!isset($arrayref[$index])) {
-
- throw new JavaArrayIndexOutOfBoundsException($this->getMethodName() . ': ' . $index . ' of array index');
-
- }
-
- $this->pushStack($arrayref[$index]);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_aastore.php b/PHPJava/Statements/JavaStatement_aastore.php
deleted file mode 100644
index e52961a1..00000000
--- a/PHPJava/Statements/JavaStatement_aastore.php
+++ /dev/null
@@ -1,18 +0,0 @@
-getStack();
- $index = $this->getStack();
- $arrayref = $this->getStack();
-
- $arrayref[$index] = $value;
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_aconst_null.php b/PHPJava/Statements/JavaStatement_aconst_null.php
deleted file mode 100644
index d5915e14..00000000
--- a/PHPJava/Statements/JavaStatement_aconst_null.php
+++ /dev/null
@@ -1,14 +0,0 @@
-pushStack(null);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_aload.php b/PHPJava/Statements/JavaStatement_aload.php
deleted file mode 100644
index fdbef9be..00000000
--- a/PHPJava/Statements/JavaStatement_aload.php
+++ /dev/null
@@ -1,16 +0,0 @@
-getByteCodeStream()->readByte();
-
- $this->pushStack($this->getLocalstorage($index));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_aload_0.php b/PHPJava/Statements/JavaStatement_aload_0.php
deleted file mode 100644
index b10ea9ec..00000000
--- a/PHPJava/Statements/JavaStatement_aload_0.php
+++ /dev/null
@@ -1,14 +0,0 @@
-pushStack($this->getLocalstorage(0));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_aload_1.php b/PHPJava/Statements/JavaStatement_aload_1.php
deleted file mode 100644
index f810606f..00000000
--- a/PHPJava/Statements/JavaStatement_aload_1.php
+++ /dev/null
@@ -1,15 +0,0 @@
-pushStack($this->getLocalstorage(1));
-
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_aload_2.php b/PHPJava/Statements/JavaStatement_aload_2.php
deleted file mode 100644
index 44906067..00000000
--- a/PHPJava/Statements/JavaStatement_aload_2.php
+++ /dev/null
@@ -1,14 +0,0 @@
-pushStack($this->getLocalstorage(2));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_aload_3.php b/PHPJava/Statements/JavaStatement_aload_3.php
deleted file mode 100644
index df78b6e2..00000000
--- a/PHPJava/Statements/JavaStatement_aload_3.php
+++ /dev/null
@@ -1,14 +0,0 @@
-pushStack($this->getLocalstorage(3));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_areturn.php b/PHPJava/Statements/JavaStatement_areturn.php
deleted file mode 100644
index 053d45da..00000000
--- a/PHPJava/Statements/JavaStatement_areturn.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_arraylength.php b/PHPJava/Statements/JavaStatement_arraylength.php
deleted file mode 100644
index fd90efc0..00000000
--- a/PHPJava/Statements/JavaStatement_arraylength.php
+++ /dev/null
@@ -1,13 +0,0 @@
-getStack();
-
- $this->pushStack(sizeof($arrayref));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_astore.php b/PHPJava/Statements/JavaStatement_astore.php
deleted file mode 100644
index 95474cc9..00000000
--- a/PHPJava/Statements/JavaStatement_astore.php
+++ /dev/null
@@ -1,12 +0,0 @@
-getByteCodeStream()->readUnsignedByte();
- $this->setLocalstorage($index, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_astore_0.php b/PHPJava/Statements/JavaStatement_astore_0.php
deleted file mode 100644
index 2e8265df..00000000
--- a/PHPJava/Statements/JavaStatement_astore_0.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(0, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_astore_1.php b/PHPJava/Statements/JavaStatement_astore_1.php
deleted file mode 100644
index 1ce1a0de..00000000
--- a/PHPJava/Statements/JavaStatement_astore_1.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(1, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_astore_2.php b/PHPJava/Statements/JavaStatement_astore_2.php
deleted file mode 100644
index d81e9e28..00000000
--- a/PHPJava/Statements/JavaStatement_astore_2.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(2, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_astore_3.php b/PHPJava/Statements/JavaStatement_astore_3.php
deleted file mode 100644
index 8622de5f..00000000
--- a/PHPJava/Statements/JavaStatement_astore_3.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(3, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_athrow.php b/PHPJava/Statements/JavaStatement_athrow.php
deleted file mode 100644
index 9c1698b9..00000000
--- a/PHPJava/Statements/JavaStatement_athrow.php
+++ /dev/null
@@ -1,30 +0,0 @@
-getCpInfo();
-
- $objectref = $this->getStack();
-
- $className = str_replace('\\', '/', get_class($objectref));
-
- foreach ($this->getAttributeData()->getExceptionTables() as $exception) {
-
- if ($cpInfo[$cpInfo[$exception->getCatchType()]->getClassIndex()]->getString() === $className &&
- $exception->getStartPc() <= $this->getPointer() &&
- $exception->getEndPc() >= $this->getPointer()) {
-
- $this->getByteCodeStream()->setOffset($exception->getHandlerPc());
- return;
-
- }
-
- }
-
- throw new JavaStatementException('exception table was broken.');
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_baload.php b/PHPJava/Statements/JavaStatement_baload.php
deleted file mode 100644
index 3512b38b..00000000
--- a/PHPJava/Statements/JavaStatement_baload.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack($this->getByteCodeStream()->readByte());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_breakpoint.php b/PHPJava/Statements/JavaStatement_breakpoint.php
deleted file mode 100644
index 3c28d1fd..00000000
--- a/PHPJava/Statements/JavaStatement_breakpoint.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::add($value1, $value2, 8));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_daload.php b/PHPJava/Statements/JavaStatement_daload.php
deleted file mode 100644
index 600bb5f4..00000000
--- a/PHPJava/Statements/JavaStatement_daload.php
+++ /dev/null
@@ -1,17 +0,0 @@
-getStack();
- $arrayref = $this->getStack();
-
- $this->pushStack($arrayref[$index]);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dastore.php b/PHPJava/Statements/JavaStatement_dastore.php
deleted file mode 100644
index b006dc10..00000000
--- a/PHPJava/Statements/JavaStatement_dastore.php
+++ /dev/null
@@ -1,18 +0,0 @@
-getStack();
- $index = $this->getStack();
- $arrayref = $this->getStack();
-
- $arrayref[$index] = $value;
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dcmpg.php b/PHPJava/Statements/JavaStatement_dcmpg.php
deleted file mode 100644
index 9a74dd52..00000000
--- a/PHPJava/Statements/JavaStatement_dcmpg.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(0);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dconst_1.php b/PHPJava/Statements/JavaStatement_dconst_1.php
deleted file mode 100644
index d44caee4..00000000
--- a/PHPJava/Statements/JavaStatement_dconst_1.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(1);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ddiv.php b/PHPJava/Statements/JavaStatement_ddiv.php
deleted file mode 100644
index d51b2d6f..00000000
--- a/PHPJava/Statements/JavaStatement_ddiv.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getByteCodeStream()->readUnsignedByte();
- $this->pushStack($this->getLocalstorage($index));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dload_0.php b/PHPJava/Statements/JavaStatement_dload_0.php
deleted file mode 100644
index 1d88a1ae..00000000
--- a/PHPJava/Statements/JavaStatement_dload_0.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::multiply($value1, $value2, 8));
-
-
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dneg.php b/PHPJava/Statements/JavaStatement_dneg.php
deleted file mode 100644
index bb4667e3..00000000
--- a/PHPJava/Statements/JavaStatement_dneg.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dstore.php b/PHPJava/Statements/JavaStatement_dstore.php
deleted file mode 100644
index 024d2218..00000000
--- a/PHPJava/Statements/JavaStatement_dstore.php
+++ /dev/null
@@ -1,17 +0,0 @@
-getByteCodeStream()->readUnsignedByte();
- $value = $this->getStack();
-
- $this->setLocalstorage($index, BinaryTools::convertDoubleToIEEE754($value));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dstore_0.php b/PHPJava/Statements/JavaStatement_dstore_0.php
deleted file mode 100644
index 8e53ac99..00000000
--- a/PHPJava/Statements/JavaStatement_dstore_0.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(0, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dstore_1.php b/PHPJava/Statements/JavaStatement_dstore_1.php
deleted file mode 100644
index d9bdb378..00000000
--- a/PHPJava/Statements/JavaStatement_dstore_1.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(1, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dstore_2.php b/PHPJava/Statements/JavaStatement_dstore_2.php
deleted file mode 100644
index 6b45400a..00000000
--- a/PHPJava/Statements/JavaStatement_dstore_2.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(2, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dstore_3.php b/PHPJava/Statements/JavaStatement_dstore_3.php
deleted file mode 100644
index e1bfda96..00000000
--- a/PHPJava/Statements/JavaStatement_dstore_3.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(3, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dsub.php b/PHPJava/Statements/JavaStatement_dsub.php
deleted file mode 100644
index c3ace5fa..00000000
--- a/PHPJava/Statements/JavaStatement_dsub.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $rightValue = $this->getStack();
-
- $this->pushStack(BinaryTools::sub($leftValue, $rightValue, 8));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dup.php b/PHPJava/Statements/JavaStatement_dup.php
deleted file mode 100644
index 6fc18a19..00000000
--- a/PHPJava/Statements/JavaStatement_dup.php
+++ /dev/null
@@ -1,11 +0,0 @@
-dupStack();
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_dup2.php b/PHPJava/Statements/JavaStatement_dup2.php
deleted file mode 100644
index cd36b202..00000000
--- a/PHPJava/Statements/JavaStatement_dup2.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_fstore.php b/PHPJava/Statements/JavaStatement_fstore.php
deleted file mode 100644
index ac863f18..00000000
--- a/PHPJava/Statements/JavaStatement_fstore.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getCpInfo();
-
- $cp = $cpInfo[$this->getByteCodeStream()->readUnsignedShort()];
-
- $get = $this->getStack();
-
- $return = $get->getInstance($cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString());
-
- if ($return !== null) {
-
- $this->pushStack($return);
-
- } else {
-
- throw new JavaStatementException('Cannot get ' . $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString() . '');
-
- }
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_getstatic.php b/PHPJava/Statements/JavaStatement_getstatic.php
deleted file mode 100644
index ba527746..00000000
--- a/PHPJava/Statements/JavaStatement_getstatic.php
+++ /dev/null
@@ -1,44 +0,0 @@
-getCpInfo();
-
- $cp = $cpInfo[$this->getByteCodeStream()->readUnsignedShort()];
-
- $class = $cpInfo[$cpInfo[$cp->getClassIndex()]->getClassIndex()]->getString();
-
- $signature = JavaClass::parseSignature($cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getDescriptorIndex()]->getString());
-
- foreach ($this->getInvoker()->getClass()->getFields() as $field) {
-
- if ($cpInfo[$field->getNameIndex()]->getString() === $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString()) {
-
- // push stack
- $this->pushStack($this->getInvoker()->getClass()->getStatic($cpInfo[$field->getNameIndex()]->getString()));
-
- return;
-
- }
-
- }
-
- if (isset($signature[0]['className'])) {
-
- $this->getInvoker()->loadPlatform($class);
- $this->getInvoker()->loadPlatform($signature[0]['className']);
- $className = str_replace('/', '\\', $signature[0]['className']);
-
- $this->pushStack(new $className());
- return;
-
- }
-
- throw new JavaStatementException('Has not class or field');
-
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_goto.php b/PHPJava/Statements/JavaStatement_goto.php
deleted file mode 100644
index 3c7efc8b..00000000
--- a/PHPJava/Statements/JavaStatement_goto.php
+++ /dev/null
@@ -1,13 +0,0 @@
-getByteCodeStream()->readShort();
-
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offset);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_goto_w.php b/PHPJava/Statements/JavaStatement_goto_w.php
deleted file mode 100644
index beaf2033..00000000
--- a/PHPJava/Statements/JavaStatement_goto_w.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack();
-
- $this->pushStack(base_convert(substr(sprintf('%032s', base_convert($value, 10, 2)), 16), 2, 10));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iadd.php b/PHPJava/Statements/JavaStatement_iadd.php
deleted file mode 100644
index d1842c6e..00000000
--- a/PHPJava/Statements/JavaStatement_iadd.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $rightValue = $this->getStack();
-
- $this->pushStack(BinaryTools::add($leftValue, $rightValue, 4));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iaload.php b/PHPJava/Statements/JavaStatement_iaload.php
deleted file mode 100644
index a58db46e..00000000
--- a/PHPJava/Statements/JavaStatement_iaload.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $arrayref = $this->getStack();
-
- $this->pushStack($arrayref[$index]);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iand.php b/PHPJava/Statements/JavaStatement_iand.php
deleted file mode 100644
index 5ff1166c..00000000
--- a/PHPJava/Statements/JavaStatement_iand.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::andBits($value1, $value2, 4));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iastore.php b/PHPJava/Statements/JavaStatement_iastore.php
deleted file mode 100644
index 87ea436c..00000000
--- a/PHPJava/Statements/JavaStatement_iastore.php
+++ /dev/null
@@ -1,15 +0,0 @@
-getStack();
- $arrayref = $this->getStack();
- $value = $this->getStack();
-
- $value[$arrayref] = $data;
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iconst_0.php b/PHPJava/Statements/JavaStatement_iconst_0.php
deleted file mode 100644
index 8be84ef1..00000000
--- a/PHPJava/Statements/JavaStatement_iconst_0.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(0);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iconst_1.php b/PHPJava/Statements/JavaStatement_iconst_1.php
deleted file mode 100644
index 85f5b44e..00000000
--- a/PHPJava/Statements/JavaStatement_iconst_1.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(1);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iconst_2.php b/PHPJava/Statements/JavaStatement_iconst_2.php
deleted file mode 100644
index 425fc06f..00000000
--- a/PHPJava/Statements/JavaStatement_iconst_2.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(2);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iconst_3.php b/PHPJava/Statements/JavaStatement_iconst_3.php
deleted file mode 100644
index 89d1dab6..00000000
--- a/PHPJava/Statements/JavaStatement_iconst_3.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(3);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iconst_4.php b/PHPJava/Statements/JavaStatement_iconst_4.php
deleted file mode 100644
index 403714aa..00000000
--- a/PHPJava/Statements/JavaStatement_iconst_4.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(4);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iconst_5.php b/PHPJava/Statements/JavaStatement_iconst_5.php
deleted file mode 100644
index 0ea93695..00000000
--- a/PHPJava/Statements/JavaStatement_iconst_5.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(5);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iconst_m1.php b/PHPJava/Statements/JavaStatement_iconst_m1.php
deleted file mode 100644
index 8c6d4585..00000000
--- a/PHPJava/Statements/JavaStatement_iconst_m1.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(-1);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_idiv.php b/PHPJava/Statements/JavaStatement_idiv.php
deleted file mode 100644
index 447bcb7e..00000000
--- a/PHPJava/Statements/JavaStatement_idiv.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getByteCodeStream()->readShort();
-
- $leftOperand = $this->getStack();
- $rightOperand = $this->getStack();
-
- if ($leftOperand === $rightOperand) {
-
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offset);
-
- }
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_if_acmpne.php b/PHPJava/Statements/JavaStatement_if_acmpne.php
deleted file mode 100644
index d1b3f4d1..00000000
--- a/PHPJava/Statements/JavaStatement_if_acmpne.php
+++ /dev/null
@@ -1,20 +0,0 @@
-getByteCodeStream()->readShort();
-
- $leftOperand = $this->getStack();
- $rightOperand = $this->getStack();
-
- if ($leftOperand !== $rightOperand) {
-
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offset);
-
- }
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_if_icmpeq.php b/PHPJava/Statements/JavaStatement_if_icmpeq.php
deleted file mode 100644
index 80751cba..00000000
--- a/PHPJava/Statements/JavaStatement_if_icmpeq.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getByteCodeStream()->readShort();
-
- $leftOperand = $this->getStack();
- $rightOperand = $this->getStack();
-
- if ($leftOperand <= $rightOperand) {
-
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offset);
-
- }
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_if_icmpgt.php b/PHPJava/Statements/JavaStatement_if_icmpgt.php
deleted file mode 100644
index d8179f62..00000000
--- a/PHPJava/Statements/JavaStatement_if_icmpgt.php
+++ /dev/null
@@ -1,21 +0,0 @@
-getByteCodeStream()->readShort();
-
- $leftOperand = $this->getStack();
- $rightOperand = $this->getStack();
-
- if ($leftOperand < $rightOperand) {
-
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offset);
-
- }
-
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_if_icmple.php b/PHPJava/Statements/JavaStatement_if_icmple.php
deleted file mode 100644
index 9beeb4a8..00000000
--- a/PHPJava/Statements/JavaStatement_if_icmple.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getByteCodeStream()->readShort();
-
- $leftOperand = $this->getStack();
- $rightOperand = $this->getStack();
-
- if ($rightOperand < $leftOperand) {
-
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offset);
-
- }
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_if_icmpne.php b/PHPJava/Statements/JavaStatement_if_icmpne.php
deleted file mode 100644
index e68bca61..00000000
--- a/PHPJava/Statements/JavaStatement_if_icmpne.php
+++ /dev/null
@@ -1,20 +0,0 @@
-getByteCodeStream()->readShort();
-
- $leftOperand = $this->getStack();
- $rightOperand = $this->getStack();
-
- if ($leftOperand != $rightOperand) {
-
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offset);
-
- }
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ifeq.php b/PHPJava/Statements/JavaStatement_ifeq.php
deleted file mode 100644
index 43c45ee6..00000000
--- a/PHPJava/Statements/JavaStatement_ifeq.php
+++ /dev/null
@@ -1,20 +0,0 @@
-getByteCodeStream()->readShort();
-
- $operand = $this->getStack();
-
- if ($operand == 0) {
-
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offset);
-
- }
-
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ifge.php b/PHPJava/Statements/JavaStatement_ifge.php
deleted file mode 100644
index 4ad6d881..00000000
--- a/PHPJava/Statements/JavaStatement_ifge.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getByteCodeStream()->readShort();
-
- $operand = $this->getStack();
-
- if ($operand != 0) {
-
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offset);
-
- }
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ifnonnull.php b/PHPJava/Statements/JavaStatement_ifnonnull.php
deleted file mode 100644
index 16e0933a..00000000
--- a/PHPJava/Statements/JavaStatement_ifnonnull.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getByteCodeStream()->readUnsignedByte();
- $const = $this->getByteCodeStream()->readByte();
-
- $this->setLocalstorage($index, $this->getLocalstorage($index) + $const);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iload.php b/PHPJava/Statements/JavaStatement_iload.php
deleted file mode 100644
index 508e6065..00000000
--- a/PHPJava/Statements/JavaStatement_iload.php
+++ /dev/null
@@ -1,13 +0,0 @@
-getByteCodeStream()->readUnsignedByte();
-
- $this->pushStack($this->getLocalstorage($index));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iload_0.php b/PHPJava/Statements/JavaStatement_iload_0.php
deleted file mode 100644
index 34a2d685..00000000
--- a/PHPJava/Statements/JavaStatement_iload_0.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack($this->getLocalstorage(0));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iload_1.php b/PHPJava/Statements/JavaStatement_iload_1.php
deleted file mode 100644
index a3960caf..00000000
--- a/PHPJava/Statements/JavaStatement_iload_1.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack($this->getLocalstorage(1));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iload_2.php b/PHPJava/Statements/JavaStatement_iload_2.php
deleted file mode 100644
index 85d80206..00000000
--- a/PHPJava/Statements/JavaStatement_iload_2.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack($this->getLocalstorage(2));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iload_3.php b/PHPJava/Statements/JavaStatement_iload_3.php
deleted file mode 100644
index 8f53fab1..00000000
--- a/PHPJava/Statements/JavaStatement_iload_3.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack($this->getLocalstorage(3));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_impdep1.php b/PHPJava/Statements/JavaStatement_impdep1.php
deleted file mode 100644
index 1e4c87eb..00000000
--- a/PHPJava/Statements/JavaStatement_impdep1.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::multiply($value1, $value2, 4));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ineg.php b/PHPJava/Statements/JavaStatement_ineg.php
deleted file mode 100644
index 715dedf6..00000000
--- a/PHPJava/Statements/JavaStatement_ineg.php
+++ /dev/null
@@ -1,13 +0,0 @@
-getStack();
-
- $this->pushStack(BinaryTools::negate($value, 4));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_instanceof.php b/PHPJava/Statements/JavaStatement_instanceof.php
deleted file mode 100644
index 379a6e46..00000000
--- a/PHPJava/Statements/JavaStatement_instanceof.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getCpInfo();
-
-
- $cp = $cpInfo[$this->getByteCodeStream()->readUnsignedShort()];
-
- // $invokeClassName = '\\' . str_replace('/', '\\', $cpList[$class->getClassIndex()]->getString());
-
-
- $nameAndTypeIndex = $cpInfo[$cp->getNameAndTypeIndex()];
-
- // signature
- $signature = JavaClass::parseSignature($cpInfo[$nameAndTypeIndex->getDescriptorIndex()]->getString());
-
- $invokeClassName = $this->getStack();
-
- $arguments = array();
-
- for ($i = 0; $i < $signature['argumentsCount']; $i++) {
-
- $arguments[] = $this->getStack();
-
- }
-
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_invokestatic.php b/PHPJava/Statements/JavaStatement_invokestatic.php
deleted file mode 100644
index bf98cf83..00000000
--- a/PHPJava/Statements/JavaStatement_invokestatic.php
+++ /dev/null
@@ -1,39 +0,0 @@
-getCpInfo();
-
- $cp = $cpInfo[$this->getByteCodeStream()->readUnsignedShort()];
-
- $methodName = $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString();
-
- $signature = JavaClass::parseSignature($cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getDescriptorIndex()]->getString());
-
- $arguments = array();
-
- for ($i = 0; $i < $signature['argumentsCount']; $i++) {
-
- $arguments[] = $this->getStack();
-
- }
-
- krsort($arguments);
-
- // call invoker
- $return = call_user_func_array(array(
- $this->getInvoker(),
- $methodName
- ), $arguments);
-
- if ($signature[0]['type'] !== 'void') {
-
- $this->pushStack($return);
-
- }
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_invokevirtual.php b/PHPJava/Statements/JavaStatement_invokevirtual.php
deleted file mode 100644
index f6d4fecc..00000000
--- a/PHPJava/Statements/JavaStatement_invokevirtual.php
+++ /dev/null
@@ -1,61 +0,0 @@
-getCpInfo();
-
- $cp = $cpInfo[$this->getByteCodeStream()->readUnsignedShort()];
-
- $class = $cpInfo[$cpInfo[$cp->getClassIndex()]->getClassIndex()]->getString();
-
- $nameAndTypeIndex = $cpInfo[$cp->getNameAndTypeIndex()];
-
- // signature
- $signature = JavaClass::parseSignature($cpInfo[$nameAndTypeIndex->getDescriptorIndex()]->getString());
- $arguments = array();
-
- for ($i = 0; $i < $signature['argumentsCount']; $i++) {
-
- $arguments[] = $this->getStack();
-
- }
-
- $invokerClass = $this->getStack();
-
- if ($invokerClass instanceof \JavaClass) {
-
- $result = call_user_func_array(array(
-
- $invokerClass->getMethodInvoker(),
- $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString()
-
- ), $arguments);
-
-
- } else {
-
- // load platform
- $this->getInvoker()->loadPlatform($class);
- $invokerClassName = '\\' . str_replace('/', '\\', $class);
-
- $result = call_user_func_array(array(
-
- $invokerClass,
- $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString()
-
- ), $arguments);
-
- }
-
- if ($signature[0]['type'] !== 'void') {
-
- $this->pushStack($result);
-
- }
-
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ior.php b/PHPJava/Statements/JavaStatement_ior.php
deleted file mode 100644
index 4e86b370..00000000
--- a/PHPJava/Statements/JavaStatement_ior.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::orBits($value1, $value2, 4));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_irem.php b/PHPJava/Statements/JavaStatement_irem.php
deleted file mode 100644
index d82eb18c..00000000
--- a/PHPJava/Statements/JavaStatement_irem.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ishl.php b/PHPJava/Statements/JavaStatement_ishl.php
deleted file mode 100644
index 68eca89d..00000000
--- a/PHPJava/Statements/JavaStatement_ishl.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::shiftLeft($value1, $value2, 4));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ishr.php b/PHPJava/Statements/JavaStatement_ishr.php
deleted file mode 100644
index 00ede8c8..00000000
--- a/PHPJava/Statements/JavaStatement_ishr.php
+++ /dev/null
@@ -1,15 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::shiftRight($value1, $value2, 4));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_istore.php b/PHPJava/Statements/JavaStatement_istore.php
deleted file mode 100644
index c5a1e0e8..00000000
--- a/PHPJava/Statements/JavaStatement_istore.php
+++ /dev/null
@@ -1,12 +0,0 @@
-getByteCodeStream()->readUnsignedByte();
- $this->setLocalstorage($index, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_istore_0.php b/PHPJava/Statements/JavaStatement_istore_0.php
deleted file mode 100644
index afa182a7..00000000
--- a/PHPJava/Statements/JavaStatement_istore_0.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(0, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_istore_1.php b/PHPJava/Statements/JavaStatement_istore_1.php
deleted file mode 100644
index 0243f967..00000000
--- a/PHPJava/Statements/JavaStatement_istore_1.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(1, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_istore_2.php b/PHPJava/Statements/JavaStatement_istore_2.php
deleted file mode 100644
index f183ad65..00000000
--- a/PHPJava/Statements/JavaStatement_istore_2.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(2, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_istore_3.php b/PHPJava/Statements/JavaStatement_istore_3.php
deleted file mode 100644
index 04094cc1..00000000
--- a/PHPJava/Statements/JavaStatement_istore_3.php
+++ /dev/null
@@ -1,11 +0,0 @@
-setLocalstorage(3, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_isub.php b/PHPJava/Statements/JavaStatement_isub.php
deleted file mode 100644
index c7be6b4e..00000000
--- a/PHPJava/Statements/JavaStatement_isub.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $rightValue = $this->getStack();
-
- $this->pushStack(BinaryTools::sub($leftValue, $rightValue, 4));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_iushr.php b/PHPJava/Statements/JavaStatement_iushr.php
deleted file mode 100644
index 37c6d4dd..00000000
--- a/PHPJava/Statements/JavaStatement_iushr.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::unsignedShiftRight($value1, $value2, 4));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ixor.php b/PHPJava/Statements/JavaStatement_ixor.php
deleted file mode 100644
index f9096c35..00000000
--- a/PHPJava/Statements/JavaStatement_ixor.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::xorBits($value1, $value2, 4));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_jsr.php b/PHPJava/Statements/JavaStatement_jsr.php
deleted file mode 100644
index cae0798a..00000000
--- a/PHPJava/Statements/JavaStatement_jsr.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::add($value1, $value2, 8));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_laload.php b/PHPJava/Statements/JavaStatement_laload.php
deleted file mode 100644
index dd8d6649..00000000
--- a/PHPJava/Statements/JavaStatement_laload.php
+++ /dev/null
@@ -1,17 +0,0 @@
-getStack();
- $arrayref = $this->getStack();
-
- $this->pushStack($arrayref[$index]);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_land.php b/PHPJava/Statements/JavaStatement_land.php
deleted file mode 100644
index 162d1806..00000000
--- a/PHPJava/Statements/JavaStatement_land.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::andBits($value1, $value2, 8));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lastore.php b/PHPJava/Statements/JavaStatement_lastore.php
deleted file mode 100644
index c93bddcb..00000000
--- a/PHPJava/Statements/JavaStatement_lastore.php
+++ /dev/null
@@ -1,18 +0,0 @@
-getStack();
- $index = $this->getStack();
- $arrayref = $this->getStack();
-
- $arrayref[$index] = $value;
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lcmp.php b/PHPJava/Statements/JavaStatement_lcmp.php
deleted file mode 100644
index b59989e3..00000000
--- a/PHPJava/Statements/JavaStatement_lcmp.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(0);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lconst_1.php b/PHPJava/Statements/JavaStatement_lconst_1.php
deleted file mode 100644
index 705b04a4..00000000
--- a/PHPJava/Statements/JavaStatement_lconst_1.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack(1);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ldc.php b/PHPJava/Statements/JavaStatement_ldc.php
deleted file mode 100644
index 16e3db85..00000000
--- a/PHPJava/Statements/JavaStatement_ldc.php
+++ /dev/null
@@ -1,40 +0,0 @@
-getCpInfo();
-
- $data = $cpInfo[$this->getByteCodeStream()->readUnsignedByte()];
-
- $value = null;
-
- if ($data instanceof \JavaStructureString) {
-
- $value = $cpInfo[$data->getStringIndex()];
-
- if ($value instanceof \JavaStructureUtf8) {
-
- // convert java string
- $this->getInvoker()->loadPlatform('java.lang.String');
-
- $value = new \java\lang\String($value);
-
- }
-
- } else if (($data instanceof \JavaStructureInteger) || ($data instanceof \JavaStructureFloat)) {
-
- $value = $data->getBytes();
-
- } else {
-
- $value = $cpInfo[$cpInfo[$this->getByteCodeStream()->readUnsignedByte()]->getStringIndex()];
-
- }
-
- $this->pushStack($value);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ldc2_w.php b/PHPJava/Statements/JavaStatement_ldc2_w.php
deleted file mode 100644
index b58e51bb..00000000
--- a/PHPJava/Statements/JavaStatement_ldc2_w.php
+++ /dev/null
@@ -1,15 +0,0 @@
-getCpInfo();
-
- $data = $cpInfo[$this->getByteCodeStream()->readUnsignedShort()];
-
- $this->pushStack($data->getBytes());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ldc_w.php b/PHPJava/Statements/JavaStatement_ldc_w.php
deleted file mode 100644
index f5ba644d..00000000
--- a/PHPJava/Statements/JavaStatement_ldc_w.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getByteCodeStream()->readUnsignedByte();
-
- $this->pushStack($this->getLocalstorage($index));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lload_0.php b/PHPJava/Statements/JavaStatement_lload_0.php
deleted file mode 100644
index c6bf30fb..00000000
--- a/PHPJava/Statements/JavaStatement_lload_0.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::multiply($value1, $value2, 8));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lneg.php b/PHPJava/Statements/JavaStatement_lneg.php
deleted file mode 100644
index 70d482b4..00000000
--- a/PHPJava/Statements/JavaStatement_lneg.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack();
-
- $paddingData = $this->getByteCodeStream()->readByte() + $this->getByteCodeStream()->readByte() + $this->getByteCodeStream()->readByte();
-
- $offsets = array();
-
- $offsets['default'] = $this->getByteCodeStream()->readInt();
- $switchSize = $this->getByteCodeStream()->readUnsignedInt();
-
-
- for ($i = 0; $i < $switchSize; $i++) {
-
- $label = $this->getByteCodeStream()->readInt();
-
- $offsets[(string) $label] = $this->getByteCodeStream()->readInt();
-
- }
-
- if (isset($offsets[$key])) {
-
- // goto PC
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offsets[$key]);
- return;
-
- }
-
- // goto default
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offsets['default']);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lor.php b/PHPJava/Statements/JavaStatement_lor.php
deleted file mode 100644
index 143cf270..00000000
--- a/PHPJava/Statements/JavaStatement_lor.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::orBits($value1, $value2, 8));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lrem.php b/PHPJava/Statements/JavaStatement_lrem.php
deleted file mode 100644
index 3bbb6013..00000000
--- a/PHPJava/Statements/JavaStatement_lrem.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lshl.php b/PHPJava/Statements/JavaStatement_lshl.php
deleted file mode 100644
index 90526f12..00000000
--- a/PHPJava/Statements/JavaStatement_lshl.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::shiftLeft($value1, $value2, 8));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lshr.php b/PHPJava/Statements/JavaStatement_lshr.php
deleted file mode 100644
index fbb163d4..00000000
--- a/PHPJava/Statements/JavaStatement_lshr.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::shiftRight($value1, $value2, 8));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lstore.php b/PHPJava/Statements/JavaStatement_lstore.php
deleted file mode 100644
index 351f41ce..00000000
--- a/PHPJava/Statements/JavaStatement_lstore.php
+++ /dev/null
@@ -1,12 +0,0 @@
-getByteCodeStream()->readUnsignedByte();
- $this->setLocalstorage($index, $this->getStack());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lstore_0.php b/PHPJava/Statements/JavaStatement_lstore_0.php
deleted file mode 100644
index 51220b97..00000000
--- a/PHPJava/Statements/JavaStatement_lstore_0.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::sub($value1, $value2, 8));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lushr.php b/PHPJava/Statements/JavaStatement_lushr.php
deleted file mode 100644
index 41e8e90a..00000000
--- a/PHPJava/Statements/JavaStatement_lushr.php
+++ /dev/null
@@ -1,14 +0,0 @@
-getStack();
- $value2 = $this->getStack();
-
- $this->pushStack(BinaryTools::unsignedShiftRight($value1, $value2, 8));
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_lxor.php b/PHPJava/Statements/JavaStatement_lxor.php
deleted file mode 100644
index 6fb819bf..00000000
--- a/PHPJava/Statements/JavaStatement_lxor.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getCpInfo();
-
- $class = $cpInfo[$this->getByteCodeStream()->readUnsignedShort()];
-
- $className = $cpInfo[$class->getClassIndex()]->getString();
-
- if (isset($this->getInvoker()->getClass()->getManipulator()->$className) &&
- $this->getInvoker()->getClass()->getManipulator()->$className !== null) {
-
- // call constructor
- call_user_func_array(
- array(
- $this->getInvoker()->getClass()->getManipulator()->$className->getMethodInvoker(),
- ''
- ),
- array()
- );
-
- $this->pushStack($this->getInvoker()->getClass()->getManipulator()->$className);
-
- } else {
-
- if (($this->getInvoker()->getClass()->getManipulator() !== null &&
- $this->getInvoker()->getClass()->getManipulator()->$className->getArchive() !== null &&
- $this->getInvoker()->getClass()->getManipulator()->$className->getArchive()->hasClass($className)) ||
- is_file(dirname($this->getInvoker()->getClass()->getClassFile()) . '/' . $className . '.class')) {
-
- $javaClass = null;
-
- if ($this->getInvoker()->getClass()->getManipulator() !== null &&
- $this->getInvoker()->getClass()->getManipulator()->$className->getArchive() !== null &&
- $this->getInvoker()->getClass()->getManipulator()->$className->getArchive()->hasClass($className)) {
-
- $javaClass = new JavaClass($className . '.class', $this->getInvoker()->getClass()->getManipulator()->$className->getArchive()->getClassBytecode($className));
-
- } else {
-
- $javaClass = new JavaClass(dirname($this->getInvoker()->getClass()->getClassFile()) . '/' . $className . '.class');
-
- }
-
- $outerClasses = explode('$', $className);
-
- $javaClass->setInstance('this', $javaClass);
-
- for ($i = 1, $size = sizeof($outerClasses); $i < $size; $i++) {
-
- $javaClass->setInstance('this$' . ($i - 1), $this->getInvoker()->getClass()->getManipulator()->{implode('$', array_slice($outerClasses, 0, $i))});
-
-
- }
-
- if (method_exists($javaClass->getMethodInvoker(), '')) {
-
- // call constructor
- call_user_func_array(
- array(
- $javaClass->getMethodInvoker(),
- ''
- ),
- array(
- $this->getInvoker()->getClass()
- )
- );
-
- }
-
- if ($this->getInvoker()->getClass()->getManipulator() !== null) {
-
- // regist to manipulator
- $this->getInvoker()->getClass()->getManipulator()->registerClass($javaClass);
-
- }
-
- // push to stack
- $this->pushStack($javaClass);
-
- } else {
-
- // load platform
- $this->getInvoker()->loadPlatform($className);
-
- $invokeClassName = '\\' . str_replace('/', '\\', $className);
-
- $this->pushStack(new $invokeClassName());
-
- }
-
- }
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_newarray.php b/PHPJava/Statements/JavaStatement_newarray.php
deleted file mode 100644
index 3b1b453c..00000000
--- a/PHPJava/Statements/JavaStatement_newarray.php
+++ /dev/null
@@ -1,17 +0,0 @@
-getByteCodeStream()->readUnsignedByte();
- $count = $this->getStack();
-
- // need reference
- $ref = new ArrayIterator(array_fill(0, $count, null));
- $this->pushStackByReference($ref);
-
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_nop.php b/PHPJava/Statements/JavaStatement_nop.php
deleted file mode 100644
index dacee615..00000000
--- a/PHPJava/Statements/JavaStatement_nop.php
+++ /dev/null
@@ -1,10 +0,0 @@
-popStack();
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_pop2.php b/PHPJava/Statements/JavaStatement_pop2.php
deleted file mode 100644
index 4199b57b..00000000
--- a/PHPJava/Statements/JavaStatement_pop2.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getCpInfo();
-
- $cp = $cpInfo[$this->getByteCodeStream()->readUnsignedShort()];
- $class = $cpInfo[$cp->getNameAndTypeIndex()];
-
- $value = $this->getStack();
- $name = $cpInfo[$class->getNameIndex()]->getString();
-
- $objectref = $this->getStack();
-
- $objectref->setInstance($name, $value);
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_putstatic.php b/PHPJava/Statements/JavaStatement_putstatic.php
deleted file mode 100644
index 6391ab43..00000000
--- a/PHPJava/Statements/JavaStatement_putstatic.php
+++ /dev/null
@@ -1,21 +0,0 @@
-getCpInfo();
-
- $cp = $cpInfo[$this->getByteCodeStream()->readUnsignedShort()];
-
- $class = $cpInfo[$cp->getNameAndTypeIndex()];
- $name = $cpInfo[$class->getNameIndex()]->getString();
-
- $value = $this->getStack();
-
- // set field
- $this->getInvoker()->getClass()->setStatic($name, $value);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_ret.php b/PHPJava/Statements/JavaStatement_ret.php
deleted file mode 100644
index d0fc4299..00000000
--- a/PHPJava/Statements/JavaStatement_ret.php
+++ /dev/null
@@ -1,11 +0,0 @@
-pushStack($this->getByteCodeStream()->readShort());
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_swap.php b/PHPJava/Statements/JavaStatement_swap.php
deleted file mode 100644
index 78cf3752..00000000
--- a/PHPJava/Statements/JavaStatement_swap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-getStack();
-
- $paddingData = $this->getByteCodeStream()->readByte() + $this->getByteCodeStream()->readByte() + $this->getByteCodeStream()->readByte();
-
- $offsets = array();
-
- $offsets['default'] = $this->getByteCodeStream()->readInt();
-
- $lowByte = $this->getByteCodeStream()->readInt();
- $highByte = $this->getByteCodeStream()->readInt();
-
- for ($i = $lowByte; $i <= $highByte; $i++) {
-
- $offsets[$i] = $this->getByteCodeStream()->readInt();
-
- }
-
- if (isset($offsets[$key])) {
-
- // goto PC
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offsets[$key]);
- return;
-
- }
-
- // goto default
- $this->getByteCodeStream()->setOffset($this->getPointer() + $offsets['default']);
-
- }
-
-}
diff --git a/PHPJava/Statements/JavaStatement_wide.php b/PHPJava/Statements/JavaStatement_wide.php
deleted file mode 100644
index a2f015e5..00000000
--- a/PHPJava/Statements/JavaStatement_wide.php
+++ /dev/null
@@ -1,11 +0,0 @@
-OperandStacks[] = $result;
-
- return $result;
-
- }
-
- public function readUnsignedByte () {
-
- $result = parent::readUnsignedByte();
- $this->OperandStacks[] = $result;
-
- return $result;
-
- }
-
- public function readInt () {
-
- $result = parent::readInt();
- $this->OperandStacks[] = $result;
-
- return $result;
-
- }
-
- public function readUnsignedInt () {
-
- $result = parent::readUnsignedInt();
- $this->OperandStacks[] = $result;
-
- return $result;
-
- }
-
- public function readShort () {
-
- $result = parent::readShort();
- $this->OperandStacks[] = $result;
-
- return $result;
-
- }
-
- public function readUnsignedShort () {
-
- $result = parent::readUnsignedShort();
- $this->OperandStacks[] = $result;
-
- return $result;
-
- }
-
- public function getOperands () {
-
- $operands = $this->OperandStacks;
-
- $this->OperandStacks = array();
-
- return $operands;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureAppendFrame.php b/PHPJava/Structures/JavaStructureAppendFrame.php
deleted file mode 100644
index e8014220..00000000
--- a/PHPJava/Structures/JavaStructureAppendFrame.php
+++ /dev/null
@@ -1,25 +0,0 @@
-FrameType = $Class->getJavaBinaryStream()->readUnsignedByte();
- $this->OffsetDelta = $Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0, $s = $this->FrameType - 251; $i < $s; $i++) {
-
- $this->Locals[] = new JavaStructureVarificationTypeInfo($Class);
-
- }
-
- }
-
-}
-
diff --git a/PHPJava/Structures/JavaStructureChopFrame.php b/PHPJava/Structures/JavaStructureChopFrame.php
deleted file mode 100644
index 5db9cb49..00000000
--- a/PHPJava/Structures/JavaStructureChopFrame.php
+++ /dev/null
@@ -1,18 +0,0 @@
-FrameType = $Class->getJavaBinaryStream()->readUnsignedByte();
- $this->OffsetDelta = $Class->getJavaBinaryStream()->readUnsignedShort();
-
- }
-
-}
-
diff --git a/PHPJava/Structures/JavaStructureClass.php b/PHPJava/Structures/JavaStructureClass.php
deleted file mode 100644
index 35c0f99d..00000000
--- a/PHPJava/Structures/JavaStructureClass.php
+++ /dev/null
@@ -1,22 +0,0 @@
-ClassIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- }
-
- public function getClassIndex () {
-
- return $this->ClassIndex;
-
- }
-
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureClasses.php b/PHPJava/Structures/JavaStructureClasses.php
deleted file mode 100644
index 665e1994..00000000
--- a/PHPJava/Structures/JavaStructureClasses.php
+++ /dev/null
@@ -1,64 +0,0 @@
-InnerClassInfoIndex = $InnerClassInfoIndex;
-
- }
-
- public function setOuterClassInfoIndex ($OuterClassInfoIndex) {
-
- $this->OuterClassInfoIndex = $OuterClassInfoIndex;
-
- }
-
- public function setInnerNameIndex ($InnerNameIndex) {
-
- $this->InnerNameIndex = $InnerNameIndex;
-
- }
-
- public function setInnerClassAccessFlag ($InnerClassAccessFlag) {
-
- $this->InnerClassAccessFlag = $InnerClassAccessFlag;
-
- }
-
- public function getInnerClassInfoIndex () {
-
- return $this->InnerClassInfoIndex;
-
- }
-
- public function getOuterClassInfoIndex () {
-
- return $this->OuterClassInfoIndex;
-
- }
-
- public function getInnerNameIndex () {
-
- return $this->InnerNameIndex;
-
- }
-
- public function getInnerClassAccessFlag () {
-
- return $this->InnerClassAccessFlag;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureDouble.php b/PHPJava/Structures/JavaStructureDouble.php
deleted file mode 100644
index 4746e349..00000000
--- a/PHPJava/Structures/JavaStructureDouble.php
+++ /dev/null
@@ -1,23 +0,0 @@
-HighBytes = $Class->getJavaBinaryStream()->readUnsignedInt();
- $this->LowBytes = $Class->getJavaBinaryStream()->readUnsignedInt();
-
- }
-
- public function getBytes () {
-
- return ($this->HighBytes << 32) + $this->LowBytes;
-
- }
-
-}
diff --git a/PHPJava/Structures/JavaStructureDoubleVariableInfo.php b/PHPJava/Structures/JavaStructureDoubleVariableInfo.php
deleted file mode 100644
index dd553d8a..00000000
--- a/PHPJava/Structures/JavaStructureDoubleVariableInfo.php
+++ /dev/null
@@ -1,15 +0,0 @@
-Tag = $Class->getJavaBinaryStream()->readUnsignedByte();
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureExceptionTable.php b/PHPJava/Structures/JavaStructureExceptionTable.php
deleted file mode 100644
index a69eed65..00000000
--- a/PHPJava/Structures/JavaStructureExceptionTable.php
+++ /dev/null
@@ -1,57 +0,0 @@
-StartPc = $StartPc;
-
- }
-
- public function setEndPc ($EndPc) {
-
- $this->EndPc = $EndPc;
-
- }
-
- public function setHandlerPc ($HandlerPc) {
-
- $this->HandlerPc = $HandlerPc;
-
- }
-
- public function setCatchType ($CatchType) {
-
- $this->CatchType = $CatchType;
-
- }
- public function getStartPc () {
-
- return $this->StartPc;
-
- }
-
- public function getEndPc () {
-
- return $this->EndPc;
-
- }
-
- public function getHandlerPc () {
-
- return $this->HandlerPc;
-
- }
-
- public function getCatchType () {
-
- return $this->CatchType;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureFieldInfo.php b/PHPJava/Structures/JavaStructureFieldInfo.php
deleted file mode 100644
index 4a7d58c9..00000000
--- a/PHPJava/Structures/JavaStructureFieldInfo.php
+++ /dev/null
@@ -1,53 +0,0 @@
-AccessFlag = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->NameIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->DescriptorIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->AttributeCount = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->AttributeCount; $i++) {
-
- $this->Attributes[$i] = new JavaAttributeInfo($Class);
-
- }
-
- }
-
- public function getAccessFlag () {
-
- return $this->AccessFlag;
-
- }
-
- public function getNameIndex () {
-
- return $this->NameIndex;
-
- }
-
- public function getDescriptorIndex () {
-
- return $this->DescriptorIndex;
-
- }
-
- public function getAttributes () {
-
- return $this->Attributes;
-
- }
-
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureFieldRef.php b/PHPJava/Structures/JavaStructureFieldRef.php
deleted file mode 100644
index 551896e2..00000000
--- a/PHPJava/Structures/JavaStructureFieldRef.php
+++ /dev/null
@@ -1,29 +0,0 @@
-ClassIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->NameAndTypeIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- }
-
- public function getClassIndex () {
-
- return $this->ClassIndex;
-
- }
-
- public function getNameAndTypeIndex () {
-
- return $this->NameAndTypeIndex;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureFloat.php b/PHPJava/Structures/JavaStructureFloat.php
deleted file mode 100644
index 553d1044..00000000
--- a/PHPJava/Structures/JavaStructureFloat.php
+++ /dev/null
@@ -1,21 +0,0 @@
-Bytes = $Class->getJavaBinaryStream()->readUnsignedInt();
-
- }
-
- public function getBytes () {
-
- return $this->Bytes;
-
- }
-
-}
diff --git a/PHPJava/Structures/JavaStructureFloatVariableInfo.php b/PHPJava/Structures/JavaStructureFloatVariableInfo.php
deleted file mode 100644
index 27633640..00000000
--- a/PHPJava/Structures/JavaStructureFloatVariableInfo.php
+++ /dev/null
@@ -1,15 +0,0 @@
-Tag = $Class->getJavaBinaryStream()->readUnsignedByte();
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureFullFrame.php b/PHPJava/Structures/JavaStructureFullFrame.php
deleted file mode 100644
index 08b5c71b..00000000
--- a/PHPJava/Structures/JavaStructureFullFrame.php
+++ /dev/null
@@ -1,38 +0,0 @@
-FrameType = $Class->getJavaBinaryStream()->readUnsignedByte();
- $this->OffsetDelta = $Class->getJavaBinaryStream()->readUnsignedShort();
- $this->NumberOfLocals = $Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->NumberOfLocals; $i++) {
-
- $this->Locals[] = new JavaStructureVarificationTypeInfo($Class);
-
- }
-
- $this->NumberOfStackItems = $Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->NumberOfStackItems; $i++) {
-
- $this->Stack[] = new JavaStructureVarificationTypeInfo($Class);
-
- }
-
- }
-
-}
-
diff --git a/PHPJava/Structures/JavaStructureInteger.php b/PHPJava/Structures/JavaStructureInteger.php
deleted file mode 100644
index 7266e3f0..00000000
--- a/PHPJava/Structures/JavaStructureInteger.php
+++ /dev/null
@@ -1,22 +0,0 @@
-Bytes = $Class->getJavaBinaryStream()->readInt();
-
-
- }
-
- public function getBytes () {
-
- return $this->Bytes;
-
- }
-
-}
diff --git a/PHPJava/Structures/JavaStructureIntegerVariableInfo.php b/PHPJava/Structures/JavaStructureIntegerVariableInfo.php
deleted file mode 100644
index ad6ed2e5..00000000
--- a/PHPJava/Structures/JavaStructureIntegerVariableInfo.php
+++ /dev/null
@@ -1,15 +0,0 @@
-Tag = $Class->getJavaBinaryStream()->readUnsignedByte();
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureLineNumberTable.php b/PHPJava/Structures/JavaStructureLineNumberTable.php
deleted file mode 100644
index 1906800a..00000000
--- a/PHPJava/Structures/JavaStructureLineNumberTable.php
+++ /dev/null
@@ -1,32 +0,0 @@
-StartPc = $StartPc;
-
- }
-
- public function setLineNumber ($LineNumber) {
-
- $this->LineNumber = $LineNumber;
-
- }
-
- public function getStartPc () {
-
- return $this->StartPc;
-
- }
-
- public function getLineNumber () {
-
- return $this->LineNumber;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureLocalVariableTable.php b/PHPJava/Structures/JavaStructureLocalVariableTable.php
deleted file mode 100644
index 69928b84..00000000
--- a/PHPJava/Structures/JavaStructureLocalVariableTable.php
+++ /dev/null
@@ -1,24 +0,0 @@
-StartPc = $Class->getJavaBinaryStream()->readUnsignedShort();
- $this->Length = $Class->getJavaBinaryStream()->readUnsignedShort();
- $this->NameIndex = $Class->getJavaBinaryStream()->readUnsignedShort();
- $this->DescriptorIndex = $Class->getJavaBinaryStream()->readUnsignedShort();
- $this->Index = $Class->getJavaBinaryStream()->readUnsignedShort();
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureLong.php b/PHPJava/Structures/JavaStructureLong.php
deleted file mode 100644
index b55a227a..00000000
--- a/PHPJava/Structures/JavaStructureLong.php
+++ /dev/null
@@ -1,28 +0,0 @@
-HighBytes = $Class->getJavaBinaryStream()->readUnsignedInt();
- //$this->LowBytes = $Class->getJavaBinaryStream()->readUnsignedInt();
-
- $this->Bytes = $Class->getJavaBinaryStream()->readLong();
-
- }
-
- public function getBytes () {
-
- //return ($this->HighBytes << 32) + $this->LowBytes;
- return $this->Bytes;
-
- }
-
-}
diff --git a/PHPJava/Structures/JavaStructureLongVariableInfo.php b/PHPJava/Structures/JavaStructureLongVariableInfo.php
deleted file mode 100644
index ee752eee..00000000
--- a/PHPJava/Structures/JavaStructureLongVariableInfo.php
+++ /dev/null
@@ -1,15 +0,0 @@
-Tag = $Class->getJavaBinaryStream()->readUnsignedByte();
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureMethodInfo.php b/PHPJava/Structures/JavaStructureMethodInfo.php
deleted file mode 100644
index 1e694115..00000000
--- a/PHPJava/Structures/JavaStructureMethodInfo.php
+++ /dev/null
@@ -1,53 +0,0 @@
-AccessFlag = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->NameIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->DescriptorIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->AttributeCount = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->AttributeCount; $i++) {
-
- $this->Attributes[$i] = new JavaAttributeInfo($Class);
-
- }
-
- }
-
- public function getAccessFlag () {
-
- return $this->AccessFlag;
-
- }
-
- public function getNameIndex () {
-
- return $this->NameIndex;
-
- }
-
- public function getDescriptorIndex () {
-
- return $this->DescriptorIndex;
-
- }
-
- public function getAttributes () {
-
- return $this->Attributes;
-
- }
-
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureMethodref.php b/PHPJava/Structures/JavaStructureMethodref.php
deleted file mode 100644
index 9eae3e33..00000000
--- a/PHPJava/Structures/JavaStructureMethodref.php
+++ /dev/null
@@ -1,29 +0,0 @@
-ClassIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->NameAndTypeIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- }
-
- public function getClassIndex () {
-
- return $this->ClassIndex;
-
- }
-
- public function getNameAndTypeIndex () {
-
- return $this->NameAndTypeIndex;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureNameAndType.php b/PHPJava/Structures/JavaStructureNameAndType.php
deleted file mode 100644
index d0a08cb4..00000000
--- a/PHPJava/Structures/JavaStructureNameAndType.php
+++ /dev/null
@@ -1,29 +0,0 @@
-NameIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
- $this->DescriptorIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- }
-
- public function getNameIndex () {
-
- return $this->NameIndex;
-
- }
-
- public function getDescriptorIndex () {
-
- return $this->DescriptorIndex;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureNullVariableInfo.php b/PHPJava/Structures/JavaStructureNullVariableInfo.php
deleted file mode 100644
index 7337c78f..00000000
--- a/PHPJava/Structures/JavaStructureNullVariableInfo.php
+++ /dev/null
@@ -1,15 +0,0 @@
-Tag = $Class->getJavaBinaryStream()->readUnsignedByte();
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureObjectVariableInfo.php b/PHPJava/Structures/JavaStructureObjectVariableInfo.php
deleted file mode 100644
index b987ab7c..00000000
--- a/PHPJava/Structures/JavaStructureObjectVariableInfo.php
+++ /dev/null
@@ -1,17 +0,0 @@
-Tag = $Class->getJavaBinaryStream()->readUnsignedByte();
- $this->cpoolIndex = $Class->getJavaBinaryStream()->readUnsignedShort();
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureSameFrame.php b/PHPJava/Structures/JavaStructureSameFrame.php
deleted file mode 100644
index 04a720c6..00000000
--- a/PHPJava/Structures/JavaStructureSameFrame.php
+++ /dev/null
@@ -1,16 +0,0 @@
-FrameType = $Class->getJavaBinaryStream()->readUnsignedByte();
-
- }
-
-}
-
diff --git a/PHPJava/Structures/JavaStructureSameFrameExtended.php b/PHPJava/Structures/JavaStructureSameFrameExtended.php
deleted file mode 100644
index d6398f4a..00000000
--- a/PHPJava/Structures/JavaStructureSameFrameExtended.php
+++ /dev/null
@@ -1,19 +0,0 @@
-FrameType = $Class->getJavaBinaryStream()->readUnsignedByte();
- $this->OffsetDelta = $Class->getJavaBinaryStream()->readUnsignedShort();
-
-
- }
-
-}
-
diff --git a/PHPJava/Structures/JavaStructureSameLocals1StackItemFrame.php b/PHPJava/Structures/JavaStructureSameLocals1StackItemFrame.php
deleted file mode 100644
index f96e5a1c..00000000
--- a/PHPJava/Structures/JavaStructureSameLocals1StackItemFrame.php
+++ /dev/null
@@ -1,19 +0,0 @@
-FrameType = $Class->getJavaBinaryStream()->readUnsignedByte();
-
- $this->Stack[] = new JavaStructureVarificationTypeInfo($Class);
-
- }
-
-}
-
diff --git a/PHPJava/Structures/JavaStructureSameLocals1StackItemFrameExtended.php b/PHPJava/Structures/JavaStructureSameLocals1StackItemFrameExtended.php
deleted file mode 100644
index 7d258ad3..00000000
--- a/PHPJava/Structures/JavaStructureSameLocals1StackItemFrameExtended.php
+++ /dev/null
@@ -1,21 +0,0 @@
-FrameType = $Class->getJavaBinaryStream()->readUnsignedByte();
- $this->OffsetDelta = $Class->getJavaBinaryStream()->readUnsignedShort();
-
- $this->Locals[] = new JavaStructureVarificationTypeInfo($Class);
-
- }
-
-}
-
diff --git a/PHPJava/Structures/JavaStructureStackMapFrame.php b/PHPJava/Structures/JavaStructureStackMapFrame.php
deleted file mode 100644
index 42088610..00000000
--- a/PHPJava/Structures/JavaStructureStackMapFrame.php
+++ /dev/null
@@ -1,56 +0,0 @@
-FrameType = $Class->getJavaBinaryStream()->readUnsignedByte();
-
- // back by frametype
- $Class->getJavaBinaryStream()->seek(-1);
-
- if ($this->FrameType >= 0 && $this->FrameType <= 63) {
-
- $this->SameFrame = new JavaStructureSameFrame($Class);
-
- } else if ($this->FrameType >= 64 && $this->FrameType <= 127) {
-
- $this->SameLocals1StackItemFrame = new JavaStructureSameLocals1StackItemFrame($Class);
-
- } else if ($this->FrameType == 247) {
-
- $this->SameLocals1StackItemFrameExtended = new JavaStructureSameLocals1StackItemFrameExtended($Class);
-
- } else if ($this->FrameType >= 248 && $this->FrameType <= 250) {
-
- $this->ChopFrame = new JavaStructureChopFrame($Class);
-
- } else if ($this->FrameType == 251) {
-
- $this->SameFrameExtended = new JavaStructureSameFrameExtended($Class);
-
- } else if ($this->FrameType >= 252 && $this->FrameType <= 254) {
-
- $this->AppendFrame = new JavaStructureAppendFrame($Class);
-
- } else if ($this->FrameType == 255) {
-
- $this->FullFrame = new JavaStructureFullFrame($Class);
-
- }
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureString.php b/PHPJava/Structures/JavaStructureString.php
deleted file mode 100644
index b047c8a2..00000000
--- a/PHPJava/Structures/JavaStructureString.php
+++ /dev/null
@@ -1,21 +0,0 @@
-StringIndex = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- }
-
- public function getStringIndex () {
-
- return $this->StringIndex;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureTopVariableInfo.php b/PHPJava/Structures/JavaStructureTopVariableInfo.php
deleted file mode 100644
index ea6d8ace..00000000
--- a/PHPJava/Structures/JavaStructureTopVariableInfo.php
+++ /dev/null
@@ -1,15 +0,0 @@
-Tag = $Class->getJavaBinaryStream()->readUnsignedByte();
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureUninitializedThisVariableInfo.php b/PHPJava/Structures/JavaStructureUninitializedThisVariableInfo.php
deleted file mode 100644
index ac9b308e..00000000
--- a/PHPJava/Structures/JavaStructureUninitializedThisVariableInfo.php
+++ /dev/null
@@ -1,15 +0,0 @@
-Tag = $Class->getJavaBinaryStream()->readUnsignedByte();
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureUninitializedVariableInfo.php b/PHPJava/Structures/JavaStructureUninitializedVariableInfo.php
deleted file mode 100644
index 8b160406..00000000
--- a/PHPJava/Structures/JavaStructureUninitializedVariableInfo.php
+++ /dev/null
@@ -1,17 +0,0 @@
-Tag = $Class->getJavaBinaryStream()->readUnsignedByte();
- $this->Offset = $Class->getJavaBinaryStream()->readUnsignedShort();
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureUtf8.php b/PHPJava/Structures/JavaStructureUtf8.php
deleted file mode 100644
index b115b52c..00000000
--- a/PHPJava/Structures/JavaStructureUtf8.php
+++ /dev/null
@@ -1,34 +0,0 @@
-Length = $this->Class->getJavaBinaryStream()->readUnsignedShort();
-
- for ($i = 0; $i < $this->Length; $i++) {
-
- $this->String .= chr($this->Class->getJavaBinaryStream()->readUnsignedByte());
-
- }
-
- }
-
- public function getLength () {
-
- return $this->Length;
-
- }
-
- public function getString () {
-
- return $this->String;
-
- }
-
-}
\ No newline at end of file
diff --git a/PHPJava/Structures/JavaStructureVerificationTypeInfo.php b/PHPJava/Structures/JavaStructureVerificationTypeInfo.php
deleted file mode 100644
index 45b7f403..00000000
--- a/PHPJava/Structures/JavaStructureVerificationTypeInfo.php
+++ /dev/null
@@ -1,36 +0,0 @@
-Tag = $Class->getJavaBinaryStream()->readUnsignedByte();
- // back by tag
- $Class->getJavaBinaryStream()->seek(-1);
-
- if ($this->Tag == 0) {
- $this->TopVariableInfo = new JavaStructureTopVariableInfo($Class);
- } else if ($this->Tag == 1) {
- $this->IntegerVariableInfo = new JavaStructureIntegerVariableInfo($Class);
- } else if ($this->Tag == 2) {
- $this->FloatVariableInfo = new JavaStructureFloatVariableInfo($Class);
- } else if ($this->Tag == 4) {
- $this->LongVariableInfo = new JavaStructureLongVariableInfo($Class);
- } else if ($this->Tag == 3) {
- $this->DoubleVariableInfo = new JavaStructureDoubleVariableInfo($Class);
- } else if ($this->Tag == 5) {
- $this->NullVariableInfo = new JavaStructureNullVariableInfo($Class);
- } else if ($this->Tag == 6) {
- $this->UninitializedThisVariableInfo = new JavaStructureUninitializedThisVariableInfo($Class);
- } else if ($this->Tag == 7) {
- $this->ObjectVariableInfo = new JavaStructureObjectVariableInfo($Class);
- } else if ($this->Tag == 8) {
- $this->UninitializedVariableInfo = new JavaStructureUninitializedVariableInfo($Class);
- }
-
-}
-
-}
-
diff --git a/PHPJava/Types/JavaTypeBoolean.php b/PHPJava/Types/JavaTypeBoolean.php
deleted file mode 100644
index 0d3c82f1..00000000
--- a/PHPJava/Types/JavaTypeBoolean.php
+++ /dev/null
@@ -1,5 +0,0 @@
-
+
+# What is the PHPJava?
+The PHPJava is experimental library which emulate JVM (a.k.a. Java Virtual Machine) by PHP 🐘
+The PHPJava proceed to read binary from pre-compiled Java file(s) ☕
+This project reference to [Java Virtual Machine Specification](https://docs.oracle.com/javase/specs/jvms/se11/html/index.html) documentation when We makes.
+
+We welcoming to contributions this project 💪
+
+## Requirements
+- PHP >= 7.2
+- Composer
+- ext-zip
+
+## Not currently supported
+Sorry, I do not have enough time (T_T)
+
+- Inner classes
+- Annotations
+- Extends other class
+- Implements
+- Outer classes
+- Event
+- Java Archive
+- double/float calculation.
+- Many built-in libraries (ex. java.lang.xxx, java.io.xxx and so on)
+- etc...
+
+## Quick start
+- 1) Install the PHPJava into your project.
+```
+$ composer require memory-agape/php-java
+```
-# どういう仕組みなの?
+- 2) Write Java
+```java
+class HelloWorld
+{
+ public static void main(String[] args)
+ {
+ System.out.println(args[0] + " " + args[1]);
+ }
+}
+```
-## 仕組みについて
-コンパイルされたJavaクラスのバイトコードをPHPJavaが理解し、
-オペコードに従い逐次処理していきます。
+- 3) Compile Java
+```
+$ javac -UTF8 /path/to/HelloWorld.java
+```
-下記を参考に作りました。
+- 4) Call to main method as following.
-The Java® Virtual Machine Specification : https://docs.oracle.com/javase/specs/jvms/se8/html/
+```php
+getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'main',
+ ["Hello", 'World']
+ );
+```
-Java Bytecode Instruction Listings : https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
+- 5) Get a result
+```
+$ php /path/to/HelloWorld.php
+Hello World
+```
+### Get/Set a static fields
-## 動作について
+- ex) Set or Get a static fields as follows.
-例:
```php
getMethodInvoker()->main(array(999, 888));
-```
+use PHPJava\Core\JavaClass;
+use PHPJava\Core\JavaClassReader;
-上記のようにして、 `test.class` のmainメソッドを呼び出すことが可能となります。
-(mainメソッドの引数はString[]を取るため、配列型を渡しています。)
+$staticFieldAccessor = (new JavaClass(new JavaClassReader('/path/to/HelloWorld.class')))
+ ->getInvoker()
+ ->getStatic()
+ ->getFields();
-また、Javaのバイトコードではコンストラクタの定義は``とされており、PHPで呼び出すのは
-`call_user_func`や`$javaClass->{''}()`等としないと表現が難しいですが、
-PHPJavaでは、下記の方法でJavaのコンストラクタを簡易的に呼び出す方法を提供しています。
+// Set
+$staticFieldAccessor->set('fieldName', 'value');
-```php
-construct();
+// Get
+echo $staticFieldAccessor->get('fieldName');
+```
-// 静的なメソッド
-$invoker->main(array(999, 888));
-// または
-$javaClass->getMethodInvoker()->main(array(999, 888));
+### Call to a static method
+- ex) Call to static method as follows.
-// 動的なメソッド
-$invoker->abc(1234);
+```php
+getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'methodName',
+ $firstArgument,
+ $secondArgument,
+ $thirdArgument,
+ ...
+ );
+
+// Or if called method have return value then you can store to variable.
+$result = (new JavaClass(new JavaClassReader('/path/to/HelloWorld.class')))
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'methodWithSomethingReturn',
+ $firstArgument,
+ $secondArgument,
+ $thirdArgument,
+ ...
+ );
+
+// The $result you want is output.
+echo $result;
```
+### Get/Set a dynamic fields
+If you want to get/set dynamic fields, you need call to `construct` method on Java by PHPJava.
-## メンバの呼び出しについて
-PHPJavaではstaticであるかどうかを区別しません。
-メンバの呼び出しは非常に単純で、下記のように実行すると、Javaのクラスで定義されているメンバを取得することが可能です。
+- ex) Call dynamic field as following.
```php
construct();
+use PHPJava\Core\JavaClass;
+use PHPJava\Core\JavaClassReader;
-// Java側で `String stringValue="Hello World"` と定義されていた場合、
-// Hello Worldと出力をします。
-var_dump((string) $invoker->stringValue);
+$javaClass = new JavaClass(new JavaClassReader('/path/to/HelloWorld.class'));
-// クラスを調べるとjava\lang\Stringという扱いになります。
-var_dump(get_class($invoker->stringValue));
+$javaClass->getInvoker()->construct();
-// プリミティブな型の場合JavaType*が出力されます。
-// Java側で`int intvalue=1111`と定義されていた場合下記の例ではJavaTypeIntが出力されます。
-var_dump(get_class($invoker->intValue));
+$dynamicFieldAccessor = $javaClass
+ ->getInvoker()
+ ->getDynamic()
+ ->getFields();
-// なお、値を取得すると1111となります。
-var_dump((string) $invoker>intValue);
-var_dump($invoker->intValue->getValue());
+// Set
+$dynamicFieldAccessor->set('fieldName', 'value');
+// Get
+echo $dynamicFieldAccessor->get('fieldName');
```
+### Call to a dynamic method
+If you want to get/set dynamic method (same as field), you need call to `construct` method on Java by PHPJava.
-## 型の定義について
-PHPJavaでは、呼び出すメソッドが静的、あるいは動的かを区別しません。
-これは、PHPで簡易的にJavaのメソッドを呼び出すためです。
+- ex) Call dynamic method as following.
-また、PHPは動的型付けのため、PHPJavaではJavaへの引数においても厳密に比較しません。
-したがって、Javaへ引数を渡す際には暗黙の型変換が行われます。
+```php
+getInvoker()
+ ->construct()
+ ->getDynamic()
+ ->getMethods();
+
+$dynamicMethodAccessor
+ ->call(
+ 'methodName',
+ $firstArgument,
+ $secondArgument,
+ $thirdArgument,
+ ...
+ );
+
+// Or if called method have return value then you can store to variable.
+$dynamicMethodAccessor
+ ->call(
+ 'methodWithSomethingReturn',
+ $firstArgument,
+ $secondArgument,
+ $thirdArgument,
+ ...
+ );
+
+// The $result you want is output.
+echo $result;
+```
+
+### Output PHPJava operations
-また、PHPのint型の最大値が32bit及び64bit環境により異なることから、
-巨大な数字の計算時には`bcmath関数`または `gmp関数` を用いて計算を行います。
-(優先的に`bcmath関数`を使用するようにしており利用できなければ、`gmp関数`を使用するようにしています。)
+- Output debug trace as following if you want to show operated log.
-bcmath関数: http://php.net/manual/ja/book.bc.php
+```php
+getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'main',
+ ["Hello", 'World']
+ );
+
+// Show debug traces.
+$javaClass->debug();
+```
-gmp関数: http://php.net/manual/ja/ref.gmp.php
+- Outputted debug trace is below.
-なお、下記はJavaのメソッドを実行した際に返却される型の情報です。
-null以外の全ての値は`JavaType*`オブジェクトとして適切に扱われます。
+```
+[method]
+public static void main(java.lang.String[])
+
+[code]
+<0xb2> <0x00> <0x02> <0x2a> <0x03> <0x32> <0xb6> <0x00> <0x03> <0xb2> <0x00> <0x02> <0x2a> <0x04> <0x32> <0xb6> <0x00> <0x03> <0xb2> <0x00>
+<0x02> <0x2a> <0x05> <0x32> <0xb6> <0x00> <0x03> <0xb1>
+
+[executed]
+ PC | OPCODE | MNEMONIC | OPERANDS | LOCAL STORAGE
+---------+--------+----------------------+------------+-----------------
+ 0 | 0xB2 | getstatic | 0 | 1
+ 3 | 0x2A | aload_0 | 1 | 1
+ 4 | 0x03 | iconst_0 | 2 | 1
+ 5 | 0x32 | aaload | 3 | 1
+ 6 | 0xB6 | invokevirtual | 2 | 1
+ 9 | 0xB2 | getstatic | 0 | 1
+ 12 | 0x2A | aload_0 | 1 | 1
+ 13 | 0x04 | iconst_1 | 2 | 1
+ 14 | 0x32 | aaload | 3 | 1
+ 15 | 0xB6 | invokevirtual | 2 | 1
+ 18 | 0xB2 | getstatic | 0 | 1
+ 21 | 0x2A | aload_0 | 1 | 1
+ 22 | 0x05 | iconst_2 | 2 | 1
+ 23 | 0x32 | aaload | 3 | 1
+ 24 | 0xB6 | invokevirtual | 2 | 1
+ 27 | 0xB1 | return | 0 | 1
+---------+--------+----------------------+------------+-----------------
+```
-|Javaの型 |PHPの型 |
+- **[method]** is showing called method.
+- **[code]** is showing JVM's real programs.
+- **[executed]** is showing executed programs.
+ - **PC** is showing Program Counter.
+ - **OPCODE** is showing Operation Codes.
+ - **MNEMONIC** is naming Operation Codes.
+ - **OPERANDS** is showing stacked items on memory.
+ - **LOCAL STORAGE** is showing stacked items on a method.
+
+## PHP problems
+- The PHP is cannot calculating big numbers because of PHP is different to the Java.
+ But the PHPJava use `bcmath` functions and `gmp` functions to a certain extent to cover to calculate.
+ The PHPJava return valued is mixed why therefore We recommend to cast to `string` on the PHPJava.
+
+- The PHPJava cannot cover to Java's types completely because of PHP is different to the Java.
+ The Java and the PHPJava comparison table is below.
+
+|Java |PHPJava |
|:-------------:|:-------------:|
|null |null |
-|boolean |JavaTypeBoolean |
-|char |JavaTypeChar |
-|byte |JavaTypeByte |
-|short |JavaTypeShort |
-|int |JavaTypeInt |
-|long |JavaTypeLong |
-|float |JavaTypeFloat |
-|double |JavaTypeDouble |
-
-## エミュレーションについて
+|boolean |\PHPJava\Kernel\Types\\_Boolean (including `__toString`) |
+|char |\PHPJava\Kernel\Types\\_Char (including `__toString`), string |
+|byte |\PHPJava\Kernel\Types\\_Byte (including `__toString`), string |
+|short |\PHPJava\Kernel\Types\\_Short (including `__toString`), string, int |
+|int |\PHPJava\Kernel\Types\\_Int (including `__toString`), string, int |
+|long |\PHPJava\Kernel\Types\\_Long (including `__toString`), string, int |
+|float |\PHPJava\Kernel\Types\\_Float (including `__toString`), string, float |
+|double |\PHPJava\Kernel\Types\\_Char (including `__toString`), string, float |
+
+## Run unit tests
+
+- PHPUnit test is below.
+```
+$ ./vendor/bin/phpunit tests
+```
-PHPJavaではJavaにデフォルトでビルトインされている機能は一切使用していません。
-つまり、PHPJava単体で、Javaをエミュレーションすることが可能となります。
+- PHP Coding standards testing is below.
+```
+$ ./vendor/bin/phpcs --standard=phpcs.xml src
+```
+- All testing is below.
-# Javaにおけるスレッドの扱いについて
-Javaにはマルチスレッドを扱うための機能が備わっていますが、PHP 5.6現在ではそのような機能はありません。
-Javaにおけるスレッドの扱いをPHPJavaで表現するには、pthreads(http://php.net/manual/ja/book.pthreads.php) の導入を必要とします。
+```
+$ composer run tests
+```
-# TODO
+## Reference
+- [Java Virtual Machine Specification](https://docs.oracle.com/javase/specs/jvms/se11/html/index.html)
-- 全ニーモニックへの対応
-- JARへの対応
-- アノテーションへの対応
-- PHPDocの追加
\ No newline at end of file
+## License
+MIT
\ No newline at end of file
diff --git a/Test.class b/Test.class
deleted file mode 100644
index 7e24ece7..00000000
Binary files a/Test.class and /dev/null differ
diff --git a/composer.json b/composer.json
new file mode 100644
index 00000000..8ef609a3
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,34 @@
+{
+ "name": "memory/php-java",
+ "description": "JVM emulator by PHP",
+ "type": "library",
+ "license": "MIT",
+ "version": "0.0.2-dev",
+ "authors": [
+ {
+ "name": "memory"
+ }
+ ],
+ "require": {
+ "php": ">=7.2",
+ "ext-zip": "*"
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPJava\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "PHPJava\\Tests\\": "tests/"
+ }
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.0",
+ "squizlabs/php_codesniffer": "^3.4",
+ "friendsofphp/php-cs-fixer": "^2.14"
+ },
+ "scripts": {
+ "tests": "phpunit tests && phpcs --standard=phpcs.xml src"
+ }
+}
diff --git a/docs/img/phpjava.jpg b/docs/img/phpjava.jpg
new file mode 100644
index 00000000..d6c240cd
Binary files /dev/null and b/docs/img/phpjava.jpg differ
diff --git a/license b/license
new file mode 100644
index 00000000..4d98acb7
--- /dev/null
+++ b/license
@@ -0,0 +1,19 @@
+Copyright (c) 2019 memory
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties
deleted file mode 100644
index 08c19796..00000000
--- a/nbproject/private/private.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-copy.src.on.open=false
-index.file=index.php
-run.as=SCRIPT
-url=http://localhost/PHPJar/
diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml
deleted file mode 100644
index 6807a2ba..00000000
--- a/nbproject/private/private.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/nbproject/project.properties b/nbproject/project.properties
deleted file mode 100644
index d37ef956..00000000
--- a/nbproject/project.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-include.path=${php.global.include.path}
-php.version=PHP_54
-source.encoding=UTF-8
-src.dir=.
-tags.asp=false
-tags.short=false
-web.root=.
diff --git a/nbproject/project.xml b/nbproject/project.xml
deleted file mode 100644
index 4795c601..00000000
--- a/nbproject/project.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
- org.netbeans.modules.php.project
-
-
- PHPJava
-
-
-
diff --git a/phpcs.xml b/phpcs.xml
new file mode 100644
index 00000000..1a2bdcec
--- /dev/null
+++ b/phpcs.xml
@@ -0,0 +1,27 @@
+
+ The PHPJava Coding Standards
+
+ ./tests
+
+
+
+
+
+
+ ./src/kernel/types
+ ./src/kernel/mnemonics
+ ./src/kernel/structures
+ ./src/imitation/java/lang/_Object.php
+ ./src/imitation/java/lang/_String.php
+ ./src/imitation/phpjava/extended/_Object
+
+
+
+ ./src/kernel/maps
+
+
+
+
+
+
+
diff --git a/src/core/JavaClass.php b/src/core/JavaClass.php
new file mode 100644
index 00000000..1205c751
--- /dev/null
+++ b/src/core/JavaClass.php
@@ -0,0 +1,269 @@
+ null,
+ 'major' => null,
+ ];
+
+ /**
+ * @var ConstantPool
+ */
+ private $constantPool;
+
+ /**
+ * @var ActiveInterface
+ */
+ private $activeInterfaces;
+
+ /**
+ * @var ActiveFields
+ */
+ private $activeFields;
+
+ /**
+ * @var ActiveMethods
+ */
+ private $activeMethods;
+
+ /**
+ * @var ActiveAttributes
+ */
+ private $activeAttributes;
+
+ private $accessFlag = 0;
+ private $thisClass = 0;
+ private $superClass = 0;
+
+ /**
+ * @var _Utf8|null
+ */
+ private $className = null;
+
+ private $debugTraces = [];
+
+ /**
+ * @var JavaClassInvoker
+ */
+ private $invoker;
+
+ /**
+ * JavaClass constructor.
+ * @param JavaClassReader $reader
+ * @throws ValidatorException
+ * @throws \PHPJava\Exceptions\ReadEntryException
+ */
+ public function __construct(JavaClassReader $reader)
+ {
+ // Validate Java file
+ if (!(new MagicByte($reader->getBinaryReader()->readUnsignedInt()))->isValid()) {
+ throw new ValidatorException($reader . ' has broken or not Java class.');
+ }
+
+ // read minor version
+ $this->versions['minor'] = $reader->getBinaryReader()->readUnsignedShort();
+
+ // read major version
+ $this->versions['major'] = $reader->getBinaryReader()->readUnsignedShort();
+
+ // read constant pool size
+ $this->constantPool = new ConstantPool(
+ $reader,
+ $reader->getBinaryReader()->readUnsignedShort()
+ );
+
+ // read access flag
+ $this->accessFlag = $reader->getBinaryReader()->readUnsignedShort();
+
+ // read this class
+ $this->thisClass = $reader->getBinaryReader()->readUnsignedShort();
+
+ $constantPoolEntries = $this->constantPool->getEntries();
+ $this->className = $constantPoolEntries[$constantPoolEntries[$this->thisClass]->getClassIndex()];
+
+ // read super class
+ $this->superClass = $reader->getBinaryReader()->readUnsignedShort();
+
+ // read interfaces
+ $this->activeInterfaces = new ActiveInterface(
+ $reader,
+ $reader->getBinaryReader()->readUnsignedShort(),
+ $this->constantPool
+ );
+
+ // read fields
+ $this->activeFields = new ActiveFields(
+ $reader,
+ $reader->getBinaryReader()->readUnsignedShort(),
+ $this->constantPool
+ );
+
+ // read methods
+ $this->activeMethods = new ActiveMethods(
+ $reader,
+ $reader->getBinaryReader()->readUnsignedShort(),
+ $this->constantPool
+ );
+
+ // read attributes
+ $this->activeAttributes = new ActiveAttributes(
+ $reader,
+ $reader->getBinaryReader()->readUnsignedShort(),
+ $this->constantPool
+ );
+
+ $this->invoker = new JavaClassInvoker($this);
+ }
+
+ public function getClassName(): string
+ {
+ return $this->className->getString();
+ }
+
+ public function getFields(): array
+ {
+ return $this->activeFields->getEntries();
+ }
+
+ public function getMethods(): array
+ {
+ return $this->activeMethods->getEntries();
+ }
+
+ public function getInvoker(): JavaClassInvoker
+ {
+ return $this->invoker;
+ }
+
+ public function appendDebug($log)
+ {
+ $this->debugTraces[] = $log;
+ return $this;
+ }
+
+ public function debug(): void
+ {
+ $cpInfo = $this->getConstantPool()->getEntries();
+ foreach ($this->debugTraces as $debugTraces) {
+ $methodAccessFlags = $debugTraces['method']->getAccessFlag();
+ $accessFlags = [];
+ $accessFlag = new AccessFlag();
+ foreach ($accessFlag->getValues() as $value) {
+ if (($methodAccessFlags & $value) !== 0) {
+ $accessFlags[] = strtolower(str_replace('_', '', $accessFlag->getName($value)));
+ }
+ }
+
+ $methodName = $cpInfo[$debugTraces['method']->getNameIndex()]->getString();
+ $descriptor = Formatter::parseSignature($cpInfo[$debugTraces['method']->getDescriptorIndex()]->getString());
+ $formattedArguments = str_replace(
+ '/',
+ '.',
+ implode(
+ ', ',
+ array_map(
+ function ($argument) {
+ $arrayBrackets = str_repeat('[]', $argument['deep_array']);
+ if ($argument['type'] === 'class') {
+ return $argument['class_name'] . $arrayBrackets;
+ }
+ return $argument['type'] . $arrayBrackets;
+ },
+ $descriptor['arguments']
+ )
+ )
+ );
+
+
+ $type = $descriptor[0]['type'];
+ if ($type === 'class') {
+ $type = $descriptor[0]['class_name'];
+ }
+
+ $type = str_replace('/', '.', $type);
+
+ $methodAccessibility = implode(' ', $accessFlags);
+
+ printf("[method]\n");
+ printf(ltrim("$methodAccessibility $type $methodName($formattedArguments)\n", ' '));
+ printf("\n");
+ printf("[code]\n");
+
+ $codeCounter = 0;
+ printf(
+ "%s\n",
+ implode(
+ "\n",
+ array_map(
+ function ($codes) use (&$codeCounter, &$debugTraces) {
+ return implode(
+ ' ',
+ array_map(
+ function ($code) use (&$codeCounter, &$debugTraces) {
+ $isMnemonic = in_array($codeCounter, $debugTraces['mnemonic_indexes']);
+ $codeCounter++;
+ return ($isMnemonic ? "\e[1m\e[35m" : "") . "<0x{$code}>" . ($isMnemonic ? "\e[m" : "");
+ },
+ $codes
+ )
+ );
+ },
+ array_chunk(str_split(bin2hex($debugTraces['raw_code']), 2), 20)
+ )
+ )
+ );
+ printf("\n");
+ printf("[executed]\n");
+
+ printf(
+ "% 8s | %-6.6s | %-20.20s | %-10.10s | %-15.15s\n",
+ "PC",
+ "OPCODE",
+ "MNEMONIC",
+ "OPERANDS",
+ "LOCAL STORAGE"
+ );
+
+ $line = sprintf(
+ "%8s+%8s+%22s+%12s+%17s\n",
+ "---------",
+ "--------",
+ "----------------------",
+ "------------",
+ "-----------------"
+ );
+
+ printf($line);
+
+ foreach ($debugTraces['executed'] as [$opcode, $mnemonic, $localStorage, $stacks, $pointer]) {
+ printf(
+ "% 8s | 0x%02X | %-20.20s | %-10.10s | %-15.15s\n",
+ (int) $pointer,
+ $opcode,
+ // Remove prefix
+ ltrim($mnemonic, '_'),
+ count($stacks),
+ count($localStorage)
+ );
+ }
+
+ printf($line);
+ printf("\n");
+ }
+ }
+}
diff --git a/src/core/JavaClassInvoker.php b/src/core/JavaClassInvoker.php
new file mode 100644
index 00000000..a6b58fed
--- /dev/null
+++ b/src/core/JavaClassInvoker.php
@@ -0,0 +1,156 @@
+javaClass = $javaClass;
+ $cpInfo = $javaClass->getConstantPool()->getEntries();
+
+ foreach ($javaClass->getMethods() as $methodInfo) {
+ /**
+ * @var _MethodInfo $methodInfo
+ */
+ $methodName = $cpInfo[$methodInfo->getNameIndex()]->getString();
+
+ if (($methodInfo->getAccessFlag() & AccessFlag::_Static) !== 0) {
+ $this->staticMethods[$methodName][] = $methodInfo;
+ } elseif ($methodInfo->getAccessFlag() === 0 || ($methodInfo->getAccessFlag() & AccessFlag::_Public) !== 0) {
+ $this->dynamicMethods[$methodName][] = $methodInfo;
+ }
+ }
+
+ foreach ($javaClass->getFields() as $fieldInfo) {
+ /**
+ * @var _FieldInfo $fieldInfo
+ */
+ $fieldName = $cpInfo[$fieldInfo->getNameIndex()]->getString();
+
+ if ($fieldInfo->getAccessFlag() === 0) {
+ $this->dynamicFields[$fieldName] = $fieldInfo;
+ } elseif (($fieldInfo->getAccessFlag() & AccessFlag::_Static) !== 0) {
+ $this->staticFields[$fieldName] = $fieldInfo;
+ }
+ }
+
+ $this->dynamicAccessor = new DynamicAccessor(
+ $this,
+ $this->dynamicMethods
+ );
+
+ $this->staticAccessor = new StaticAccessor(
+ $this,
+ $this->staticMethods
+ );
+
+ // call
+ if (isset($this->staticMethods[''])) {
+ $this->getStatic()->getMethods()->call('');
+ }
+ }
+
+ /**
+ * @return JavaClassInvoker
+ */
+ public function construct(): self
+ {
+ $this->dynamicAccessor = new DynamicAccessor(
+ $this,
+ $this->dynamicMethods
+ );
+
+ if (isset($this->dynamicMethods[''])) {
+ $this->getDynamic()->getMethods()->call('');
+ }
+
+ return $this;
+ }
+
+ /**
+ * @return JavaClass
+ */
+ public function getJavaClass(): JavaClass
+ {
+ return $this->javaClass;
+ }
+
+ /**
+ * @return DynamicAccessor
+ */
+ public function getDynamic(): DynamicAccessor
+ {
+ return $this->dynamicAccessor;
+ }
+
+ /**
+ * @return StaticAccessor
+ */
+ public function getStatic(): StaticAccessor
+ {
+ return $this->staticAccessor;
+ }
+
+ /**
+ * @param string $name
+ * @param string $signature
+ * @return bool
+ */
+ public function isInvoked(string $name, string $signature): bool
+ {
+ return in_array($signature, $this->specialInvoked[$name] ?? [], true);
+ }
+
+ /**
+ * @param string $name
+ * @param string $signature
+ * @return JavaClassInvoker
+ */
+ public function addToSpecialInvokedList(string $name, string $signature): self
+ {
+ $this->specialInvoked[$name][] = $signature;
+ return $this;
+ }
+}
diff --git a/src/core/JavaClassReader.php b/src/core/JavaClassReader.php
new file mode 100644
index 00000000..c0114f6b
--- /dev/null
+++ b/src/core/JavaClassReader.php
@@ -0,0 +1,24 @@
+handle = fopen($file, 'r');
+ $this->binaryReader = new JVM\Stream\BinaryReader($this->handle);
+ }
+
+ public function getBinaryReader(): JVM\Stream\BinaryReader
+ {
+ return $this->binaryReader;
+ }
+
+ public function __toString(): string
+ {
+ return stream_get_meta_data($this->handle)['uri'];
+ }
+}
diff --git a/src/core/jvm/AccessorInterface.php b/src/core/jvm/AccessorInterface.php
new file mode 100644
index 00000000..8f37fbb7
--- /dev/null
+++ b/src/core/jvm/AccessorInterface.php
@@ -0,0 +1,11 @@
+reader = $reader;
+ for ($i = 0; $i < $entries; $i++) {
+ // not implemented, read only
+ $this->entries[$i] = new AttributeInfo($reader);
+ $this->entries[$i]->setConstantPool($constantPool);
+ $this->entries[$i]->execute();
+ }
+ }
+
+ public function getEntries()
+ {
+ return $this->entries;
+ }
+}
diff --git a/src/core/jvm/ActiveFields.php b/src/core/jvm/ActiveFields.php
new file mode 100644
index 00000000..c83dd665
--- /dev/null
+++ b/src/core/jvm/ActiveFields.php
@@ -0,0 +1,27 @@
+reader = $reader;
+ for ($i = 0; $i < $entries; $i++) {
+ // not implemented, read only
+ $this->entries[$i] = new _FieldInfo($reader);
+ $this->entries[$i]->setConstantPool($constantPool);
+ $this->entries[$i]->execute();
+ }
+ }
+
+ public function getEntries()
+ {
+ return $this->entries;
+ }
+}
diff --git a/src/core/jvm/ActiveInterface.php b/src/core/jvm/ActiveInterface.php
new file mode 100644
index 00000000..99561b4e
--- /dev/null
+++ b/src/core/jvm/ActiveInterface.php
@@ -0,0 +1,24 @@
+reader = $reader;
+ for ($i = 0; $i < $entries; $i++) {
+ // not implemented, read only
+ $this->entries[$i] = $reader->getBinaryReader()->readUnsignedShort();
+ }
+ }
+
+ public function getEntries()
+ {
+ return $this->entries;
+ }
+}
diff --git a/src/core/jvm/ActiveMethods.php b/src/core/jvm/ActiveMethods.php
new file mode 100644
index 00000000..6b8602e3
--- /dev/null
+++ b/src/core/jvm/ActiveMethods.php
@@ -0,0 +1,27 @@
+reader = $reader;
+ for ($i = 0; $i < $entries; $i++) {
+ // not implemented, read only
+ $this->entries[$i] = new _MethodInfo($reader);
+ $this->entries[$i]->setConstantPool($constantPool);
+ $this->entries[$i]->execute();
+ }
+ }
+
+ public function getEntries()
+ {
+ return $this->entries;
+ }
+}
diff --git a/src/core/jvm/ConstantPool.php b/src/core/jvm/ConstantPool.php
new file mode 100644
index 00000000..bcb7a8ec
--- /dev/null
+++ b/src/core/jvm/ConstantPool.php
@@ -0,0 +1,85 @@
+reader = $reader;
+
+ for ($i = 1; $i < $entries; $i++) {
+ $this->entries[$i] = $this->read(
+ $reader->getBinaryReader()->readUnsignedByte()
+ );
+
+ // execute
+ $this->entries[$i]->execute();
+
+ // Java's Long and Double problem.
+ if ($this->entries[$i] instanceof _Long ||
+ $this->entries[$i] instanceof _Double) {
+ $i++;
+ }
+ }
+ }
+
+ public function getEntries(): array
+ {
+ return $this->entries;
+ }
+
+ private function read($entryTag): ?StructureInterface
+ {
+ switch ($entryTag) {
+ case ConstantPoolTag::CONSTANT_Class:
+ return new _Class($this->reader);
+ case ConstantPoolTag::CONSTANT_Fieldref:
+ return new _Fieldref($this->reader);
+ case ConstantPoolTag::CONSTANT_Methodref:
+ return new _Methodref($this->reader);
+ case ConstantPoolTag::CONSTANT_String:
+ return new _String($this->reader);
+ case ConstantPoolTag::CONSTANT_Integer:
+ return new _Integer($this->reader);
+ case ConstantPoolTag::CONSTANT_Float:
+ return new _Float($this->reader);
+ case ConstantPoolTag::CONSTANT_Long:
+ return new _Long($this->reader);
+ case ConstantPoolTag::CONSTANT_Double:
+ return new _Double($this->reader);
+ case ConstantPoolTag::CONSTANT_NameAndType:
+ return new _NameAndType($this->reader);
+ case ConstantPoolTag::CONSTANT_Utf8:
+ return new _Utf8($this->reader);
+ case ConstantPoolTag::CONSTANT_MethodHandle:
+ case ConstantPoolTag::CONSTANT_MethodType:
+ case ConstantPoolTag::CONSTANT_Module:
+ case ConstantPoolTag::CONSTANT_Package:
+ throw new ReadEntryException('Entry tag ' . sprintf('%x', $entryTag) . ' is not implemented.');
+ }
+ throw new ReadEntryException('Entry tag ' . sprintf('%x', $entryTag) . ' is not defined.');
+ }
+}
diff --git a/src/core/jvm/DynamicAccessor.php b/src/core/jvm/DynamicAccessor.php
new file mode 100644
index 00000000..0ac8467a
--- /dev/null
+++ b/src/core/jvm/DynamicAccessor.php
@@ -0,0 +1,37 @@
+methodAccessor = new DynamicMethodInvoker($invoker, $methods);
+ $this->fieldAccessor = new DynamicField($invoker, []);
+ }
+
+ public function getFields(): FieldInterface
+ {
+ return $this->fieldAccessor;
+ }
+
+ public function getMethods(): InvokerInterface
+ {
+ return $this->methodAccessor;
+ }
+}
diff --git a/src/core/jvm/StaticAccessor.php b/src/core/jvm/StaticAccessor.php
new file mode 100644
index 00000000..cd1d17b0
--- /dev/null
+++ b/src/core/jvm/StaticAccessor.php
@@ -0,0 +1,37 @@
+methodAccessor = new StaticMethodInvoker($invoker, $methods);
+ $this->fieldAccessor = new StaticField($invoker, []);
+ }
+
+ public function getFields(): FieldInterface
+ {
+ return $this->fieldAccessor;
+ }
+
+ public function getMethods(): InvokerInterface
+ {
+ return $this->methodAccessor;
+ }
+}
diff --git a/src/core/jvm/field/DynamicField.php b/src/core/jvm/field/DynamicField.php
new file mode 100644
index 00000000..38d266f9
--- /dev/null
+++ b/src/core/jvm/field/DynamicField.php
@@ -0,0 +1,19 @@
+javaClassInvoker = $javaClassInvoker;
+ $this->fields = $fields;
+ }
+}
diff --git a/src/core/jvm/field/FieldGettable.php b/src/core/jvm/field/FieldGettable.php
new file mode 100644
index 00000000..d76bc848
--- /dev/null
+++ b/src/core/jvm/field/FieldGettable.php
@@ -0,0 +1,26 @@
+fields[$name])) {
+ debug_print_backtrace();
+ throw new NoSuchFieldException('Get to undefined field ' . $name);
+ }
+ if ($this->fields[$name] instanceof _String) {
+ return (string) $this->fields[$name];
+ }
+ return $this->fields[$name];
+ }
+}
diff --git a/src/core/jvm/field/FieldInterface.php b/src/core/jvm/field/FieldInterface.php
new file mode 100644
index 00000000..3b32d760
--- /dev/null
+++ b/src/core/jvm/field/FieldInterface.php
@@ -0,0 +1,11 @@
+fields[$name] = $value;
+ return $this;
+ }
+}
diff --git a/src/core/jvm/field/StaticField.php b/src/core/jvm/field/StaticField.php
new file mode 100644
index 00000000..191d66e3
--- /dev/null
+++ b/src/core/jvm/field/StaticField.php
@@ -0,0 +1,20 @@
+javaClassInvoker = $javaClassInvoker;
+ $this->fields = $fields;
+ }
+}
diff --git a/src/core/jvm/invoker/DynamicMethodInvoker.php b/src/core/jvm/invoker/DynamicMethodInvoker.php
new file mode 100644
index 00000000..b381d551
--- /dev/null
+++ b/src/core/jvm/invoker/DynamicMethodInvoker.php
@@ -0,0 +1,12 @@
+javaClassInvoker = $javaClassInvoker;
+ $this->methods = $methods;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed ...$arguments
+ * @return null
+ * @throws IllegalJavaClassException
+ * @throws NoSuchMethodException
+ * @throws RuntimeException
+ * @throws UndefinedMethodException
+ * @throws UndefinedOpCodeException
+ * @throws \PHPJava\Exceptions\TypeException
+ */
+ public function call(string $name, ...$arguments)
+ {
+ $getCodeAttribute = function ($attributes): ?CodeAttribute {
+ foreach ($attributes as $attribute) {
+ /**
+ * @var AttributeInfo $attribute
+ */
+ if ($attribute->getAttributeData() instanceof CodeAttribute) {
+ return $attribute->getAttributeData();
+ }
+ }
+ return null;
+ };
+
+ /**
+ * @var _MethodInfo|null $method
+ */
+ $methodReferences = $this->methods[$name] ?? null;
+ if ($methodReferences === null) {
+ throw new UndefinedMethodException('Call to undefined method ' . $name . '.');
+ }
+
+ $constantPool = $this->javaClassInvoker
+ ->getJavaClass()
+ ->getConstantPool()
+ ->getEntries();
+
+ // Find same method
+ $convertedPassedArguments = Formatter::buildArgumentsSignature(
+ array_map(
+ function ($argument) {
+ return TypeResolver::convertPHPtoJava($argument);
+ },
+ $arguments
+ )
+ );
+
+ $method = null;
+ foreach ($methodReferences as $methodReference) {
+ $methodSignature = Formatter::buildArgumentsSignature(
+ Formatter::parseSignature($constantPool[$methodReference->getDescriptorIndex()]->getString())['arguments']
+ );
+
+ if ($methodSignature === $convertedPassedArguments) {
+ $method = $methodReference;
+ break;
+ }
+ }
+
+ if ($method === null) {
+ throw new NoSuchMethodException('Call to undefined method ' . $name . '.');
+ }
+
+ $codeAttribute = $getCodeAttribute($method->getAttributes());
+
+ if ($codeAttribute === null) {
+ throw new IllegalJavaClassException('Java class does not having code attribution.');
+ }
+
+ $handle = fopen('php://memory', 'r+');
+ fwrite($handle, $codeAttribute->getCode());
+ rewind($handle);
+
+ // debug code attribution with HEX
+ $debugTraces['raw_code'] = $codeAttribute->getCode();
+ $debugTraces['method'] = $method;
+ $debugTraces['mnemonic_indexes'] = [];
+ $debugTraces['executed'] = [];
+
+ $reader = new BinaryReader($handle);
+ $localStorage = $arguments;
+
+ if ($this->isDynamic()) {
+ array_unshift(
+ $localStorage,
+ $this->javaClassInvoker->getJavaClass()
+ );
+ }
+
+ $stacks = [];
+ $mnemonicMap = new OpCode();
+ $executedCounter = 0;
+ while ($reader->getOffset() < $codeAttribute->getOpCodeLength()) {
+ if (++$executedCounter > \PHPJava\Core\JVM\Parameters\Invoker::MAX_STACK_EXCEEDED) {
+ throw new RuntimeException('Max stack exceeded. PHPJava has been stopped by safety guard. Maybe Java class has illegal program counter, stacks, or OpCode.');
+ }
+ $opcode = $reader->readUnsignedByte();
+ $mnemonic = $mnemonicMap->getName($opcode);
+
+ if ($mnemonic === null) {
+ throw new UndefinedOpCodeException('Call to undefined OpCode ' . sprintf('0x%X', $cursor) . '.');
+ }
+ $pointer = $reader->getOffset() - 1;
+
+ $fullName = '\\PHPJava\\Kernel\\Mnemonics\\' . $mnemonic;
+ $debugTraces['executed'][] = [$opcode, $mnemonic, $localStorage, $stacks, $pointer];
+ $debugTraces['mnemonic_indexes'][] = $pointer;
+
+ /**
+ * @var OperationInterface|Accumulator|ConstantPool $executor
+ */
+ $executor = new $fullName();
+ $executor->setConstantPool($this->javaClassInvoker->getJavaClass()->getConstantPool());
+ $executor->setParameters(
+ $this->javaClassInvoker,
+ $reader,
+ $localStorage,
+ $stacks,
+ $pointer
+ );
+ $returnValue = $executor->execute();
+
+ if ($returnValue !== null) {
+ $this->javaClassInvoker->getJavaClass()->appendDebug($debugTraces);
+ return $returnValue;
+ }
+ }
+
+ $this->javaClassInvoker->getJavaClass()->appendDebug($debugTraces);
+ return null;
+ }
+}
diff --git a/src/core/jvm/invoker/InvokerInterface.php b/src/core/jvm/invoker/InvokerInterface.php
new file mode 100644
index 00000000..30320939
--- /dev/null
+++ b/src/core/jvm/invoker/InvokerInterface.php
@@ -0,0 +1,11 @@
+handle = $handle;
+ }
+
+ final public function read($bytes = 1)
+ {
+ $this->offset += $bytes;
+ return fread($this->handle, $bytes);
+ }
+
+ public function readByte()
+ {
+ return current(unpack('c', $this->read(1)));
+ }
+
+ public function readUnsignedByte()
+ {
+ return (int) sprintf('%u', ord($this->read(1)));
+ }
+
+ public function readUnsignedInt()
+ {
+ return base_convert(bin2hex($this->read(4)), 16, 10);
+ }
+
+ public function readUnsignedShort()
+ {
+ return (int) sprintf('%u', hexdec(bin2hex($this->read(2))));
+ }
+
+ public function readInt()
+ {
+ $bytes = array_values(unpack('c4', $this->read(4)));
+ return ($bytes[0] << 24) | ($bytes[1] << 16) | ($bytes[2] << 8) | $bytes[3];
+ }
+
+ public function readShort()
+ {
+ $short = $this->readUnsignedShort();
+ return (($short & 0x8000) > 0) ? ($short - 0xFFFF - 1) : $short ;
+ }
+
+ public function readUnsignedLong()
+ {
+ if (PHP_INT_MAX === 2147483647) {
+ return base_convert(bin2hex($this->read(8)), 16, 10);
+ }
+
+ return (int) sprintf('%u', hexdec(bin2hex($this->read(8))));
+ }
+
+ public function readLong()
+ {
+ return hexdec(bin2hex($this->read(8)));
+ }
+
+ public function seek($bytes)
+ {
+ $this->offset += $bytes;
+ fseek($this->handle, $bytes, SEEK_CUR);
+ }
+
+ public function setOffset($pointer)
+ {
+ $this->offset = $pointer;
+ fseek($this->handle, $pointer, SEEK_SET);
+ }
+
+ public function getOffset()
+ {
+ return $this->offset;
+ }
+}
diff --git a/src/core/jvm/validations/MagicByte.php b/src/core/jvm/validations/MagicByte.php
new file mode 100644
index 00000000..2c552404
--- /dev/null
+++ b/src/core/jvm/validations/MagicByte.php
@@ -0,0 +1,20 @@
+magicByte = $magicByte;
+ }
+
+ public function isValid(): bool
+ {
+ return static::CAFEBABE === BinaryTool::toHex($this->magicByte ?? null);
+ }
+}
diff --git a/src/core/jvm/validations/ValidatorInterface.php b/src/core/jvm/validations/ValidatorInterface.php
new file mode 100644
index 00000000..36e48d88
--- /dev/null
+++ b/src/core/jvm/validations/ValidatorInterface.php
@@ -0,0 +1,7 @@
+getString() . "\n";
+ return;
+ }
+ if (is_string($arg) ||
+ is_int($arg) ||
+ $arg instanceof Type ||
+ $arg instanceof \PHPJava\Imitation\java\lang\_String
+ ) {
+ echo $arg . "\n";
+ return;
+ }
+
+ echo "\n";
+ }
+
+ public function print($arg)
+ {
+ if ($arg instanceof _Utf8) {
+ echo $arg->getString();
+ return;
+ }
+ if (is_string($arg) ||
+ is_int($arg) ||
+ $arg instanceof Type ||
+ $arg instanceof \PHPJava\Imitation\java\lang\_String
+ ) {
+ echo $arg;
+ return;
+ }
+ }
+
+ public function append($string)
+ {
+ $this->sequence .= $string;
+ return $this;
+ }
+}
diff --git a/src/imitation/java/lang/ArrayIndexOutOfBoundsException.php b/src/imitation/java/lang/ArrayIndexOutOfBoundsException.php
new file mode 100644
index 00000000..3612c5cb
--- /dev/null
+++ b/src/imitation/java/lang/ArrayIndexOutOfBoundsException.php
@@ -0,0 +1,8 @@
+sequence .= $arg->toString();
+ } else {
+ if (is_array($arg)) {
+ $arg = implode($arg);
+ }
+ $this->sequence .= $arg;
+ }
+ return $this;
+ }
+
+ public function toString(): string
+ {
+ return $this->sequence;
+ }
+
+ public function __toString(): string
+ {
+ return $this->sequence;
+ }
+}
diff --git a/src/imitation/java/lang/Throwable.php b/src/imitation/java/lang/Throwable.php
new file mode 100644
index 00000000..06858171
--- /dev/null
+++ b/src/imitation/java/lang/Throwable.php
@@ -0,0 +1,17 @@
+getMessage();
+ }
+}
diff --git a/src/imitation/java/lang/_Object.php b/src/imitation/java/lang/_Object.php
new file mode 100644
index 00000000..d08ae280
--- /dev/null
+++ b/src/imitation/java/lang/_Object.php
@@ -0,0 +1,7 @@
+object = $object;
+ }
+
+ public function equals($object): bool
+ {
+ if (!($this->object instanceof _Utf8)) {
+ return false;
+ }
+ if ($object instanceof _String) {
+ return $this->toString() === $object->toString();
+ }
+ return $this->toString() === $object;
+ }
+
+ public function toString(): string
+ {
+ return $this->__toString();
+ }
+
+ public function __toString(): string
+ {
+ if (!($this->object instanceof _Utf8)) {
+ return (string) $this->object;
+ }
+ return $this->object->getString();
+ }
+}
diff --git a/src/imitation/phpjava/extended/_Object.php b/src/imitation/phpjava/extended/_Object.php
new file mode 100644
index 00000000..80a794f3
--- /dev/null
+++ b/src/imitation/phpjava/extended/_Object.php
@@ -0,0 +1,65 @@
+toString();
+ }
+
+ public function wait(int $timeout = null, int $nanos = null): void
+ {
+ // not implemented.
+ }
+}
diff --git a/src/kernel/attributes/AnnotationDefaultAttribute.php b/src/kernel/attributes/AnnotationDefaultAttribute.php
new file mode 100644
index 00000000..7730dfc8
--- /dev/null
+++ b/src/kernel/attributes/AnnotationDefaultAttribute.php
@@ -0,0 +1,16 @@
+attributeNameIndex = $this->readUnsignedShort();
+ $this->attributeLength = $this->readUnsignedInt();
+ $cpInfo = $this->getConstantPool()->getEntries();
+ $classAttributeName = '\\PHPJava\\Kernel\\Attributes\\' . $cpInfo[$this->attributeNameIndex]->getString() . 'Attribute';
+ $this->attributeData = new $classAttributeName($this->reader);
+ $this->attributeData->setConstantPool($this->getConstantPool());
+ $this->attributeData->execute();
+ }
+
+ public function getAttributeData()
+ {
+ return $this->attributeData;
+ }
+
+ public function getAttributeNameIndex()
+ {
+ return $this->attributeNameIndex;
+ }
+
+ public function getAttributeLength()
+ {
+ return $this->attributeLength;
+ }
+}
diff --git a/src/kernel/attributes/AttributeInterface.php b/src/kernel/attributes/AttributeInterface.php
new file mode 100644
index 00000000..df1827f7
--- /dev/null
+++ b/src/kernel/attributes/AttributeInterface.php
@@ -0,0 +1,7 @@
+maxStack = $this->readUnsignedShort();
+ $this->maxLocals = $this->readUnsignedShort();
+ $this->codeLength = $this->readUnsignedInt();
+
+ // read mnemonics
+ $this->code = [];
+ for ($i = 0; $i < $this->codeLength; $i++) {
+ $this->code[$i] = $this->readUnsignedByte();
+ $this->rawCode .= chr($this->code[$i]);
+ }
+
+ // read exception table
+ $this->exceptionTableLength = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->exceptionTableLength; $i++) {
+ $exceptionTable = new \PHPJava\Kernel\Structures\_ExceptionTable($this->reader);
+ $exceptionTable->setConstantPool($this->getConstantPool());
+ $exceptionTable->setStartPc($this->readUnsignedShort())
+ ->setEndPc($this->readUnsignedShort())
+ ->setHandlerPc($this->readUnsignedShort())
+ ->setCatchType($this->readUnsignedShort())
+ ->execute();
+ $this->exceptionTables[] = $exceptionTable;
+ }
+
+ $this->attributeCount = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->attributeCount; $i++) {
+ $attributeInfo = new \PHPJava\Kernel\Attributes\AttributeInfo($this->reader);
+ $attributeInfo->setConstantPool($this->getConstantPool());
+ $attributeInfo->execute();
+ $this->attributeInfo[] = $attributeInfo;
+ }
+ }
+ public function getExceptionTables()
+ {
+ return $this->exceptionTables;
+ }
+ public function getCode()
+ {
+ return $this->rawCode;
+ }
+ public function getOpCodes()
+ {
+ return $this->code;
+ }
+ public function getOpCodeLength()
+ {
+ return (int) $this->codeLength;
+ }
+}
diff --git a/src/kernel/attributes/ConstantValueAttribute.php b/src/kernel/attributes/ConstantValueAttribute.php
new file mode 100644
index 00000000..76100f4f
--- /dev/null
+++ b/src/kernel/attributes/ConstantValueAttribute.php
@@ -0,0 +1,16 @@
+numberOfClasses = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->numberOfClasses; $i++) {
+ $thises[$i] = new JavaStructureClasses($this);
+ $thises[$i]->setInnerClassInfoIndex($this->readUnsignedShort());
+ $thises[$i]->setOuterClassInfoIndex($this->readUnsignedShort());
+ $thises[$i]->setInnerNameIndex($this->readUnsignedShort());
+ $thises[$i]->setInnerClassAccessFlag($this->readUnsignedShort());
+ }
+ }
+ public function getClasses()
+ {
+ return $thises;
+ }
+}
diff --git a/src/kernel/attributes/LineNumberTableAttribute.php b/src/kernel/attributes/LineNumberTableAttribute.php
new file mode 100644
index 00000000..0e554cf6
--- /dev/null
+++ b/src/kernel/attributes/LineNumberTableAttribute.php
@@ -0,0 +1,30 @@
+lineNumberTableLength = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->lineNumberTableLength; $i++) {
+ $lineNumberTable = new \PHPJava\Kernel\Structures\_LineNumberTable($this->reader);
+ $lineNumberTable->setConstantPool($this->getConstantPool());
+ $lineNumberTable->setStartPc($this->readUnsignedShort())
+ ->setLineNumber($this->readUnsignedShort())
+ ->execute();
+ $this->lineNumberTables[] = $lineNumberTable;
+ }
+ }
+ public function getLineNumberTables()
+ {
+ return $this->lineNumberTables;
+ }
+}
diff --git a/src/kernel/attributes/LocalVariableTableAttribute.php b/src/kernel/attributes/LocalVariableTableAttribute.php
new file mode 100644
index 00000000..2198f04c
--- /dev/null
+++ b/src/kernel/attributes/LocalVariableTableAttribute.php
@@ -0,0 +1,21 @@
+localVariableTableLength = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->localVariableTableLength; $i++) {
+ $this->localVariableTables[] = new JavaStructureLocalVariableTable($class);
+ }
+ }
+}
diff --git a/src/kernel/attributes/LocalVariableTypeTableAttribute.php b/src/kernel/attributes/LocalVariableTypeTableAttribute.php
new file mode 100644
index 00000000..561535a8
--- /dev/null
+++ b/src/kernel/attributes/LocalVariableTypeTableAttribute.php
@@ -0,0 +1,16 @@
+sourceFileIndex = $this->readUnsignedShort();
+ }
+ public function getSourceFileIndex()
+ {
+ return $this->sourceFileIndex;
+ }
+}
diff --git a/src/kernel/attributes/StackMapTableAttribute.php b/src/kernel/attributes/StackMapTableAttribute.php
new file mode 100644
index 00000000..113d721b
--- /dev/null
+++ b/src/kernel/attributes/StackMapTableAttribute.php
@@ -0,0 +1,28 @@
+numberOfEntries = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->numberOfEntries; $i++) {
+ $stackMapFrame = new \PHPJava\Kernel\Structures\_StackMapFrame($this->reader);
+ $stackMapFrame->setConstantPool($this->getConstantPool());
+ $stackMapFrame->execute();
+ $this->stackMapFrames[] = $stackMapFrame;
+ }
+ }
+ public function getStackMapFrames()
+ {
+ return $this->stackMapFrames;
+ }
+}
diff --git a/src/kernel/attributes/SyntheticAttribute.php b/src/kernel/attributes/SyntheticAttribute.php
new file mode 100644
index 00000000..b91b1598
--- /dev/null
+++ b/src/kernel/attributes/SyntheticAttribute.php
@@ -0,0 +1,16 @@
+javaClassInvoker = $javaClassInvoker;
+ $this->javaClass = $javaClassInvoker->getJavaClass();
+ $this->reader = $reader;
+ $this->localStorage = &$localStorage;
+ $this->stacks = &$stacks;
+ $this->pointer = $pointer;
+ return $this;
+ }
+
+ final public function read($bytes = 1)
+ {
+ return $this->reader->read($bytes);
+ }
+
+ public function readByte()
+ {
+ return $this->reader->readByte();
+ }
+
+ public function readUnsignedByte()
+ {
+ return $this->reader->readUnsignedByte();
+ }
+
+ public function readUnsignedInt()
+ {
+ return $this->reader->readUnsignedInt();
+ }
+
+ public function readUnsignedShort()
+ {
+ return $this->reader->readUnsignedShort();
+ }
+
+ public function readInt()
+ {
+ return $this->reader->readInt();
+ }
+
+ public function readShort()
+ {
+ return $this->reader->readShort();
+ }
+
+ public function readUnsignedLong()
+ {
+ return $this->reader->readUnsignedLong();
+ }
+
+ public function readLong()
+ {
+ return $this->reader->readLong();
+ }
+
+ public function seek($bytes)
+ {
+ $this->reader->seek($bytes);
+ }
+
+ public function setOffset($pointer)
+ {
+ $this->reader->setOffset($pointer);
+ }
+
+ public function getOffset()
+ {
+ return $this->reader->getOffset();
+ }
+
+
+ public function pushStack($value)
+ {
+ $this->stacks[] = $value;
+ }
+
+ public function pushStackByReference(&$value)
+ {
+ $this->stacks[] = &$value;
+ }
+
+ public function dupStack()
+ {
+ $stack = $this->stacks[sizeof($this->stacks) - 1] ?? null;
+ if ($stack === null) {
+ throw new \Exception('Stack overflow');
+ }
+ $this->pushStack($stack);
+ }
+
+ public function getStack()
+ {
+ return array_pop($this->stacks);
+ }
+
+ public function popStack()
+ {
+ array_pop($this->stacks);
+ }
+
+ public function getStacks()
+ {
+ return $this->stacks;
+ }
+
+ public function setLocalStorage($index, $value)
+ {
+ $this->localStorage[(int) $index] = $value;
+ }
+
+
+ public function getLocalStorage($index)
+ {
+ if (!isset($this->localStorage[(int) $index])) {
+ $this->localStorage[(int) $index] = null;
+ }
+ return $this->localStorage[(int) $index];
+ }
+
+ public function getLocalStorages()
+ {
+ return $this->localStorage;
+ }
+
+ public function getProgramCounter()
+ {
+ return $this->pointer;
+ }
+}
diff --git a/src/kernel/core/BinaryReader.php b/src/kernel/core/BinaryReader.php
new file mode 100644
index 00000000..a6d54458
--- /dev/null
+++ b/src/kernel/core/BinaryReader.php
@@ -0,0 +1,74 @@
+reader = $reader;
+ }
+
+ final public function read($bytes = 1)
+ {
+ return $this->reader->getBinaryReader()->read($bytes);
+ }
+
+ public function readByte()
+ {
+ return $this->reader->getBinaryReader()->readByte();
+ }
+
+ public function readUnsignedByte()
+ {
+ return $this->reader->getBinaryReader()->readUnsignedByte();
+ }
+
+ public function readUnsignedInt()
+ {
+ return $this->reader->getBinaryReader()->readUnsignedInt();
+ }
+
+ public function readUnsignedShort()
+ {
+ return $this->reader->getBinaryReader()->readUnsignedShort();
+ }
+
+ public function readInt()
+ {
+ return $this->reader->getBinaryReader()->readInt();
+ }
+
+ public function readShort()
+ {
+ return $this->reader->getBinaryReader()->readShort();
+ }
+
+ public function readUnsignedLong()
+ {
+ return $this->reader->getBinaryReader()->readUnsignedLong();
+ }
+
+ public function readLong()
+ {
+ return $this->reader->getBinaryReader()->readLong();
+ }
+
+ public function seek($bytes)
+ {
+ $this->reader->getBinaryReader()->seek($bytes);
+ }
+
+ public function setOffset($pointer)
+ {
+ $this->reader->getBinaryReader()->setOffset($pointer);
+ }
+
+ public function getOffset()
+ {
+ return $this->reader->getBinaryReader()->getOffset();
+ }
+}
diff --git a/src/kernel/core/ConstantPool.php b/src/kernel/core/ConstantPool.php
new file mode 100644
index 00000000..6a94ec7f
--- /dev/null
+++ b/src/kernel/core/ConstantPool.php
@@ -0,0 +1,18 @@
+constantPool = $constantPool;
+ return $this;
+ }
+
+ public function getConstantPool(): \PHPJava\Core\JVM\ConstantPool
+ {
+ return $this->constantPool;
+ }
+}
diff --git a/src/kernel/frames/AppendFrame.php b/src/kernel/frames/AppendFrame.php
new file mode 100644
index 00000000..aae5a894
--- /dev/null
+++ b/src/kernel/frames/AppendFrame.php
@@ -0,0 +1,26 @@
+frameType = $this->readUnsignedByte();
+ $this->offsetDelta = $this->readUnsignedShort();
+ for ($i = 0, $s = $this->frameType - 251; $i < $s; $i++) {
+ $local = new \PHPJava\Kernel\Structures\_VerificationTypeInfo($this->reader);
+ $local->execute();
+ $this->locals[] = $local;
+ }
+ }
+}
diff --git a/src/kernel/frames/ChopFrame.php b/src/kernel/frames/ChopFrame.php
new file mode 100644
index 00000000..84ee66a9
--- /dev/null
+++ b/src/kernel/frames/ChopFrame.php
@@ -0,0 +1,20 @@
+frameType = $this->readUnsignedByte();
+ $this->offsetDelta = $this->readUnsignedShort();
+ }
+}
diff --git a/src/kernel/frames/FrameInterface.php b/src/kernel/frames/FrameInterface.php
new file mode 100644
index 00000000..da1870bf
--- /dev/null
+++ b/src/kernel/frames/FrameInterface.php
@@ -0,0 +1,8 @@
+frameType = $this->readUnsignedByte();
+ $this->offsetDelta = $this->readUnsignedShort();
+ $this->numberOfLocals = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->numberOfLocals; $i++) {
+ $local = new \PHPJava\Kernel\Structures\_VerificationTypeInfo($this->reader);
+ $local->execute();
+ $this->locals = $local;
+ }
+ $this->numberOfStackItems = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->numberOfStackItems; $i++) {
+ $stack = new \PHPJava\Kernel\Structures\_VerificationTypeInfo($this->reader);
+ $stack->execute();
+ $this->stack[] = $stack;
+ }
+ }
+}
diff --git a/src/kernel/frames/SameFrame.php b/src/kernel/frames/SameFrame.php
new file mode 100644
index 00000000..56d6f78a
--- /dev/null
+++ b/src/kernel/frames/SameFrame.php
@@ -0,0 +1,18 @@
+frameType = $this->readUnsignedByte();
+ }
+}
diff --git a/src/kernel/frames/SameFrameExtended.php b/src/kernel/frames/SameFrameExtended.php
new file mode 100644
index 00000000..ff0c9738
--- /dev/null
+++ b/src/kernel/frames/SameFrameExtended.php
@@ -0,0 +1,20 @@
+frameType = $this->readUnsignedByte();
+ $this->offsetDelta = $this->readUnsignedShort();
+ }
+}
diff --git a/src/kernel/frames/SameLocals1StackItemFrame.php b/src/kernel/frames/SameLocals1StackItemFrame.php
new file mode 100644
index 00000000..bfe3997d
--- /dev/null
+++ b/src/kernel/frames/SameLocals1StackItemFrame.php
@@ -0,0 +1,22 @@
+frameType = $this->readUnsignedByte();
+ $stack = new \PHPJava\Kernel\Structures\_VerificationTypeInfo($this->reader);
+ $stack->execute();
+ $this->stack[] = $stack;
+ }
+}
diff --git a/src/kernel/frames/SameLocals1StackItemFrameExtended.php b/src/kernel/frames/SameLocals1StackItemFrameExtended.php
new file mode 100644
index 00000000..dcddcc71
--- /dev/null
+++ b/src/kernel/frames/SameLocals1StackItemFrameExtended.php
@@ -0,0 +1,23 @@
+frameType = $this->readUnsignedByte();
+ $this->offsetDelta = $this->readUnsignedShort();
+ $local = new \PHPJava\Kernel\Structures\_VerificationTypeInfo($this->reader);
+ $local->execute();
+ $this->locals[] = $local;
+ }
+}
diff --git a/src/kernel/maps/AccessFlag.php b/src/kernel/maps/AccessFlag.php
new file mode 100644
index 00000000..986bf044
--- /dev/null
+++ b/src/kernel/maps/AccessFlag.php
@@ -0,0 +1,13 @@
+getConstants(), true)) !== false) {
+ return $key;
+ }
+ } catch (\ReflectionException $e) {
+ }
+ return null;
+ }
+
+ public function getValues(): array
+ {
+ try {
+ $reflectionClass = new \ReflectionClass($this);
+ return array_values($reflectionClass->getConstants());
+ } catch (\ReflectionException $e) {
+ }
+ return [];
+ }
+}
diff --git a/src/kernel/maps/OpCode.php b/src/kernel/maps/OpCode.php
new file mode 100644
index 00000000..35b1f1c7
--- /dev/null
+++ b/src/kernel/maps/OpCode.php
@@ -0,0 +1,211 @@
+getStack();
+ $arrayref = $this->getStack();
+
+ if (!isset($arrayref[$index])) {
+ throw new \PHPJava\Imitation\java\lang\ArrayIndexOutOfBoundsException('Array index ' . $index . ' out of bounds. (Program Counter: ' . $this->getProgramCounter() . ')');
+ }
+ $this->pushStack($arrayref[$index]);
+ }
+}
diff --git a/src/kernel/mnemonics/_aastore.php b/src/kernel/mnemonics/_aastore.php
new file mode 100644
index 00000000..8f148900
--- /dev/null
+++ b/src/kernel/mnemonics/_aastore.php
@@ -0,0 +1,23 @@
+getStack();
+ $index = $this->getStack();
+ $arrayref = $this->getStack();
+
+ $arrayref[$index] = $value;
+ }
+}
diff --git a/src/kernel/mnemonics/_aconst_null.php b/src/kernel/mnemonics/_aconst_null.php
new file mode 100644
index 00000000..28faa94c
--- /dev/null
+++ b/src/kernel/mnemonics/_aconst_null.php
@@ -0,0 +1,19 @@
+pushStack(null);
+ }
+}
diff --git a/src/kernel/mnemonics/_aload.php b/src/kernel/mnemonics/_aload.php
new file mode 100644
index 00000000..f4674307
--- /dev/null
+++ b/src/kernel/mnemonics/_aload.php
@@ -0,0 +1,20 @@
+readByte();
+ $this->pushStack($this->getLocalStorage($index));
+ }
+}
diff --git a/src/kernel/mnemonics/_aload_0.php b/src/kernel/mnemonics/_aload_0.php
new file mode 100644
index 00000000..3661e451
--- /dev/null
+++ b/src/kernel/mnemonics/_aload_0.php
@@ -0,0 +1,19 @@
+pushStack($this->getLocalStorage(0));
+ }
+}
diff --git a/src/kernel/mnemonics/_aload_1.php b/src/kernel/mnemonics/_aload_1.php
new file mode 100644
index 00000000..cf5ed84b
--- /dev/null
+++ b/src/kernel/mnemonics/_aload_1.php
@@ -0,0 +1,19 @@
+pushStack($this->getLocalStorage(1));
+ }
+}
diff --git a/src/kernel/mnemonics/_aload_2.php b/src/kernel/mnemonics/_aload_2.php
new file mode 100644
index 00000000..cafb4499
--- /dev/null
+++ b/src/kernel/mnemonics/_aload_2.php
@@ -0,0 +1,19 @@
+pushStack($this->getLocalStorage(2));
+ }
+}
diff --git a/src/kernel/mnemonics/_aload_3.php b/src/kernel/mnemonics/_aload_3.php
new file mode 100644
index 00000000..cf6e496f
--- /dev/null
+++ b/src/kernel/mnemonics/_aload_3.php
@@ -0,0 +1,19 @@
+pushStack($this->getLocalStorage(3));
+ }
+}
diff --git a/PHPJava/Statements/JavaStatement_anewarray.php b/src/kernel/mnemonics/_anewarray.php
similarity index 53%
rename from PHPJava/Statements/JavaStatement_anewarray.php
rename to src/kernel/mnemonics/_anewarray.php
index 83b48c14..f437c5ad 100644
--- a/PHPJava/Statements/JavaStatement_anewarray.php
+++ b/src/kernel/mnemonics/_anewarray.php
@@ -1,23 +1,28 @@
getByteCodeStream()->readUnsignedShort();
+ $this->readUnsignedShort();
// 空の配列を渡す (nullで埋める)
$count = $this->getStack();
// need reference
- $ref = new ArrayIterator(array_fill(0, $count, null));
+ $ref = new \ArrayIterator(array_fill(0, $count, null));
$this->pushStackByReference($ref);
-
}
-
-}
+}
diff --git a/src/kernel/mnemonics/_areturn.php b/src/kernel/mnemonics/_areturn.php
new file mode 100644
index 00000000..13a2a140
--- /dev/null
+++ b/src/kernel/mnemonics/_areturn.php
@@ -0,0 +1,16 @@
+getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_arraylength.php b/src/kernel/mnemonics/_arraylength.php
new file mode 100644
index 00000000..6f733a39
--- /dev/null
+++ b/src/kernel/mnemonics/_arraylength.php
@@ -0,0 +1,18 @@
+getStack();
+
+ $this->pushStack(sizeof($arrayref));
+ }
+}
diff --git a/src/kernel/mnemonics/_astore.php b/src/kernel/mnemonics/_astore.php
new file mode 100644
index 00000000..84a2ab50
--- /dev/null
+++ b/src/kernel/mnemonics/_astore.php
@@ -0,0 +1,17 @@
+readUnsignedByte();
+ $this->setLocalStorage($index, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_astore_0.php b/src/kernel/mnemonics/_astore_0.php
new file mode 100644
index 00000000..5f547776
--- /dev/null
+++ b/src/kernel/mnemonics/_astore_0.php
@@ -0,0 +1,16 @@
+setLocalStorage(0, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_astore_1.php b/src/kernel/mnemonics/_astore_1.php
new file mode 100644
index 00000000..6ca1c84a
--- /dev/null
+++ b/src/kernel/mnemonics/_astore_1.php
@@ -0,0 +1,16 @@
+setLocalStorage(1, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_astore_2.php b/src/kernel/mnemonics/_astore_2.php
new file mode 100644
index 00000000..058ba01e
--- /dev/null
+++ b/src/kernel/mnemonics/_astore_2.php
@@ -0,0 +1,16 @@
+setLocalStorage(2, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_astore_3.php b/src/kernel/mnemonics/_astore_3.php
new file mode 100644
index 00000000..41af3d20
--- /dev/null
+++ b/src/kernel/mnemonics/_astore_3.php
@@ -0,0 +1,16 @@
+setLocalStorage(3, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_athrow.php b/src/kernel/mnemonics/_athrow.php
new file mode 100644
index 00000000..d24fa681
--- /dev/null
+++ b/src/kernel/mnemonics/_athrow.php
@@ -0,0 +1,31 @@
+getConstantPool()->getEntries();
+
+ $objectref = $this->getStack();
+
+ $className = str_replace('\\', '/', get_class($objectref));
+
+ foreach ($this->getAttributeData()->getExceptionTables() as $exception) {
+ if ($cpInfo[$cpInfo[$exception->getCatchType()]->getClassIndex()]->getString() === $className &&
+ $exception->getStartPc() <= $this->getProgramCounter() &&
+ $exception->getEndPc() >= $this->getProgramCounter()) {
+ $this->setOffset($exception->getHandlerPc());
+ return;
+ }
+ }
+
+ throw new Exception('exception table was broken.');
+ }
+}
diff --git a/src/kernel/mnemonics/_baload.php b/src/kernel/mnemonics/_baload.php
new file mode 100644
index 00000000..3eee3de4
--- /dev/null
+++ b/src/kernel/mnemonics/_baload.php
@@ -0,0 +1,16 @@
+pushStack($this->readByte());
+ }
+}
diff --git a/src/kernel/mnemonics/_breakpoint.php b/src/kernel/mnemonics/_breakpoint.php
new file mode 100644
index 00000000..652bdc19
--- /dev/null
+++ b/src/kernel/mnemonics/_breakpoint.php
@@ -0,0 +1,16 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::add($value1, $value2, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_daload.php b/src/kernel/mnemonics/_daload.php
new file mode 100644
index 00000000..d70778d0
--- /dev/null
+++ b/src/kernel/mnemonics/_daload.php
@@ -0,0 +1,22 @@
+getStack();
+ $arrayref = $this->getStack();
+
+ $this->pushStack($arrayref[$index]);
+ }
+}
diff --git a/src/kernel/mnemonics/_dastore.php b/src/kernel/mnemonics/_dastore.php
new file mode 100644
index 00000000..f776d4c1
--- /dev/null
+++ b/src/kernel/mnemonics/_dastore.php
@@ -0,0 +1,23 @@
+getStack();
+ $index = $this->getStack();
+ $arrayref = $this->getStack();
+
+ $arrayref[$index] = $value;
+ }
+}
diff --git a/src/kernel/mnemonics/_dcmpg.php b/src/kernel/mnemonics/_dcmpg.php
new file mode 100644
index 00000000..31f3c706
--- /dev/null
+++ b/src/kernel/mnemonics/_dcmpg.php
@@ -0,0 +1,16 @@
+pushStack(0);
+ }
+}
diff --git a/src/kernel/mnemonics/_dconst_1.php b/src/kernel/mnemonics/_dconst_1.php
new file mode 100644
index 00000000..20dcb990
--- /dev/null
+++ b/src/kernel/mnemonics/_dconst_1.php
@@ -0,0 +1,16 @@
+pushStack(1);
+ }
+}
diff --git a/src/kernel/mnemonics/_ddiv.php b/src/kernel/mnemonics/_ddiv.php
new file mode 100644
index 00000000..908053e9
--- /dev/null
+++ b/src/kernel/mnemonics/_ddiv.php
@@ -0,0 +1,16 @@
+readUnsignedByte();
+ $this->pushStack($this->getLocalStorage($index));
+ }
+}
diff --git a/src/kernel/mnemonics/_dload_0.php b/src/kernel/mnemonics/_dload_0.php
new file mode 100644
index 00000000..4649c02b
--- /dev/null
+++ b/src/kernel/mnemonics/_dload_0.php
@@ -0,0 +1,16 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::multiply($value1, $value2, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_dneg.php b/src/kernel/mnemonics/_dneg.php
new file mode 100644
index 00000000..fdbb920e
--- /dev/null
+++ b/src/kernel/mnemonics/_dneg.php
@@ -0,0 +1,16 @@
+getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_dstore.php b/src/kernel/mnemonics/_dstore.php
new file mode 100644
index 00000000..c2cec8ae
--- /dev/null
+++ b/src/kernel/mnemonics/_dstore.php
@@ -0,0 +1,22 @@
+readUnsignedByte();
+ $value = $this->getStack();
+
+ $this->setLocalStorage($index, BinaryTool::convertDoubleToIEEE754($value));
+ }
+}
diff --git a/src/kernel/mnemonics/_dstore_0.php b/src/kernel/mnemonics/_dstore_0.php
new file mode 100644
index 00000000..886d2d8b
--- /dev/null
+++ b/src/kernel/mnemonics/_dstore_0.php
@@ -0,0 +1,16 @@
+setLocalStorage(0, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_dstore_1.php b/src/kernel/mnemonics/_dstore_1.php
new file mode 100644
index 00000000..5d62fbbf
--- /dev/null
+++ b/src/kernel/mnemonics/_dstore_1.php
@@ -0,0 +1,16 @@
+setLocalStorage(1, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_dstore_2.php b/src/kernel/mnemonics/_dstore_2.php
new file mode 100644
index 00000000..40d6aca7
--- /dev/null
+++ b/src/kernel/mnemonics/_dstore_2.php
@@ -0,0 +1,16 @@
+setLocalStorage(2, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_dstore_3.php b/src/kernel/mnemonics/_dstore_3.php
new file mode 100644
index 00000000..4f69f17d
--- /dev/null
+++ b/src/kernel/mnemonics/_dstore_3.php
@@ -0,0 +1,16 @@
+setLocalStorage(3, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_dsub.php b/src/kernel/mnemonics/_dsub.php
new file mode 100644
index 00000000..9e1b3751
--- /dev/null
+++ b/src/kernel/mnemonics/_dsub.php
@@ -0,0 +1,19 @@
+getStack();
+ $rightValue = $this->getStack();
+
+ $this->pushStack(BinaryTool::sub($leftValue, $rightValue, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_dup.php b/src/kernel/mnemonics/_dup.php
new file mode 100644
index 00000000..fe104d28
--- /dev/null
+++ b/src/kernel/mnemonics/_dup.php
@@ -0,0 +1,16 @@
+dupStack();
+ }
+}
diff --git a/src/kernel/mnemonics/_dup2.php b/src/kernel/mnemonics/_dup2.php
new file mode 100644
index 00000000..2f5c3ca5
--- /dev/null
+++ b/src/kernel/mnemonics/_dup2.php
@@ -0,0 +1,16 @@
+getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_fstore.php b/src/kernel/mnemonics/_fstore.php
new file mode 100644
index 00000000..8ded7106
--- /dev/null
+++ b/src/kernel/mnemonics/_fstore.php
@@ -0,0 +1,16 @@
+getConstantPool()->getEntries();
+
+ $cp = $cpInfo[$this->readUnsignedShort()];
+
+ $get = $this->getStack();
+
+ $return = $get->getInstance($cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString());
+
+ if ($return !== null) {
+ $this->pushStack($return);
+ return;
+ }
+ throw new Exception('Cannot get to undefined field ' . $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString() . '');
+ }
+}
diff --git a/src/kernel/mnemonics/_getstatic.php b/src/kernel/mnemonics/_getstatic.php
new file mode 100644
index 00000000..5a2484c6
--- /dev/null
+++ b/src/kernel/mnemonics/_getstatic.php
@@ -0,0 +1,40 @@
+getConstantPool()->getEntries();
+
+ $cp = $cpInfo[$this->readUnsignedShort()];
+ $class = $cpInfo[$cpInfo[$cp->getClassIndex()]->getClassIndex()]->getString();
+ $signature = Formatter::parseSignature($cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getDescriptorIndex()]->getString());
+
+ if ($cp instanceof _Fieldref) {
+ foreach ($this->javaClass->getFields() as $field) {
+ if ($cpInfo[$field->getNameIndex()]->getString() === $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString()) {
+ // push stack
+ $fieldName = $cpInfo[$field->getNameIndex()]->getString();
+ $this->pushStack($this->javaClassInvoker->getStatic()->getFields()->get($fieldName));
+ return;
+ }
+ }
+ }
+
+ if (isset($signature[0]['class_name'])) {
+ $className = ClassResolver::resolve($signature[0]['class_name']);
+ $this->pushStack(new $className());
+ return;
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_goto.php b/src/kernel/mnemonics/_goto.php
new file mode 100644
index 00000000..75c42e65
--- /dev/null
+++ b/src/kernel/mnemonics/_goto.php
@@ -0,0 +1,18 @@
+readShort();
+
+ $this->setOffset($this->getProgramCounter() + $offset);
+ }
+}
diff --git a/src/kernel/mnemonics/_goto_w.php b/src/kernel/mnemonics/_goto_w.php
new file mode 100644
index 00000000..dc2ecbc5
--- /dev/null
+++ b/src/kernel/mnemonics/_goto_w.php
@@ -0,0 +1,16 @@
+getStack();
+
+ $this->pushStack(base_convert(substr(sprintf('%032s', base_convert($value, 10, 2)), 16), 2, 10));
+ }
+}
diff --git a/src/kernel/mnemonics/_iadd.php b/src/kernel/mnemonics/_iadd.php
new file mode 100644
index 00000000..d67734ea
--- /dev/null
+++ b/src/kernel/mnemonics/_iadd.php
@@ -0,0 +1,19 @@
+getStack();
+ $rightValue = $this->getStack();
+
+ $this->pushStack(BinaryTool::add($leftValue, $rightValue, 4));
+ }
+}
diff --git a/src/kernel/mnemonics/_iaload.php b/src/kernel/mnemonics/_iaload.php
new file mode 100644
index 00000000..43017299
--- /dev/null
+++ b/src/kernel/mnemonics/_iaload.php
@@ -0,0 +1,19 @@
+getStack();
+ $arrayref = $this->getStack();
+
+ $this->pushStack($arrayref[$index]);
+ }
+}
diff --git a/src/kernel/mnemonics/_iand.php b/src/kernel/mnemonics/_iand.php
new file mode 100644
index 00000000..fb7dc93f
--- /dev/null
+++ b/src/kernel/mnemonics/_iand.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::andBits($value1, $value2, 4));
+ }
+}
diff --git a/src/kernel/mnemonics/_iastore.php b/src/kernel/mnemonics/_iastore.php
new file mode 100644
index 00000000..f19dc57b
--- /dev/null
+++ b/src/kernel/mnemonics/_iastore.php
@@ -0,0 +1,20 @@
+getStack();
+ $arrayref = $this->getStack();
+ $value = $this->getStack();
+
+ $value[$arrayref] = $data;
+ }
+}
diff --git a/src/kernel/mnemonics/_iconst_0.php b/src/kernel/mnemonics/_iconst_0.php
new file mode 100644
index 00000000..35ce140e
--- /dev/null
+++ b/src/kernel/mnemonics/_iconst_0.php
@@ -0,0 +1,16 @@
+pushStack(0);
+ }
+}
diff --git a/src/kernel/mnemonics/_iconst_1.php b/src/kernel/mnemonics/_iconst_1.php
new file mode 100644
index 00000000..1b2d887f
--- /dev/null
+++ b/src/kernel/mnemonics/_iconst_1.php
@@ -0,0 +1,16 @@
+pushStack(1);
+ }
+}
diff --git a/src/kernel/mnemonics/_iconst_2.php b/src/kernel/mnemonics/_iconst_2.php
new file mode 100644
index 00000000..8c447a20
--- /dev/null
+++ b/src/kernel/mnemonics/_iconst_2.php
@@ -0,0 +1,16 @@
+pushStack(2);
+ }
+}
diff --git a/src/kernel/mnemonics/_iconst_3.php b/src/kernel/mnemonics/_iconst_3.php
new file mode 100644
index 00000000..ad388c56
--- /dev/null
+++ b/src/kernel/mnemonics/_iconst_3.php
@@ -0,0 +1,16 @@
+pushStack(3);
+ }
+}
diff --git a/src/kernel/mnemonics/_iconst_4.php b/src/kernel/mnemonics/_iconst_4.php
new file mode 100644
index 00000000..6934a8d6
--- /dev/null
+++ b/src/kernel/mnemonics/_iconst_4.php
@@ -0,0 +1,16 @@
+pushStack(4);
+ }
+}
diff --git a/src/kernel/mnemonics/_iconst_5.php b/src/kernel/mnemonics/_iconst_5.php
new file mode 100644
index 00000000..6259e2d9
--- /dev/null
+++ b/src/kernel/mnemonics/_iconst_5.php
@@ -0,0 +1,16 @@
+pushStack(5);
+ }
+}
diff --git a/src/kernel/mnemonics/_iconst_m1.php b/src/kernel/mnemonics/_iconst_m1.php
new file mode 100644
index 00000000..6ac64b9e
--- /dev/null
+++ b/src/kernel/mnemonics/_iconst_m1.php
@@ -0,0 +1,16 @@
+pushStack(-1);
+ }
+}
diff --git a/src/kernel/mnemonics/_idiv.php b/src/kernel/mnemonics/_idiv.php
new file mode 100644
index 00000000..7351939d
--- /dev/null
+++ b/src/kernel/mnemonics/_idiv.php
@@ -0,0 +1,16 @@
+readShort();
+
+ $leftOperand = $this->getStack();
+ $rightOperand = $this->getStack();
+
+ if ($leftOperand === $rightOperand) {
+ $this->setOffset($this->getProgramCounter() + $offset);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_if_acmpne.php b/src/kernel/mnemonics/_if_acmpne.php
new file mode 100644
index 00000000..75d2361b
--- /dev/null
+++ b/src/kernel/mnemonics/_if_acmpne.php
@@ -0,0 +1,23 @@
+readShort();
+
+ $leftOperand = $this->getStack();
+ $rightOperand = $this->getStack();
+
+ if ($leftOperand !== $rightOperand) {
+ $this->setOffset($this->getProgramCounter() + $offset);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_if_icmpeq.php b/src/kernel/mnemonics/_if_icmpeq.php
new file mode 100644
index 00000000..b09c0342
--- /dev/null
+++ b/src/kernel/mnemonics/_if_icmpeq.php
@@ -0,0 +1,16 @@
+readShort();
+
+ $leftOperand = $this->getStack();
+ $rightOperand = $this->getStack();
+
+ if ($leftOperand <= $rightOperand) {
+ $this->setOffset($this->getProgramCounter() + $offset);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_if_icmpgt.php b/src/kernel/mnemonics/_if_icmpgt.php
new file mode 100644
index 00000000..7ce1f603
--- /dev/null
+++ b/src/kernel/mnemonics/_if_icmpgt.php
@@ -0,0 +1,23 @@
+readShort();
+
+ $leftOperand = $this->getStack();
+ $rightOperand = $this->getStack();
+
+ if ($leftOperand < $rightOperand) {
+ $this->setOffset($this->getProgramCounter() + $offset);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_if_icmple.php b/src/kernel/mnemonics/_if_icmple.php
new file mode 100644
index 00000000..14c61bc6
--- /dev/null
+++ b/src/kernel/mnemonics/_if_icmple.php
@@ -0,0 +1,16 @@
+readShort();
+
+ $leftOperand = $this->getStack();
+ $rightOperand = $this->getStack();
+
+ if ($rightOperand < $leftOperand) {
+ $this->setOffset($this->getProgramCounter() + $offset);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_if_icmpne.php b/src/kernel/mnemonics/_if_icmpne.php
new file mode 100644
index 00000000..1d5ef93a
--- /dev/null
+++ b/src/kernel/mnemonics/_if_icmpne.php
@@ -0,0 +1,23 @@
+readShort();
+
+ $leftOperand = $this->getStack();
+ $rightOperand = $this->getStack();
+
+ if ($leftOperand != $rightOperand) {
+ $this->setOffset($this->getProgramCounter() + $offset);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_ifeq.php b/src/kernel/mnemonics/_ifeq.php
new file mode 100644
index 00000000..c3258e7a
--- /dev/null
+++ b/src/kernel/mnemonics/_ifeq.php
@@ -0,0 +1,22 @@
+readShort();
+
+ $operand = $this->getStack();
+
+ if ($operand == 0) {
+ $this->setOffset($this->getProgramCounter() + $offset);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_ifge.php b/src/kernel/mnemonics/_ifge.php
new file mode 100644
index 00000000..83651fda
--- /dev/null
+++ b/src/kernel/mnemonics/_ifge.php
@@ -0,0 +1,16 @@
+readShort();
+
+ $operand = $this->getStack();
+
+ if ($operand != 0) {
+ $this->setOffset($this->getProgramCounter() + $offset);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_ifnonnull.php b/src/kernel/mnemonics/_ifnonnull.php
new file mode 100644
index 00000000..04e3a75c
--- /dev/null
+++ b/src/kernel/mnemonics/_ifnonnull.php
@@ -0,0 +1,16 @@
+readUnsignedByte();
+ $const = $this->readByte();
+
+ $this->setLocalStorage($index, $this->getLocalStorage($index) + $const);
+ }
+}
diff --git a/src/kernel/mnemonics/_iload.php b/src/kernel/mnemonics/_iload.php
new file mode 100644
index 00000000..124c1a7a
--- /dev/null
+++ b/src/kernel/mnemonics/_iload.php
@@ -0,0 +1,18 @@
+readUnsignedByte();
+
+ $this->pushStack($this->getLocalStorage($index));
+ }
+}
diff --git a/src/kernel/mnemonics/_iload_0.php b/src/kernel/mnemonics/_iload_0.php
new file mode 100644
index 00000000..a9232d48
--- /dev/null
+++ b/src/kernel/mnemonics/_iload_0.php
@@ -0,0 +1,16 @@
+pushStack($this->getLocalStorage(0));
+ }
+}
diff --git a/src/kernel/mnemonics/_iload_1.php b/src/kernel/mnemonics/_iload_1.php
new file mode 100644
index 00000000..11ef59b2
--- /dev/null
+++ b/src/kernel/mnemonics/_iload_1.php
@@ -0,0 +1,16 @@
+pushStack($this->getLocalStorage(1));
+ }
+}
diff --git a/src/kernel/mnemonics/_iload_2.php b/src/kernel/mnemonics/_iload_2.php
new file mode 100644
index 00000000..3644e87c
--- /dev/null
+++ b/src/kernel/mnemonics/_iload_2.php
@@ -0,0 +1,16 @@
+pushStack($this->getLocalStorage(2));
+ }
+}
diff --git a/src/kernel/mnemonics/_iload_3.php b/src/kernel/mnemonics/_iload_3.php
new file mode 100644
index 00000000..6777ff7c
--- /dev/null
+++ b/src/kernel/mnemonics/_iload_3.php
@@ -0,0 +1,16 @@
+pushStack($this->getLocalStorage(3));
+ }
+}
diff --git a/src/kernel/mnemonics/_impdep1.php b/src/kernel/mnemonics/_impdep1.php
new file mode 100644
index 00000000..87956ed1
--- /dev/null
+++ b/src/kernel/mnemonics/_impdep1.php
@@ -0,0 +1,16 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::multiply($value1, $value2, 4));
+ }
+}
diff --git a/src/kernel/mnemonics/_ineg.php b/src/kernel/mnemonics/_ineg.php
new file mode 100644
index 00000000..77faf80a
--- /dev/null
+++ b/src/kernel/mnemonics/_ineg.php
@@ -0,0 +1,18 @@
+getStack();
+
+ $this->pushStack(BinaryTool::negate($value, 4));
+ }
+}
diff --git a/src/kernel/mnemonics/_instanceof.php b/src/kernel/mnemonics/_instanceof.php
new file mode 100644
index 00000000..ed118ef0
--- /dev/null
+++ b/src/kernel/mnemonics/_instanceof.php
@@ -0,0 +1,16 @@
+getConstantPool()->getEntries();
+ $cp = $cpInfo[$this->readUnsignedShort()];
+ $nameAndTypeIndex = $cpInfo[$cp->getNameAndTypeIndex()];
+ $signature = $cpInfo[$nameAndTypeIndex->getDescriptorIndex()]->getString();
+ $parsedSignature = Formatter::parseSignature($signature);
+ $invokerClass = $this->getStack();
+
+ $arguments = [];
+
+ for ($i = 0; $i < $parsedSignature['arguments_count']; $i++) {
+ $arguments[] = $this->getStack();
+ }
+
+ krsort($arguments);
+
+ $methodName = $cpInfo[$nameAndTypeIndex->getNameIndex()]->getString();
+ if ($this->javaClassInvoker->isInvoked($methodName, $signature)) {
+ return;
+ }
+
+ $this->javaClassInvoker
+ ->addToSpecialInvokedList($methodName, $signature);
+
+ if ($invokerClass instanceof JavaClass) {
+ $result = $invokerClass->getInvoker()->getDynamic()->getMethods()
+ ->call(
+ $methodName,
+ ...$arguments
+ );
+ } else {
+ $result = call_user_func_array(
+ [
+ $invokerClass,
+ MethodNameResolver::resolve($methodName),
+ ],
+ $arguments
+ );
+ }
+
+ if ($parsedSignature[0]['type'] !== 'void') {
+ $this->pushStack($result);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_invokestatic.php b/src/kernel/mnemonics/_invokestatic.php
new file mode 100644
index 00000000..80be605b
--- /dev/null
+++ b/src/kernel/mnemonics/_invokestatic.php
@@ -0,0 +1,45 @@
+getConstantPool()->getEntries();
+ $cp = $cpInfo[$this->readUnsignedShort()];
+ $methodName = $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString();
+ $signature = Formatter::parseSignature($cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getDescriptorIndex()]->getString());
+ $arguments = [];
+ $className = ClassResolver::resolve($cpInfo[$cpInfo[$cp->getClassIndex()]->getClassIndex()]->getString());
+ for ($i = 0; $i < $signature['arguments_count']; $i++) {
+ $arguments[] = $this->getStack();
+ }
+
+ krsort($arguments);
+
+ if (!class_exists($className)) {
+ throw new \PHPJava\Imitation\java\lang\ClassNotFoundException($className . ' class does not exist.');
+ }
+
+ // call invoker
+ $return = forward_static_call_array(
+ [
+ $className,
+ $methodName
+ ],
+ $arguments
+ );
+
+ if ($signature[0]['type'] !== 'void') {
+ $this->pushStack($return);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_invokevirtual.php b/src/kernel/mnemonics/_invokevirtual.php
new file mode 100644
index 00000000..a911df31
--- /dev/null
+++ b/src/kernel/mnemonics/_invokevirtual.php
@@ -0,0 +1,51 @@
+getConstantPool()->getEntries();
+ $cp = $cpInfo[$this->readUnsignedShort()];
+ $class = $cpInfo[$cpInfo[$cp->getClassIndex()]->getClassIndex()]->getString();
+ $nameAndTypeIndex = $cpInfo[$cp->getNameAndTypeIndex()];
+
+ // signature
+ $signature = Formatter::parseSignature($cpInfo[$nameAndTypeIndex->getDescriptorIndex()]->getString());
+ $arguments = [];
+
+ for ($i = 0; $i < $signature['arguments_count']; $i++) {
+ $arguments[] = $this->getStack();
+ }
+ krsort($arguments);
+ $invokerClass = $this->getStack();
+ $invokerClassName = ClassResolver::resolve($class);
+ $methodName = $cpInfo[$cpInfo[$cp->getNameAndTypeIndex()]->getNameIndex()]->getString();
+
+ if ($invokerClass instanceof JavaClass) {
+ $result = $invokerClass->getInvoker()->getDynamic()->getMethods()->call($methodName, ...$arguments);
+ } else {
+ $result = call_user_func_array(
+ [
+ $invokerClass,
+ $methodName
+ ],
+ $arguments
+ );
+ }
+
+ if ($signature[0]['type'] !== 'void') {
+ $this->pushStack($result);
+ }
+ }
+}
diff --git a/src/kernel/mnemonics/_ior.php b/src/kernel/mnemonics/_ior.php
new file mode 100644
index 00000000..c6a53306
--- /dev/null
+++ b/src/kernel/mnemonics/_ior.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::orBits($value1, $value2, 4));
+ }
+}
diff --git a/src/kernel/mnemonics/_irem.php b/src/kernel/mnemonics/_irem.php
new file mode 100644
index 00000000..74ed0647
--- /dev/null
+++ b/src/kernel/mnemonics/_irem.php
@@ -0,0 +1,16 @@
+getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_ishl.php b/src/kernel/mnemonics/_ishl.php
new file mode 100644
index 00000000..ab080c37
--- /dev/null
+++ b/src/kernel/mnemonics/_ishl.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::shiftLeft($value1, $value2, 4));
+ }
+}
diff --git a/src/kernel/mnemonics/_ishr.php b/src/kernel/mnemonics/_ishr.php
new file mode 100644
index 00000000..7d791e2b
--- /dev/null
+++ b/src/kernel/mnemonics/_ishr.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::shiftRight($value1, $value2, 4));
+ }
+}
diff --git a/src/kernel/mnemonics/_istore.php b/src/kernel/mnemonics/_istore.php
new file mode 100644
index 00000000..faaa0868
--- /dev/null
+++ b/src/kernel/mnemonics/_istore.php
@@ -0,0 +1,17 @@
+readUnsignedByte();
+ $this->setLocalStorage($index, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_istore_0.php b/src/kernel/mnemonics/_istore_0.php
new file mode 100644
index 00000000..05e47c4f
--- /dev/null
+++ b/src/kernel/mnemonics/_istore_0.php
@@ -0,0 +1,16 @@
+setLocalStorage(0, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_istore_1.php b/src/kernel/mnemonics/_istore_1.php
new file mode 100644
index 00000000..b4d53fea
--- /dev/null
+++ b/src/kernel/mnemonics/_istore_1.php
@@ -0,0 +1,16 @@
+setLocalStorage(1, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_istore_2.php b/src/kernel/mnemonics/_istore_2.php
new file mode 100644
index 00000000..47ccf5ef
--- /dev/null
+++ b/src/kernel/mnemonics/_istore_2.php
@@ -0,0 +1,16 @@
+setLocalStorage(2, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_istore_3.php b/src/kernel/mnemonics/_istore_3.php
new file mode 100644
index 00000000..db8241dd
--- /dev/null
+++ b/src/kernel/mnemonics/_istore_3.php
@@ -0,0 +1,16 @@
+setLocalStorage(3, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_isub.php b/src/kernel/mnemonics/_isub.php
new file mode 100644
index 00000000..b4bafb4a
--- /dev/null
+++ b/src/kernel/mnemonics/_isub.php
@@ -0,0 +1,19 @@
+getStack();
+ $rightValue = $this->getStack();
+
+ $this->pushStack(BinaryTool::sub($leftValue, $rightValue, 4));
+ }
+}
diff --git a/src/kernel/mnemonics/_iushr.php b/src/kernel/mnemonics/_iushr.php
new file mode 100644
index 00000000..6c620cbc
--- /dev/null
+++ b/src/kernel/mnemonics/_iushr.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::unsignedShiftRight($value1, $value2, 4));
+ }
+}
diff --git a/src/kernel/mnemonics/_ixor.php b/src/kernel/mnemonics/_ixor.php
new file mode 100644
index 00000000..c7d8057e
--- /dev/null
+++ b/src/kernel/mnemonics/_ixor.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::xorBits($value1, $value2, 4));
+ }
+}
diff --git a/src/kernel/mnemonics/_jsr.php b/src/kernel/mnemonics/_jsr.php
new file mode 100644
index 00000000..546a0584
--- /dev/null
+++ b/src/kernel/mnemonics/_jsr.php
@@ -0,0 +1,16 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::add($value1, $value2, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_laload.php b/src/kernel/mnemonics/_laload.php
new file mode 100644
index 00000000..34b32fa3
--- /dev/null
+++ b/src/kernel/mnemonics/_laload.php
@@ -0,0 +1,22 @@
+getStack();
+ $arrayref = $this->getStack();
+
+ $this->pushStack($arrayref[$index]);
+ }
+}
diff --git a/src/kernel/mnemonics/_land.php b/src/kernel/mnemonics/_land.php
new file mode 100644
index 00000000..92206336
--- /dev/null
+++ b/src/kernel/mnemonics/_land.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::andBits($value1, $value2, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_lastore.php b/src/kernel/mnemonics/_lastore.php
new file mode 100644
index 00000000..5f82e970
--- /dev/null
+++ b/src/kernel/mnemonics/_lastore.php
@@ -0,0 +1,23 @@
+getStack();
+ $index = $this->getStack();
+ $arrayref = $this->getStack();
+
+ $arrayref[$index] = $value;
+ }
+}
diff --git a/src/kernel/mnemonics/_lcmp.php b/src/kernel/mnemonics/_lcmp.php
new file mode 100644
index 00000000..a1342796
--- /dev/null
+++ b/src/kernel/mnemonics/_lcmp.php
@@ -0,0 +1,16 @@
+pushStack(0);
+ }
+}
diff --git a/src/kernel/mnemonics/_lconst_1.php b/src/kernel/mnemonics/_lconst_1.php
new file mode 100644
index 00000000..6f772ead
--- /dev/null
+++ b/src/kernel/mnemonics/_lconst_1.php
@@ -0,0 +1,16 @@
+pushStack(1);
+ }
+}
diff --git a/src/kernel/mnemonics/_ldc.php b/src/kernel/mnemonics/_ldc.php
new file mode 100644
index 00000000..8a98f3cb
--- /dev/null
+++ b/src/kernel/mnemonics/_ldc.php
@@ -0,0 +1,38 @@
+getConstantPool()->getEntries();
+
+ $data = $cpInfo[$this->readUnsignedByte()];
+
+ $value = null;
+
+ if ($data instanceof _String) {
+ $value = $cpInfo[$data->getStringIndex()];
+
+ if ($value instanceof _Utf8) {
+ $value = new \PHPJava\Imitation\java\lang\_String($value);
+ }
+ } elseif (($data instanceof _Integer) || ($data instanceof _Float)) {
+ $value = $data->getBytes();
+ } else {
+ $value = $cpInfo[$data->getStringIndex()];
+ }
+
+ $this->pushStack($value);
+ }
+}
diff --git a/src/kernel/mnemonics/_ldc2_w.php b/src/kernel/mnemonics/_ldc2_w.php
new file mode 100644
index 00000000..d22d5d3b
--- /dev/null
+++ b/src/kernel/mnemonics/_ldc2_w.php
@@ -0,0 +1,20 @@
+getConstantPool()->getEntries();
+
+ $data = $cpInfo[$this->readUnsignedShort()];
+
+ $this->pushStack($data->getBytes());
+ }
+}
diff --git a/src/kernel/mnemonics/_ldc_w.php b/src/kernel/mnemonics/_ldc_w.php
new file mode 100644
index 00000000..e4f39405
--- /dev/null
+++ b/src/kernel/mnemonics/_ldc_w.php
@@ -0,0 +1,16 @@
+readUnsignedByte();
+
+ $this->pushStack($this->getLocalStorage($index));
+ }
+}
diff --git a/src/kernel/mnemonics/_lload_0.php b/src/kernel/mnemonics/_lload_0.php
new file mode 100644
index 00000000..2a93cb0d
--- /dev/null
+++ b/src/kernel/mnemonics/_lload_0.php
@@ -0,0 +1,16 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::multiply($value1, $value2, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_lneg.php b/src/kernel/mnemonics/_lneg.php
new file mode 100644
index 00000000..648f8d2d
--- /dev/null
+++ b/src/kernel/mnemonics/_lneg.php
@@ -0,0 +1,16 @@
+getStack();
+
+ // padding data
+ $paddingData = 4 - (($this->getOffset()) % 4);
+ if ($paddingData != 4) {
+ $this->read($paddingData);
+ }
+
+ $offsets = [];
+ $offsets['default'] = $this->readInt();
+ $switchSize = $this->readUnsignedInt();
+
+ for ($i = 0; $i < $switchSize; $i++) {
+ $label = $this->readUnsignedInt();
+ $offsets[(string) $label] = $this->readInt();
+ }
+
+ if (isset($offsets[$key])) {
+ // goto PC
+ $this->setOffset($this->getProgramCounter() + $offsets[$key]);
+ return;
+ }
+
+ // goto default
+ $this->setOffset($this->getProgramCounter() + $offsets['default']);
+ }
+}
diff --git a/src/kernel/mnemonics/_lor.php b/src/kernel/mnemonics/_lor.php
new file mode 100644
index 00000000..bb66a443
--- /dev/null
+++ b/src/kernel/mnemonics/_lor.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::orBits($value1, $value2, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_lrem.php b/src/kernel/mnemonics/_lrem.php
new file mode 100644
index 00000000..398bb1ed
--- /dev/null
+++ b/src/kernel/mnemonics/_lrem.php
@@ -0,0 +1,16 @@
+getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_lshl.php b/src/kernel/mnemonics/_lshl.php
new file mode 100644
index 00000000..52a868ff
--- /dev/null
+++ b/src/kernel/mnemonics/_lshl.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::shiftLeft($value1, $value2, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_lshr.php b/src/kernel/mnemonics/_lshr.php
new file mode 100644
index 00000000..164d443c
--- /dev/null
+++ b/src/kernel/mnemonics/_lshr.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::shiftRight($value1, $value2, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_lstore.php b/src/kernel/mnemonics/_lstore.php
new file mode 100644
index 00000000..d0375324
--- /dev/null
+++ b/src/kernel/mnemonics/_lstore.php
@@ -0,0 +1,17 @@
+readUnsignedByte();
+ $this->setLocalStorage($index, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_lstore_0.php b/src/kernel/mnemonics/_lstore_0.php
new file mode 100644
index 00000000..b45b6330
--- /dev/null
+++ b/src/kernel/mnemonics/_lstore_0.php
@@ -0,0 +1,16 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::sub($value1, $value2, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_lushr.php b/src/kernel/mnemonics/_lushr.php
new file mode 100644
index 00000000..ff715a03
--- /dev/null
+++ b/src/kernel/mnemonics/_lushr.php
@@ -0,0 +1,19 @@
+getStack();
+ $value2 = $this->getStack();
+
+ $this->pushStack(BinaryTool::unsignedShiftRight($value1, $value2, 8));
+ }
+}
diff --git a/src/kernel/mnemonics/_lxor.php b/src/kernel/mnemonics/_lxor.php
new file mode 100644
index 00000000..ba8c8227
--- /dev/null
+++ b/src/kernel/mnemonics/_lxor.php
@@ -0,0 +1,16 @@
+getConstantPool()->getEntries();
+ $class = $cpInfo[$this->readUnsignedShort()];
+ $className = $cpInfo[$class->getClassIndex()]->getString();
+ if ($className === $this->javaClass->getClassName()) {
+ // will be called
+ $this->pushStack($this->javaClass);
+ return;
+ }
+
+ $invokeClassName = ClassResolver::resolve($className);
+ $this->pushStack(new $invokeClassName());
+ }
+}
diff --git a/src/kernel/mnemonics/_newarray.php b/src/kernel/mnemonics/_newarray.php
new file mode 100644
index 00000000..9cff6a53
--- /dev/null
+++ b/src/kernel/mnemonics/_newarray.php
@@ -0,0 +1,21 @@
+readUnsignedByte();
+ $count = $this->getStack();
+
+ // need reference
+ $ref = new \ArrayIterator(array_fill(0, $count, null));
+ $this->pushStackByReference($ref);
+ }
+}
diff --git a/src/kernel/mnemonics/_nop.php b/src/kernel/mnemonics/_nop.php
new file mode 100644
index 00000000..8be8bf42
--- /dev/null
+++ b/src/kernel/mnemonics/_nop.php
@@ -0,0 +1,15 @@
+popStack();
+ }
+}
diff --git a/src/kernel/mnemonics/_pop2.php b/src/kernel/mnemonics/_pop2.php
new file mode 100644
index 00000000..247f497d
--- /dev/null
+++ b/src/kernel/mnemonics/_pop2.php
@@ -0,0 +1,16 @@
+getConstantPool()->getEntries();
+ $cp = $cpInfo[$this->readUnsignedShort()];
+ $class = $cpInfo[$cp->getNameAndTypeIndex()];
+
+ $value = $this->getStack();
+ $name = $cpInfo[$class->getNameIndex()]->getString();
+ $objectref = $this->getStack();
+
+ $objectref->getInvoker()->getDynamic()->getFields()->set($name, $value);
+ }
+}
diff --git a/src/kernel/mnemonics/_putstatic.php b/src/kernel/mnemonics/_putstatic.php
new file mode 100644
index 00000000..cffa45c6
--- /dev/null
+++ b/src/kernel/mnemonics/_putstatic.php
@@ -0,0 +1,23 @@
+getConstantPool()->getEntries();
+
+ $cp = $cpInfo[$this->readUnsignedShort()];
+
+ $class = $cpInfo[$cp->getNameAndTypeIndex()];
+ $fieldName = $cpInfo[$class->getNameIndex()]->getString();
+
+ $this->javaClassInvoker->getStatic()->getFields()->set($fieldName, $this->getStack());
+ }
+}
diff --git a/src/kernel/mnemonics/_ret.php b/src/kernel/mnemonics/_ret.php
new file mode 100644
index 00000000..175af782
--- /dev/null
+++ b/src/kernel/mnemonics/_ret.php
@@ -0,0 +1,16 @@
+pushStack($this->readShort());
+ }
+}
diff --git a/src/kernel/mnemonics/_swap.php b/src/kernel/mnemonics/_swap.php
new file mode 100644
index 00000000..b45c2373
--- /dev/null
+++ b/src/kernel/mnemonics/_swap.php
@@ -0,0 +1,16 @@
+getStack();
+
+ // padding data
+ $paddingData = 4 - (($this->getOffset()) % 4);
+ if ($paddingData != 4) {
+ $this->read($paddingData);
+ }
+
+ $offsets = [];
+ $offsets['default'] = $this->readInt();
+ $lowByte = $this->readInt();
+ $highByte = $this->readInt();
+ for ($i = $lowByte; $i <= $highByte; $i++) {
+ $offsets[$i] = $this->readInt();
+ }
+
+ if (isset($offsets[$key])) {
+ // goto PC
+ $this->setOffset($this->getProgramCounter() + $offsets[$key]);
+ return;
+ }
+
+ // goto default
+ $this->setOffset($this->getProgramCounter() + $offsets['default']);
+ }
+}
diff --git a/src/kernel/mnemonics/_wide.php b/src/kernel/mnemonics/_wide.php
new file mode 100644
index 00000000..2a81920f
--- /dev/null
+++ b/src/kernel/mnemonics/_wide.php
@@ -0,0 +1,16 @@
+classIndex = $this->readUnsignedShort();
+ }
+ public function getClassIndex()
+ {
+ return $this->classIndex;
+ }
+}
diff --git a/src/kernel/structures/_Classes.php b/src/kernel/structures/_Classes.php
new file mode 100644
index 00000000..e4b1f825
--- /dev/null
+++ b/src/kernel/structures/_Classes.php
@@ -0,0 +1,51 @@
+innerClassInfoIndex = $innerClassInfoIndex;
+ }
+ public function setOuterClassInfoIndex($outerClassInfoIndex)
+ {
+ $this->outerClassInfoIndex = $outerClassInfoIndex;
+ }
+ public function setInnerNameIndex($innerNameIndex)
+ {
+ $this->innerNameIndex = $innerNameIndex;
+ }
+ public function setInnerClassAccessFlag($innerClassAccessFlag)
+ {
+ $this->innerClassAccessFlag = $innerClassAccessFlag;
+ }
+ public function getInnerClassInfoIndex()
+ {
+ return $this->innerClassInfoIndex;
+ }
+ public function getOuterClassInfoIndex()
+ {
+ return $this->outerClassInfoIndex;
+ }
+ public function getInnerNameIndex()
+ {
+ return $this->innerNameIndex;
+ }
+ public function getInnerClassAccessFlag()
+ {
+ return $this->innerClassAccessFlag;
+ }
+}
diff --git a/src/kernel/structures/_Double.php b/src/kernel/structures/_Double.php
new file mode 100644
index 00000000..e06a17f8
--- /dev/null
+++ b/src/kernel/structures/_Double.php
@@ -0,0 +1,23 @@
+highBytes = $this->readUnsignedInt();
+ $this->lowBytes = $this->readUnsignedInt();
+ }
+ public function getBytes()
+ {
+ return ($this->highBytes << 32) + $this->lowBytes;
+ }
+}
diff --git a/src/kernel/structures/_ExceptionTable.php b/src/kernel/structures/_ExceptionTable.php
new file mode 100644
index 00000000..d2bf2211
--- /dev/null
+++ b/src/kernel/structures/_ExceptionTable.php
@@ -0,0 +1,64 @@
+startPc = $startPc;
+ return $this;
+ }
+
+ public function setEndPc($endPc)
+ {
+ $this->endPc = $endPc;
+ return $this;
+ }
+
+ public function setHandlerPc($handlerPc)
+ {
+ $this->handlerPc = $handlerPc;
+ return $this;
+ }
+
+ public function setCatchType($catchType)
+ {
+ $this->catchType = $catchType;
+ return $this;
+ }
+
+ public function getStartPc()
+ {
+ return $this->startPc;
+ }
+
+ public function getEndPc()
+ {
+ return $this->endPc;
+ }
+
+ public function getHandlerPc()
+ {
+ return $this->handlerPc;
+ }
+
+ public function getCatchType()
+ {
+ return $this->catchType;
+ }
+}
diff --git a/src/kernel/structures/_FieldInfo.php b/src/kernel/structures/_FieldInfo.php
new file mode 100644
index 00000000..0293e57e
--- /dev/null
+++ b/src/kernel/structures/_FieldInfo.php
@@ -0,0 +1,48 @@
+accessFlag = $this->readUnsignedShort();
+ $this->nameIndex = $this->readUnsignedShort();
+ $this->descriptorIndex = $this->readUnsignedShort();
+ $this->attributeCount = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->attributeCount; $i++) {
+ $this->attributes[$i] = new \PHPJava\Kernel\Attributes\AttributeInfo($this->reader);
+ }
+ }
+
+ public function getAccessFlag()
+ {
+ return $this->accessFlag;
+ }
+
+ public function getNameIndex()
+ {
+ return $this->nameIndex;
+ }
+
+ public function getDescriptorIndex()
+ {
+ return $this->descriptorIndex;
+ }
+
+ public function getAttributes()
+ {
+ return $this->attributes;
+ }
+}
diff --git a/src/kernel/structures/_FieldRef.php b/src/kernel/structures/_FieldRef.php
new file mode 100644
index 00000000..bbbc84d9
--- /dev/null
+++ b/src/kernel/structures/_FieldRef.php
@@ -0,0 +1,27 @@
+classIndex = $this->readUnsignedShort();
+ $this->nameAndTypeIndex = $this->readUnsignedShort();
+ }
+ public function getClassIndex()
+ {
+ return $this->classIndex;
+ }
+ public function getNameAndTypeIndex()
+ {
+ return $this->nameAndTypeIndex;
+ }
+}
diff --git a/src/kernel/structures/_Float.php b/src/kernel/structures/_Float.php
new file mode 100644
index 00000000..a12364f5
--- /dev/null
+++ b/src/kernel/structures/_Float.php
@@ -0,0 +1,21 @@
+bytes = $this->readUnsignedInt();
+ }
+ public function getBytes()
+ {
+ return $this->bytes;
+ }
+}
diff --git a/src/kernel/structures/_Integer.php b/src/kernel/structures/_Integer.php
new file mode 100644
index 00000000..d9ac654b
--- /dev/null
+++ b/src/kernel/structures/_Integer.php
@@ -0,0 +1,21 @@
+bytes = $this->readInt();
+ }
+ public function getBytes()
+ {
+ return $this->bytes;
+ }
+}
diff --git a/src/kernel/structures/_LineNumberTable.php b/src/kernel/structures/_LineNumberTable.php
new file mode 100644
index 00000000..1560a54e
--- /dev/null
+++ b/src/kernel/structures/_LineNumberTable.php
@@ -0,0 +1,37 @@
+startPc = $startPc;
+ return $this;
+ }
+ public function setLineNumber($lineNumber)
+ {
+ $this->lineNumber = $lineNumber;
+ return $this;
+ }
+ public function getStartPc()
+ {
+ return $this->startPc;
+ }
+ public function getLineNumber()
+ {
+ return $this->lineNumber;
+ }
+}
diff --git a/src/kernel/structures/_LocalVariableTable.php b/src/kernel/structures/_LocalVariableTable.php
new file mode 100644
index 00000000..25e3cd8c
--- /dev/null
+++ b/src/kernel/structures/_LocalVariableTable.php
@@ -0,0 +1,25 @@
+startPc = $this->readUnsignedShort();
+ $this->length = $this->readUnsignedShort();
+ $this->nameIndex = $this->readUnsignedShort();
+ $this->descriptorIndex = $this->readUnsignedShort();
+ $this->index = $this->readUnsignedShort();
+ }
+}
diff --git a/src/kernel/structures/_Long.php b/src/kernel/structures/_Long.php
new file mode 100644
index 00000000..42a727a9
--- /dev/null
+++ b/src/kernel/structures/_Long.php
@@ -0,0 +1,26 @@
+highBytes = $this->readUnsignedInt();
+ //$this->lowBytes = $this->readUnsignedInt();
+ $this->bytes = $this->readLong();
+ }
+ public function getBytes()
+ {
+ //return ($this->highBytes << 32) + $this->lowBytes;
+ return $this->bytes;
+ }
+}
diff --git a/src/kernel/structures/_MethodInfo.php b/src/kernel/structures/_MethodInfo.php
new file mode 100644
index 00000000..668ab577
--- /dev/null
+++ b/src/kernel/structures/_MethodInfo.php
@@ -0,0 +1,48 @@
+accessFlag = $this->readUnsignedShort();
+ $this->nameIndex = $this->readUnsignedShort();
+ $this->descriptorIndex = $this->readUnsignedShort();
+ $this->attributeCount = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->attributeCount; $i++) {
+ $attribute = new \PHPJava\Kernel\Attributes\AttributeInfo($this->reader);
+ $attribute->setConstantPool($this->getConstantPool());
+ $attribute->execute();
+
+ $this->attributes[] = $attribute;
+ }
+ }
+ public function getAccessFlag()
+ {
+ return $this->accessFlag;
+ }
+ public function getNameIndex()
+ {
+ return $this->nameIndex;
+ }
+ public function getDescriptorIndex()
+ {
+ return $this->descriptorIndex;
+ }
+ public function getAttributes()
+ {
+ return $this->attributes;
+ }
+}
diff --git a/src/kernel/structures/_Methodref.php b/src/kernel/structures/_Methodref.php
new file mode 100644
index 00000000..61d7379c
--- /dev/null
+++ b/src/kernel/structures/_Methodref.php
@@ -0,0 +1,27 @@
+classIndex = $this->readUnsignedShort();
+ $this->nameAndTypeIndex = $this->readUnsignedShort();
+ }
+ public function getClassIndex()
+ {
+ return $this->classIndex;
+ }
+ public function getNameAndTypeIndex()
+ {
+ return $this->nameAndTypeIndex;
+ }
+}
diff --git a/src/kernel/structures/_NameAndType.php b/src/kernel/structures/_NameAndType.php
new file mode 100644
index 00000000..17b885ec
--- /dev/null
+++ b/src/kernel/structures/_NameAndType.php
@@ -0,0 +1,27 @@
+nameIndex = $this->readUnsignedShort();
+ $this->descriptorIndex = $this->readUnsignedShort();
+ }
+ public function getNameIndex()
+ {
+ return $this->nameIndex;
+ }
+ public function getDescriptorIndex()
+ {
+ return $this->descriptorIndex;
+ }
+}
diff --git a/src/kernel/structures/_StackMapFrame.php b/src/kernel/structures/_StackMapFrame.php
new file mode 100644
index 00000000..504b6851
--- /dev/null
+++ b/src/kernel/structures/_StackMapFrame.php
@@ -0,0 +1,47 @@
+frameType = $this->readUnsignedByte();
+ // back by frametype
+ $this->reader->getBinaryReader()->seek(-1);
+
+ if ($this->frameType >= 0 && $this->frameType <= 63) {
+ $this->frame = new \PHPJava\Kernel\Frames\SameFrame($this->reader);
+ } elseif ($this->frameType >= 64 && $this->frameType <= 127) {
+ $this->frame = new \PHPJava\Kernel\Frames\SameLocals1StackItemFrame($this->reader);
+ } elseif ($this->frameType == 247) {
+ $this->frame = new \PHPJava\Kernel\Frames\SameLocals1StackItemFrameExtended($this->reader);
+ } elseif ($this->frameType >= 248 && $this->frameType <= 250) {
+ $this->frame = new \PHPJava\Kernel\Frames\ChopFrame($this->reader);
+ } elseif ($this->frameType == 251) {
+ $this->frame = new \PHPJava\Kernel\Frames\SameFrameExtended($this->reader);
+ } elseif ($this->frameType >= 252 && $this->frameType <= 254) {
+ $this->frame = new \PHPJava\Kernel\Frames\AppendFrame($this->reader);
+ } elseif ($this->frameType == 255) {
+ $this->frame = new \PHPJava\Kernel\Frames\FullFrame($this->reader);
+ }
+ $this->frame->execute();
+ }
+
+ public function getFrame(): StructureInterface
+ {
+ return $this->frame;
+ }
+}
diff --git a/src/kernel/structures/_String.php b/src/kernel/structures/_String.php
new file mode 100644
index 00000000..a7c2b962
--- /dev/null
+++ b/src/kernel/structures/_String.php
@@ -0,0 +1,21 @@
+stringIndex = $this->readUnsignedShort();
+ }
+ public function getStringIndex()
+ {
+ return $this->stringIndex;
+ }
+}
diff --git a/src/kernel/structures/_Utf8.php b/src/kernel/structures/_Utf8.php
new file mode 100644
index 00000000..e038789c
--- /dev/null
+++ b/src/kernel/structures/_Utf8.php
@@ -0,0 +1,29 @@
+length = $this->readUnsignedShort();
+ for ($i = 0; $i < $this->length; $i++) {
+ $this->string .= chr($this->readUnsignedByte());
+ }
+ }
+ public function getLength()
+ {
+ return $this->length;
+ }
+ public function getString()
+ {
+ return $this->string;
+ }
+}
diff --git a/src/kernel/structures/_VerificationTypeInfo.php b/src/kernel/structures/_VerificationTypeInfo.php
new file mode 100644
index 00000000..8b402631
--- /dev/null
+++ b/src/kernel/structures/_VerificationTypeInfo.php
@@ -0,0 +1,58 @@
+tag = $this->readUnsignedByte();
+
+ // back by tag
+ $this->reader->getBinaryReader()->seek(-1);
+
+ switch ($this->tag) {
+ case 0:
+ $this->variableInfo = new \PHPJava\Kernel\Variables\TopVariableInfo($this->reader);
+ break;
+ case 1:
+ $this->variableInfo = new \PHPJava\Kernel\Variables\IntegerVariableInfo($this->reader);
+ break;
+ case 2:
+ $this->variableInfo = new \PHPJava\Kernel\Variables\FloatVariableInfo($this->reader);
+ break;
+ case 3:
+ $this->variableInfo = new \PHPJava\Kernel\Variables\LongVariableInfo($this->reader);
+ break;
+ case 4:
+ $this->variableInfo = new \PHPJava\Kernel\Variables\DoubleVariableInfo($this->reader);
+ break;
+ case 5:
+ $this->variableInfo = new \PHPJava\Kernel\Variables\NullVariableInfo($this->reader);
+ break;
+ case 6:
+ $this->variableInfo = new \PHPJava\Kernel\Variables\UninitializedThisVariableInfo($this->reader);
+ break;
+ case 7:
+ $this->variableInfo = new \PHPJava\Kernel\Variables\ObjectVariableInfo($this->reader);
+ break;
+ case 8:
+ $this->variableInfo = new \PHPJava\Kernel\Variables\UninitializedVariableInfo($this->reader);
+ break;
+ }
+ $this->variableInfo->execute();
+ }
+}
diff --git a/src/kernel/types/Type.php b/src/kernel/types/Type.php
new file mode 100644
index 00000000..8951df76
--- /dev/null
+++ b/src/kernel/types/Type.php
@@ -0,0 +1,22 @@
+value = $value;
+ }
+
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ public function __toString()
+ {
+ return (string) $this->getValue();
+ }
+}
diff --git a/src/kernel/types/_Boolean.php b/src/kernel/types/_Boolean.php
new file mode 100644
index 00000000..f83805f2
--- /dev/null
+++ b/src/kernel/types/_Boolean.php
@@ -0,0 +1,7 @@
+tag = $this->readUnsignedByte();
+ }
+}
diff --git a/src/kernel/variables/FloatVariableInfo.php b/src/kernel/variables/FloatVariableInfo.php
new file mode 100644
index 00000000..1f97eb42
--- /dev/null
+++ b/src/kernel/variables/FloatVariableInfo.php
@@ -0,0 +1,17 @@
+tag = $this->readUnsignedByte();
+ }
+}
diff --git a/src/kernel/variables/IntegerVariableInfo.php b/src/kernel/variables/IntegerVariableInfo.php
new file mode 100644
index 00000000..990a1e55
--- /dev/null
+++ b/src/kernel/variables/IntegerVariableInfo.php
@@ -0,0 +1,17 @@
+tag = $this->readUnsignedByte();
+ }
+}
diff --git a/src/kernel/variables/LongVariableInfo.php b/src/kernel/variables/LongVariableInfo.php
new file mode 100644
index 00000000..1b156efc
--- /dev/null
+++ b/src/kernel/variables/LongVariableInfo.php
@@ -0,0 +1,17 @@
+tag = $this->readUnsignedByte();
+ }
+}
diff --git a/src/kernel/variables/NullVariableInfo.php b/src/kernel/variables/NullVariableInfo.php
new file mode 100644
index 00000000..d8293c26
--- /dev/null
+++ b/src/kernel/variables/NullVariableInfo.php
@@ -0,0 +1,17 @@
+tag = $this->readUnsignedByte();
+ }
+}
diff --git a/src/kernel/variables/ObjectVariableInfo.php b/src/kernel/variables/ObjectVariableInfo.php
new file mode 100644
index 00000000..6400d5c8
--- /dev/null
+++ b/src/kernel/variables/ObjectVariableInfo.php
@@ -0,0 +1,19 @@
+tag = $this->readUnsignedByte();
+ $this->cpoolIndex = $this->readUnsignedShort();
+ }
+}
diff --git a/src/kernel/variables/TopVariableInfo.php b/src/kernel/variables/TopVariableInfo.php
new file mode 100644
index 00000000..eb2a9e82
--- /dev/null
+++ b/src/kernel/variables/TopVariableInfo.php
@@ -0,0 +1,17 @@
+tag = $this->readUnsignedByte();
+ }
+}
diff --git a/src/kernel/variables/UninitializedThisVariableInfo.php b/src/kernel/variables/UninitializedThisVariableInfo.php
new file mode 100644
index 00000000..e0c4d09a
--- /dev/null
+++ b/src/kernel/variables/UninitializedThisVariableInfo.php
@@ -0,0 +1,17 @@
+tag = $this->readUnsignedByte();
+ }
+}
diff --git a/src/kernel/variables/UninitializedVariableInfo.php b/src/kernel/variables/UninitializedVariableInfo.php
new file mode 100644
index 00000000..a68c4d77
--- /dev/null
+++ b/src/kernel/variables/UninitializedVariableInfo.php
@@ -0,0 +1,19 @@
+tag = $this->readUnsignedByte();
+ $this->offset = $this->readUnsignedShort();
+ }
+}
diff --git a/src/kernel/variables/VariableInfoInterface.php b/src/kernel/variables/VariableInfoInterface.php
new file mode 100644
index 00000000..30c16441
--- /dev/null
+++ b/src/kernel/variables/VariableInfoInterface.php
@@ -0,0 +1,7 @@
+= 0 && $bits[$index] === '1'; $index--) {
-
// nop
-
}
if ($index === -1) {
-
throw new BinaryToolsException('Passed parameter was overflow');
-
}
$bits[$index] = '1';
for ($i = $index + 1; $i < $bitSize; $i++) {
-
$bits[$i] = '0';
-
}
return $bits;
-
}
- public final static function toSigned ($value, $bytes) {
-
+ final public static function toSigned($value, $bytes)
+ {
+ $value = (int) $value;
$convert = base_convert((string) $value, 10, 2);
$bitSize = strlen($convert);
if ($bitSize < ($bytes * 8) || $convert[0] !== '1') {
-
return $value;
-
}
return '-' . base_convert(self::addOneBit(self::reverseBits($convert)), 2, 10);
-
}
- public final static function negate ($value, $bytes) {
-
+ final public static function negate($value, $bytes)
+ {
+ $value = (int) $value;
$value = base_convert((string) $value, 10, 2);
if (sprintf('%0' . $bytes . 's', $value) === str_repeat('0', $bytes)) {
-
// zero number was overflow
return '0';
-
}
$convert = self::addOneBit(self::reverseBits($value));
if ($convert[0] === '1') {
-
$convert = '-' . base_convert($convert, 2, 10);
-
} else {
-
$convert = base_convert($convert, 2, 10);
-
}
return $convert;
-
}
- public final static function multiply ($value1, $value2, $bytes) {
-
+ final public static function multiply($value1, $value2, $bytes)
+ {
+ $value1 = (int) $value1;
+ $value2 = (int) $value2;
if (function_exists('gmp_mul')) {
-
$a = gmp_init($value1);
$b = gmp_init($value2);
return gmp_strval(gmp_mul($a, $b));
-
- } else if (function_exists('bcmul')) {
-
+ } elseif (function_exists('bcmul')) {
return bcmul($value1, $value2);
-
} else {
-
throw new BinaryToolsException('Cannot multiply values.');
-
}
-
}
- public final static function add ($value1, $value2, $bytes) {
-
+ final public static function add($value1, $value2, $bytes)
+ {
+ $value1 = (int) $value1;
+ $value2 = (int) $value2;
if (function_exists('gmp_add')) {
-
$a = gmp_init($value1);
$b = gmp_init($value2);
return gmp_strval(gmp_add($a, $b));
-
- } else if (function_exists('bcadd')) {
-
+ } elseif (function_exists('bcadd')) {
return bcadd($value1, $value2);
-
} else {
-
throw new BinaryToolsException('Cannot add values.');
-
}
-
}
- public final static function sub ($value1, $value2, $bytes) {
-
+ final public static function sub($value1, $value2, $bytes)
+ {
+ $value1 = (int) $value1;
+ $value2 = (int) $value2;
if (function_exists('gmp_sub')) {
-
$a = gmp_init($value1);
$b = gmp_init($value2);
return gmp_strval(gmp_sub($a, $b));
-
- } else if (function_exists('bcsub')) {
-
+ } elseif (function_exists('bcsub')) {
return bcsub($value1, $value2);
-
} else {
-
throw new BinaryToolsException('Cannot sub values.');
-
}
-
}
- public final static function div ($value1, $value2, $bytes) {
-
+ final public static function div($value1, $value2, $bytes)
+ {
+ $value1 = (int) $value1;
+ $value2 = (int) $value2;
if (function_exists('gmp_div')) {
-
$a = gmp_init($value1);
$b = gmp_init($value2);
return gmp_strval(gmp_div($a, $b));
-
- } else if (function_exists('bcdiv')) {
-
+ } elseif (function_exists('bcdiv')) {
return bcdiv($value1, $value2);
-
} else {
-
throw new BinaryToolsException('Cannot div values.');
-
}
-
}
- public final static function shiftLeft ($value1, $value2, $bytes) {
-
+ final public static function shiftLeft($value1, $value2, $bytes)
+ {
+ $value1 = (int) $value1;
+ $value2 = (int) $value2;
$bits = base_convert($value1, 10, 2);
$bits = sprintf('%0' . ($bytes * 8) . 's', $bits . str_repeat('0', $value2));
return base_convert($bits, 2, 10);
-
}
- public final static function unsignedShiftRight ($value1, $value2, $bytes) {
-
+ final public static function unsignedShiftRight($value1, $value2, $bytes)
+ {
+ $value1 = (int) $value1;
+ $value2 = (int) $value2;
$bits = sprintf('%0' . ($bytes * 8) . 's', base_convert($value2, 10, 2));
$bits = sprintf('%0' . ($bytes * 8) . 's', substr($bits, 0, strlen($bits) - $value1));
if ($bits === '') {
-
$bits = '0';
-
}
return base_convert($bits, 2, 10);
-
}
- public final static function shiftRight ($value1, $value2, $bytes) {
-
+ final public static function shiftRight($value1, $value2, $bytes)
+ {
return self::toSigned(self::unsignedShiftRight($value1, $value2, $bytes), $bytes);
-
}
- public final static function orBits ($value1, $value2, $bytes) {
-
+ final public static function orBits($value1, $value2, $bytes)
+ {
+ $value1 = (int) $value1;
+ $value2 = (int) $value2;
$value1 = sprintf('%0' . ($bytes * 8) . 's', base_convert($value1, 10, 2));
$value2 = sprintf('%0' . ($bytes * 8) . 's', base_convert($value2, 10, 2));
$build = '';
for ($i = 0; $i < $bytes * 8; $i++) {
-
if ($value1[$i] === '1' || $value2[$i] == '1') {
-
$build .= '1';
-
} else {
-
$build .= '0';
-
}
-
}
return base_convert($build, 2, 10);
-
}
- public final static function xorBits ($value1, $value2, $bytes) {
-
+ final public static function xorBits($value1, $value2, $bytes)
+ {
+ $value1 = (int) $value1;
+ $value2 = (int) $value2;
$value1 = sprintf('%0' . ($bytes * 8) . 's', base_convert($value1, 10, 2));
$value2 = sprintf('%0' . ($bytes * 8) . 's', base_convert($value2, 10, 2));
$build = '';
for ($i = 0; $i < $bytes * 8; $i++) {
-
if (($value1[$i] === '1' && $value2[$i] === '0') ||
($value1[$i] === '0' && $value2[$i] === '1')) {
-
$build .= '1';
-
} else {
-
$build .= '0';
-
}
-
}
return base_convert($build, 2, 10);
-
}
- public final static function andBits ($value1, $value2, $bytes) {
-
+ final public static function andBits($value1, $value2, $bytes)
+ {
+ $value1 = (int) $value1;
+ $value2 = (int) $value2;
$value1 = sprintf('%0' . ($bytes * 8) . 's', base_convert($value1, 10, 2));
$value2 = sprintf('%0' . ($bytes * 8) . 's', base_convert($value2, 10, 2));
$build = '';
for ($i = 0; $i < $bytes * 8; $i++) {
-
if ($value1[$i] === '1' && $value2[$i] === '1') {
-
$build .= '1';
-
} else {
-
$build .= '0';
-
}
-
}
return base_convert($build, 2, 10);
-
}
-
- public final static function convertDoubleToIEEE754 ($doubleValue, $rounded = 8) {
+ final public static function convertDoubleToIEEE754($doubleValue, $rounded = 8)
+ {
$doubleValue = sprintf('%063s', base_convert($doubleValue, 10, 2));
-
+
$sign = $doubleValue[0];
$exponent = substr($doubleValue, 1, 10);
$fraction = substr($doubleValue, 11);
-
+
// double scale
$scale = 52;
-
+
$fractionData = 0;
for ($i = 0; $i < 52; $i++) {
$fractionData = bcadd($fractionData, bcmul($fraction[$i], bcpow(2, -1 * ($i + 1), $scale), $scale), $scale);
}
-
+
// calc sign
$operand1 = -1 * $sign;
-
- // calc fraction
+
+ // calc fraction
$operand2 = bcadd(1, $fractionData, $scale);
-
+
// calc exponent and bias(?)
$operand3 = bcpow(2, bindec($exponent), $scale);
-
+
return bcmul(-2, bcmul(bcmul($operand1, $operand2, $scale), $operand3, $scale), $rounded);
-
}
-
}
diff --git a/src/utilities/ClassResolver.php b/src/utilities/ClassResolver.php
new file mode 100644
index 00000000..adffe946
--- /dev/null
+++ b/src/utilities/ClassResolver.php
@@ -0,0 +1,20 @@
+ '_String',
+ 'Object' => '_Object',
+ ];
+
+ public static function resolve($javaPath): string
+ {
+ $namespaces = explode('.', str_replace('/', '.', $javaPath));
+ $buildClassPath = [];
+ foreach ($namespaces as $namespace) {
+ $buildClassPath[] = static::MAPS[$namespace] ?? $namespace;
+ }
+ return '\\PHPJava\\Imitation\\' . implode('\\', $buildClassPath);
+ }
+}
diff --git a/src/utilities/Formatter.php b/src/utilities/Formatter.php
new file mode 100644
index 00000000..f995ea6f
--- /dev/null
+++ b/src/utilities/Formatter.php
@@ -0,0 +1,88 @@
+ TypeResolver::getMappedSignatureType($signature[$i]),
+ 'deep_array' => $deepArray,
+ ];
+ $deepArray = 0;
+ break;
+ case 'L':
+ // class name
+ $build = '';
+ // read to ;
+ for ($i++; $i < $size && $signature[$i] !== ';'; $i++) {
+ $build .= $signature[$i];
+ }
+ $data[] = [
+ 'type' => 'class',
+ 'deep_array' => $deepArray,
+ 'class_name' => $build,
+ ];
+ $deepArray = 0;
+
+ break;
+ case '[':
+ // array
+ $deepArray++;
+ for ($i++; $signature[$i] === '['; $i++) {
+ $deepArray++;
+ }
+ // loop
+ continue 2;
+ case '(':
+ $build = '';
+ // read to )
+ for ($i++; $i < $size && $signature[$i] !== ')'; $i++) {
+ $build .= $signature[$i];
+ }
+ $data['arguments'] = ($build !== '') ? static::parseSignature($build) : [];
+ $data['arguments_count'] = count($data['arguments']);
+ break;
+ }
+ $i++;
+ }
+ return $data;
+ }
+
+ public static function buildArgumentsSignature($signatures): string
+ {
+ $string = '';
+ foreach ($signatures as $signature) {
+ $build = str_repeat('[', $signature['deep_array']);
+ if ($signature['type'] === 'class') {
+ $build .= 'L' . str_replace('/', '.', $signature['class_name']);
+ } else {
+ $build .= TypeResolver::resolve($signature['type']);
+ }
+ $string .= $build . ';';
+ }
+ return $string;
+ }
+}
diff --git a/src/utilities/MethodNameResolver.php b/src/utilities/MethodNameResolver.php
new file mode 100644
index 00000000..ec5301c0
--- /dev/null
+++ b/src/utilities/MethodNameResolver.php
@@ -0,0 +1,21 @@
+ '',
+ ];
+
+
+ public static function resolve(string $name): string
+ {
+ $flipped = array_flip(static::PHP_METHOD_MAP);
+ if (isset($flipped[$name])) {
+ return $flipped[$name];
+ }
+ return $name;
+ }
+}
diff --git a/src/utilities/TypeResolver.php b/src/utilities/TypeResolver.php
new file mode 100644
index 00000000..b02a265c
--- /dev/null
+++ b/src/utilities/TypeResolver.php
@@ -0,0 +1,92 @@
+ 'I',
+ 'string' => 'Ljava.lang.String',
+ ];
+
+ const SIGNATURE_MAP = [
+ 'B' => 'byte',
+ 'C' => 'char',
+ 'D' => 'double',
+ 'F' => 'float',
+ 'I' => 'int',
+ 'J' => 'long',
+ 'S' => 'short',
+ 'V' => 'void',
+ 'Z' => 'boolean',
+ 'L' => 'class',
+ ];
+
+ /**
+ * @param $signature
+ * @return string
+ * @throws TypeException
+ */
+ public static function getMappedSignatureType($signature): string
+ {
+ if (isset(static::SIGNATURE_MAP[$signature])) {
+ return static::SIGNATURE_MAP[$signature];
+ }
+ throw new TypeException('Passed undefined signature ' . $signature);
+ }
+
+ public static function resolve($type): string
+ {
+ $flipped = array_flip(static::SIGNATURE_MAP);
+ if (isset($flipped[$type])) {
+ return $flipped[$type];
+ }
+ return 'L' . $type;
+ }
+
+ public static function convertPHPtoJava($arguments, $defaultJavaArgumentType = 'java.lang.String'): array
+ {
+ $phpType = gettype($arguments);
+ $deepArray = 0;
+ if ($phpType === 'array') {
+ $deepArray++;
+ $getNestedValues = [];
+ foreach ($arguments as $argument) {
+ $getNestedValues[] = static::convertPHPtoJava($argument);
+ }
+ if (empty($getNestedValues)) {
+ $flipped = array_flip(static::PHP_TYPE_MAP);
+ $resolveType = static::SIGNATURE_MAP[static::resolve($defaultJavaArgumentType)];
+ if ($resolveType === 'class') {
+ return [
+ 'type' => $resolveType,
+ 'class_name' => $defaultJavaArgumentType,
+ 'deep_array' => $deepArray,
+ ];
+ }
+ return [
+ 'type' => $resolveType,
+ 'deep_array' => $deepArray,
+ ];
+ }
+ $firstParameter = $getNestedValues[0];
+
+ // TODO: Validate parameters
+ $firstParameter['deep_array'] += $deepArray;
+ return $firstParameter;
+ }
+ $resolveType = static::SIGNATURE_MAP[static::PHP_TYPE_MAP[$phpType][0]] ?? null;
+ if ($resolveType === 'class') {
+ return [
+ 'type' => $resolveType,
+ 'class_name' => substr(static::PHP_TYPE_MAP[$phpType], 1),
+ 'deep_array' => $deepArray,
+ ];
+ }
+ return [
+ 'type' => $resolveType,
+ 'deep_array' => $deepArray,
+ ];
+ }
+}
diff --git a/test.java b/test.java
deleted file mode 100644
index fe561e60..00000000
--- a/test.java
+++ /dev/null
@@ -1,288 +0,0 @@
-class Test {
-
- long z = -22222222222222222L;
- static int c = 100;
- static String b = "Hello World";
-
- /**
- * test for "Integer" value
- *
- * @param value
- * @return
- */
- public int testInt (int value) {
-
- System.out.println(this.testPrivateInteger(value));
- return value;
- }
-
- /**
- * test for "Short" value
- *
- * @param value
- * @return
- */
- public short testShort (short value) {
- return value;
- }
-
- /**
- * test for "Long" value
- *
- * @param value
- * @return
- */
- public long testLong (long value) {
- return value;
- }
-
- /**
- * test for "Float" value
- *
- * @param value
- * @return
- */
- public float testLong (float value) {
- return value;
- }
-
- /**
- * test for "Double" value
- *
- * @param value
- * @return
- */
- public double testLong (double value) {
- return value;
- }
-
- /**
- * test for "Char" value
- *
- * @param value
- * @return
- */
- public char testChar (char value) {
- return value;
- }
-
- /**
- * test for "Byte" value
- *
- * @param value
- * @return
- */
- public byte testByte (byte value) {
- return value;
- }
-
- /**
- * test for "Boolean" value
- *
- * @param value
- * @return
- */
- public boolean testBoolean (boolean value) {
- return value;
- }
-
- /**
- * test for "String" value
- *
- * @param value
- * @return
- */
- public String testString (String value) {
- return value;
- }
-
- /**
- * main method
- *
- * @param args
- */
- public static void main (String[] args) {
-
- String x = "String";
-
- // new instance
- Test _a = new Test();
-
- // test call
- // _a.javaTest();
-
-
- int t = 2;
- //t *= 1;
- //t = ~1;
- t <<= 1;
- System.out.println(t);
- t >>= 1;
- System.out.println(t);
- t -= 1;
- System.out.println(t);
- t += 1;
- System.out.println(t);
- t = 1;
- System.out.println(t);
- t >>>= 1;
- System.out.println(t);
- t |= 1;
- System.out.println(t);
- t &= 1;
- System.out.println(t);
- t = 345321;
- System.out.println((short) t);
-
- long t1 = 111;
- t1 *= 1;
- t1 = ~1;
- t1 <<= 1;
- t1 >>= 1;
- t1 -= 1;
- t1 += 1;
- t1 = 1;
- t1 >>>= 1;
- t1 |= 1;
- t1 &= 1;
-
- double t2 = 2;
- t2 *= 1;
- t2 = ~1;
- t2 -= 1;
- t2 += 1;
- t2 = 1;
-
- /*boolean _b = false;
- _b = true && true;
- _b = true && false;
- _b = true || true;
- _b = true || false;*/
-
- try {
-
- for (int i = 0; i < Test.c; i++) {
-
- StringBuilder b = new StringBuilder();
-
- switch (i + 1) {
-
- case -1:
-
- b.append("a");
-
- break;
- case 1:
-
- b.append("b");
-
- break;
- case 2:
-
- b.append("c");
-
- break;
-
- }
-
- if (!x.equals(i + "")) {
-
-
- System.out.println("Test:" + Test.b + "/" + x + "*****" + i + "/" + b);
-
- }
-
- if (i == 10) {
-
- throw new NullPointerException();
-
- }
-
- }
-
- } catch (NullPointerException e) {
-
- System.out.println("ぬるぷっぷー");
-
- }
-
- String[] test = {"4", "5", "6"};
- for (String i : test) {
-
- System.out.println(i);
-
- }
-
- int[] test2 = {1, 2, 3};
- for (int i : test2) {
-
- System.out.println(i);
-
- }
-
- long[] test3 = {1L, 2L, 3L};
- for (long i : test3) {
-
- System.out.println(i);
-
- }
-
- double[] test4 = {3.4, 3.5, 3.6, 81263.12312321, -99};
- for (double i : test4) {
-
- System.out.println(i);
-
- }
-
- }
-
- public static String test (int n, String m, int l, int i, int v, int k) {
-
- int j = 1;
-
- for (; j <= 10; j++) {
-
- j++;
-
- }
-
- return "Java emulate by php " + n + "/" + m + "/" + l + "/" + i + "/" + v + "/" + k + "/" + j;
-
- }
-
- private int testPrivateInteger (int value) {
- return value + 1 * 2 + 3;
- }
-
- /*public void javaTest () {
-
- testClass _c = new testClass();
- _c.t();
-
- }
-
- public class testClass {
-
- public void t () {
-
- System.out.println("testClass.t method." + Test.this.z);
-
- testClass2 _c = new testClass2();
- _c.t();
-
-
- }
-
- public class testClass2 {
-
- public void t () {
-
- System.out.println("testClass2.t method." + Test.this.z);
-
- }
-
- }
-
- }*/
-
-}
\ No newline at end of file
diff --git a/test.php b/test.php
deleted file mode 100644
index 48c8c2a8..00000000
--- a/test.php
+++ /dev/null
@@ -1,81 +0,0 @@
-construct();
-
- // 動的メンバコールテスト
- var_dump(get_class($invoker->z));
-
- // 動的メンバ値変更&コールテスト
- $invoker->z = 9999;
-
- // 格納されている値
- var_dump($invoker->z->getValue());
-
- // 実際の値
- var_dump((string) $invoker->z);
-
- // 静的メンバコールテスト
- var_dump(get_class($invoker->b));
-
- // toString
- var_dump((string) $invoker->b);
-
- // メインメソッドを呼ぶ
- // $invoker->getMethodInvoker()->main(array(999, 888));
-
- // testIntを呼ぶ
- var_dump($invoker->testInt(1111));
-
- // testIntを呼ぶ
- var_dump((string) $invoker->testInt(1111));
-
- // testString(java/lang/String)を呼ぶ
- var_dump($invoker->testString("8888"));
- //
- // testString(java/lang/String)を呼ぶ
- var_dump((string) $invoker->testString("8888"));
-
- $javaClass->trace();
-
-/*
- // $a = new JavaArchive('JavaTest/dist/JavaTest.jar');
-
- // var_dump($a->getClass('javatest.JavaTest')->main(array(999, 888)));
- $manipulator = new JavaManipulator();
-
- $invoker = $manipulator->registerClass(new JavaClass('test.class'));
-
- // call main method
- var_dump($invoker->main(array(999, 888)));
-
- // var_dump($invoker->test(999, 999, 999, 999, 999, 999));
-
- $invoker->getClass()->trace();*/
-
-} catch (Exception $e) {
-
- $javaClass->trace();
-
- var_dump($e->getMessage(), $e->getFile(), $e->getLine());
-
-}
\ No newline at end of file
diff --git a/tests/AccessDynamicFieldTest.php b/tests/AccessDynamicFieldTest.php
new file mode 100644
index 00000000..90f4232e
--- /dev/null
+++ b/tests/AccessDynamicFieldTest.php
@@ -0,0 +1,39 @@
+initiatedJavaClasses['AccessDynamicFieldTest']->getInvoker()->construct();
+ $this->assertEquals(5, $constructed->getDynamic()->getFields()->get('number'));
+ $this->assertEquals('Hello World', $constructed->getDynamic()->getFields()->get('string'));
+ }
+
+ public function testOverwriteField()
+ {
+ $constructed = $this->initiatedJavaClasses['AccessDynamicFieldTest']->getInvoker()->construct();
+ $constructed->getStatic()->getFields()->set('number', 1000);
+ $constructed->getStatic()->getFields()->set('string', 'New String!');
+ $this->assertEquals(1000, $constructed->getStatic()->getFields()->get('number'));
+ $this->assertEquals('New String!', $constructed->getStatic()->getFields()->get('string'));
+ }
+
+ public function testAffectedNewConstructingTest()
+ {
+ $constructed = $this->initiatedJavaClasses['AccessDynamicFieldTest']->getInvoker()->construct();
+ $constructed->getStatic()->getFields()->set('number', 1000);
+ $constructed->getStatic()->getFields()->set('string', 'New String!');
+
+ // affected assertion
+ $constructed = $this->initiatedJavaClasses['AccessDynamicFieldTest']->getInvoker()->construct();
+ $this->assertEquals(5, $constructed->getDynamic()->getFields()->get('number'));
+ $this->assertEquals('Hello World', $constructed->getDynamic()->getFields()->get('string'));
+ }
+}
diff --git a/tests/AccessDynamicMethodTest.php b/tests/AccessDynamicMethodTest.php
new file mode 100644
index 00000000..705b0b60
--- /dev/null
+++ b/tests/AccessDynamicMethodTest.php
@@ -0,0 +1,60 @@
+initiatedJavaClasses['AccessDynamicMethodTest']
+ ->getInvoker()
+ ->construct()
+ ->getDynamic()
+ ->getMethods()
+ ->call(
+ 'main',
+ ["Hello", "World"]
+ );
+ $result = ob_get_clean();
+
+ $this->assertEquals("HelloWorld", $result);
+ }
+
+ public function testCallMainHavingIntegerArguments()
+ {
+ ob_start();
+ // call main
+ $this->initiatedJavaClasses['AccessDynamicMethodTest']
+ ->getInvoker()
+ ->construct()
+ ->getDynamic()
+ ->getMethods()
+ ->call(
+ 'main',
+ [1234, 5678]
+ );
+ $result = ob_get_clean();
+
+ $this->assertEquals(246811356, $result);
+ }
+
+ public function testCallReturnTest()
+ {
+ // call main
+ $result = $this->initiatedJavaClasses['AccessDynamicMethodTest']
+ ->getInvoker()
+ ->construct()
+ ->getDynamic()
+ ->getMethods()
+ ->call('returnTest');
+
+ $this->assertEquals('Return Test.', $result);
+ }
+}
diff --git a/tests/AccessStaticFieldTest.php b/tests/AccessStaticFieldTest.php
new file mode 100644
index 00000000..b26c7508
--- /dev/null
+++ b/tests/AccessStaticFieldTest.php
@@ -0,0 +1,25 @@
+assertEquals(5, $this->initiatedJavaClasses['AccessStaticFieldTest']->getInvoker()->getStatic()->getFields()->get('number'));
+ $this->assertEquals('Hello World', $this->initiatedJavaClasses['AccessStaticFieldTest']->getInvoker()->getStatic()->getFields()->get('string'));
+ }
+
+ public function testOverwriteField()
+ {
+ $this->initiatedJavaClasses['AccessStaticFieldTest']->getInvoker()->getStatic()->getFields()->set('number', 1000);
+ $this->initiatedJavaClasses['AccessStaticFieldTest']->getInvoker()->getStatic()->getFields()->set('string', 'New String!');
+ $this->assertEquals(1000, $this->initiatedJavaClasses['AccessStaticFieldTest']->getInvoker()->getStatic()->getFields()->get('number'));
+ $this->assertEquals('New String!', $this->initiatedJavaClasses['AccessStaticFieldTest']->getInvoker()->getStatic()->getFields()->get('string'));
+ }
+}
diff --git a/tests/AccessStaticMethodTest.php b/tests/AccessStaticMethodTest.php
new file mode 100644
index 00000000..0bd94895
--- /dev/null
+++ b/tests/AccessStaticMethodTest.php
@@ -0,0 +1,57 @@
+initiatedJavaClasses['AccessStaticMethodTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'main',
+ ["Hello", "World"]
+ );
+ $result = ob_get_clean();
+
+ $this->assertEquals("HelloWorld", $result);
+ }
+
+ public function testCallMainHavingIntegerArguments()
+ {
+ ob_start();
+ // call main
+ $this->initiatedJavaClasses['AccessStaticMethodTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'main',
+ [1234, 5678]
+ );
+ $result = ob_get_clean();
+
+ $this->assertEquals(246811356, $result);
+ }
+
+ public function testCallReturnTest()
+ {
+ // call main
+ $result = $this->initiatedJavaClasses['AccessStaticMethodTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call('returnTest');
+
+ $this->assertEquals('Return Test.', $result);
+ }
+}
diff --git a/tests/Base.php b/tests/Base.php
new file mode 100644
index 00000000..a2cd136e
--- /dev/null
+++ b/tests/Base.php
@@ -0,0 +1,30 @@
+fixtures as $fixture) {
+ exec('javac -encoding UTF8 ' . __DIR__ . '/fixtures/java/' . str_replace(['../', './'], '', $fixture) . '.java -d ' . __DIR__ . '/caches');
+ $this->initiatedJavaClasses[$fixture] = new \PHPJava\Core\JavaClass(
+ new \PHPJava\Core\JavaClassReader(
+ $this->getClassName($fixture)
+ )
+ );
+ }
+ }
+
+ protected function getClassName($fixtureName)
+ {
+ return __DIR__ . '/caches/' . $fixtureName . '.class';
+ }
+}
diff --git a/tests/ConstructTest.php b/tests/ConstructTest.php
new file mode 100644
index 00000000..2e0250ca
--- /dev/null
+++ b/tests/ConstructTest.php
@@ -0,0 +1,43 @@
+initiatedJavaClasses['ConstructTest']
+ ->getInvoker()
+ ->construct()
+ ->getDynamic()
+ ->getFields()
+ ->get('text');
+
+ $this->assertEquals('Default Text', $text);
+
+ $text = $this->initiatedJavaClasses['ConstructTest']
+ ->getInvoker()
+ ->getDynamic()
+ ->getFields()
+ ->set('text', 'New Text')
+ ->get('text');
+
+ $this->assertEquals('New Text', $text);
+
+ // Re-construction will be changed to default text
+
+ $text = $this->initiatedJavaClasses['ConstructTest']
+ ->getInvoker()
+ ->construct()
+ ->getDynamic()
+ ->getFields()
+ ->get('text');
+
+ $this->assertEquals('Default Text', $text);
+ }
+}
diff --git a/tests/LoopTest.php b/tests/LoopTest.php
new file mode 100644
index 00000000..0a040d0c
--- /dev/null
+++ b/tests/LoopTest.php
@@ -0,0 +1,57 @@
+initiatedJavaClasses['LoopTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call('calculateByFor', 10);
+ $this->assertEquals(
+ "45",
+ (string) $calculatedValue
+ );
+
+ $calculatedValue = $this->initiatedJavaClasses['LoopTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call('calculateByFor', 20);
+ $this->assertEquals(
+ "190",
+ (string) $calculatedValue
+ );
+ }
+
+ public function testCallCalculateByWhile()
+ {
+ $calculatedValue = $this->initiatedJavaClasses['LoopTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call('calculateByWhile', 10);
+ $this->assertEquals(
+ "45",
+ (string) $calculatedValue
+ );
+
+ $calculatedValue = $this->initiatedJavaClasses['LoopTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call('calculateByWhile', 20);
+ $this->assertEquals(
+ "190",
+ (string) $calculatedValue
+ );
+ }
+}
diff --git a/tests/OutputDebugTraceTest.php b/tests/OutputDebugTraceTest.php
new file mode 100644
index 00000000..02ebf1c1
--- /dev/null
+++ b/tests/OutputDebugTraceTest.php
@@ -0,0 +1,34 @@
+initiatedJavaClasses['OutputDebugTraceTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'main',
+ ["Hello", " ", "World"]
+ );
+ ob_end_clean();
+
+ ob_start();
+ $this->initiatedJavaClasses['OutputDebugTraceTest']->debug();
+ $result = ob_get_clean();
+ $this->assertEquals(
+ file_get_contents(__DIR__ . '/templates/DebugTraceTest.txt'),
+ $result
+ );
+ }
+}
diff --git a/tests/SwitchTest.php b/tests/SwitchTest.php
new file mode 100644
index 00000000..f4775a1d
--- /dev/null
+++ b/tests/SwitchTest.php
@@ -0,0 +1,126 @@
+initiatedJavaClasses['SwitchTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'tableswitch',
+ -1
+ );
+ $result = ob_get_clean();
+
+ $this->assertEquals(
+ 'Cat',
+ $result
+ );
+ }
+
+ public function testTableswitch_Pattern2()
+ {
+ ob_start();
+ $calculatedValue = $this->initiatedJavaClasses['SwitchTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'tableswitch',
+ 0
+ );
+ $result = ob_get_clean();
+
+ $this->assertEquals(
+ 'Dog',
+ $result
+ );
+ }
+
+ public function testTableswitch_Pattern3()
+ {
+ ob_start();
+ $calculatedValue = $this->initiatedJavaClasses['SwitchTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'tableswitch',
+ 1
+ );
+ $result = ob_get_clean();
+
+ $this->assertEquals(
+ 'Hamster',
+ $result
+ );
+ }
+
+
+ public function testCallLookupswitch_Pattern1()
+ {
+ ob_start();
+ $calculatedValue = $this->initiatedJavaClasses['SwitchTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'lookupswitch',
+ 1234
+ );
+ $result = ob_get_clean();
+
+ $this->assertEquals(
+ 'Lion',
+ $result
+ );
+ }
+
+ public function testCallLookupswitch_Pattern2()
+ {
+ ob_start();
+ $calculatedValue = $this->initiatedJavaClasses['SwitchTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'lookupswitch',
+ 5678
+ );
+ $result = ob_get_clean();
+
+ $this->assertEquals(
+ 'Panda',
+ $result
+ );
+ }
+
+ public function testCallLookupswitch_Pattern3()
+ {
+ ob_start();
+ $calculatedValue = $this->initiatedJavaClasses['SwitchTest']
+ ->getInvoker()
+ ->getStatic()
+ ->getMethods()
+ ->call(
+ 'lookupswitch',
+ 9999
+ );
+ $result = ob_get_clean();
+
+ $this->assertEquals(
+ 'Elephant',
+ $result
+ );
+ }
+}
\ No newline at end of file
diff --git a/nbproject/private/config.properties b/tests/caches/.gitkeep
similarity index 100%
rename from nbproject/private/config.properties
rename to tests/caches/.gitkeep
diff --git a/tests/fixtures/java/AccessDynamicFieldTest.java b/tests/fixtures/java/AccessDynamicFieldTest.java
new file mode 100644
index 00000000..3cb262a5
--- /dev/null
+++ b/tests/fixtures/java/AccessDynamicFieldTest.java
@@ -0,0 +1,5 @@
+class AccessDynamicFieldTest
+{
+ public int number = 5;
+ public String string = "Hello World";
+}
diff --git a/tests/fixtures/java/AccessDynamicMethodTest.java b/tests/fixtures/java/AccessDynamicMethodTest.java
new file mode 100644
index 00000000..269ca9ef
--- /dev/null
+++ b/tests/fixtures/java/AccessDynamicMethodTest.java
@@ -0,0 +1,19 @@
+class AccessDynamicMethodTest
+{
+ public void main(String[] args)
+ {
+ System.out.print(args[0]);
+ System.out.print(args[1]);
+ }
+
+ public void main(int[] args)
+ {
+ System.out.print(args[0] * 2);
+ System.out.print(args[1] * 2);
+ }
+
+ public String returnTest()
+ {
+ return "Return Test.";
+ }
+}
diff --git a/tests/fixtures/java/AccessStaticFieldTest.java b/tests/fixtures/java/AccessStaticFieldTest.java
new file mode 100644
index 00000000..3784ac17
--- /dev/null
+++ b/tests/fixtures/java/AccessStaticFieldTest.java
@@ -0,0 +1,5 @@
+class AccessStaticFieldTest
+{
+ public static int number = 5;
+ public static String string = "Hello World";
+}
diff --git a/tests/fixtures/java/AccessStaticMethodTest.java b/tests/fixtures/java/AccessStaticMethodTest.java
new file mode 100644
index 00000000..68de6427
--- /dev/null
+++ b/tests/fixtures/java/AccessStaticMethodTest.java
@@ -0,0 +1,19 @@
+class AccessStaticMethodTest
+{
+ public static void main(String[] args)
+ {
+ System.out.print(args[0]);
+ System.out.print(args[1]);
+ }
+
+ public static void main(int[] args)
+ {
+ System.out.print(args[0] * 2);
+ System.out.print(args[1] * 2);
+ }
+
+ public static String returnTest()
+ {
+ return "Return Test.";
+ }
+}
diff --git a/tests/fixtures/java/ConstructTest.java b/tests/fixtures/java/ConstructTest.java
new file mode 100644
index 00000000..4c01f6e1
--- /dev/null
+++ b/tests/fixtures/java/ConstructTest.java
@@ -0,0 +1,4 @@
+class ConstructTest
+{
+ public String text = "Default Text";
+}
diff --git a/tests/fixtures/java/LoopTest.java b/tests/fixtures/java/LoopTest.java
new file mode 100644
index 00000000..647bbcc0
--- /dev/null
+++ b/tests/fixtures/java/LoopTest.java
@@ -0,0 +1,22 @@
+class LoopTest
+{
+ public static int calculateByFor(int length)
+ {
+ int sum = 0;
+ for (int i = 0; i < length; i++) {
+ sum += i;
+ }
+ return sum;
+ }
+
+ public static int calculateByWhile(int length)
+ {
+ int sum = 0;
+ int i = 0;
+ while (i < length) {
+ sum += i;
+ i++;
+ }
+ return sum;
+ }
+}
diff --git a/tests/fixtures/java/OutputDebugTraceTest.java b/tests/fixtures/java/OutputDebugTraceTest.java
new file mode 100644
index 00000000..717d184c
--- /dev/null
+++ b/tests/fixtures/java/OutputDebugTraceTest.java
@@ -0,0 +1,9 @@
+class OutputDebugTraceTest
+{
+ public static void main(String[] args)
+ {
+ System.out.print(args[0]);
+ System.out.print(args[1]);
+ System.out.print(args[2]);
+ }
+}
diff --git a/tests/fixtures/java/SwitchTest.java b/tests/fixtures/java/SwitchTest.java
new file mode 100644
index 00000000..b15e7ee9
--- /dev/null
+++ b/tests/fixtures/java/SwitchTest.java
@@ -0,0 +1,32 @@
+class SwitchTest
+{
+ public static void tableswitch(int jump)
+ {
+ switch (jump) {
+ case -1:
+ System.out.print("Cat");
+ break;
+ case 0:
+ System.out.print("Dog");
+ break;
+ case 1:
+ System.out.print("Hamster");
+ break;
+ }
+ }
+
+ public static void lookupswitch(int jump)
+ {
+ switch (jump) {
+ case 1234:
+ System.out.print("Lion");
+ break;
+ case 5678:
+ System.out.print("Panda");
+ break;
+ case 9999:
+ System.out.print("Elephant");
+ break;
+ }
+ }
+}
diff --git a/tests/templates/DebugTraceTest.txt b/tests/templates/DebugTraceTest.txt
new file mode 100644
index 00000000..c9956f1a
--- /dev/null
+++ b/tests/templates/DebugTraceTest.txt
@@ -0,0 +1,28 @@
+[method]
+public static void main(java.lang.String[])
+
+[code]
+[1m[35m<0xb2>[m <0x00> <0x02> [1m[35m<0x2a>[m [1m[35m<0x03>[m [1m[35m<0x32>[m [1m[35m<0xb6>[m <0x00> <0x03> [1m[35m<0xb2>[m <0x00> <0x02> [1m[35m<0x2a>[m [1m[35m<0x04>[m [1m[35m<0x32>[m [1m[35m<0xb6>[m <0x00> <0x03> [1m[35m<0xb2>[m <0x00>
+<0x02> [1m[35m<0x2a>[m [1m[35m<0x05>[m [1m[35m<0x32>[m [1m[35m<0xb6>[m <0x00> <0x03> [1m[35m<0xb1>[m
+
+[executed]
+ PC | OPCODE | MNEMONIC | OPERANDS | LOCAL STORAGE
+---------+--------+----------------------+------------+-----------------
+ 0 | 0xB2 | getstatic | 0 | 1
+ 3 | 0x2A | aload_0 | 1 | 1
+ 4 | 0x03 | iconst_0 | 2 | 1
+ 5 | 0x32 | aaload | 3 | 1
+ 6 | 0xB6 | invokevirtual | 2 | 1
+ 9 | 0xB2 | getstatic | 0 | 1
+ 12 | 0x2A | aload_0 | 1 | 1
+ 13 | 0x04 | iconst_1 | 2 | 1
+ 14 | 0x32 | aaload | 3 | 1
+ 15 | 0xB6 | invokevirtual | 2 | 1
+ 18 | 0xB2 | getstatic | 0 | 1
+ 21 | 0x2A | aload_0 | 1 | 1
+ 22 | 0x05 | iconst_2 | 2 | 1
+ 23 | 0x32 | aaload | 3 | 1
+ 24 | 0xB6 | invokevirtual | 2 | 1
+ 27 | 0xB1 | return | 0 | 1
+---------+--------+----------------------+------------+-----------------
+