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