forked from JavaTX/JavaCompilerCore
test
This commit is contained in:
parent
4c213eb3cf
commit
7de617f0c1
@ -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);
|
||||||
|
|
||||||
// Create Constructor
|
|
||||||
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Ljava/lang/Boolean;)V", null, null);
|
|
||||||
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
|
||||||
|
|
||||||
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
|
|
||||||
|
|
||||||
// mv.visitMethodInsn(INVOKEDYNAMIC, "#0", "run", "()Ljava/lang/Runnable");
|
|
||||||
|
|
||||||
MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class,
|
|
||||||
String.class, MethodType.class);
|
|
||||||
|
|
||||||
Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory",
|
|
||||||
"metafactory", mt.toMethodDescriptorString());
|
|
||||||
|
|
||||||
mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bootstrap);
|
|
||||||
|
|
||||||
mv.visitVarInsn(Opcodes.ASTORE, 1);
|
|
||||||
mv.visitVarInsn(Opcodes.ALOAD, 1);
|
|
||||||
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/Runnable", "run", "()V");
|
|
||||||
mv.visitInsn(Opcodes.RETURN);
|
|
||||||
mv.visitMaxs(1, 2);
|
|
||||||
mv.visitEnd();
|
|
||||||
|
|
||||||
cw.visitEnd();
|
|
||||||
|
|
||||||
byte[] b = cw.toByteArray();
|
|
||||||
|
|
||||||
|
|
||||||
// Test if statement
|
|
||||||
/* 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);
|
|
||||||
mv.visitCode();
|
|
||||||
|
|
||||||
// Label l0 = new Label();
|
|
||||||
// mv.visitLabel(l0);
|
|
||||||
|
|
||||||
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
|
||||||
|
|
||||||
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
|
|
||||||
|
|
||||||
// Label l1 = new Label();
|
|
||||||
// mv.visitLabel(l1);
|
|
||||||
mv.visitVarInsn(Opcodes.ALOAD, 1);
|
|
||||||
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z");
|
|
||||||
|
|
||||||
Label label = new Label();
|
|
||||||
mv.visitJumpInsn(Opcodes.IFEQ, label);
|
|
||||||
|
|
||||||
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
|
|
||||||
mv.visitLdcInsn("1");
|
|
||||||
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
|
|
||||||
|
|
||||||
Label endLabel = new Label();
|
|
||||||
mv.visitJumpInsn(Opcodes.GOTO, endLabel);
|
|
||||||
|
|
||||||
mv.visitLabel(label);
|
|
||||||
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
|
|
||||||
mv.visitLdcInsn("0");
|
|
||||||
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mv.visitLabel(endLabel);
|
cw.visitSource("TestClass.java", null);
|
||||||
|
|
||||||
|
// Create Constructor
|
||||||
|
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory",
|
||||||
|
mt.toMethodDescriptorString());
|
||||||
|
Handle arg2 = new Handle(Opcodes.H_INVOKESTATIC, "TestClass", "lambda$0", "()V");
|
||||||
|
|
||||||
|
mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bootstrap,
|
||||||
|
Type.getMethodType("()V"), arg2,
|
||||||
|
Type.getMethodType("()V"));
|
||||||
|
|
||||||
|
mv.visitVarInsn(Opcodes.ASTORE, 1);
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 1);
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/Runnable", "run", "()V");
|
||||||
mv.visitInsn(Opcodes.RETURN);
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
|
|
||||||
// Label l2 = new Label();
|
// creates bridge method, contains lambdas body
|
||||||
// mv.visitLabel(l2);
|
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.visitLocalVariable("this", "LTestIf;", null, l0, l2, 0);
|
mv.visitMaxs(1, 2);
|
||||||
// mv.visitLocalVariable("b", "Ljava/lang/Boolean;", null, l0, l2, 1);
|
|
||||||
mv.visitMaxs(2, 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
|
||||||
|
/*
|
||||||
|
* 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); mv.visitCode();
|
||||||
|
*
|
||||||
|
* // Label l0 = new Label(); // mv.visitLabel(l0);
|
||||||
|
*
|
||||||
|
* mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
*
|
||||||
|
* mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>",
|
||||||
|
* "()V");
|
||||||
|
*
|
||||||
|
* // Label l1 = new Label(); // mv.visitLabel(l1);
|
||||||
|
* mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
|
||||||
|
* "java/lang/Boolean", "booleanValue", "()Z");
|
||||||
|
*
|
||||||
|
* Label label = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, label);
|
||||||
|
*
|
||||||
|
* mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out",
|
||||||
|
* "Ljava/io/PrintStream;"); mv.visitLdcInsn("1");
|
||||||
|
* mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
|
||||||
|
* "(Ljava/lang/String;)V");
|
||||||
|
*
|
||||||
|
* Label endLabel = new Label(); mv.visitJumpInsn(Opcodes.GOTO, endLabel);
|
||||||
|
*
|
||||||
|
* mv.visitLabel(label); mv.visitFieldInsn(Opcodes.GETSTATIC,
|
||||||
|
* "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("0");
|
||||||
|
* mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
|
||||||
|
* "(Ljava/lang/String;)V");
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* mv.visitLabel(endLabel); mv.visitInsn(Opcodes.RETURN);
|
||||||
|
*
|
||||||
|
* // 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.visitMaxs(2, 2); 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) {
|
||||||
@ -124,6 +146,6 @@ public class Test {
|
|||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
@ -81,5 +82,5 @@ public class JavaTXCompiler {
|
|||||||
sourceFiles.add(ret);
|
sourceFiles.add(ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
BIN
test/.DS_Store
vendored
Binary file not shown.
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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"));
|
||||||
|
Loading…
Reference in New Issue
Block a user