From 2948129dc64a5063cec05bcc6aa3545b2db48b75 Mon Sep 17 00:00:00 2001
From: Shivane Sabharwal <shivane.sabharwal98@gmail.com>
Date: Sat, 27 Apr 2019 23:49:10 -0700
Subject: [PATCH] add allocProtoType

---
 src/main/java/chocopy/pa3/CodeGenImpl.java | 44 ++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/src/main/java/chocopy/pa3/CodeGenImpl.java b/src/main/java/chocopy/pa3/CodeGenImpl.java
index f70984c..3334f8d 100644
--- a/src/main/java/chocopy/pa3/CodeGenImpl.java
+++ b/src/main/java/chocopy/pa3/CodeGenImpl.java
@@ -175,6 +175,7 @@ public class CodeGenImpl extends CodeGenBase {
             backend.emitMV(tmpReg, SP, "Return STR OBJ address.");
         }
 
+
     }
 
     // Every function needs a register manager.
@@ -406,6 +407,24 @@ public class CodeGenImpl extends CodeGenBase {
 
         private registerManager regMgr = new registerManager();
 
+        /* This method allocates object on the heap using the prototype
+        * Return register containing address */
+        private RiscVBackend.Register allocPrototype(SymbolType typ, RiscVBackend.Register objReg) {
+            RiscVBackend.Register storeAddr = regMgr.borrowOneTmp();
+            // Convention: if typ is INT_TYPE then objReg contains the literal value, not a pointer.
+            if (typ.equals(SymbolType.INT_TYPE)) {
+                backend.emitLA(A0, intClass.getPrototypeLabel(), "Load prototype address");
+                backend.emitJAL(objectAllocLabel, "Allocate int");
+                backend.emitSW(objReg, A0, 3 * backend.getWordSize(), "Set __int__ value");
+                backend.emitMV(storeAddr, A0, "Store address of new allocation in register");
+                return storeAddr;
+            } else if (typ.equals(SymbolType.STR_TYPE)) {
+                backend.emitLA(A0, strClass.getPrototypeLabel(), "Load prototype address");
+                backend.emitJAL(objectAllocLabel, "Allocate string");
+            }
+            return null;
+        }
+
         /** An analyzer for the function described by FUNCINFO0, which is null
          *  for the top level. */
         StmtAnalyzer(FuncInfo funcInfo0) {
@@ -533,6 +552,31 @@ public class CodeGenImpl extends CodeGenBase {
             return null;
         }
 
+        @Override
+        public RiscVBackend.Register analyze(UnaryExpr node) {
+            RiscVBackend.Register operandReg = node.operand.dispatch(this);
+
+            switch (node.operator) {
+                case "-":
+
+                    RiscVBackend.Register savedOpAddr = regMgr.borrowOneTmp();
+                    RiscVBackend.Register savedResult = regMgr.borrowOnePersist();
+                    backend.emitMV(savedOpAddr, operandReg, "Save operand addr in register");
+                    if (node.operand instanceof IntegerLiteral) {
+                        backend.emitLW(operandReg, operandReg, 3 * backend.getWordSize(), "Load operand value");
+                    } else if (node.operand instanceof Identifier) {
+                        backend.emitLW(operandReg, operandReg, 0, "Load operand value");
+                    }
+                    backend.emitSUB(savedResult, ZERO, operandReg, "Unary Operator-::INT save in same operand reg");
+                    RiscVBackend.Register heapObject = allocPrototype(SymbolType.INT_TYPE, savedResult);
+                    regMgr.returnOne(operandReg);
+                    regMgr.returnOne(savedOpAddr);
+                    regMgr.returnOne(savedResult);
+                    return heapObject;
+
+            }
+            return null;
+        }
         @Override
         public RiscVBackend.Register analyze(Identifier node) {
             SymbolInfo id = sym.get(node.name);
-- 
GitLab