1 #include "checkpoint.h"
3 #include "structdefs.h"
6 void ** makecheckpoint(int numparams, void ** pointerarray, struct SimpleHash * forward, struct SimpleHash * reverse) {
7 void **newarray=RUNMALLOC(sizeof(void *)*numparams);
8 struct SimpleHash *todo=allocateSimpleHash(100);
10 for(i=0;i<numparams;i++) {
11 SimpleHashadd(todo, (int) pointerarray[i], (int) pointerarray[i]);
13 while(SimpleHashcountset(todo)!=0) {
14 void * ptr=(void *) SimpleHashfirstkey(todo);
15 int type=((int *)ptr)[0];
16 SimpleHashremove(todo, (int) ptr, (int) ptr);
19 SimpleHashget(forward, (int) ptr, (int *) &cpy);
20 int * pointer=pointerarray[type];
22 /* Array of primitives */
24 } else if (((int)pointer)==1) {
25 /* Array of pointers */
26 struct ArrayObject *ao=(struct ArrayObject *) ptr;
27 int length=ao->___length___;
29 for(i=0;i<length;i++) {
30 void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
31 if (SimpleHashcontainskey(forward, (int) objptr))
32 SimpleHashget(forward,(int) objptr,(int *) &((void **)(((char *)& ao->___length___)+sizeof(int)))[i]);
34 void * copy=createcopy(objptr);
35 SimpleHashadd(forward, (int) objptr, (int)copy);
36 SimpleHashadd(reverse, (int) copy, (int) objptr);
37 SimpleHashadd(todo, (int) objptr, (int) objptr);
38 ((void **)(((char *)& ao->___length___)+sizeof(int)))[i]=copy;
44 for(i=1;i<=size;i++) {
45 int offset=pointer[i];
46 void * objptr=*((void **)(((int)ptr)+offset));
47 if (SimpleHashcontainskey(forward, (int) objptr))
48 SimpleHashget(forward, (int) objptr, (int *) &(((char *)cpy)[offset]));
50 void * copy=createcopy(objptr);
51 SimpleHashadd(forward, (int) objptr, (int) copy);
52 SimpleHashadd(reverse, (int) copy, (int) objptr);
53 SimpleHashadd(todo, (int) objptr, (int) objptr);
54 *((void **) ((int)cpy)+offset)=copy;
62 void * createcopy(void * orig) {
63 int type=((int *)orig)[0];
64 if (type<NUMCLASSES) {
65 /* We have a normal object */
66 int size=classsize[type];
67 void *newobj=RUNMALLOC(size);
68 memcpy(newobj, orig, size);
71 /* We have an array */
72 struct ArrayObject *ao=(struct ArrayObject *)orig;
73 int elementsize=classsize[type];
74 int length=ao->___length___;
75 int size=sizeof(struct ArrayObject)+length*elementsize;
76 void *newobj=RUNMALLOC(size);
77 memcpy(newobj, orig, size);
82 void restorecheckpoint(int numparams, void ** original, void ** checkpoint, struct SimpleHash *forward, struct SimpleHash * reverse) {
83 struct SimpleHash *todo=allocateSimpleHash(100);
86 for(i=0;i<numparams;i++) {
87 SimpleHashadd(todo, (int) checkpoint[i], (int) checkpoint[i]);
90 while(SimpleHashcountset(todo)!=0) {
91 void * ptr=(void *) SimpleHashfirstkey(todo);
92 int type=((int *)ptr)[0];
93 SimpleHashremove(todo, (int) ptr, (int) ptr);
96 SimpleHashget(reverse, (int) ptr, (int *) &cpy);
97 int * pointer=pointerarray[type];
99 /* Array of primitives */
101 } else if ((int)pointer==1) {
102 /* Array of pointers */
103 struct ArrayObject *ao=(struct ArrayObject *) ptr;
104 int length=ao->___length___;
106 for(i=0;i<length;i++) {
107 void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
108 SimpleHashget(reverse, (int) objptr, (int *) &((void **)(((char *)& ao->___length___)+sizeof(int)))[i]);
113 for(i=1;i<=size;i++) {
114 int offset=pointer[i];
115 void * objptr=*((void **)(((int)ptr)+offset));
116 SimpleHashget(reverse, (int) objptr, (int *) &(((char *)cpy)[offset]));