From 93514e4f0802f14b50f4ca1aa5677be94dcefee0 Mon Sep 17 00:00:00 2001 From: Jochen Seyfried Date: Wed, 8 May 2024 13:51:20 +0200 Subject: [PATCH] Added TODOS for changes --- Source/abstractSyntaxTree/Class/MethodDecl.java | 1 + Source/abstractSyntaxTree/Program.java | 14 +++++++++++++- .../Statement/IfElseStatement.java | 2 +- .../abstractSyntaxTree/Statement/IfStatement.java | 2 +- .../Statement/ReturnStatement.java | 4 ++-- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Source/abstractSyntaxTree/Class/MethodDecl.java b/Source/abstractSyntaxTree/Class/MethodDecl.java index fce967a..5005324 100644 --- a/Source/abstractSyntaxTree/Class/MethodDecl.java +++ b/Source/abstractSyntaxTree/Class/MethodDecl.java @@ -11,6 +11,7 @@ public class MethodDecl implements IClass { private HashMap>> methodContext; private HashMap> typeContext; + //TODO: Move this into the typeCheck private HashMap localVars; // (type, identifier) // add content here public MethodDecl(HashMap>> methodContext, HashMap> typeContext){ diff --git a/Source/abstractSyntaxTree/Program.java b/Source/abstractSyntaxTree/Program.java index 0c9aa5d..6df43b2 100644 --- a/Source/abstractSyntaxTree/Program.java +++ b/Source/abstractSyntaxTree/Program.java @@ -3,7 +3,9 @@ package abstractSyntaxTree; import TypeCheck.TypeCheckResult; import abstractSyntaxTree.Class.FieldDecl; import abstractSyntaxTree.Datatype.RefType; +import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; import java.util.HashMap; import java.util.List; @@ -11,7 +13,10 @@ import java.util.List; public class Program { public List classes; + //TODO: Rename typeContext to attributeContext or something public HashMap> typeContext; // (class, (type, identifier)) + + //TODO: Change Data structure and make parameter a list public HashMap>> methodContext; // (class, (returntype, (identifier, parameter))) public TypeCheckResult typeCheck() throws Exception{ @@ -26,7 +31,14 @@ public class Program { public void codeGen() throws Exception{ for(RefType oneClass : classes){ - oneClass.codeGen(); + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); + cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "oneClass.className", + null, "java/lang/Object", null); + oneClass.codeGen(cw); + cw.visitEnd(); + byte[] bytecode = cw.toByteArray(); + + //Write the bytecode to a .class file } } } diff --git a/Source/abstractSyntaxTree/Statement/IfElseStatement.java b/Source/abstractSyntaxTree/Statement/IfElseStatement.java index cd0fe10..d8ac01e 100644 --- a/Source/abstractSyntaxTree/Statement/IfElseStatement.java +++ b/Source/abstractSyntaxTree/Statement/IfElseStatement.java @@ -43,7 +43,7 @@ public class IfElseStatement extends AbstractType implements IStatement{ Label conditionFalse = new Label(); Label statementEnd = new Label(); - condition.CodeGen(mv); + condition.codeGen(mv); mv.visitJumpInsn(Opcodes.IFEQ, conditionFalse); //Checks if the condition is false (0) ifStatement.codeGen(mv); //If the condition is true, execute the ifBlock diff --git a/Source/abstractSyntaxTree/Statement/IfStatement.java b/Source/abstractSyntaxTree/Statement/IfStatement.java index 665f4f1..1c8461c 100644 --- a/Source/abstractSyntaxTree/Statement/IfStatement.java +++ b/Source/abstractSyntaxTree/Statement/IfStatement.java @@ -35,7 +35,7 @@ public class IfStatement extends AbstractType implements IStatement{ Label conditionFalse = new Label(); - condition.CodeGen(mv); + condition.codeGen(mv); mv.visitJumpInsn(Opcodes.IFEQ, conditionFalse); //Checks if the condition is false (0) ifStatement.codeGen(mv); diff --git a/Source/abstractSyntaxTree/Statement/ReturnStatement.java b/Source/abstractSyntaxTree/Statement/ReturnStatement.java index 0005827..976de6e 100644 --- a/Source/abstractSyntaxTree/Statement/ReturnStatement.java +++ b/Source/abstractSyntaxTree/Statement/ReturnStatement.java @@ -34,11 +34,11 @@ public class ReturnStatement extends AbstractType implements IStatement{ public void codeGen(MethodVisitor mv) throws Exception { if (expression != null) { - expression.CodeGen(mv); + expression.codeGen(mv); //Get the Type of the expression String type = expression.typeCheck().type; - if (type.equals("int") || type.equals("bool")) { + if (type.equals("int") || type.equals("bool") || type.equals("char")) { mv.visitInsn(Opcodes.IRETURN); } else { mv.visitInsn(Opcodes.ARETURN);