summaryrefslogtreecommitdiff
path: root/boil/library/BoilVisitor.java
diff options
context:
space:
mode:
authorbd-912 <bdunahu@colostate.edu>2024-04-24 17:12:52 -0600
committerbd-912 <bdunahu@colostate.edu>2024-04-24 17:12:52 -0600
commit5fb49263868a96ce42fdf40202ce0ff2fc507dd8 (patch)
tree6abb0f8a6ac0ee8ebaa662f66275fd96696dc6a8 /boil/library/BoilVisitor.java
parent15569878d1e95aa0d8fcd61a84aba6f0c33efa22 (diff)
Partial support for array accesses, start fixing MemWrite
Diffstat (limited to 'boil/library/BoilVisitor.java')
-rw-r--r--boil/library/BoilVisitor.java89
1 files changed, 53 insertions, 36 deletions
diff --git a/boil/library/BoilVisitor.java b/boil/library/BoilVisitor.java
index 83b1fd3..2542cc0 100644
--- a/boil/library/BoilVisitor.java
+++ b/boil/library/BoilVisitor.java
@@ -105,6 +105,8 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
n.f0.accept(this, argu);
n.f1.accept(this, argu);
n.f2.accept(this, argu);
+
+ this.addVapor(String.format("func AllocArray(size)\n bytes = MulS(size 4)\n bytes = Add(bytes 4)\n v = HeapAllocZ(bytes)\n [v] = size\n ret v\n"));
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<- %s with %s",
n.getClass().getSimpleName(),
@@ -294,20 +296,6 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
String para = n.f4.accept(this, argu);
this.addVapor(String.format("%s)\n", para));
- // spill out all class attributes, if they're not used, who cares
- String selfID = this.getUniqueID();
- this.addVapor(String.format(" %s = this\n",
- this.tf.alias(selfID)));
- ClassInstance parent = this.symt.getMethod(id).getClassInstance();
- int attr_index = parent.getMethods().size() * 4;
- for (TypeInstance attr : parent.getLocals()) {
- this.addVapor(String.format(" %s = [%s+%d]\n",
- this.tf.alias(attr.getName()),
- this.tf.alias(selfID),
- attr_index));
- attr_index += 4;
- }
-
n.f7.accept(this, argu);
n.f8.accept(this, argu);
String ret = n.f10.accept(this, argu);
@@ -492,12 +480,9 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
*/
public String visit(AssignmentStatement n, String argu) {
String _ret=null;
- String id = n.f0.f0.tokenImage;
- MinimalLogger.info(String.format("-> %s (%s)",
- n.getClass().getSimpleName(),
- id));
+ MinimalLogger.info(String.format("-> %s",
+ n.getClass().getSimpleName()));
///////////////////////////////////////////////////////////////
- TypeInstance t = this.symt.getType(id);
String lhs = n.f0.accept(this, argu);
String expr = n.f2.accept(this, argu);
@@ -511,9 +496,8 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
lhs,
expr));
///////////////////////////////////////////////////////////////
- MinimalLogger.info(String.format("<- %s (%s)",
- n.getClass().getSimpleName(),
- id));
+ MinimalLogger.info(String.format("<- %s",
+ n.getClass().getSimpleName()));
return _ret;
}
@@ -531,9 +515,14 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
MinimalLogger.info(String.format("-> %s",
n.getClass().getSimpleName()));
///////////////////////////////////////////////////////////////
- n.f0.accept(this, argu);
- n.f2.accept(this, argu);
- n.f5.accept(this, argu);
+ String lhs = n.f0.accept(this, argu);
+ int index = Integer.parseInt(n.f2.accept(this, argu)) * 4;
+ String expr = n.f5.accept(this, argu);
+
+ this.addVapor(String.format(" [%s+%d] = %s\n",
+ lhs,
+ index,
+ expr));
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<- %s with %s",
n.getClass().getSimpleName(),
@@ -792,12 +781,15 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
* f3 -> "]"
*/
public String visit(ArrayLookup n, String argu) {
- String _ret=null;
+ String _ret="";
MinimalLogger.info(String.format("-> %s",
n.getClass().getSimpleName()));
///////////////////////////////////////////////////////////////
- n.f0.accept(this, argu);
- n.f2.accept(this, argu);
+ String arr = n.f0.accept(this, argu);
+ int index = Integer.parseInt(n.f2.accept(this, argu)) * 4;
+ _ret += String.format("[%s+%d]",
+ arr,
+ index);
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<- %s with %s",
n.getClass().getSimpleName(),
@@ -811,11 +803,13 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
* f2 -> "length"
*/
public String visit(ArrayLength n, String argu) {
- String _ret=null;
+ String _ret="";
MinimalLogger.info(String.format("-> %s",
n.getClass().getSimpleName()));
///////////////////////////////////////////////////////////////
- n.f0.accept(this, argu);
+ String arr = n.f0.accept(this, argu);
+ _ret += String.format("[%s+0]",
+ arr);
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<- %s with %s",
n.getClass().getSimpleName(),
@@ -899,6 +893,8 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
0);
MinimalLogger.info("Calculating method index to call...");
+ MinimalLogger.severe("t: " + t);
+ MinimalLogger.severe("t.getClassInstance() " + t.getClassInstance());
int mtdIndex = t.getClassInstance().getMethods()
.indexOf(this.symt.getMethod(mtd)) * 4;
@@ -1043,13 +1039,28 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
*/
public String visit(Identifier n, String argu) {
String _ret="";
- MinimalLogger.info(String.format("-> %s",
- n.getClass().getSimpleName()));
+ String id = n.f0.tokenImage;
+ MinimalLogger.info(String.format("-> %s (%s)",
+ n.getClass().getSimpleName(),
+ id));
///////////////////////////////////////////////////////////////
- _ret += this.tf.alias(n.f0.tokenImage);
+ ClassInstance cur = this.symt.getClass(this.symt.getActive(TypeEnum.classname));
+ TypeInstance t = this.symt.getType(id);
+ if (cur.getLocals().contains(t)) {
+ MinimalLogger.info(String.format("Getting the index for local variable %s",
+ id));
+ // calculate the attr index!
+ int attr_index = (cur.getMethods().size() * 4);
+ attr_index += cur.getLocals().indexOf(t);
+ _ret += String.format("[this+%d]",
+ attr_index);
+ } else {
+ _ret += this.tf.alias(id);
+ }
///////////////////////////////////////////////////////////////
- MinimalLogger.info(String.format("<- %s with %s",
+ MinimalLogger.info(String.format("<- %s (%s) with %s",
n.getClass().getSimpleName(),
+ id,
_ret));
return _ret;
}
@@ -1081,11 +1092,17 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
* f4 -> "]"
*/
public String visit(ArrayAllocationExpression n, String argu) {
- String _ret=null;
+ String _ret="";
MinimalLogger.info(String.format("-> %s",
n.getClass().getSimpleName()));
///////////////////////////////////////////////////////////////
- n.f3.accept(this, argu);
+ String len = n.f3.accept(this, argu);
+ String aAllocID = this.tf.alias(this.getUniqueID());
+ this.addVapor(String.format(" %s = call :AllocArray(%s)\n",
+ aAllocID,
+ len));
+
+ _ret += aAllocID;
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<- %s with %s",
n.getClass().getSimpleName(),