diff options
author | bd-912 <bdunahu@colostate.edu> | 2024-04-24 17:12:52 -0600 |
---|---|---|
committer | bd-912 <bdunahu@colostate.edu> | 2024-04-24 17:12:52 -0600 |
commit | 5fb49263868a96ce42fdf40202ce0ff2fc507dd8 (patch) | |
tree | 6abb0f8a6ac0ee8ebaa662f66275fd96696dc6a8 /boil/library/BoilVisitor.java | |
parent | 15569878d1e95aa0d8fcd61a84aba6f0c33efa22 (diff) |
Partial support for array accesses, start fixing MemWrite
Diffstat (limited to 'boil/library/BoilVisitor.java')
-rw-r--r-- | boil/library/BoilVisitor.java | 89 |
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(), |