From 5f54c2df4bbab01aab2abb983b1fb43bfe59867d Mon Sep 17 00:00:00 2001 From: Apoorva Ranade Date: Fri, 7 May 2021 18:28:45 +0530 Subject: [PATCH] Cleanup 2 --- src/main/java/chocopy/pa3/CodeGenImpl.java | 126 ++++++++++----------- 1 file changed, 60 insertions(+), 66 deletions(-) diff --git a/src/main/java/chocopy/pa3/CodeGenImpl.java b/src/main/java/chocopy/pa3/CodeGenImpl.java index e2637af..03d26b9 100644 --- a/src/main/java/chocopy/pa3/CodeGenImpl.java +++ b/src/main/java/chocopy/pa3/CodeGenImpl.java @@ -479,25 +479,30 @@ public class CodeGenImpl extends CodeGenBase public final int off; public final Register sl; public int regHandle; - StackVarRuntimeInfo(Register sl, int off){ + StackVarRuntimeInfo(Register sl, int off) + { this.off = off; this.sl = sl; regHandle = -1; } - StackVarRuntimeInfo(Register sl, int off, int regHandle){ + StackVarRuntimeInfo(Register sl, int off, int regHandle) + { this.off = off; this.sl = sl; this.regHandle = regHandle; } - public void free(){ - if(regHandle >= 0){ + public void free() + { + if(regHandle >= 0) + { freeRegister(regHandle); regHandle = -1; } } } - private Object getVar(Identifier id){ + private Object getVar(Identifier id) + { SymbolInfo info = sym.get(id.name); if(info instanceof StackVarInfo) return getStackVar((StackVarInfo)info); @@ -505,91 +510,80 @@ public class CodeGenImpl extends CodeGenBase return ((GlobalVarInfo)info).getLabel(); } - private StackVarRuntimeInfo getStackVar(StackVarInfo info){ - FuncInfo varFuncInfo = info.getFuncInfo(); - System.out.println("var name: " + info.getVarName()); - System.out.println("varfuncInfo name: " + varFuncInfo.getFuncName()); - System.out.println("var idx: " + varFuncInfo.getVarIndex(info.getVarName())); + private StackVarRuntimeInfo getStackVar(StackVarInfo info) + { + FuncInfo varFuncInfo = info.getFuncInfo(); int tmpHandle = getRegister(); Register tmp = registerPool[tmpHandle]; - if (funcInfo != null && funcInfo != info.getFuncInfo()) { + if (funcInfo != null && funcInfo != info.getFuncInfo()) + { int varFunDepth = varFuncInfo.getDepth(); int callerDepth = funcInfo.getDepth(); int jumps = callerDepth - varFunDepth; - System.out.println("varFunDepth: " + varFunDepth); - System.out.println("callerDepth: " + callerDepth); - - backend.emitMV(tmp, FP, "Load FP"); FuncInfo curr = funcInfo; - for (int i = 0; i < jumps; i++) { + for (int i = 0; i < jumps; i++) + { backend.emitLW(tmp, tmp, curr.getParams().size()*wordSize, "Load static link from " + curr.getFuncName() + " to " + curr.getParentFuncInfo().getBaseName()); curr = curr.getParentFuncInfo(); } - - System.out.println("We are referencing non local variable"); - } else { - System.out.println("We are referencing local variable"); - backend.emitMV(tmp, FP, "We are referencing local variable"); - } - - int idx = varFuncInfo.getVarIndex(info.getVarName()); - int paramSize = varFuncInfo.getParams().size(); - int offset = getLocalVarLocationOffset(idx, paramSize); - return new StackVarRuntimeInfo(tmp, offset, tmpHandle); + } + else + { + backend.emitMV(tmp, FP, "Referencing local variable"+info.getVarName()); + } + int idx = varFuncInfo.getVarIndex(info.getVarName()); + int paramSize = varFuncInfo.getParams().size(); + int offset = getLocalVarLocationOffset(idx, paramSize); + return new StackVarRuntimeInfo(tmp, offset, tmpHandle); } @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()) - //{ - Register reg = node.value.dispatch(this); - if (reg == null) - reg = A0; - for(Expr target: node.targets) + Register reg = node.value.dispatch(this); + if (reg == null) + reg = A0; + for(Expr target: node.targets) + { + if(target instanceof Identifier) { - if(target instanceof Identifier) + Identifier targetID = (Identifier)target; + Object var = getVar(targetID); + if(var instanceof StackVarRuntimeInfo) { - Identifier targetID = (Identifier)target; - Object var = getVar(targetID); - if(var instanceof StackVarRuntimeInfo){ - StackVarRuntimeInfo rtinfo = (StackVarRuntimeInfo) var; - backend.emitSW(reg, rtinfo.sl, rtinfo.off ,"Store local variable: "+((Identifier)target).name); - rtinfo.free(); - } - else - backend.emitSW(reg, (Label)var, T0, "Store Global variable: " + ((Identifier)targetID).name); - } + StackVarRuntimeInfo rtinfo = (StackVarRuntimeInfo) var; + backend.emitSW(reg, rtinfo.sl, rtinfo.off ,"Store local variable: "+((Identifier)target).name); + rtinfo.free(); + } else + backend.emitSW(reg, (Label)var, T0, "Store Global variable: " + ((Identifier)targetID).name); + } + else + { + backend.emitSW(reg, Register.FP, -sp_off*wordSize, "Store value to b stored"); + incSp(1); + boolean old_lvalue = l_value; + l_value = true; + Register ret = target.dispatch(this); + l_value = old_lvalue; + sp_off--; + Register tmp = reg; + int tmpHandle = -1; + if(ret.equals(reg)) { - backend.emitSW(reg, Register.FP, -sp_off*wordSize, "Store value to b stored"); - incSp(1); - boolean old_lvalue = l_value; - l_value = true; - Register ret = target.dispatch(this); - l_value = old_lvalue; - sp_off--; - Register tmp = reg; - int tmpHandle = -1; - if(ret.equals(reg)) - { - tmpHandle = getRegister(); - tmp = registerPool[tmpHandle]; - } - backend.emitLW(tmp, Register.FP, -sp_off*wordSize, "Load value to b stored"); - backend.emitSW(tmp, ret, 0, "Set list element"); - if(tmpHandle >= 0) - freeRegister(tmpHandle); + tmpHandle = getRegister(); + tmp = registerPool[tmpHandle]; } + backend.emitLW(tmp, Register.FP, -sp_off*wordSize, "Load value to b stored"); + backend.emitSW(tmp, ret, 0, "Set list element"); + if(tmpHandle >= 0) + freeRegister(tmpHandle); } - //} + } return null; }