Implemented CodeGen for Constants and fixed an issue regarding the placements of local variables on the JVM stack.

( index JVM = index localVars + 1)
This commit is contained in:
Jochen Seyfried 2024-06-22 12:30:06 +02:00
parent c764b710ea
commit 87e863e773
6 changed files with 14 additions and 7 deletions

View File

@ -28,7 +28,7 @@ public class Compiler {
public static void main(String[] args) throws Exception{ public static void main(String[] args) throws Exception{
Path filePath = Paths.get("src/main/java/Input.java"); Path filePath = Paths.get("src/main/java/InputTest.java");
// todo remove this debug info // todo remove this debug info

View File

@ -5,6 +5,7 @@ import TypeCheck.TypeCheckException;
import TypeCheck.TypeCheckResult; import TypeCheck.TypeCheckResult;
import abstractSyntaxTree.Parameter.ParameterList; import abstractSyntaxTree.Parameter.ParameterList;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -26,7 +27,11 @@ public class BooleanConstantExpression extends AbstractType implements IExpressi
@Override @Override
public void codeGen(MethodVisitor mv, LinkedHashMap<String, String> localVars, HashMap<String, HashMap<String, String>> typeContext) throws Exception { public void codeGen(MethodVisitor mv, LinkedHashMap<String, String> localVars, HashMap<String, HashMap<String, String>> typeContext) throws Exception {
if (value){
mv.visitInsn(Opcodes.ICONST_1);
} else {
mv.visitInsn(Opcodes.ICONST_0);
}
} }
@Override @Override
public TypeCheckResult getTypeCheckResult() { public TypeCheckResult getTypeCheckResult() {

View File

@ -4,6 +4,7 @@ import TypeCheck.AbstractType;
import TypeCheck.TypeCheckResult; import TypeCheck.TypeCheckResult;
import abstractSyntaxTree.Parameter.ParameterList; import abstractSyntaxTree.Parameter.ParameterList;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -25,7 +26,7 @@ public class CharConstantExpression extends AbstractType implements IExpression{
@Override @Override
public void codeGen(MethodVisitor mv, LinkedHashMap<String, String> localVars, HashMap<String, HashMap<String, String>> typeContext) throws Exception { public void codeGen(MethodVisitor mv, LinkedHashMap<String, String> localVars, HashMap<String, HashMap<String, String>> typeContext) throws Exception {
mv.visitIntInsn(Opcodes.BIPUSH, (int) value);
} }
@Override @Override

View File

@ -4,6 +4,7 @@ import TypeCheck.AbstractType;
import TypeCheck.TypeCheckResult; import TypeCheck.TypeCheckResult;
import abstractSyntaxTree.Parameter.ParameterList; import abstractSyntaxTree.Parameter.ParameterList;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -27,7 +28,8 @@ public class IntConstantExpression extends AbstractType implements IExpression{
@Override @Override
public void codeGen(MethodVisitor mv, LinkedHashMap<String, String> localVars, HashMap<String, HashMap<String, String>> typeContext) throws Exception { public void codeGen(MethodVisitor mv, LinkedHashMap<String, String> localVars, HashMap<String, HashMap<String, String>> typeContext) throws Exception {
//TODO: When we are finished this can be done more efficiently
mv.visitLdcInsn(value);
} }
@Override @Override

View File

@ -45,12 +45,12 @@ public class LocalVarIdentifier extends AbstractType implements IExpression{
throw new Exception("Variable " + identifier + " not declared"); throw new Exception("Variable " + identifier + " not declared");
} }
// Load the variable onto the stack // Find the index of the variable
int index = -1; int index = -1;
int counter = 0; int counter = 0;
for (String key : localVars.keySet()){ for (String key : localVars.keySet()){
if (key.equals(identifier)){ if (key.equals(identifier)){
index = counter; index = counter+1; // +1 because the first local variable is at index 1, 0 is used for "this"
break; break;
} }
counter++; counter++;

View File

@ -50,7 +50,6 @@ public class ReturnStatement extends AbstractType implements IStatement{
mv.visitInsn(Opcodes.IRETURN); mv.visitInsn(Opcodes.IRETURN);
} else { } else {
mv.visitInsn(Opcodes.ARETURN); mv.visitInsn(Opcodes.ARETURN);
} }
} else { } else {
mv.visitInsn(Opcodes.RETURN); mv.visitInsn(Opcodes.RETURN);