From: bdemsky <bdemsky>
Date: Fri, 8 Sep 2006 01:57:16 +0000 (+0000)
Subject: more changes
X-Git-Tag: preEdgeChange~830
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=71ba53eff27f49b10b6a8d5ba18d75975727760a;p=IRC.git

more changes
---

diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java
index 8fe28732..76bcf10e 100644
--- a/Robust/src/IR/Flat/BuildCode.java
+++ b/Robust/src/IR/Flat/BuildCode.java
@@ -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. */
diff --git a/Robust/src/Runtime/checkpoint.c b/Robust/src/Runtime/checkpoint.c
index a23b6e4a..3a35a471 100644
--- a/Robust/src/Runtime/checkpoint.c
+++ b/Robust/src/Runtime/checkpoint.c
@@ -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);
+	}
       }
     }
   }
 }
-
-