Updated CodeGen of FiledDecl and MethodDecl and Assign
This commit is contained in:
parent
3be8d9854a
commit
108b8f63ea
@ -41,7 +41,7 @@ public class FieldDecl extends AbstractType implements Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void codeGen(ClassWriter cw) {
|
public void codeGen(ClassWriter cw) {
|
||||||
//TODO: Do we have fields with initial values?
|
//TODO: Do we have fields with initial values? --> No dont think so --> assign
|
||||||
FieldVisitor fv = cw.visitField(Opcodes.ACC_PUBLIC, identifier, getFieldDescriptor(), null, null);
|
FieldVisitor fv = cw.visitField(Opcodes.ACC_PUBLIC, identifier, getFieldDescriptor(), null, null);
|
||||||
fv.visitEnd();
|
fv.visitEnd();
|
||||||
}
|
}
|
||||||
@ -51,7 +51,7 @@ public class FieldDecl extends AbstractType implements Node {
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case "int":
|
case "int":
|
||||||
return "I";
|
return "I";
|
||||||
case "boolean":
|
case "bool":
|
||||||
return "Z";
|
return "Z";
|
||||||
case "char":
|
case "char":
|
||||||
return "C";
|
return "C";
|
||||||
|
@ -116,7 +116,7 @@ public class MethodDecl implements Node {
|
|||||||
for (Parameter param : parameters.parameterList) {
|
for (Parameter param : parameters.parameterList) {
|
||||||
switch (param.type) {
|
switch (param.type) {
|
||||||
case "int" -> descriptor.append("I");
|
case "int" -> descriptor.append("I");
|
||||||
case "boolean" -> descriptor.append("Z");
|
case "bool" -> descriptor.append("Z");
|
||||||
case "char" -> descriptor.append("C");
|
case "char" -> descriptor.append("C");
|
||||||
case "void" -> descriptor.append("V");
|
case "void" -> descriptor.append("V");
|
||||||
default -> {
|
default -> {
|
||||||
@ -136,7 +136,7 @@ public class MethodDecl implements Node {
|
|||||||
} else {
|
} else {
|
||||||
switch (returnType) {
|
switch (returnType) {
|
||||||
case "int" -> descriptor.append("I");
|
case "int" -> descriptor.append("I");
|
||||||
case "boolean" -> descriptor.append("Z");
|
case "bool" -> descriptor.append("Z");
|
||||||
case "char" -> descriptor.append("C");
|
case "char" -> descriptor.append("C");
|
||||||
case "void" -> descriptor.append("V");
|
case "void" -> descriptor.append("V");
|
||||||
default -> {
|
default -> {
|
||||||
|
@ -85,7 +85,7 @@ public class RefType extends AbstractType implements Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (MethodDecl method : methodDecls) {
|
for (MethodDecl method : methodDecls) {
|
||||||
// method.codeGen(cw);
|
method.codeGen(cw, methodContext);
|
||||||
}
|
}
|
||||||
cw.visitEnd();
|
cw.visitEnd();
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import TypeCheck.TypeCheckHelper;
|
|||||||
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.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -30,6 +31,6 @@ public class LocalVarDecl implements IStatement{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void codeGen(MethodVisitor mv, HashMap<String, String> localVars) throws Exception {
|
public void codeGen(MethodVisitor mv, HashMap<String, String> localVars) throws Exception {
|
||||||
|
localVars.put(identifier, type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,6 @@ import abstractSyntaxTree.Parameter.ParameterList;
|
|||||||
import org.objectweb.asm.*;
|
import org.objectweb.asm.*;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class ReturnStatement extends AbstractType implements IStatement{
|
public class ReturnStatement extends AbstractType implements IStatement{
|
||||||
IExpression expression;
|
IExpression expression;
|
||||||
@ -39,7 +38,8 @@ public class ReturnStatement extends AbstractType implements IStatement{
|
|||||||
if (expression != null) {
|
if (expression != null) {
|
||||||
expression.codeGen(mv);
|
expression.codeGen(mv);
|
||||||
//Get the Type of the expression
|
//Get the Type of the expression
|
||||||
String type = expression.typeCheck().type;
|
//TODO: Resolve how do we get the type of the expression
|
||||||
|
String type = expression.typeCheck(??).type;
|
||||||
|
|
||||||
if (type.equals("int") || type.equals("bool") || type.equals("char")) {
|
if (type.equals("int") || type.equals("bool") || type.equals("char")) {
|
||||||
mv.visitInsn(Opcodes.IRETURN);
|
mv.visitInsn(Opcodes.IRETURN);
|
||||||
|
@ -8,6 +8,7 @@ import abstractSyntaxTree.Expression.InstVarExpression;
|
|||||||
import abstractSyntaxTree.Expression.LocalVarIdentifier;
|
import abstractSyntaxTree.Expression.LocalVarIdentifier;
|
||||||
import abstractSyntaxTree.Parameter.ParameterList;
|
import abstractSyntaxTree.Parameter.ParameterList;
|
||||||
import abstractSyntaxTree.Statement.IStatement;
|
import abstractSyntaxTree.Statement.IStatement;
|
||||||
|
import abstractSyntaxTree.Statement.LocalVarDecl;
|
||||||
import org.objectweb.asm.*;
|
import org.objectweb.asm.*;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -51,7 +52,13 @@ public class AssignStatementExpression extends AbstractType implements IExpressi
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void codeGen(MethodVisitor mv, HashMap<String, String> localVars) throws Exception {
|
public void codeGen(MethodVisitor mv, HashMap<String, String> localVars) throws Exception {
|
||||||
if (left instanceof VarRefExpression varRef) {
|
if (left instanceof LocalVarIdentifier) {
|
||||||
|
LocalVarIdentifier localVar = (LocalVarIdentifier) left;
|
||||||
|
String varName = localVar.getIdentifier();
|
||||||
|
|
||||||
|
//Get the index of the local variable
|
||||||
|
int varIndex = localVars.get(varName)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user