Changed the methodContext to use the ParameterList
This commit is contained in:
parent
87cde5e048
commit
7ff84e5ad7
3
.idea/.gitignore
generated
vendored
3
.idea/.gitignore
generated
vendored
@ -2,4 +2,5 @@
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
|
||||
.idea/
|
||||
.idea/# GitHub Copilot persisted chat sessions
|
||||
/copilot/chatSessions
|
||||
|
@ -14,7 +14,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Stack;
|
||||
|
||||
public class MethodDecl implements IClass, Node {
|
||||
public class MethodDecl implements Node {
|
||||
|
||||
//Class Name
|
||||
public String classThatContainsMethod;
|
||||
@ -43,8 +43,9 @@ public class MethodDecl implements IClass, Node {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void codeGen(ClassWriter cw) throws Exception {
|
||||
|
||||
// methodContext (class, (returnType, (identifier, parameter)))
|
||||
public void codeGen(ClassWriter cw, HashMap<String, HashMap<String, HashMap<String, ParameterList>>> methodContext) throws Exception {
|
||||
|
||||
localVars.put("this", classThatContainsMethod);
|
||||
for (Parameter param : parameters.parameterList) {
|
||||
@ -60,19 +61,19 @@ public class MethodDecl implements IClass, Node {
|
||||
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
|
||||
|
||||
mv.visitCode();
|
||||
codeBlock.codeGen(mv, localVars); //TODO: pass the local vars? --> codeGen for block not yet implemented
|
||||
codeBlock.codeGen(mv, localVars);
|
||||
mv.visitInsn(Opcodes.RETURN);
|
||||
|
||||
//automatically computed max stack and max locals
|
||||
mv.visitMaxs(0, 0);
|
||||
mv.visitEnd();
|
||||
} else if (name.equals("main")) { //TODO: Check how we distinguish the main method
|
||||
} else if (name.equals("main")) {
|
||||
int access = Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC;
|
||||
|
||||
MethodVisitor mv = cw.visitMethod(access, name, "([Ljava/lang/String;)V", null, null);
|
||||
|
||||
mv.visitCode();
|
||||
codeBlock.codeGen(mv, localVars); //TODO: pass the local vars? --> codeGen for block not yet implemented
|
||||
codeBlock.codeGen(mv, localVars);
|
||||
mv.visitInsn(Opcodes.RETURN);
|
||||
|
||||
mv.visitMaxs(0, 0);
|
||||
@ -82,7 +83,7 @@ public class MethodDecl implements IClass, Node {
|
||||
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, name, getMethodDescriptor(), null, null);
|
||||
|
||||
mv.visitCode();
|
||||
codeBlock.codeGen(mv, localVars); //TODO: pass the local vars? --> codeGen for block not yet implemented
|
||||
codeBlock.codeGen(mv, localVars);
|
||||
|
||||
// We have to check the return type to get the return opcode
|
||||
// For methods which return an actual value, the return opcode is created in the method body to ensure the
|
||||
|
@ -3,6 +3,7 @@ package abstractSyntaxTree.Class;
|
||||
import TypeCheck.AbstractType;
|
||||
import TypeCheck.TypeCheckResult;
|
||||
import abstractSyntaxTree.Node;
|
||||
import abstractSyntaxTree.Parameter.ParameterList;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
|
||||
@ -10,7 +11,7 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
public class RefType extends AbstractType implements IClass, Node {
|
||||
public class RefType extends AbstractType implements Node {
|
||||
|
||||
//Class Name
|
||||
public String name;
|
||||
@ -72,8 +73,7 @@ public class RefType extends AbstractType implements IClass, Node {
|
||||
|
||||
// Method for code generation which iterates over all the field declarations
|
||||
// and method declarations and calls their CodeGen methods
|
||||
@Override
|
||||
public void codeGen(ClassWriter cw) throws Exception {
|
||||
public void codeGen(ClassWriter cw, HashMap<String, HashMap<String, HashMap<String, ParameterList>>> methodContext) throws Exception {
|
||||
|
||||
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null,
|
||||
"java/lang/Object", null);
|
||||
@ -83,7 +83,7 @@ public class RefType extends AbstractType implements IClass, Node {
|
||||
}
|
||||
|
||||
for (MethodDecl method : methodDecls) {
|
||||
method.codeGen(cw);
|
||||
method.codeGen(cw, methodContext);
|
||||
}
|
||||
cw.visitEnd();
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import TypeCheck.TypeCheckResult;
|
||||
import abstractSyntaxTree.Class.FieldDecl;
|
||||
import abstractSyntaxTree.Class.MethodDecl;
|
||||
import abstractSyntaxTree.Class.RefType;
|
||||
import abstractSyntaxTree.Parameter.ParameterList;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
|
||||
@ -18,7 +19,7 @@ import java.util.jar.JarOutputStream;
|
||||
public class Program implements Node {
|
||||
public List<RefType> classes;
|
||||
public HashMap<String, HashMap<String, String>> typeContext; // (class, (type, identifier))
|
||||
public HashMap<String, HashMap<String, HashMap<String, List<String>>>> methodContext; // (class, (returntype, (identifier, parameter)))
|
||||
public HashMap<String, HashMap<String, HashMap<String, ParameterList>>> methodContext; // (class, (returntype, (identifier, parameterList)))
|
||||
|
||||
public Program(List<RefType> classes){
|
||||
this.classes = classes;
|
||||
@ -64,7 +65,7 @@ public class Program implements Node {
|
||||
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
|
||||
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, oneClass.name, null, "java/lang/Object", null);
|
||||
|
||||
oneClass.codeGen(cw);
|
||||
oneClass.codeGen(cw, methodContext);
|
||||
|
||||
cw.visitEnd();
|
||||
byte[] bytecode = cw.toByteArray();
|
||||
|
Loading…
x
Reference in New Issue
Block a user