From 35544f1b6976849b67a06002d44b9dc8634e85cc Mon Sep 17 00:00:00 2001 From: bdemsky Date: Thu, 16 Feb 2006 22:19:31 +0000 Subject: [PATCH] Checking in more flattening code. --- Robust/src/IR/Flat/BuildFlat.java | 40 ++++++++++++++++----- Robust/src/IR/Tree/BlockExpressionNode.java | 4 +++ Robust/src/IR/Tree/IfStatementNode.java | 12 +++++++ Robust/src/IR/Tree/ReturnNode.java | 4 +++ Robust/src/Main/Main.java | 2 +- 5 files changed, 53 insertions(+), 9 deletions(-) diff --git a/Robust/src/IR/Flat/BuildFlat.java b/Robust/src/IR/Flat/BuildFlat.java index 257be353..e00b6092 100644 --- a/Robust/src/IR/Flat/BuildFlat.java +++ b/Robust/src/IR/Flat/BuildFlat.java @@ -9,7 +9,7 @@ public class BuildFlat { state=st; } - public void buildflat() { + public void buildFlat() { Iterator it=state.classset.iterator(); while(it.hasNext()) { ClassDescriptor cn=(ClassDescriptor)it.next(); @@ -49,10 +49,11 @@ public class BuildFlat { } private NodePair flattenBlockExpressionNode(BlockExpressionNode en) { - throw new Error(); + TempDescriptor tmp=TempDescriptor.tempFactory("neverused"); + return flattenExpressionNode(en.getExpression(),tmp); } - private NodePair flattenExpressionNode(ExpressionNode en) { + private NodePair flattenExpressionNode(ExpressionNode en, TempDescriptor out_temp) { throw new Error(); } @@ -61,14 +62,33 @@ public class BuildFlat { } private NodePair flattenIfStatementNode(IfStatementNode isn) { - throw new Error(); + TempDescriptor cond_temp=TempDescriptor.tempFactory("condition"); + NodePair cond=flattenExpressionNode(isn.getCondition(),cond_temp); + FlatCondBranch fcb=new FlatCondBranch(cond_temp); + NodePair true_np=flattenBlockNode(isn.getTrueBlock()); + NodePair false_np; + FlatNop nopend=new FlatNop(); + + if (isn.getFalseBlock()!=null) + false_np=flattenBlockNode(isn.getFalseBlock()); + else { + FlatNop nop=new FlatNop(); + false_np=new NodePair(nop,nop); + } + + cond.getEnd().addNext(fcb); + fcb.addTrueNext(true_np.getBegin()); + fcb.addFalseNext(false_np.getBegin()); + true_np.getEnd().addNext(nopend); + false_np.getEnd().addNext(nopend); + return new NodePair(cond.getBegin(), nopend); } 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 condition=flattenExpressionNode(ln.getCondition(),cond_temp); NodePair update=flattenBlockNode(ln.getUpdate()); NodePair body=flattenBlockNode(ln.getBody()); FlatNode begin=initializer.getBegin(); @@ -84,7 +104,7 @@ public class BuildFlat { return new NodePair(begin,nopend); } else if (ln.getType()==LoopNode.WHILELOOP) { TempDescriptor cond_temp=TempDescriptor.tempFactory("condition"); - NodePair condition=flattenExpressionNode(ln.getCondition()); + NodePair condition=flattenExpressionNode(ln.getCondition(),cond_temp); NodePair body=flattenBlockNode(ln.getBody()); FlatNode begin=condition.getBegin(); FlatCondBranch fcb=new FlatCondBranch(cond_temp); @@ -97,7 +117,7 @@ public class BuildFlat { return new NodePair(begin,nopend); } else if (ln.getType()==LoopNode.DOWHILELOOP) { TempDescriptor cond_temp=TempDescriptor.tempFactory("condition"); - NodePair condition=flattenExpressionNode(ln.getCondition()); + NodePair condition=flattenExpressionNode(ln.getCondition(),cond_temp); NodePair body=flattenBlockNode(ln.getBody()); FlatNode begin=body.getBegin(); FlatCondBranch fcb=new FlatCondBranch(cond_temp); @@ -112,7 +132,11 @@ public class BuildFlat { } private NodePair flattenReturnNode(IR.Tree.ReturnNode rntree) { - throw new Error(); + TempDescriptor retval=TempDescriptor.tempFactory("ret_value"); + NodePair cond=flattenExpressionNode(rntree.getReturnExpression(),retval); + ReturnNode rnflat=new IR.Flat.ReturnNode(retval); + cond.getEnd().addNext(rnflat); + return new NodePair(cond.getBegin(),rnflat); } private NodePair flattenSubBlockNode(SubBlockNode sbn) { diff --git a/Robust/src/IR/Tree/BlockExpressionNode.java b/Robust/src/IR/Tree/BlockExpressionNode.java index 751e134d..22a9ee00 100644 --- a/Robust/src/IR/Tree/BlockExpressionNode.java +++ b/Robust/src/IR/Tree/BlockExpressionNode.java @@ -10,6 +10,10 @@ public class BlockExpressionNode extends BlockStatementNode { return en.printNode(indent); } + public ExpressionNode getExpression() { + return en; + } + public int kind() { return Kind.BlockExpressionNode; } diff --git a/Robust/src/IR/Tree/IfStatementNode.java b/Robust/src/IR/Tree/IfStatementNode.java index 419f0de3..c24a7039 100644 --- a/Robust/src/IR/Tree/IfStatementNode.java +++ b/Robust/src/IR/Tree/IfStatementNode.java @@ -10,6 +10,18 @@ public class IfStatementNode extends BlockStatementNode { this.true_st=true_st; this.else_st=else_st; } + + public ExpressionNode getCondition() { + return cond; + } + + public BlockNode getTrueBlock() { + return true_st; + } + + public BlockNode getFalseBlock() { + return else_st; + } public String printNode(int indent) { if (else_st==null) diff --git a/Robust/src/IR/Tree/ReturnNode.java b/Robust/src/IR/Tree/ReturnNode.java index 27dfd32f..780a4cbd 100644 --- a/Robust/src/IR/Tree/ReturnNode.java +++ b/Robust/src/IR/Tree/ReturnNode.java @@ -11,6 +11,10 @@ public class ReturnNode extends BlockStatementNode { this.en=en; } + public ExpressionNode getReturnExpression() { + return en; + } + public String printNode(int indent) { if (en==null) return "return"; diff --git a/Robust/src/Main/Main.java b/Robust/src/Main/Main.java index 027781da..8eebe0a1 100644 --- a/Robust/src/Main/Main.java +++ b/Robust/src/Main/Main.java @@ -25,7 +25,7 @@ public class Main { bir.buildtree(); BuildFlat bf=new BuildFlat(state); - bf.buildflat(); + bf.buildFlat(); System.exit(l.numErrors()); } -- 2.34.1