Changes
authorbdemsky <bdemsky>
Tue, 28 Mar 2006 23:21:15 +0000 (23:21 +0000)
committerbdemsky <bdemsky>
Tue, 28 Mar 2006 23:21:15 +0000 (23:21 +0000)
Robust/src/IR/Descriptor.java
Robust/src/IR/FieldDescriptor.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/FlatCall.java
Robust/src/IR/Flat/ParamsObject.java
Robust/src/IR/Flat/TempObject.java
Robust/src/IR/MethodDescriptor.java
Robust/src/IR/Tree/MethodInvokeNode.java
Robust/src/IR/VarDescriptor.java
Robust/src/Makefile

index 81e327c79b3318f88a686412408ff528cb9e6a25..edafd624a5f716bf53b12dc5dcb9557911621417 100644 (file)
@@ -15,7 +15,7 @@ public abstract class Descriptor {
     
     public Descriptor(String name) {
        this.name = name;
-        this.safename = "__" + name + "__";
+        this.safename = "___" + name + "___";
        this.uniqueid=count++;
     }
 
index ce57b6276f4f0ba8a37caa4efbde56ecac87199e..b8f0a20191435808adf2b9b117bcd0be38d51257 100644 (file)
@@ -21,7 +21,7 @@ public class FieldDescriptor extends Descriptor {
        this.td=t;
        this.identifier=identifier;
        this.en=e;
-        this.safename = "__" + name + "__";
+        this.safename = "___" + name + "___";
        this.uniqueid=count++;
     }
 
index 168c253d1ad62fe40d9f935fd9d17290770b7956..6c44f7bef074334bd5109b3bdb2da1e280f4984b 100644 (file)
@@ -9,8 +9,8 @@ public class BuildCode {
     Hashtable paramstable;
     Hashtable tempstable;
     int tag=0;
-    String localsprefix="__locals__";
-    String paramsprefix="__params__";
+    String localsprefix="___locals___";
+    String paramsprefix="___params___";
     private static final boolean GENERATEPRECISEGC=true;
 
     public BuildCode(State st, Hashtable temptovar) {
@@ -41,6 +41,16 @@ public class BuildCode {
        }
        outstructs.println("#include \"classdefs.h\"");
        outmethodheader.println("#include \"structdefs.h\"");
+
+       // Output the C declarations
+       // These could mutually reference each other
+       while(it.hasNext()) {
+           ClassDescriptor cn=(ClassDescriptor)it.next();
+           outclassdefs.println("struct "+cn.getSafeSymbol()+";");
+       }
+       outclassdefs.println("");
+
+       it=state.getClassSymbolTable().getDescriptorsIterator();
        while(it.hasNext()) {
            ClassDescriptor cn=(ClassDescriptor)it.next();
            generateCallStructs(cn, outclassdefs, outstructs, outmethodheader);
@@ -53,7 +63,6 @@ public class BuildCode {
        Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
        while(classit.hasNext()) {
            ClassDescriptor cn=(ClassDescriptor)classit.next();
-           generateCallStructs(cn, outclassdefs, outstructs, outmethodheader);
            Iterator methodit=cn.getMethods();
            while(methodit.hasNext()) {
                /* Classify parameters */
@@ -101,7 +110,10 @@ public class BuildCode {
        classdefout.println("  int type;");
        while(fieldit.hasNext()) {
            FieldDescriptor fd=(FieldDescriptor)fieldit.next();
-           classdefout.println("  "+fd.getType().getSafeSymbol()+" "+fd.getSafeSymbol()+";");
+           if (fd.getType().isClass())
+               classdefout.println("  struct "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
+           else 
+               classdefout.println("  "+fd.getType().getSafeSymbol()+" "+fd.getSafeSymbol()+";");
        }
        classdefout.println("};\n");
 
@@ -118,34 +130,40 @@ public class BuildCode {
 
            /* Output parameter structure */
            if (GENERATEPRECISEGC) {
-               output.println("struct "+cn.getSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params {");
+               output.println("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params {");
                output.println("  int type;");
+               output.println("  void * next;");
                for(int i=0;i<objectparams.numPointers();i++) {
                    TempDescriptor temp=objectparams.getPointer(i);
-                   output.println("  struct "+temp.getType().getSafeSymbol()+" * "+temp.getSymbol()+";");
+                   output.println("  struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
                }
-               output.println("  void * next;");
                output.println("};\n");
            }
 
            /* Output temp structure */
            if (GENERATEPRECISEGC) {
-               output.println("struct "+cn.getSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_temps {");
+               output.println("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_locals {");
                output.println("  int type;");
+               output.println("  void * next;");
                for(int i=0;i<objecttemps.numPointers();i++) {
                    TempDescriptor temp=objecttemps.getPointer(i);
                    if (temp.getType().isNull())
-                       output.println("  void * "+temp.getSymbol()+";");
-                   else 
-                       output.println("  struct "+temp.getType().getSafeSymbol()+" * "+temp.getSymbol()+";");
+                       output.println("  void * "+temp.getSafeSymbol()+";");
+                   else
+                       output.println("  struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
                }
-               output.println("  void * next;");
                output.println("};\n");
            }
            
            /* Output method declaration */
-           if (md.getReturnType()!=null)
-               headersout.print(md.getReturnType().getSafeSymbol()+" ");
+           if (md.getReturnType()!=null) {
+               if (md.getReturnType().isClass())
+                   headersout.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
+               else
+                   headersout.print(md.getReturnType().getSafeSymbol()+" ");
+           } else 
+               //catch the constructor case
+               headersout.print("void ");
            headersout.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(");
            
            boolean printcomma=false;
@@ -174,7 +192,7 @@ public class BuildCode {
        output.println(" {");
        
        if (GENERATEPRECISEGC) {
-           output.println("   struct "+cn.getSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_temps "+localsprefix+";");
+           output.println("   struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_locals "+localsprefix+";");
        }
        TempObject objecttemp=(TempObject) tempstable.get(md);
        for(int i=0;i<objecttemp.numPrimitives();i++) {
@@ -237,7 +255,7 @@ public class BuildCode {
                generateFlatNode(fm, current_node, output);
                FlatNode nextnode=current_node.getNext(0);
                if (visited.contains(nextnode)) {
-                   output.println("goto L"+nodetolabel.get(nextnode));
+                   output.println("goto L"+nodetolabel.get(nextnode)+";");
                    current_node=null;
                } else
                    current_node=nextnode;
@@ -248,7 +266,7 @@ public class BuildCode {
                if (!visited.contains(current_node.getNext(1)))
                    tovisit.add(current_node.getNext(1));
                if (visited.contains(current_node.getNext(0))) {
-                   output.println("goto L"+nodetolabel.get(current_node.getNext(0)));
+                   output.println("goto L"+nodetolabel.get(current_node.getNext(0))+";");
                    current_node=null;
                } else
                    current_node=current_node.getNext(0);
@@ -309,15 +327,27 @@ public class BuildCode {
     }
 
     private void generateFlatCall(FlatMethod fm, FlatCall fc, PrintWriter output) {
-       MethodDescriptor md=fm.getMethod();
+       MethodDescriptor md=fc.getMethod();
+       ParamsObject objectparams=(ParamsObject) paramstable.get(md);
        ClassDescriptor cn=md.getClassDesc();
        output.println("{");
-       boolean needcomma=false;
        if (GENERATEPRECISEGC) {
-           output.print("       struct "+cn.getSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params __paramlist__={");
+           output.print("       struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params __parameterlist__={");
+           
+           output.print(objectparams.getUID());
+           output.print(", & "+localsprefix);
            if (fc.getThis()!=null) {
+               output.print(", ");
                output.print(generateTemp(fm,fc.getThis()));
-               needcomma=true;
+           }
+           for(int i=0;i<fc.numArgs();i++) {
+               VarDescriptor var=md.getParameter(i);
+               TempDescriptor paramtemp=(TempDescriptor)temptovar.get(var);
+               if (objectparams.isParamPtr(paramtemp)) {
+                   TempDescriptor targ=fc.getArg(i);
+                   output.print(", ");
+                   output.print(generateTemp(fm, targ));
+               }
            }
            output.println("};");
        }
@@ -327,11 +357,22 @@ public class BuildCode {
        if (fc.getReturnTemp()!=null)
            output.print(generateTemp(fm,fc.getReturnTemp())+"=");
        output.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(");
-       needcomma=false;
+       boolean needcomma=false;
        if (GENERATEPRECISEGC) {
-           output.println("__parameterlist__");
+           output.print("&__parameterlist__");
            needcomma=true;
        }
+       for(int i=0;i<fc.numArgs();i++) {
+           VarDescriptor var=md.getParameter(i);
+           TempDescriptor paramtemp=(TempDescriptor)temptovar.get(var);
+           if (objectparams.isParamPrim(paramtemp)) {
+               TempDescriptor targ=fc.getArg(i);
+               if (needcomma)
+                   output.print(", ");
+               output.print(generateTemp(fm, targ));
+               needcomma=true;
+           }
+       }
        output.println(");");
        output.println("   }");
     }
@@ -397,8 +438,15 @@ public class BuildCode {
        ParamsObject objectparams=(ParamsObject)paramstable.get(md);
        ClassDescriptor cn=md.getClassDesc();
        
-       if (md.getReturnType()!=null)
-           output.print(md.getReturnType().getSafeSymbol()+" ");
+       if (md.getReturnType()!=null) {
+           if (md.getReturnType().isClass())
+               output.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
+           else
+               output.print(md.getReturnType().getSafeSymbol()+" ");
+       } else 
+           //catch the constructor case
+           output.print("void ");
+
        output.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(");
        
        boolean printcomma=false;
index 374674a28f3450ac1395c77de0a8b45a1029cfd4..85175514a48831a27177bcad1ab6e62e6228e84c 100644 (file)
@@ -132,7 +132,12 @@ public class BuildFlat {
        MethodDescriptor md=min.getMethod();
        
        //Call to constructor
-       FlatCall fc=new FlatCall(md, out_temp, thisarg, temps);
+       
+       FlatCall fc;
+       if(md.getReturnType()==null||md.getReturnType().isVoid())
+           fc=new FlatCall(md, null, thisarg, temps);
+       else 
+           fc=new FlatCall(md, out_temp, thisarg, temps);
        if (first==null) {
            first=fc;
        } else
index 99b36cf968e71b406c462bb00aee9ed9f01f84a1..e5a344e3a291c31b18c43aca450eca3ea6a4dc0f 100644 (file)
@@ -26,6 +26,14 @@ public class FlatCall extends FlatNode {
        return dst;
     }
 
+    public int numArgs() {
+       return args.length;
+    }
+
+    public TempDescriptor getArg(int i) {
+       return args[i];
+    }
+
     public String toString() {
        String st="";
        if (dst==null)
index 9e546fd521d20f38be8ba5fc16d70f5fd7117798..1fbf9be2e53fa6710201992575b1f1863fe710e4 100644 (file)
@@ -8,7 +8,7 @@ public class ParamsObject {
     private MethodDescriptor method;
     private int tag;
     private Hashtable paramtotemp;
-    protected Hashtable temptostore;
+    private Hashtable temptostore;
     private int count;
 
     public ParamsObject(MethodDescriptor md, int tag) {
@@ -21,6 +21,10 @@ public class ParamsObject {
        count=0;
     }
 
+    public int getUID() {
+       return tag;
+    }
+
     public void addPtr(TempDescriptor t) {
        Position p=new Position(true, pointerparams.size());
        pointerparams.add(t);
@@ -28,6 +32,22 @@ public class ParamsObject {
        temptostore.put(t,p);
     }
 
+    public boolean isParamPtr(TempDescriptor t) {
+       if (containsTemp(t)) {
+           ParamsObject.Position p=(ParamsObject.Position)temptostore.get(t);
+           return p.inStruct;
+       }
+       return false;
+    }
+
+    public boolean isParamPrim(TempDescriptor t) {
+       if (containsTemp(t)) {
+           ParamsObject.Position p=(ParamsObject.Position)temptostore.get(t);
+           return !p.inStruct;
+       }
+       return false;
+    }
+
     public boolean containsTemp(TempDescriptor t) {
        return temptostore.containsKey(t);
     }
index 583c9ed4632f9079990cc8216d21de2a7caa1afc..b7c93fc317e58b522bd2247fe3620199fa6163c4 100644 (file)
@@ -24,7 +24,7 @@ public class TempObject {
     }
 
     public void addPtr(TempDescriptor t) {
-       if (!params.containsTemp(t)) {
+       if (!params.containsTemp(t)&&!pointerparams.contains(t)) {
            Position p=new Position(true, pointerparams.size());
            pointerparams.add(t);
            paramtotemp.put(new Integer(count++), t);
@@ -33,7 +33,7 @@ public class TempObject {
     }
 
     public void addPrim(TempDescriptor t) {
-       if (!params.containsTemp(t)) {
+       if (!params.containsTemp(t)&&!primitiveparams.contains(t)) {
            Position p=new Position(false, primitiveparams.size());
            primitiveparams.add(t);
            paramtotemp.put(new Integer(count++), t);
@@ -58,19 +58,11 @@ public class TempObject {
     }
 
     public boolean isParamPtr(TempDescriptor t) {
-       if (params.containsTemp(t)) {
-           ParamsObject.Position p=(ParamsObject.Position)params.temptostore.get(t);
-           return p.inStruct;
-       }
-       return false;
+       return params.isParamPtr(t);
     }
 
     public boolean isParamPrim(TempDescriptor t) {
-       if (params.containsTemp(t)) {
-           ParamsObject.Position p=(ParamsObject.Position)params.temptostore.get(t);
-           return !p.inStruct;
-       }
-       return false;
+       return params.isParamPrim(t);
     }
 
     int numPointers() {
index 88fa989d874a89289cec45d3341dad6edd5a272d..ae040bb57eacddf98a6145611996050057ada917 100644 (file)
@@ -25,7 +25,7 @@ public class MethodDescriptor extends Descriptor {
        this.modifier=m;
        this.returntype=rt;
        this.identifier=identifier;
-        this.safename = "__" + name + "__";
+        this.safename = "___" + name + "___";
        this.uniqueid=count++;
        params=new Vector();
        paramtable=new SymbolTable();
@@ -37,7 +37,7 @@ public class MethodDescriptor extends Descriptor {
        this.modifier=m;
        this.returntype=null;
        this.identifier=identifier;
-        this.safename = "__" + name + "__";
+        this.safename = "___" + name + "___";
        this.uniqueid=count++;
        params=new Vector();
        paramtable=new SymbolTable();
index 48cb38bb1cc621445b6ff0eae18bcadfb9fb4e9e..927df956b9f47b3e6a6a5a76155129579a79dbea 100644 (file)
@@ -71,7 +71,10 @@ public class MethodInvokeNode extends ExpressionNode {
 
     public String printNode(int indent) {
        String st;
-       st=en.printNode(indent)+"."+methodid+"(";
+       if (en!=null)
+           st=en.printNode(indent)+"."+methodid+"(";
+       else
+           st=methodid+"(";
 
        for(int i=0;i<argumentlist.size();i++) {
            ExpressionNode en=(ExpressionNode)argumentlist.get(i);
index 42038b2a6bed570c510ea60bbc2cd2654183dbd7..17e81f00ae7a3130e0de360786cf980b09d37991 100644 (file)
@@ -17,7 +17,7 @@ public class VarDescriptor extends Descriptor {
        super(identifier);
        this.td=t;
        this.identifier=identifier;
-        this.safename = "__" + name + "__";
+        this.safename = "___" + name + "___";
        this.uniqueid=count++;
     }
 
index 9637e6a50e1726c0ac560348fefb3ee8ccd39b8f..ef687c05d40951e9204cdb2c75f513f79a0c2ac1 100644 (file)
@@ -34,4 +34,4 @@ Parse/Parser.java Parse/Sym.java: Parse/java14.cup
        javac -cp ../cup:.:$(CLASSPATH) $<
 
 clean:
-       rm IR/*.class IR/Tree/*.class Main/*.class Lex/*.class Parse/*.class Parse/Sym.java Parse/Parser.java IR/Flat/*.class
+       rm IR/*.class IR/Tree/*.class Main/*.class Lex/*.class Parse/*.class Parse/Sym.java Parse/Parser.java IR/Flat/*.class classdefs.h methodheaders.h methods.c structdefs.h