Skip to content
Snippets Groups Projects
Verified Commit 6bb094b5 authored by Recolic Keghart's avatar Recolic Keghart
Browse files

str literal passed

parent f6517fdb
No related branches found
No related tags found
No related merge requests found
Pipeline #235 passed with warnings with stages
in 4 minutes and 38 seconds
package chocopy.pa3; package chocopy.pa3;
import java.util.ArrayList; import java.nio.charset.Charset;
import java.util.LinkedHashMap; import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.*;
import java.util.Map;
import chocopy.common.analysis.SymbolTable; import chocopy.common.analysis.SymbolTable;
import chocopy.common.analysis.AbstractNodeAnalyzer; import chocopy.common.analysis.AbstractNodeAnalyzer;
...@@ -90,9 +89,39 @@ public class CodeGenImpl extends CodeGenBase { ...@@ -90,9 +89,39 @@ public class CodeGenImpl extends CodeGenBase {
emitPush(tmpReg, null); emitPush(tmpReg, null);
backend.emitLI(tmpReg, 4, "OBJECT HEAD - SIZE = 3+1"); backend.emitLI(tmpReg, 4, "OBJECT HEAD - SIZE = 3+1");
emitPush(tmpReg, null); emitPush(tmpReg, null);
backend.emitLI(tmpReg, 2, "OBJECT HEAD - TYPE = INT"); backend.emitLI(tmpReg, 2, "OBJECT HEAD - TYPE = BOOL");
emitPush(tmpReg, null); 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 { ...@@ -385,7 +414,9 @@ public class CodeGenImpl extends CodeGenBase {
@Override @Override
public RiscVBackend.Register analyze(StringLiteral node) { 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;
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment