This commit is contained in:
Fayez Abu Alia 2017-10-05 20:02:11 +02:00
parent 4c213eb3cf
commit 7de617f0c1
6 changed files with 117 additions and 88 deletions

View File

@ -5,8 +5,10 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.lang.invoke.CallSite; import java.lang.invoke.CallSite;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType; import java.lang.invoke.MethodType;
import java.lang.reflect.Method;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
@ -18,103 +20,123 @@ import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
import javassist.runtime.Desc;
public class Test { public class Test {
private static final String rootDirectory = System.getProperty("user.dir")+"/bin/de/dhbwstuttgart/bytecode/"; private static final String rootDirectory = System.getProperty("user.dir") + "/bin/de/dhbwstuttgart/bytecode/";
protected static ClassLoader getClassLoader() throws Exception{
protected static ClassLoader getClassLoader() throws Exception {
File file = new File(rootDirectory); File file = new File(rootDirectory);
URL url = file.toURI().toURL(); URL url = file.toURI().toURL();
URL[] urls = new URL[]{url}; URL[] urls = new URL[] { url };
System.out.println(urls[0]); System.out.println(urls[0]);
return new URLClassLoader(urls); return new URLClassLoader(urls);
} }
public static void main(String[] args) { public static void main(String[] args) {
// Test Lambda // Test Lambda
ClassWriter cw =new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC+Opcodes.ACC_SUPER, "TestClass", null, "java/lang/Object", null); cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, "TestClass", null, "java/lang/Object", null);
cw.visitSource("TestClass.java", null);
// Create Constructor // Create Constructor
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Ljava/lang/Boolean;)V", null, null); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
// mv.visitMethodInsn(INVOKEDYNAMIC, "#0", "run", "()Ljava/lang/Runnable"); // mv.visitMethodInsn(INVOKEDYNAMIC, "#0", "run", "()Ljava/lang/Runnable");
//Call site, which, when invoked, returns an instance of the functional interface to which
//the lambda is being converted
MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
MethodType.class, MethodType.class, MethodHandle.class, MethodType.class);
MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory",
String.class, MethodType.class); mt.toMethodDescriptorString());
Handle arg2 = new Handle(Opcodes.H_INVOKESTATIC, "TestClass", "lambda$0", "()V");
Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bootstrap,
"metafactory", mt.toMethodDescriptorString()); Type.getMethodType("()V"), arg2,
Type.getMethodType("()V"));
mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bootstrap);
mv.visitVarInsn(Opcodes.ASTORE, 1); mv.visitVarInsn(Opcodes.ASTORE, 1);
mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/Runnable", "run", "()V"); mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/Runnable", "run", "()V");
mv.visitInsn(Opcodes.RETURN); mv.visitInsn(Opcodes.RETURN);
// creates bridge method, contains lambdas body
MethodVisitor mvl = cw.visitMethod(Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC + Opcodes.ACC_SYNTHETIC, "lambda$0",
"()V", null, null);
mvl.visitCode();
mvl.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mvl.visitLdcInsn("lambda");
mvl.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
mvl.visitInsn(Opcodes.RETURN);
mvl.visitMaxs(2, 0);
mvl.visitEnd();
mv.visitMaxs(1, 2); mv.visitMaxs(1, 2);
mv.visitEnd(); mv.visitEnd();
cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup",
Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL);
cw.visitEnd(); cw.visitEnd();
byte[] b = cw.toByteArray(); byte[] b = cw.toByteArray();
// Test if statement
// Test if statement /*
/* ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS); * ClassWriter cw = new
* ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC+Opcodes.ACC_SUPER, "TestIf", null, "java/lang/Object", null); *
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Ljava/lang/Boolean;)V", null, null); * cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC+Opcodes.ACC_SUPER, "TestIf", null,
mv.visitCode(); * "java/lang/Object", null); MethodVisitor mv =
* cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Ljava/lang/Boolean;)V", null,
// Label l0 = new Label(); * null); mv.visitCode();
// mv.visitLabel(l0); *
* // Label l0 = new Label(); // mv.visitLabel(l0);
mv.visitVarInsn(Opcodes.ALOAD, 0); *
* mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); *
* mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>",
// Label l1 = new Label(); * "()V");
// mv.visitLabel(l1); *
mv.visitVarInsn(Opcodes.ALOAD, 1); * // Label l1 = new Label(); // mv.visitLabel(l1);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z"); * mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
* "java/lang/Boolean", "booleanValue", "()Z");
Label label = new Label(); *
mv.visitJumpInsn(Opcodes.IFEQ, label); * Label label = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, label);
*
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); * mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out",
mv.visitLdcInsn("1"); * "Ljava/io/PrintStream;"); mv.visitLdcInsn("1");
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); * mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
* "(Ljava/lang/String;)V");
Label endLabel = new Label(); *
mv.visitJumpInsn(Opcodes.GOTO, endLabel); * Label endLabel = new Label(); mv.visitJumpInsn(Opcodes.GOTO, endLabel);
*
mv.visitLabel(label); * mv.visitLabel(label); mv.visitFieldInsn(Opcodes.GETSTATIC,
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); * "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("0");
mv.visitLdcInsn("0"); * mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); * "(Ljava/lang/String;)V");
*
*
*
mv.visitLabel(endLabel); * mv.visitLabel(endLabel); mv.visitInsn(Opcodes.RETURN);
mv.visitInsn(Opcodes.RETURN); *
* // Label l2 = new Label(); // mv.visitLabel(l2);
// Label l2 = new Label(); *
// mv.visitLabel(l2); * // mv.visitLocalVariable("this", "LTestIf;", null, l0, l2, 0); //
* mv.visitLocalVariable("b", "Ljava/lang/Boolean;", null, l0, l2, 1);
// mv.visitLocalVariable("this", "LTestIf;", null, l0, l2, 0); * mv.visitMaxs(2, 2); mv.visitEnd();
// mv.visitLocalVariable("b", "Ljava/lang/Boolean;", null, l0, l2, 1); *
mv.visitMaxs(2, 2); * cw.visitEnd(); byte[] b = cw.toByteArray();
mv.visitEnd(); */
cw.visitEnd();
byte[] b = cw.toByteArray();
*/
FileOutputStream output; FileOutputStream output;
try { try {
output = new FileOutputStream(new File(System.getProperty("user.dir")+"/testBytecode/TestClass.class")); output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/TestClass.class"));
output.write(b); output.write(b);
output.close(); output.close();
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {

View File

@ -1,5 +1,6 @@
package de.dhbwstuttgart.core; package de.dhbwstuttgart.core;
import de.dhbwstuttgart.bytecode.BytecodeGen;
import de.dhbwstuttgart.exceptions.DebugException; import de.dhbwstuttgart.exceptions.DebugException;
import de.dhbwstuttgart.parser.JavaTXParser; import de.dhbwstuttgart.parser.JavaTXParser;
import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.ClassOrInterface;

View File

@ -2,6 +2,7 @@ package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.ASTVisitor; import de.dhbwstuttgart.syntaxtree.ASTVisitor;
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
@ -20,6 +21,10 @@ public class ArgumentList extends SyntaxTreeNode
return expr; return expr;
} }
public void accept(StatementVisitor visitor) {
visitor.visit(this);
}
@Override @Override
public void accept(ASTVisitor visitor) { public void accept(ASTVisitor visitor) {
visitor.visit(this); visitor.visit(this);

BIN
test/.DS_Store vendored

Binary file not shown.

View File

@ -37,12 +37,12 @@ public class JavaTXCompilerTest extends JavaTXCompiler {
@Test @Test
public void test() throws IOException, java.lang.ClassNotFoundException { public void test() throws IOException, java.lang.ClassNotFoundException {
filesToTest.add(new File(rootDirectory+"EmptyClass.jav")); filesToTest.add(new File(rootDirectory+"EmptyMethod.jav"));
for(File f : filesToTest){ for(File f : filesToTest){
SourceFile sf = this.parse(f); SourceFile sf = this.parse(f);
String content = readFile(f.getPath(), StandardCharsets.UTF_8); String content = readFile(f.getPath(), StandardCharsets.UTF_8);
HashMap<String,byte[]> bytecode = this.getBytecode(sf); HashMap<String,byte[]> bytecode = this.getBytecode(sf);
this.writeClassFile(bytecode, "EmptyClass"); this.writeClassFile(bytecode, "EmptyMethod");
} }
} }

View File

@ -35,7 +35,8 @@ public class JavaTXCompilerTest extends JavaTXCompiler {
public void test() throws IOException, java.lang.ClassNotFoundException { public void test() throws IOException, java.lang.ClassNotFoundException {
//filesToTest.add(new File(rootDirectory+"Faculty.jav")); //filesToTest.add(new File(rootDirectory+"Faculty.jav"));
//filesToTest.add(new File(rootDirectory+"mathStruc.jav")); //filesToTest.add(new File(rootDirectory+"mathStruc.jav"));
filesToTest.add(new File(rootDirectory+"test.jav")); //filesToTest.add(new File(rootDirectory+"test.jav"));
filesToTest.add(new File(rootDirectory+"EmptyMethod.jav"));
//filesToTest.add(new File(rootDirectory+"Lambda.jav")); //filesToTest.add(new File(rootDirectory+"Lambda.jav"));
//filesToTest.add(new File(rootDirectory+"Lambda2.jav")); //filesToTest.add(new File(rootDirectory+"Lambda2.jav"));
//filesToTest.add(new File(rootDirectory+"Lambda3.jav")); //filesToTest.add(new File(rootDirectory+"Lambda3.jav"));