From 026eb099b0f679a57b1aa2938c554d74e0a8a714 Mon Sep 17 00:00:00 2001 From: Sanjar Ahmadov Date: Sun, 2 May 2021 10:54:51 -0400 Subject: [PATCH] Add jump to label in return statement --- src/main/java/chocopy/pa3/CodeGenImpl.java | 27 ++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/chocopy/pa3/CodeGenImpl.java b/src/main/java/chocopy/pa3/CodeGenImpl.java index 939b9f0..d4b4cfa 100644 --- a/src/main/java/chocopy/pa3/CodeGenImpl.java +++ b/src/main/java/chocopy/pa3/CodeGenImpl.java @@ -236,7 +236,10 @@ public class CodeGenImpl extends CodeGenBase // *********** functions start *********** public Register analyze(CallExpr node) { + System.out.println("Inside CallExpr: " + node.function.name); backend.emitLW(T6, FP, 0, "Inside CallExpr: " + node.function.name); + + SymbolInfo Ty = globalSymbols.get(node.function.name); if(Ty instanceof ClassInfo){ //object create @@ -295,6 +298,7 @@ public class CodeGenImpl extends CodeGenBase } public Register analyze(MethodCallExpr node) { + System.out.println("Inside MethodCallExpr: " + node.method.member.name); backend.emitLW(T6, FP, 0, "Inside MethodCallExpr: " + node.method.member.name); Register obj = node.method.object.dispatch(this); int n_args = node.args.size(); @@ -327,6 +331,7 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(ReturnStmt stmt) { + System.out.println("Inside ReturnStmt: "); backend.emitLW(T6, FP, 0, "Inside ReturnStmt: "); Expr expr = stmt.value; if (expr == null) { @@ -336,7 +341,7 @@ public class CodeGenImpl extends CodeGenBase // All expressions should save their end result in A0 expr.dispatch(this); - + backend.emitJ(this.epilogue, "Jump to function epilogue"); return A0; } @@ -347,6 +352,7 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(NoneLiteral node) { + System.out.println("Inside NoneLiteral: "); backend.emitLW(T6, FP, 0, "Inside NoneLiteral: "); backend.emitMV(Register.A0, Register.ZERO, "Load none"); return Register.A0; @@ -355,6 +361,7 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(StringLiteral node) { + System.out.println("Inside StringLiteral: "); backend.emitLW(T6, FP, 0, "Inside StringLiteral: "); Label l = constants.getStrConstant(node.value); backend.emitLA(Register.A0, l, "Load string literal"); @@ -364,6 +371,7 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(BooleanLiteral node) { + System.out.println("Inside BooleanLiteral: "); backend.emitLW(T6, FP, 0, "Inside BooleanLiteral: "); if(node.value==true) backend.emitLI(Register.A0, 1, "Load boolean literal: true "); @@ -376,6 +384,7 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(AssignStmt node) { + System.out.println("Inside AssignStmt: "); backend.emitLW(T6, FP, 0, "Inside AssignStmt: "); Type t = node.value.getInferredType(); // if(t.isSpecialType() || t.isListType()) @@ -415,6 +424,7 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(ExprStmt node) { + System.out.println("Inside ExprStmt: "); backend.emitLW(T6, FP, 0, "Inside ExprStmt: "); node.expr.dispatch(this); return null; @@ -423,6 +433,7 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(IfExpr node) { + System.out.println("Inside IfExpr: "); node.condition.dispatch(this); Label ln = generateLocalLabel(); node.thenExpr.dispatch(this); @@ -436,6 +447,7 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(IfStmt node) { + System.out.println("Inside IfStmt: "); node.condition.dispatch(this); Label ln = generateLocalLabel(); for(Stmt s:node.thenBody) @@ -514,6 +526,7 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(BinaryExpr node) { + System.out.println("Inside BinaryExpr: "); String operator = node.operator; backend.emitLW(T6, FP, 0, "Inside BinaryExpr: "); @@ -724,15 +737,18 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(WhileStmt node) { + System.out.println("Inside WhileStmt: "); Label startLoop = generateLocalLabel(); backend.emitLocalLabel(startLoop, "Beginning of while loop"); node.condition.dispatch(this); Label endLoop = elseBlock; - for(Stmt stmt:node.body) + for(Stmt stmt:node.body) { + System.out.println("Inside WhileStmt: for loop " + stmt.toString()); stmt.dispatch(this); + } backend.emitJ(startLoop, "Jump to beginning of loop"); backend.emitLocalLabel(endLoop, "End of while loop"); - + System.out.println("Inside WhileStmt: Done with while"); return null; } @@ -765,9 +781,12 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(IntegerLiteral node) { + System.out.println("Inside IntegerLiteral: " + node.value); backend.emitLW(T6, FP, 0, "Inside IntegerLiteral: " + node.value); backend.emitLI(A0, node.value, "Load integer literal " + node.value); - //backend.emitJAL(makeintLabel, "Box integer"); + + // FIXME: Remove line below later once you are boxing it in function call + backend.emitJAL(makeintLabel, "Box integer"); return A0; }