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] +<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 +---------+--------+----------------------+------------+----------------- +