1 #include "checkpoint.h"
3 #include "structdefs.h"
6 void ** makecheckpoint(int numparams, void ** srcpointer, struct RuntimeHash * forward, struct RuntimeHash * reverse) {
7 void **newarray=RUNMALLOC(sizeof(void *)*numparams);
8 struct RuntimeHash *todo=allocateRuntimeHash(100);
10 for(i=0;i<numparams;i++) {
11 void * objptr=srcpointer[i];
12 if (RuntimeHashcontainskey(forward, (int) objptr))
13 RuntimeHashget(forward,(int) objptr,(int *) &newarray[i]);
15 void * copy=createcopy(objptr);
16 RuntimeHashadd(forward, (int) objptr, (int)copy);
17 RuntimeHashadd(reverse, (int) copy, (int) objptr);
18 RuntimeHashadd(todo, (int) objptr, (int) objptr);
22 while(RuntimeHashcountset(todo)!=0) {
23 void * ptr=(void *) RuntimeHashfirstkey(todo);
24 int type=((int *)ptr)[0];
25 RuntimeHashremove(todo, (int) ptr, (int) ptr);
28 RuntimeHashget(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 struct ArrayObject *ao_cpy=(struct ArrayObject *) cpy;
37 int length=ao->___length___;
39 for(i=0;i<length;i++) {
40 void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
42 ((void **)(((char *)& ao->___length___)+sizeof(int)))[i]=NULL;
43 } else if (RuntimeHashcontainskey(forward, (int) objptr))
44 RuntimeHashget(forward,(int) objptr,(int *) &((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]);
46 void * copy=createcopy(objptr);
47 RuntimeHashadd(forward, (int) objptr, (int)copy);
48 RuntimeHashadd(reverse, (int) copy, (int) objptr);
49 RuntimeHashadd(todo, (int) objptr, (int) objptr);
50 ((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]=copy;
56 for(i=1;i<=size;i++) {
57 int offset=pointer[i];
58 void * objptr=*((void **)(((int)ptr)+offset));
60 *((void **) (((int)cpy)+offset))=NULL;
61 } else if (RuntimeHashcontainskey(forward, (int) objptr))
62 RuntimeHashget(forward, (int) objptr, (int *) &(((char *)cpy)[offset]));
64 void * copy=createcopy(objptr);
65 RuntimeHashadd(forward, (int) objptr, (int) copy);
66 RuntimeHashadd(reverse, (int) copy, (int) objptr);
67 RuntimeHashadd(todo, (int) objptr, (int) objptr);
68 *((void **) (((int)cpy)+offset))=copy;
77 void * createcopy(void * orig) {
81 int type=((int *)orig)[0];
82 if (type<NUMCLASSES) {
83 /* We have a normal object */
84 int size=classsize[type];
85 void *newobj=RUNMALLOC(size);
86 memcpy(newobj, orig, size);
89 /* We have an array */
90 struct ArrayObject *ao=(struct ArrayObject *)orig;
91 int elementsize=classsize[type];
92 int length=ao->___length___;
93 int size=sizeof(struct ArrayObject)+length*elementsize;
94 void *newobj=RUNMALLOC(size);
95 memcpy(newobj, orig, size);
101 void restorecheckpoint(int numparams, void ** original, void ** checkpoint, struct RuntimeHash *forward, struct RuntimeHash * reverse) {
102 struct RuntimeHash *todo=allocateRuntimeHash(100);
105 for(i=0;i<numparams;i++) {
106 RuntimeHashadd(todo, (int) checkpoint[i], (int) checkpoint[i]);
109 while(RuntimeHashcountset(todo)!=0) {
110 void * ptr=(void *) RuntimeHashfirstkey(todo);
111 int type=((int *)ptr)[0];
112 RuntimeHashremove(todo, (int) ptr, (int) ptr);
117 RuntimeHashget(reverse, (int) ptr, (int *) &cpy);
118 pointer=pointerarray[type];
119 size=classsize[type];
122 /* Array of primitives */
123 struct ArrayObject *ao=(struct ArrayObject *) ptr;
124 int length=ao->___length___;
125 int cpysize=sizeof(struct ArrayObject)+length*size;
126 memcpy(cpy, ptr, cpysize);
128 } else if ((int)pointer==1) {
129 /* Array of pointers */
130 struct ArrayObject *ao=(struct ArrayObject *) ptr;
131 struct ArrayObject *ao_cpy=(struct ArrayObject *) cpy;
132 int length=ao->___length___;
134 int cpysize=sizeof(struct ArrayObject)+length*size;
135 memcpy(ao_cpy, ao, cpysize);
137 for(i=0;i<length;i++) {
138 void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
140 ((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]=NULL;
142 RuntimeHashget(reverse, (int) objptr, (int *) &((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]);
145 int numptr=pointer[0];
148 if (hasflags[type]) {
149 flagptr=(void *) (((int *)cpy)[2]);
151 memcpy(cpy, ptr, size);
152 for(i=1;i<=numptr;i++) {
153 int offset=pointer[i];
154 void * objptr=*((void **)(((int)ptr)+offset));
156 *((void **) (((int)cpy)+offset))=NULL;
158 RuntimeHashget(reverse, (int) objptr, (int *) &(((char *)cpy)[offset]));
160 if (hasflags[type]) {
161 (((void **)cpy)[2])=flagptr;
162 flagorand(cpy, 1, 0xFFFFFFFF);