1 #include "checkpoint.h"
3 #include "structdefs.h"
6 void ** makecheckpoint(int numparams, void ** srcpointer, 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 void * objptr=srcpointer[i];
12 if (SimpleHashcontainskey(forward, (int) objptr))
13 SimpleHashget(forward,(int) objptr,(int *) &newarray[i]);
15 void * copy=createcopy(objptr);
16 SimpleHashadd(forward, (int) objptr, (int)copy);
17 SimpleHashadd(reverse, (int) copy, (int) objptr);
18 SimpleHashadd(todo, (int) objptr, (int) objptr);
22 while(SimpleHashcountset(todo)!=0) {
23 void * ptr=(void *) SimpleHashfirstkey(todo);
24 int type=((int *)ptr)[0];
25 SimpleHashremove(todo, (int) ptr, (int) ptr);
28 SimpleHashget(forward, (int) ptr, (int *) &cpy);
29 int * pointer=pointerarray[type];
31 /* Array of primitives */
33 } else if (((int)pointer)==1) {
34 /* Array of pointers */
35 struct ArrayObject *ao=(struct ArrayObject *) ptr;
36 int length=ao->___length___;
38 for(i=0;i<length;i++) {
39 void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
40 if (SimpleHashcontainskey(forward, (int) objptr))
41 SimpleHashget(forward,(int) objptr,(int *) &((void **)(((char *)& ao->___length___)+sizeof(int)))[i]);
43 void * copy=createcopy(objptr);
44 SimpleHashadd(forward, (int) objptr, (int)copy);
45 SimpleHashadd(reverse, (int) copy, (int) objptr);
46 SimpleHashadd(todo, (int) objptr, (int) objptr);
47 ((void **)(((char *)& ao->___length___)+sizeof(int)))[i]=copy;
53 for(i=1;i<=size;i++) {
54 int offset=pointer[i];
55 void * objptr=*((void **)(((int)ptr)+offset));
56 if (SimpleHashcontainskey(forward, (int) objptr))
57 SimpleHashget(forward, (int) objptr, (int *) &(((char *)cpy)[offset]));
59 void * copy=createcopy(objptr);
60 SimpleHashadd(forward, (int) objptr, (int) copy);
61 SimpleHashadd(reverse, (int) copy, (int) objptr);
62 SimpleHashadd(todo, (int) objptr, (int) objptr);
63 *((void **) ((int)cpy)+offset)=copy;
72 void * createcopy(void * orig) {
76 int type=((int *)orig)[0];
77 if (type<NUMCLASSES) {
78 /* We have a normal object */
79 int size=classsize[type];
80 void *newobj=RUNMALLOC(size);
81 memcpy(newobj, orig, size);
84 /* We have an array */
85 struct ArrayObject *ao=(struct ArrayObject *)orig;
86 int elementsize=classsize[type];
87 int length=ao->___length___;
88 int size=sizeof(struct ArrayObject)+length*elementsize;
89 void *newobj=RUNMALLOC(size);
90 memcpy(newobj, orig, size);
96 void restorecheckpoint(int numparams, void ** original, void ** checkpoint, struct SimpleHash *forward, struct SimpleHash * reverse) {
97 struct SimpleHash *todo=allocateSimpleHash(100);
100 for(i=0;i<numparams;i++) {
101 SimpleHashadd(todo, (int) checkpoint[i], (int) checkpoint[i]);
104 while(SimpleHashcountset(todo)!=0) {
105 void * ptr=(void *) SimpleHashfirstkey(todo);
106 int type=((int *)ptr)[0];
107 SimpleHashremove(todo, (int) ptr, (int) ptr);
110 SimpleHashget(reverse, (int) ptr, (int *) &cpy);
111 int * pointer=pointerarray[type];
113 /* Array of primitives */
115 } else if ((int)pointer==1) {
116 /* Array of pointers */
117 struct ArrayObject *ao=(struct ArrayObject *) ptr;
118 int length=ao->___length___;
120 for(i=0;i<length;i++) {
121 void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
122 SimpleHashget(reverse, (int) objptr, (int *) &((void **)(((char *)& ao->___length___)+sizeof(int)))[i]);
127 for(i=1;i<=size;i++) {
128 int offset=pointer[i];
129 void * objptr=*((void **)(((int)ptr)+offset));
130 SimpleHashget(reverse, (int) objptr, (int *) &(((char *)cpy)[offset]));