From 9f20266904646307af0de3b9c326ea1f3156ab66 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Wed, 5 Apr 2006 22:09:37 +0000 Subject: [PATCH] Updates --- Robust/src/IR/Flat/BuildCode.java | 30 +++++++++++++++++++++++++-- Robust/src/IR/Flat/BuildFlat.java | 18 ++++++++++++---- Robust/src/IR/Tree/SemanticCheck.java | 6 +++++- Robust/src/Main/Main.java | 5 +---- Robust/src/Runtime/runtime.h | 2 ++ 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 30b61291..5842dad5 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -88,6 +88,21 @@ public class BuildCode { generateFlatMethod(fm,outmethod); } } + if (state.main!=null) { + outmethod.println("int main(int argc, const char *argv[]) {"); + ClassDescriptor cd=typeutil.getClass(state.main); + Set mainset=cd.getMethodTable().getSet("main"); + for(Iterator mainit=mainset.iterator();mainit.hasNext();) { + MethodDescriptor md=(MethodDescriptor)mainit.next(); + if (md.numParameters()!=0) + continue; + if (!md.getModifiers().isStatic()) + throw new Error("Error: Non static main"); + outmethod.println(" "+cd.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"();"); + break; + } + outmethod.println("}"); + } outmethod.close(); } @@ -345,6 +360,9 @@ public class BuildCode { if (current_node.numNext()==0) { output.print(" "); generateFlatNode(fm, current_node, output); + if (current_node.kind()!=FKind.FlatReturnNode) { + output.println(" return;"); + } current_node=null; } else if(current_node.numNext()==1) { output.print(" "); @@ -571,12 +589,20 @@ public class BuildCode { output.println(generateTemp(fm, fln.getDst())+"=0;"); else if (fln.getType().getSymbol().equals(TypeUtil.StringClass)) output.println(generateTemp(fm, fln.getDst())+"=newstring(\""+FlatLiteralNode.escapeString((String)fln.getValue())+"\");"); - else + else if (fln.getType().isBoolean()) { + if (((Boolean)fln.getValue()).booleanValue()) + output.println(generateTemp(fm, fln.getDst())+"=1;"); + else + output.println(generateTemp(fm, fln.getDst())+"=0;"); + } else output.println(generateTemp(fm, fln.getDst())+"="+fln.getValue()+";"); } private void generateFlatReturnNode(FlatMethod fm, FlatReturnNode frn, PrintWriter output) { - output.println("return "+generateTemp(fm, frn.getReturnTemp())+";"); + if (frn.getReturnTemp()!=null) + output.println("return "+generateTemp(fm, frn.getReturnTemp())+";"); + else + output.println("return;"); } private void generateFlatCondBranch(FlatMethod fm, FlatCondBranch fcb, String label, PrintWriter output) { diff --git a/Robust/src/IR/Flat/BuildFlat.java b/Robust/src/IR/Flat/BuildFlat.java index 6c58090e..b34ea9af 100644 --- a/Robust/src/IR/Flat/BuildFlat.java +++ b/Robust/src/IR/Flat/BuildFlat.java @@ -406,11 +406,21 @@ public class BuildFlat { } private NodePair flattenReturnNode(ReturnNode rntree) { - TempDescriptor retval=TempDescriptor.tempFactory("ret_value", rntree.getReturnExpression().getType()); - NodePair cond=flattenExpressionNode(rntree.getReturnExpression(),retval); + TempDescriptor retval=null; + NodePair cond=null; + if (rntree.getReturnExpression()!=null) { + retval=TempDescriptor.tempFactory("ret_value", rntree.getReturnExpression().getType()); + cond=flattenExpressionNode(rntree.getReturnExpression(),retval); + } + FlatReturnNode rnflat=new FlatReturnNode(retval); - cond.getEnd().addNext(rnflat); - return new NodePair(cond.getBegin(),rnflat); + + if (cond!=null) { + cond.getEnd().addNext(rnflat); + return new NodePair(cond.getBegin(),rnflat); + } else + return new NodePair(rnflat,rnflat); + } private NodePair flattenSubBlockNode(SubBlockNode sbn) { diff --git a/Robust/src/IR/Tree/SemanticCheck.java b/Robust/src/IR/Tree/SemanticCheck.java index 33889fdb..680603c0 100644 --- a/Robust/src/IR/Tree/SemanticCheck.java +++ b/Robust/src/IR/Tree/SemanticCheck.java @@ -153,7 +153,11 @@ public class SemanticCheck { } void checkReturnNode(MethodDescriptor md, SymbolTable nametable, ReturnNode rn) { - checkExpressionNode(md, nametable, rn.getReturnExpression(), md.getReturnType()); + if (rn.getReturnExpression()!=null) + checkExpressionNode(md, nametable, rn.getReturnExpression(), md.getReturnType()); + else + if (md.getReturnType()!=null&&!md.getReturnType().isVoid()) + throw new Error("Need to return something for "+md); } void checkIfStatementNode(MethodDescriptor md, SymbolTable nametable, IfStatementNode isn) { diff --git a/Robust/src/Main/Main.java b/Robust/src/Main/Main.java index dea270a0..cc28e001 100644 --- a/Robust/src/Main/Main.java +++ b/Robust/src/Main/Main.java @@ -14,10 +14,6 @@ import IR.TypeUtil; public class Main { public static void main(String args[]) throws Exception { String ClassLibraryPrefix="./ClassLibrary/"; - if (args.length<1) { - System.out.println("Must input source file"); - System.exit(-1); - } State state=new State(); for(int i=0;i #include + + void * allocate_new(int type); #endif -- 2.34.1