From: bdemsky Date: Thu, 16 Feb 2006 09:14:29 +0000 (+0000) Subject: Bug fixes X-Git-Tag: preEdgeChange~974 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=4750bbf756656a9b033e3cd7e7fcf0e02aed2e7e;p=IRC.git Bug fixes --- diff --git a/Robust/src/IR/Flat/BuildFlat.java b/Robust/src/IR/Flat/BuildFlat.java index 8946b7f9..257be353 100644 --- a/Robust/src/IR/Flat/BuildFlat.java +++ b/Robust/src/IR/Flat/BuildFlat.java @@ -48,34 +48,81 @@ public class BuildFlat { return new NodePair(begin,end); } - private NodePair flattenExpressionNode(ExpressionNode en) { + private NodePair flattenBlockExpressionNode(BlockExpressionNode en) { + throw new Error(); + } + private NodePair flattenExpressionNode(ExpressionNode en) { + throw new Error(); } private NodePair flattenDeclarationNode(DeclarationNode dn) { - + throw new Error(); } private NodePair flattenIfStatementNode(IfStatementNode isn) { - + throw new Error(); } private NodePair flattenLoopNode(LoopNode ln) { + if (ln.getType()==LoopNode.FORLOOP) { + NodePair initializer=flattenBlockNode(ln.getInitializer()); + TempDescriptor cond_temp=TempDescriptor.tempFactory("condition"); + NodePair condition=flattenExpressionNode(ln.getCondition()); + NodePair update=flattenBlockNode(ln.getUpdate()); + NodePair body=flattenBlockNode(ln.getBody()); + FlatNode begin=initializer.getBegin(); + FlatCondBranch fcb=new FlatCondBranch(cond_temp); + FlatNop nopend=new FlatNop(); + initializer.getEnd().addNext(condition.getBegin()); + body.getEnd().addNext(update.getBegin()); + update.getEnd().addNext(condition.getBegin()); + condition.getEnd().addNext(fcb); + fcb.addFalseNext(nopend); + fcb.addTrueNext(body.getBegin()); + return new NodePair(begin,nopend); + } else if (ln.getType()==LoopNode.WHILELOOP) { + TempDescriptor cond_temp=TempDescriptor.tempFactory("condition"); + NodePair condition=flattenExpressionNode(ln.getCondition()); + NodePair body=flattenBlockNode(ln.getBody()); + FlatNode begin=condition.getBegin(); + FlatCondBranch fcb=new FlatCondBranch(cond_temp); + FlatNop nopend=new FlatNop(); + + body.getEnd().addNext(condition.getBegin()); + condition.getEnd().addNext(fcb); + fcb.addFalseNext(nopend); + fcb.addTrueNext(body.getBegin()); + return new NodePair(begin,nopend); + } else if (ln.getType()==LoopNode.DOWHILELOOP) { + TempDescriptor cond_temp=TempDescriptor.tempFactory("condition"); + NodePair condition=flattenExpressionNode(ln.getCondition()); + NodePair body=flattenBlockNode(ln.getBody()); + FlatNode begin=body.getBegin(); + FlatCondBranch fcb=new FlatCondBranch(cond_temp); + FlatNop nopend=new FlatNop(); + + body.getEnd().addNext(condition.getBegin()); + condition.getEnd().addNext(fcb); + fcb.addFalseNext(nopend); + fcb.addTrueNext(body.getBegin()); + return new NodePair(begin,nopend); + } else throw new Error(); } - private NodePair flattenReturnNode(ReturnNode rn) { - + private NodePair flattenReturnNode(IR.Tree.ReturnNode rntree) { + throw new Error(); } private NodePair flattenSubBlockNode(SubBlockNode sbn) { - + return flattenBlockNode(sbn.getBlockNode()); } private NodePair flattenBlockStatementNode(BlockStatementNode bsn) { switch(bsn.kind()) { case Kind.BlockExpressionNode: - return flattenExpressionNode((ExpressionNode)bsn); + return flattenBlockExpressionNode((BlockExpressionNode)bsn); case Kind.DeclarationNode: return flattenDeclarationNode((DeclarationNode)bsn); @@ -87,7 +134,7 @@ public class BuildFlat { return flattenLoopNode((LoopNode)bsn); case Kind.ReturnNode: - return flattenReturnNode((ReturnNode)bsn); + return flattenReturnNode((IR.Tree.ReturnNode)bsn); case Kind.SubBlockNode: return flattenSubBlockNode((SubBlockNode)bsn); diff --git a/Robust/src/IR/Flat/ReturnNode.java b/Robust/src/IR/Flat/ReturnNode.java index 4ee9adbb..ba11f761 100644 --- a/Robust/src/IR/Flat/ReturnNode.java +++ b/Robust/src/IR/Flat/ReturnNode.java @@ -1,8 +1,14 @@ +package IR.Flat; + public class ReturnNode extends FlatNode { - public ReturnNode() { - } + TempDescriptor tempdesc; - + public ReturnNode(TempDescriptor td) { + this.tempdesc=td; + } + public String toString() { + return "return "+tempdesc; + } } diff --git a/Robust/src/IR/Tree/BlockExpressionNode.java b/Robust/src/IR/Tree/BlockExpressionNode.java index 9cfd9d29..751e134d 100644 --- a/Robust/src/IR/Tree/BlockExpressionNode.java +++ b/Robust/src/IR/Tree/BlockExpressionNode.java @@ -1,6 +1,6 @@ package IR.Tree; -class BlockExpressionNode extends BlockStatementNode { +public class BlockExpressionNode extends BlockStatementNode { ExpressionNode en; public BlockExpressionNode(ExpressionNode e) { this.en=e; diff --git a/Robust/src/IR/Tree/DeclarationNode.java b/Robust/src/IR/Tree/DeclarationNode.java index ec093323..d8825f3a 100644 --- a/Robust/src/IR/Tree/DeclarationNode.java +++ b/Robust/src/IR/Tree/DeclarationNode.java @@ -1,7 +1,7 @@ package IR.Tree; import IR.VarDescriptor; -class DeclarationNode extends BlockStatementNode { +public class DeclarationNode extends BlockStatementNode { VarDescriptor vd; public DeclarationNode(VarDescriptor var) { vd=var; diff --git a/Robust/src/IR/Tree/IfStatementNode.java b/Robust/src/IR/Tree/IfStatementNode.java index 2077409b..419f0de3 100644 --- a/Robust/src/IR/Tree/IfStatementNode.java +++ b/Robust/src/IR/Tree/IfStatementNode.java @@ -1,6 +1,6 @@ package IR.Tree; -class IfStatementNode extends BlockStatementNode { +public class IfStatementNode extends BlockStatementNode { ExpressionNode cond; BlockNode true_st; BlockNode else_st; diff --git a/Robust/src/IR/Tree/LoopNode.java b/Robust/src/IR/Tree/LoopNode.java index f387d6c0..d604b1aa 100644 --- a/Robust/src/IR/Tree/LoopNode.java +++ b/Robust/src/IR/Tree/LoopNode.java @@ -1,6 +1,6 @@ package IR.Tree; -class LoopNode extends BlockStatementNode { +public class LoopNode extends BlockStatementNode { BlockNode initializer; ExpressionNode condition; BlockNode update; @@ -26,6 +26,22 @@ class LoopNode extends BlockStatementNode { this.type=type; } + public BlockNode getInitializer() { + return initializer; + } + + public ExpressionNode getCondition() { + return condition; + } + + public BlockNode getUpdate() { + return update; + } + + public BlockNode getBody() { + return body; + } + public String printNode(int indent) { if (type==FORLOOP) { return "for("+initializer.printNode(0)+";"+condition.printNode(0)+ @@ -38,6 +54,10 @@ class LoopNode extends BlockStatementNode { } else throw new Error(); } + public int getType() { + return type; + } + public int kind() { return Kind.LoopNode; } diff --git a/Robust/src/IR/Tree/ReturnNode.java b/Robust/src/IR/Tree/ReturnNode.java index aef5a0d3..27dfd32f 100644 --- a/Robust/src/IR/Tree/ReturnNode.java +++ b/Robust/src/IR/Tree/ReturnNode.java @@ -1,6 +1,6 @@ package IR.Tree; -class ReturnNode extends BlockStatementNode { +public class ReturnNode extends BlockStatementNode { ExpressionNode en; public ReturnNode() { diff --git a/Robust/src/IR/Tree/SubBlockNode.java b/Robust/src/IR/Tree/SubBlockNode.java index f2ff9358..8ab42ef4 100644 --- a/Robust/src/IR/Tree/SubBlockNode.java +++ b/Robust/src/IR/Tree/SubBlockNode.java @@ -1,6 +1,6 @@ package IR.Tree; -class SubBlockNode extends BlockStatementNode { +public class SubBlockNode extends BlockStatementNode { BlockNode bn; public SubBlockNode(BlockNode bn) { this.bn=bn; @@ -9,6 +9,11 @@ class SubBlockNode extends BlockStatementNode { public String printNode(int indent) { return bn.printNode(indent); } + + public BlockNode getBlockNode() { + return bn; + } + public int kind() { return Kind.SubBlockNode; }