Add memory allocation
authorbdemsky <bdemsky>
Wed, 5 Apr 2006 23:01:54 +0000 (23:01 +0000)
committerbdemsky <bdemsky>
Wed, 5 Apr 2006 23:01:54 +0000 (23:01 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/State.java
Robust/src/Runtime/runtime.c
Robust/src/f.test

index 5842dad53dc5110c72b824e370d03e7f35014c5c..05d1cdc168ad7442802468e7a7094270a0ea86c4 100644 (file)
@@ -69,6 +69,7 @@ public class BuildCode {
            ClassDescriptor cn=(ClassDescriptor)it.next();
            generateCallStructs(cn, outclassdefs, outstructs, outmethodheader);
        }
+
        outstructs.close();
        outmethodheader.close();
 
@@ -76,6 +77,10 @@ public class BuildCode {
        outmethod.println("#include \"methodheaders.h\"");
        outmethod.println("#include \"virtualtable.h\"");
        outmethod.println("#include <runtime.h>");
+
+       outclassdefs.println("extern int classsize[];");
+       generateSizeArray(outmethod);
+
        Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
        while(classit.hasNext()) {
            ClassDescriptor cn=(ClassDescriptor)classit.next();
@@ -109,15 +114,13 @@ public class BuildCode {
     private int maxcount=0;
 
     private void buildVirtualTables(PrintWriter outvirtual) {
-       int numclasses=0;
        Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
        while(classit.hasNext()) {
            ClassDescriptor cd=(ClassDescriptor)classit.next();
            if (virtualcalls.getMethodCount(cd)>maxcount)
                maxcount=virtualcalls.getMethodCount(cd);
-           numclasses++;
        }
-       MethodDescriptor[][] virtualtable=new MethodDescriptor[numclasses][maxcount];
+       MethodDescriptor[][] virtualtable=new MethodDescriptor[state.numClasses()][maxcount];
 
        /* Fill in virtual table */
        classit=state.getClassSymbolTable().getDescriptorsIterator();
@@ -127,7 +130,7 @@ public class BuildCode {
        }
        outvirtual.print("void * virtualtable[]={");
        boolean needcomma=false;
-       for(int i=0;i<numclasses;i++) {
+       for(int i=0;i<state.numClasses();i++) {
            for(int j=0;j<maxcount;j++) {
                if (needcomma)
                    outvirtual.print(", ");
@@ -159,6 +162,24 @@ public class BuildCode {
        }
     }
 
+    private void generateSizeArray(PrintWriter outclassdefs) {
+       outclassdefs.print("int classsize[]={");
+       Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
+       ClassDescriptor[] cdarray=new ClassDescriptor[state.numClasses()];
+       while(it.hasNext()) {
+           ClassDescriptor cd=(ClassDescriptor)it.next();
+           cdarray[cd.getId()]=cd;
+       }
+       boolean needcomma=false;
+       for(int i=0;i<state.numClasses();i++) {
+           if (needcomma)
+               outclassdefs.print(", ");
+           outclassdefs.print("sizeof(struct "+cdarray[i].getSafeSymbol()+")");            
+           needcomma=true;
+       }
+       outclassdefs.println("};");
+    }
+
     private void generateTempStructs(FlatMethod fm) {
        MethodDescriptor md=fm.getMethod();
        ParamsObject objectparams=new ParamsObject(md,tag++);
index 83ec6f464432ad473782cc7e7bf3b851096eaa8c..93b5af68ceb1c4cbb98bfcf1cfa91fe8d6a80bea 100644 (file)
@@ -22,6 +22,8 @@ public class State {
     public Set parsetrees;
     public Hashtable treemethodmap;
     public Hashtable flatmethodmap;
+    private int numclasses=0;
+
 
     public static TypeDescriptor getTypeDescriptor(int t) {
        TypeDescriptor td=new TypeDescriptor(t);
@@ -37,6 +39,11 @@ public class State {
        if (classes.contains(tdn.getSymbol()))
            throw new Error("Class "+tdn.getSymbol()+" defined twice");
        classes.add(tdn);
+       numclasses++;
+    }
+
+    public int numClasses() {
+       return numclasses;
     }
 
     public BlockNode getMethodBody(MethodDescriptor md) {
index 6dca89fd363f70654a86a5b465966fe0dc391ca8..05d947899c5da42341fbd0d5a739034e56839784 100644 (file)
@@ -1,5 +1,6 @@
 #include "runtime.h"
 #include "structdefs.h"
+extern int classsize[];
 
 int ___Object______hashcode____(struct ___Object___ * ___this___) {
   return (int) ___this___;
@@ -8,3 +9,9 @@ int ___Object______hashcode____(struct ___Object___ * ___this___) {
 void ___System______printInt____I(int x) {
   printf("%d\n",x);
 }
+
+void * allocate_new(int type) {
+  void * v=calloc(1,classsize[type]);
+  *((int *)v)=type;
+  return v;
+}
index 70b589591f222696ae997dbc6e6472099e12905f..7b2b6fc4f8bc6c954154cb4c62039c41bc89e4f7 100644 (file)
@@ -1,6 +1,10 @@
 public class Test {
-
+    public Test() {
+      ;
+    }
+    int a;
     public static void main() {
+       Test t=new Test();
        for(int i=3;i<100000;i++) {
                boolean flag=true;
                for(int j=2;flag&&j<i;j++) {