@@ -21,7 +21,7 @@ const char* val_typeof_string(int64_t t) {
2121 }
2222}
2323
24- void step (val_t * to , val_t * from , val_t * * to_curr , val_t * * to_next , int count , int * t_back ) {
24+ void step (val_t * * to_curr , val_t * * to_next , int count , int * t_back ) {
2525 type_t t ;
2626 int i ;
2727 int size ;
@@ -72,20 +72,16 @@ void step(val_t* to, val_t* from, val_t** to_curr, val_t** to_next, int count, i
7272int64_t * collect_garbage (int64_t * rsp , int64_t * rbp , int64_t * rbx ) {
7373 int stack_count = rbp - rsp ;
7474
75- val_t * from = heap + ((rbx < (heap + heap_size )) ? 0 : heap_size );
76- val_t * to = heap + ((rbx < (heap + heap_size )) ? heap_size : 0 );
77-
75+ val_t * tmp ;
7876 val_t * to_next = to ;
7977 val_t * to_curr = to ;
8078
8179 int t_back = 0 ;
8280 int t_front = 0 ;
8381
8482 // Step through everything on the stack
85- val_t * rsp_curr = rsp ;
86- step (to , from , & rsp_curr , & to_next , stack_count , & t_back );
87-
88- printf ("DONE STACK\n" );
83+ val_t * rsp_curr = rsp ;
84+ step (& rsp_curr , & to_next , stack_count , & t_back );
8985
9086 int vi ;
9187 // now play catch up between to_curr and to_next
@@ -94,13 +90,13 @@ int64_t* collect_garbage(int64_t* rsp, int64_t *rbp, int64_t* rbx) {
9490 case T_VECT :
9591 vi = to_curr [0 ];
9692 to_curr ++ ;
97- step (to , from , & to_curr , & to_next , vi , & t_back );
93+ step (& to_curr , & to_next , vi , & t_back );
9894 break ;
9995 case T_BOX :
100- step (to , from , & to_curr , & to_next , 1 , & t_back );
96+ step (& to_curr , & to_next , 1 , & t_back );
10197 break ;
10298 case T_CONS :
103- step (to , from , & to_curr , & to_next , 2 , & t_back );
99+ step (& to_curr , & to_next , 2 , & t_back );
104100 break ;
105101 case T_STR :
106102 to_curr = to_curr + 1 + ((* to_curr + 1 ) / 2 );
@@ -110,16 +106,18 @@ int64_t* collect_garbage(int64_t* rsp, int64_t *rbp, int64_t* rbx) {
110106 break ;
111107 }
112108 }
109+
110+ tmp = from ;
111+ from = to ;
112+ to = tmp ;
113113 return to_next ;
114114}
115115
116116
117117void print_memory (int64_t * rsp , int64_t * rbp , int64_t * rbx ) {
118118
119- val_t * h = heap + ((rbx < (heap + heap_size )) ? 0 : heap_size );
120-
121119 int stack_count = rbp - rsp ;
122- int heap_count = rbx - h ;
120+ int heap_count = rbx - from ;
123121
124122 printf ("----------------------------------------------------------------\n" );
125123 int i ;
@@ -132,6 +130,17 @@ void print_memory(int64_t* rsp, int64_t* rbp, int64_t* rbx) {
132130 printf ("HEAP:\n" );
133131 for (i = 0 ; i < heap_count ; i ++ ) {
134132 printf ("[%" PRIx64 "] = %016" PRIx64 ", %s\n" ,
135- (int64_t )h + 8 * i , h [i ], val_typeof_string (h [i ]));
133+ (int64_t )from + 8 * i , from [i ], val_typeof_string (from [i ]));
134+ }
135+ }
136+
137+ int64_t * alloc_val (int64_t * rsp , int64_t * rbp , int64_t * rbx , int words ) {
138+ if (rbx + words >= from + heap_size ) {
139+ rbx = collect_garbage (rsp , rbp , rbx );
140+ if (rbx + words >= from + heap_size ) {
141+ printf ("OUT OF MEMORY!!\n" );
142+ exit (1 );
143+ }
136144 }
145+ return rbx ;
137146}
0 commit comments