From 6bb094b58c4302834c3006c4761e2875b94b3b9f Mon Sep 17 00:00:00 2001
From: Recolic Keghart <root@recolic.net>
Date: Thu, 25 Apr 2019 19:19:02 -0700
Subject: [PATCH] str literal passed

---
 src/main/java/chocopy/pa3/CodeGenImpl.java | 45 ++++++++++++++++++----
 1 file changed, 38 insertions(+), 7 deletions(-)

diff --git a/src/main/java/chocopy/pa3/CodeGenImpl.java b/src/main/java/chocopy/pa3/CodeGenImpl.java
index e08992c..f3888a8 100644
--- a/src/main/java/chocopy/pa3/CodeGenImpl.java
+++ b/src/main/java/chocopy/pa3/CodeGenImpl.java
@@ -1,9 +1,8 @@
 package chocopy.pa3;
 
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
 
 import chocopy.common.analysis.SymbolTable;
 import chocopy.common.analysis.AbstractNodeAnalyzer;
@@ -90,9 +89,39 @@ public class CodeGenImpl extends CodeGenBase {
             emitPush(tmpReg, null);
             backend.emitLI(tmpReg, 4, "OBJECT HEAD - SIZE = 3+1");
             emitPush(tmpReg, null);
-            backend.emitLI(tmpReg, 2, "OBJECT HEAD - TYPE = INT");
+            backend.emitLI(tmpReg, 2, "OBJECT HEAD - TYPE = BOOL");
             emitPush(tmpReg, null);
-            backend.emitADDI(tmpReg, SP, backend.getWordSize(), "Return INT address.");
+            backend.emitADDI(tmpReg, SP, backend.getWordSize(), "Return BOOL address.");
+        }
+        public void emitPushStrVal(RiscVBackend.Register tmpReg, String val, String comment) {
+            emitNoop(comment);
+            byte [] bytes = val.getBytes(StandardCharsets.US_ASCII);
+            int dataLen = bytes.length / backend.getWordSize() + 1; // Equals to ceil((len+1) DIVIDE WORD_SIZE)
+
+            for(int cter = 0; cter < dataLen; ++cter) {
+                int myRangeBegin = (dataLen-cter-1) * backend.getWordSize();
+                int myRangeEnd = Math.min(myRangeBegin + backend.getWordSize(), bytes.length);
+                int curr = 0;
+                assert backend.getWordSize() == 4; // curr should be 4 byte = int
+                String debug_pushed_str = "";
+                for(int shift = 0; shift < myRangeEnd - myRangeBegin; ++shift) {
+                    curr += bytes[myRangeBegin + shift] << (shift * 8);
+                    debug_pushed_str += Integer.toString(bytes[myRangeBegin + shift]) + " ";
+                }
+
+                backend.emitLI(tmpReg, curr, "STR VAL - " + debug_pushed_str);
+                emitPush(tmpReg, "STR VAL - PUSH A BLOCK");
+            }
+
+            backend.emitLI(tmpReg, bytes.length, "STR ATTR - __len__");
+            emitPush(tmpReg, null);
+            backend.emitLI(tmpReg, 0, "OBJECT HEAD - DISPATCH TBL = NULL");
+            emitPush(tmpReg, null);
+            backend.emitLI(tmpReg, 3 + dataLen + 1, "OBJECT HEAD - SIZE");
+            emitPush(tmpReg, null);
+            backend.emitLI(tmpReg, 3, "OBJECT HEAD - TYPE = STR");
+            emitPush(tmpReg, null);
+            backend.emitADDI(tmpReg, SP, backend.getWordSize(), "Return STR OBJ address.");
         }
 
     }
@@ -385,7 +414,9 @@ public class CodeGenImpl extends CodeGenBase {
 
         @Override
         public RiscVBackend.Register analyze(StringLiteral node) {
-            int strLen = node.value.length();
+            RiscVBackend.Register tmpReg = regMgr.borrowOne();
+            betterBackend.emitPushStrVal(tmpReg, node.value, "push string literal.");
+            return tmpReg;
         }
     }
 
-- 
GitLab