Changes
authorbdemsky <bdemsky>
Mon, 27 Mar 2006 23:58:38 +0000 (23:58 +0000)
committerbdemsky <bdemsky>
Mon, 27 Mar 2006 23:58:38 +0000 (23:58 +0000)
Robust/src/IR/ClassDescriptor.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/FlatLiteralNode.java
Robust/src/IR/Flat/FlatNew.java

index c3419d60b46e792a2d0131f5e9fd925419729e13..e5888b3d616a911fe78a13c178768cdd427a2ede 100644 (file)
@@ -13,8 +13,10 @@ public class ClassDescriptor extends Descriptor {
        superclass=null;
        fields=new SymbolTable();
        methods=new SymbolTable();
+       classid=UIDCount++;
     }
-
+    private static int UIDCount=0;
+    private final int classid;
     String classname;
     String superclass;
     ClassDescriptor superdesc;
@@ -24,6 +26,9 @@ public class ClassDescriptor extends Descriptor {
     SymbolTable fields;
     SymbolTable methods;
 
+    public int getId() {
+       return classid;
+    }
     
     public Iterator getMethods() {
        return methods.getDescriptorsIterator();
index e7e815d91ed3687f7279962e2a84b9da0c54e093..168c253d1ad62fe40d9f935fd9d17290770b7956 100644 (file)
@@ -89,7 +89,7 @@ public class BuildCode {
                if (type.isPtr()&&GENERATEPRECISEGC)
                    objecttemps.addPtr(temp);
                else
-                   objecttemps.addPrim(temp);          
+                   objecttemps.addPrim(temp);
            }
        }
     }
@@ -195,7 +195,6 @@ public class BuildCode {
        tovisit.add(fm.methodEntryNode());
        FlatNode current_node=null;
 
-
        //Assign labels 1st
        //Node needs a label if it is
        while(!tovisit.isEmpty()) {
@@ -312,7 +311,7 @@ public class BuildCode {
     private void generateFlatCall(FlatMethod fm, FlatCall fc, PrintWriter output) {
        MethodDescriptor md=fm.getMethod();
        ClassDescriptor cn=md.getClassDesc();
-       output.println("   {");
+       output.println("{");
        boolean needcomma=false;
        if (GENERATEPRECISEGC) {
            output.print("       struct "+cn.getSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params __paramlist__={");
@@ -346,23 +345,43 @@ public class BuildCode {
     }
 
     private void generateFlatNew(FlatMethod fm, FlatNew fn, PrintWriter output) {
+       output.println(generateTemp(fm,fn.getDst())+"=allocate_new("+fn.getType().getClassDesc().getId()+");");
     }
 
     private void generateFlatOpNode(FlatMethod fm, FlatOpNode fon, PrintWriter output) {
-       if (fon.getOp().getOp()==Operation.ASSIGN)
-           output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+";");
-       else if (fon.getRight()!=null)
+
+       if (fon.getRight()!=null)
            output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+fon.getOp().toString()+generateTemp(fm,fon.getRight())+";");
+       else if (fon.getOp().getOp()==Operation.ASSIGN)
+           output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+";");
+       else if (fon.getOp().getOp()==Operation.UNARYPLUS)
+           output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+";");
+       else if (fon.getOp().getOp()==Operation.UNARYMINUS)
+           output.println(generateTemp(fm, fon.getDest())+" = -"+generateTemp(fm, fon.getLeft())+";");
+       else if (fon.getOp().getOp()==Operation.POSTINC)
+           output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+"++;");
+       else if (fon.getOp().getOp()==Operation.POSTDEC)
+           output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+"--;");
+       else if (fon.getOp().getOp()==Operation.PREINC)
+           output.println(generateTemp(fm, fon.getDest())+" = ++"+generateTemp(fm, fon.getLeft())+";");
+       else if (fon.getOp().getOp()==Operation.PREDEC)
+           output.println(generateTemp(fm, fon.getDest())+" = --"+generateTemp(fm, fon.getLeft())+";");
        else
            output.println(generateTemp(fm, fon.getDest())+fon.getOp().toString()+generateTemp(fm, fon.getLeft())+";");
     }
 
     private void generateFlatCastNode(FlatMethod fm, FlatCastNode fcn, PrintWriter output) {
        /* TODO: Make call into runtime */
-       output.println(fcn.getDst()+"=("+fcn.getType().getSafeSymbol()+")"+fcn.getSrc()+";");
+       output.println(generateTemp(fm,fcn.getDst())+"=("+fcn.getType().getSafeSymbol()+")"+generateTemp(fm,fcn.getSrc())+";");
     }
 
     private void generateFlatLiteralNode(FlatMethod fm, FlatLiteralNode fln, PrintWriter output) {
+       if (fln.getValue()==null)
+           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
+           output.println(generateTemp(fm, fln.getDst())+"="+fln.getValue()+";");
     }
 
     private void generateFlatReturnNode(FlatMethod fm, FlatReturnNode frn, PrintWriter output) {
index c27836bcb8d0a75fbfb927ed2d9bc5624a2909cb..ba5e58cbde298886159e766be73b1745654551b4 100644 (file)
@@ -12,6 +12,14 @@ public class FlatLiteralNode extends FlatNode {
        this.dst=dst;
     }
 
+    public TypeDescriptor getType() {
+       return type;
+    }
+
+    public TempDescriptor getDst() {
+       return dst;
+    }
+
     public Object getValue() {
        return value;
     }
@@ -22,7 +30,7 @@ public class FlatLiteralNode extends FlatNode {
        else
            return dst+"="+escapeString(value.toString());
     }
-    private static String escapeString(String st) {
+    protected static String escapeString(String st) {
        String new_st="";
        for(int i=0;i<st.length();i++) {
            char x=st.charAt(i);
index c8769bdb338d446828e69bf6a298c125dfca3300..ac70b096bb398f16f8085cb09386eb7daeede1e6 100644 (file)
@@ -21,4 +21,12 @@ public class FlatNew extends FlatNode {
     public TempDescriptor [] writesTemps() {
        return new TempDescriptor[] {dst};
     }
+
+    public TempDescriptor getDst() {
+       return dst;
+    }
+
+    public TypeDescriptor getType() {
+       return type;
+    }
 }