From e19717a180287956a70c4fbf150545b81bfd6f69 Mon Sep 17 00:00:00 2001 From: bill Date: Fri, 30 Apr 2021 17:22:51 +0800 Subject: [PATCH] bug fixes --- src/main/java/chocopy/pa3/CodeGenImpl.java | 29 ++++++++++++---------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/chocopy/pa3/CodeGenImpl.java b/src/main/java/chocopy/pa3/CodeGenImpl.java index ac0a67b..a230342 100644 --- a/src/main/java/chocopy/pa3/CodeGenImpl.java +++ b/src/main/java/chocopy/pa3/CodeGenImpl.java @@ -2,12 +2,12 @@ package chocopy.pa3; import chocopy.common.analysis.AbstractNodeAnalyzer; import chocopy.common.analysis.SymbolTable; -import chocopy.common.analysis.types.FuncType; -import chocopy.common.analysis.types.Type; import chocopy.common.astnodes.*; import chocopy.common.codegen.*; +import java.util.HashMap; import java.util.List; +import java.util.Map; import chocopy.common.codegen.RiscVBackend.Register; import static chocopy.common.codegen.RiscVBackend.Register.*; @@ -128,7 +128,10 @@ public class CodeGenImpl extends CodeGenBase { private final FuncInfo funcInfo; private final String size_label; private int sp_off, max_sp; - + protected Label elseBlock; + /** Variable to store offset from frame pointer to identify next + * empty space on stack frame to store variable*/ + /** An analyzer for the function described by FUNCINFO0, which is null for the top level. */ StmtAnalyzer(FuncInfo funcInfo0) { funcInfo = funcInfo0; @@ -143,7 +146,10 @@ public class CodeGenImpl extends CodeGenBase { } epilogue = generateLocalLabel(); } - + private void incSp(int i){ + sp_off+=i+1; + max_sp = max_sp >= sp_off?max_sp:sp_off; + } public Register analyze(AssignStmt node) { return null; } @@ -177,16 +183,15 @@ public class CodeGenImpl extends CodeGenBase { String.format("Load pointer to prototype of: %s", cls.getClassName())); backend.emitJAL(objectAllocLabel, "Allocate new object in A0"); backend.emitSW(A0, FP, -sp_off*wordSize, String.format("Push on stack slot %d", sp_off)); - if(sp_off>max_sp) - max_sp = sp_off; - sp_off++; + incSp(0); + backend.emitSW(A0, FP, -sp_off*wordSize, "Push argument 0 from last."); backend.emitADDI(SP, FP, sp_off, "Set SP to last argument."); backend.emitLW(A1, A0, getDispatchTableOffset(), "Load address of object's dispatch table"); backend.emitLW(A1, A1, getMethodOffset(cls, "__init__"), String.format("Load address of method: %s.__init__", cls.getClassName())); backend.emitJALR(A1, String.format("Invoke method: %s.__init", cls.getClassName())); backend.emitADDI(SP, FP, "-"+size_label, "Set SP to stack frame top."); - sp_off--; + -- sp_off; backend.emitLW(A0, FP, -sp_off*wordSize, String.format("Pop stack slot %d", sp_off)); } else { //func call @@ -248,9 +253,7 @@ public class CodeGenImpl extends CodeGenBase { backend.emitBNEZ(obj, label, "Ensure not None"); backend.emitJ(errorNone, "Go to error handler"); backend.emitLocalLabel(label, "Not None"); - if(sp_off>max_sp) - max_sp = sp_off; - sp_off += (n_args+1)*wordSize; + incSp(n_args+1); backend.emitSW(obj, FP, (n_args - sp_off) *wordSize, String.format("Push argument %d from last.", n_args)); for (int i = 0; i < n_args; ++i) @@ -266,8 +269,8 @@ public class CodeGenImpl extends CodeGenBase { backend.emitADDI(SP, FP, -sp_off * wordSize, "Set SP to last argument."); backend.emitJALR(A1, String.format("Invoke method: %s.%s", objectClass.getClassName(), node.method.member.name)); backend.emitInsn(String.format("addi sp, fp, -%s", size_label), "Set SP to stack frame top."); - sp_off -= (n_args+1)*wordSize; - + sp_off -= n_args+1; + return A0; }