Updates
authorbdemsky <bdemsky>
Wed, 5 Apr 2006 22:09:37 +0000 (22:09 +0000)
committerbdemsky <bdemsky>
Wed, 5 Apr 2006 22:09:37 +0000 (22:09 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Tree/SemanticCheck.java
Robust/src/Main/Main.java
Robust/src/Runtime/runtime.h

index 30b6129102d93db2993222769ad972844a2b4a26..5842dad53dc5110c72b824e370d03e7f35014c5c 100644 (file)
@@ -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) {
index 6c58090e6c740c4dc6c5488a6cc07a069017363d..b34ea9af427100e60c331d6f05a88ee023518551 100644 (file)
@@ -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) {
index 33889fdb3cb790f7dd0b72c6a165e4bb927a7997..680603c034000ea1008cc9f3fe10a3858bd9aaff 100644 (file)
@@ -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) {
index dea270a0bc66257aebc86c9b524fc3e45a8c884d..cc28e0012311c2075d0c30fe8dc95165fb84aeee 100644 (file)
@@ -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<args.length;i++) {
@@ -44,6 +40,7 @@ public class Main {
       }
       
       readSourceFile(state, ClassLibraryPrefix+"Object.java");
+      readSourceFile(state, ClassLibraryPrefix+"System.java");
 
       BuildIR bir=new BuildIR(state);
       bir.buildtree();
index 96552e0e4c1a75e8401b21e8ff38e9572cd08a82..3cd48e8fd6831f58918f08d373430805393d9cb6 100644 (file)
@@ -2,6 +2,8 @@
 #define RUNTIME
 #include<stdlib.h>
 #include<stdio.h>
+
+
 void * allocate_new(int type);
 
 #endif