/[cvs]/stack/stack.c
ViewVC logotype

Diff of /stack/stack.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.96 by teddy, Sun Mar 10 07:55:13 2002 UTC revision 1.97 by masse, Sun Mar 10 08:30:43 2002 UTC
# Line 127  value* new_val(environment *env) Line 127  value* new_val(environment *env)
127    env->gc_ref= nitem;    env->gc_ref= nitem;
128    
129    env->gc_count++;    env->gc_count++;
130      nval->gc_garb= 1;
131    
132    return nval;    return nval;
133  }  }
# Line 137  inline void gc_mark(value *val) Line 138  inline void gc_mark(value *val)
138  {  {
139    stackitem *iterator;    stackitem *iterator;
140    
141    if(val==NULL || val->gc_garb==0)    if(val->gc_garb==0)
142      return;      return;
143    
144    val->gc_garb= 0;    val->gc_garb= 0;
# Line 167  extern void gc_init(environment *env) Line 168  extern void gc_init(environment *env)
168    symbol *tsymb;    symbol *tsymb;
169    int i;    int i;
170    
   /* Garb by default */  
   iterator= env->gc_ref;  
   while(iterator!=NULL) {  
     iterator->item->gc_garb= 1;  
     iterator= iterator->next;  
   }  
   
171    /* Mark protected values */    /* Mark protected values */
172    iterator= env->gc_protect;    iterator= env->gc_protect;
173    while(iterator!=NULL) {    while(iterator!=NULL) {
# Line 192  extern void gc_init(environment *env) Line 186  extern void gc_init(environment *env)
186    for(i= 0; i<HASHTBLSIZE; i++) {    for(i= 0; i<HASHTBLSIZE; i++) {
187      tsymb= env->symbols[i];      tsymb= env->symbols[i];
188      while(tsymb!=NULL) {      while(tsymb!=NULL) {
189        gc_mark(tsymb->val);        if (tsymb->val != NULL)
190            gc_mark(tsymb->val);
191        tsymb= tsymb->next;        tsymb= tsymb->next;
192      }      }
193    }    }
# Line 213  extern void gc_init(environment *env) Line 208  extern void gc_init(environment *env)
208            env->gc_ref->item->content.ptr= titem->next;            env->gc_ref->item->content.ptr= titem->next;
209            free(titem);            free(titem);
210          }          }
         break;  
211        default:        default:
         break;  
212        }        }
213        free(env->gc_ref->item);  /* Remove from gc_ref */        free(env->gc_ref->item);  /* Remove from gc_ref */
214        titem= env->gc_ref->next;        titem= env->gc_ref->next;
215        free(env->gc_ref);        /* Remove value */        free(env->gc_ref);        /* Remove value */
216        env->gc_ref= titem;        env->gc_ref= titem;
217      } else {                    /* Keep values */        continue;
       titem= env->gc_ref->next;  
       env->gc_ref->next= new_head;  
       new_head= env->gc_ref;  
       env->gc_ref= titem;  
       env->gc_count++;  
218      }      }
219        
220        /* Keep values */
221        titem= env->gc_ref->next;
222        env->gc_ref->next= new_head;
223        new_head= env->gc_ref;
224        new_head->item->gc_garb= 1;
225        env->gc_ref= titem;
226        env->gc_count++;
227    }    }
228    
229    env->gc_limit= env->gc_count*2;    env->gc_limit= env->gc_count*2;

Legend:
Removed from v.1.96  
changed lines
  Added in v.1.97

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26