more changes
authorbdemsky <bdemsky>
Fri, 8 Sep 2006 01:57:16 +0000 (01:57 +0000)
committerbdemsky <bdemsky>
Fri, 8 Sep 2006 01:57:16 +0000 (01:57 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/checkpoint.c

index 8fe2873251e9c1cc86e2f8caa80523b5d8c3ca8f..76bcf10eb0a74628a8d478b4576e0645bd4066df 100644 (file)
@@ -162,6 +162,7 @@ public class BuildCode {
            outmethod.println("#include \"checkers.h\"");
        }
        outclassdefs.println("extern int classsize[];");
+       outclassdefs.println("extern int hasflags[];");
        outclassdefs.println("extern int * pointerarray[];");
 
        //Store the sizes of classes & array elements
@@ -532,7 +533,7 @@ public class BuildCode {
 
        for(int i=0;i<state.numArrays();i++) {
            if (needcomma)
-               output.println(",");
+               output.println(", ");
            TypeDescriptor tdelement=arraytable[i].dereference();
            if (tdelement.isArray()||tdelement.isClass())
                output.print("((int *)1)");
@@ -542,6 +543,19 @@ public class BuildCode {
        }
        
        output.println("};");
+       needcomma=false;
+       output.println("int hasflags[]={");
+       for(int i=0;i<state.numClasses();i++) {
+           ClassDescriptor cn=cdarray[i];
+           if (needcomma)
+               output.println(", ");
+           needcomma=true;
+           if (cn.hasFlags())
+               output.print("1");
+           else
+               output.print("0");
+       }
+       output.println("};");
     }
 
     /* Force consistent field ordering between inherited classes. */
index a23b6e4a1953fa0927993aa114141b9ea390cc89..3a35a471e19cb70549b9932adbd43fa3ebc5e056 100644 (file)
@@ -107,31 +107,50 @@ void restorecheckpoint(int numparams, void ** original, void ** checkpoint, stru
     RuntimeHashremove(todo, (int) ptr, (int) ptr);
     {
       void *cpy;
+      int *pointer;
+      int size;
       RuntimeHashget(reverse, (int) ptr, (int *) &cpy);
-      int * pointer=pointerarray[type];
+      pointer=pointerarray[type];
+      size=classsize[type];
+
       if (pointer==0) {
        /* Array of primitives */
-       /* Do nothing */
+       struct ArrayObject *ao=(struct ArrayObject *) ptr;
+       int length=ao->___length___;
+       int cpysize=sizeof(struct ArrayObject)+length*size;
+       memcpy(cpy, ptr, cpysize);
+
       } else if ((int)pointer==1) {
        /* Array of pointers */
        struct ArrayObject *ao=(struct ArrayObject *) ptr;
+       struct ArrayObject *ao_cpy=(struct ArrayObject *) cpy;
        int length=ao->___length___;
        int i;
+       int cpysize=sizeof(struct ArrayObject)+length*size;
+       memcpy(ao_cpy, ao, cpysize);
+
        for(i=0;i<length;i++) {
          void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
-         RuntimeHashget(reverse, (int) objptr, (int *) &((void **)(((char *)& ao->___length___)+sizeof(int)))[i]);
+         RuntimeHashget(reverse, (int) objptr, (int *) &((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]);
        }
       } else {
-       int size=pointer[0];
+       int numptr=pointer[0];
        int i;
-       for(i=1;i<=size;i++) {
+       void *flagptr;
+       if (hasflags[type]) {
+         flagptr=(void *) (((int *)cpy)[2]);
+       }
+       memcpy(cpy, ptr, size);
+       for(i=1;i<=numptr;i++) {
          int offset=pointer[i];
          void * objptr=*((void **)(((int)ptr)+offset));
          RuntimeHashget(reverse, (int) objptr, (int *) &(((char *)cpy)[offset]));
        }
+       if (hasflags[type]) {
+         (((void **)cpy)[2])=flagptr;
+         flagorand(cpy, 1, 0xFFFFFFFF);
+       }
       }
     }
   }
 }
-
-