/[gcl]/gcl/o/sgbc.c
ViewVC logotype

Diff of /gcl/o/sgbc.c

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

revision 1.25 by camm, Sat Apr 9 13:59:23 2005 UTC revision 1.26 by camm, Fri Jun 10 15:13:53 2005 UTC
# Line 59  int gclmprotect ( void *addr, size_t len Line 59  int gclmprotect ( void *addr, size_t len
59    
60    
61  #define sgc_mark_pack_list(u)      \  #define sgc_mark_pack_list(u)      \
62  do {register object xtmp = u;  \  do {object xtmp = u;  \
63   while (xtmp != Cnil) \   while (xtmp != Cnil) \
64     {if (ON_WRITABLE_PAGE(xtmp)) xtmp->d.m = TRUE; \     {if (ON_WRITABLE_PAGE(xtmp)) {mark(xtmp);} \
65       sgc_mark_object(xtmp->c.c_car); \       sgc_mark_object(xtmp->c.c_car); \
66      xtmp=xtmp->c.c_cdr;}}while(0)      xtmp=Scdr(xtmp);}}while(0)
67    
68    
69  #ifdef SDEBUG  #ifdef SDEBUG
# Line 72  joe1(){;} Line 72  joe1(){;}
72  joe() {;}      joe() {;}    
73  #endif  #endif
74    
75    static void *mcsh,*mcsl;
76    
77  static void  static void
78  sgc_mark_cons(object x) {  sgc_mark_cons(object x) {
79        
80    cs_check(x);    cs_check(x);
81        
82    #if CSTACK_DIRECTION == -1
83      if (mcsl>(void *)&x)
84    #else
85      if (mcsl<(void *)&x)
86    #endif
87        mcsl=&x;
88    
89    /*  x is already marked.  */    /*  x is already marked.  */
90        
91   BEGIN:   BEGIN:
# Line 89  sgc_mark_cons(object x) { Line 98  sgc_mark_cons(object x) {
98    goto MARK_CDR;    goto MARK_CDR;
99        
100   MARK_CAR:   MARK_CAR:
101    if (x->c.c_car->c.m ==0) {    if (!is_marked_or_free(x->c.c_car)) {
102      if (type_of(x->c.c_car) == t_cons) {      if (type_of(x->c.c_car) == t_cons) {
103        x->c.c_car->c.m = TRUE;        mark(x->c.c_car);
104        sgc_mark_cons(x->c.c_car);        sgc_mark_cons(x->c.c_car);
105      } else      } else
106        sgc_mark_object1(x->c.c_car);}        sgc_mark_object1(x->c.c_car);}
107   MARK_CDR:     MARK_CDR:  
108  #endif  #endif
109    x = x->c.c_cdr;    if (is_imm_fixnum(x->c.c_cdr)) return;
110      x = Scdr(x);
111    IF_WRITABLE(x, goto WRITABLE_CDR;);    IF_WRITABLE(x, goto WRITABLE_CDR;);
112    return;    return;
113   WRITABLE_CDR:   WRITABLE_CDR:
114    if (x->d.m) return;    if (is_marked_or_free(x)) return;
115    if (type_of(x) == t_cons) {    if (type_of(x) == t_cons) {
116      x->c.m = TRUE;      mark(x);
117      goto BEGIN;      goto BEGIN;
118    }    }
119    sgc_mark_object1(x);    sgc_mark_object1(x);
# Line 125  sgc_mark_cons(object x) { Line 135  sgc_mark_cons(object x) {
135  static void  static void
136  sgc_mark_object1(object x) {  sgc_mark_object1(object x) {
137    
138    long i;    fixnum i,j;
   int j;  
139    object *p;    object *p;
140    char *cp;    char *cp;
141        
142    cs_check(x);    cs_check(x);
143    #if CSTACK_DIRECTION == -1
144      if (mcsl>(void *)&cp)
145    #else
146      if (mcsl<(void *)&cp)
147    #endif
148        mcsl=&cp;
149    
150   BEGIN:   BEGIN:
151  #ifdef SDEBUG  #ifdef SDEBUG
152    if (x == OBJNULL || !ON_WRITABLE_PAGE(x))    if (x == OBJNULL || !ON_WRITABLE_PAGE(x))
# Line 139  sgc_mark_object1(object x) { Line 155  sgc_mark_object1(object x) {
155    joe();    joe();
156   OK:   OK:
157  #endif  #endif
158    if (x->d.m)    if (is_marked_or_free(x))
159      return;      return;
160  #ifdef SDEBUG  #ifdef SDEBUG
161    if(x==sdebug) joe1();    if(x==sdebug) joe1();
# Line 151  sgc_mark_object1(object x) { Line 167  sgc_mark_object1(object x) {
167       always fail on x that satisfy (NULL_OR_ON_C_STACK(x))       always fail on x that satisfy (NULL_OR_ON_C_STACK(x))
168    */    */
169        
170    x->d.m = TRUE;    mark(x);
171    switch (type_of(x)) {    switch (type_of(x)) {
172    case t_fixnum:    case t_fixnum:
173      break;      break;
# Line 159  sgc_mark_object1(object x) { Line 175  sgc_mark_object1(object x) {
175    case t_ratio:    case t_ratio:
176      sgc_mark_object(x->rat.rat_num);      sgc_mark_object(x->rat.rat_num);
177      x = x->rat.rat_den;      x = x->rat.rat_den;
178      IF_WRITABLE(x,if(x->d.m==0) goto BEGIN);      IF_WRITABLE(x,if(!is_marked_or_free(x)) goto BEGIN);
179            
180    case t_shortfloat:    case t_shortfloat:
181      break;      break;
# Line 170  sgc_mark_object1(object x) { Line 186  sgc_mark_object1(object x) {
186    case t_complex:    case t_complex:
187      sgc_mark_object(x->cmp.cmp_imag);      sgc_mark_object(x->cmp.cmp_imag);
188      x = x->cmp.cmp_real;      x = x->cmp.cmp_real;
189      IF_WRITABLE(x,if(x->d.m==0) goto BEGIN);      IF_WRITABLE(x,if(!is_marked_or_free(x)) goto BEGIN);
190            
191    case t_character:    case t_character:
192      break;      break;
193            
194    case t_symbol:    case t_symbol:
195      IF_WRITABLE(x->s.s_plist,if(x->s.s_plist->d.m==0)      IF_WRITABLE(x->s.s_plist,if(!is_marked_or_free(x->s.s_plist))
196      {x->s.s_plist->d.m=TRUE;      {mark(x->s.s_plist);
197      sgc_mark_cons(x->s.s_plist);});      sgc_mark_cons(x->s.s_plist);});
198      sgc_mark_object(x->s.s_gfdef);      sgc_mark_object(x->s.s_gfdef);
199      sgc_mark_object(x->s.s_dbind);      sgc_mark_object(x->s.s_dbind);
# Line 249  sgc_mark_object1(object x) { Line 265  sgc_mark_object1(object x) {
265        if (inheap(x->a.a_dims)) {        if (inheap(x->a.a_dims)) {
266          if (what_to_collect == t_contiguous)          if (what_to_collect == t_contiguous)
267            mark_contblock((char *)(x->a.a_dims),            mark_contblock((char *)(x->a.a_dims),
268                           sizeof(int)*x->a.a_rank);                           sizeof(fixnum)*x->a.a_rank);
269        } else  if(SGC_RELBLOCK_P(x->a.a_dims))        } else  if(SGC_RELBLOCK_P(x->a.a_dims))
270          x->a.a_dims = (int *)          x->a.a_dims = (fixnum *)
271            copy_relblock((char *)(x->a.a_dims),            copy_relblock((char *)(x->a.a_dims),
272                          sizeof(int)*x->a.a_rank);                          sizeof(fixnum)*x->a.a_rank);
273      }      }
274      if ((enum aelttype)x->a.a_elttype == aet_ch)      if ((enum aelttype)x->a.a_elttype == aet_ch)
275        goto CASE_STRING;        goto CASE_STRING;
# Line 338  sgc_mark_object1(object x) { Line 354  sgc_mark_object1(object x) {
354      if (type_map[page(x->big.big_self)] < t_contiguous)      if (type_map[page(x->big.big_self)] < t_contiguous)
355          printf("bad body for %x (%x)\n",x,cp);          printf("bad body for %x (%x)\n",x,cp);
356  #endif  #endif
357  #ifndef GMP  /* #ifndef GMP */
358      if ((int)what_to_collect >= (int)t_contiguous) {  /*     if ((int)what_to_collect >= (int)t_contiguous) { */
359        j = x->big.big_length;  /*       j = x->big.big_length; */
360        cp = (char *)x->big.big_self;  /*       cp = (char *)x->big.big_self; */
361        if (cp == NULL)  /*       if (cp == NULL) */
362          break;  /*      break; */
363        if  (j != lg(MP(x))  &&  /*       if  (j != lg(MP(x))  && */
364             /* we don't bother to zero this register,             /* we don't bother to zero this register,
365                and its contents may get over written */                and its contents may get over written */
366             ! (x ==  big_register_1 &&  /*         ! (x ==  big_register_1 && */
367                (int)(cp) <= top &&  /*            (int)(cp) <= top && */
368                (int) cp >= bot))  /*            (int) cp >= bot)) */
369                    
370          printf("bad length 0x%x ",x);  /*      printf("bad length 0x%x ",x); */
371        j = j * sizeof(int);  /*       j = j * sizeof(int); */
372                
373        if (inheap(cp)) {  /*       if (inheap(cp)) { */
374          if (what_to_collect == t_contiguous)  /*      if (what_to_collect == t_contiguous) */
375            mark_contblock(cp, j);  /*        mark_contblock(cp, j); */
376        } else {  /*       } else { */
377          if (SGC_RELBLOCK_P(cp))  /*      if (SGC_RELBLOCK_P(cp)) */
378            x->big.big_self = (plong *)copy_relblock(cp, j);}}  /*        x->big.big_self = (plong *)copy_relblock(cp, j);}} */
379  #endif /* no gmp */  /* #endif */ /* no gmp */
380  #ifndef GMP_USE_MALLOC  #ifndef GMP_USE_MALLOC
381      if ((int)what_to_collect >= (int)t_contiguous) {      if ((int)what_to_collect >= (int)t_contiguous) {
382        j = MP_ALLOCATED(x);        j = MP_ALLOCATED(x);
383        cp = (char *)MP_SELF(x);        cp = (char *)MP_SELF(x);
384        if (cp == 0)        if (cp == 0)
385          break;          break;
386  #ifdef PARI  /* #ifdef PARI */
387        if (j != lg(MP(x))  &&  /*       if (j != lg(MP(x))  && */
388            /* we don't bother to zero this register,            /* we don't bother to zero this register,
389               and its contents may get over written */               and its contents may get over written */
390            ! (x == big_register_1 &&  /*        ! (x == big_register_1 && */
391               (int)(cp) <= top &&  /*           (int)(cp) <= top && */
392               (int) cp >= bot))  /*           (int) cp >= bot)) */
393          printf("bad length 0x%x ",x);  /*      printf("bad length 0x%x ",x); */
394  #endif  /* #endif */
395        j = j * MP_LIMB_SIZE;        j = j * MP_LIMB_SIZE;
396        if (inheap(cp)) {        if (inheap(cp)) {
397          if (what_to_collect == t_contiguous)          if (what_to_collect == t_contiguous)
# Line 420  sgc_mark_object1(object x) { Line 436  sgc_mark_object1(object x) {
436      /* We make bitvectors multiple of sizeof(int) in size allocated      /* We make bitvectors multiple of sizeof(int) in size allocated
437         Assume 8 = number of bits in char */         Assume 8 = number of bits in char */
438            
439  #define W_SIZE (8*sizeof(int))      j= sizeof(fixnum) *
     j= sizeof(int) *  
440        ((BV_OFFSET(x) + x->bv.bv_dim + W_SIZE -1)/W_SIZE);        ((BV_OFFSET(x) + x->bv.bv_dim + W_SIZE -1)/W_SIZE);
441      cp = x->bv.bv_self;      cp = x->bv.bv_self;
442      if (cp == NULL)      if (cp == NULL)
# Line 508  sgc_mark_object1(object x) { Line 523  sgc_mark_object1(object x) {
523      }      }
524      break;      break;
525            
526        /*FIXME: centralize this*/
527        /*FIXME: SGC_CONTBLOCK_P? */
528    #define SGC_MARK_CP(a_,b_) {fixnum _t=(b_);if (inheap((a_))) {\
529                                  if (what_to_collect == t_contiguous) mark_contblock((void *)(a_),_t);\
530                               } else if (SGC_RELBLOCK_P((a_))) (a_)=(void *)copy_relblock((void *)(a_),_t);}
531    
532    #define SGC_MARK_MP(a_) {if ((a_)->_mp_d) \
533                               SGC_MARK_CP((a_)->_mp_d,(a_)->_mp_alloc*MP_LIMB_SIZE);}
534    
535    case t_random:    case t_random:
536        if ((int)what_to_collect >= (int)t_contiguous) {
537          SGC_MARK_MP(x->rnd.rnd_state._mp_seed);
538          if (x->rnd.rnd_state._mp_algdata._mp_lc) {
539            SGC_MARK_MP(x->rnd.rnd_state._mp_algdata._mp_lc->_mp_a);
540            if (!x->rnd.rnd_state._mp_algdata._mp_lc->_mp_m2exp) SGC_MARK_MP(x->rnd.rnd_state._mp_algdata._mp_lc->_mp_m);
541            SGC_MARK_CP(x->rnd.rnd_state._mp_algdata._mp_lc,sizeof(*x->rnd.rnd_state._mp_algdata._mp_lc));
542          }
543        }
544      break;      break;
545            
546    case t_readtable:    case t_readtable:
# Line 567  sgc_mark_object1(object x) { Line 599  sgc_mark_object1(object x) {
599        break;        break;
600      if (what_to_collect == t_contiguous) {      if (what_to_collect == t_contiguous) {
601        if (!MAYBE_DATA_P((x->cfd.cfd_start)) ||        if (!MAYBE_DATA_P((x->cfd.cfd_start)) ||
602            get_mark_bit((int *)(x->cfd.cfd_start)))            get_mark_bit(x->cfd.cfd_start))
603          break;          break;
604        mark_contblock(x->cfd.cfd_start, x->cfd.cfd_size);        mark_contblock(x->cfd.cfd_start, x->cfd.cfd_size);
605      }      }
# Line 576  sgc_mark_object1(object x) { Line 608  sgc_mark_object1(object x) {
608      sgc_mark_object(x->cc.cc_name);      sgc_mark_object(x->cc.cc_name);
609      sgc_mark_object(x->cc.cc_env);      sgc_mark_object(x->cc.cc_env);
610      sgc_mark_object(x->cc.cc_data);      sgc_mark_object(x->cc.cc_data);
611        if (x->cc.cc_turbo!=NULL) sgc_mark_object(*(x->cc.cc_turbo-1));
612      if (what_to_collect == t_contiguous) {      if (what_to_collect == t_contiguous) {
613        if (x->cc.cc_turbo != NULL)        if (x->cc.cc_turbo != NULL)
614          mark_contblock((char *)(x->cc.cc_turbo-1),          mark_contblock((char *)(x->cc.cc_turbo-1),
# Line 599  sgc_mark_object1(object x) { Line 632  sgc_mark_object1(object x) {
632  static void  static void
633  sgc_mark_stack_carefully(void *topv, void *bottomv, int offset) {  sgc_mark_stack_carefully(void *topv, void *bottomv, int offset) {
634        
635    long m,pageoffset;    long pageoffset;
636    unsigned long p;    unsigned long p;
637    object x;    object x;
638    struct typemanager *tm;    struct typemanager *tm;
# Line 628  sgc_mark_stack_carefully(void *topv, voi Line 661  sgc_mark_stack_carefully(void *topv, voi
661           ((pageoffset=((char *)*j - pagetochar(p))) %           ((pageoffset=((char *)*j - pagetochar(p))) %
662            tm->tm_size));            tm->tm_size));
663        if ((pageoffset <  (tm->tm_size * tm->tm_nppage))        if ((pageoffset <  (tm->tm_size * tm->tm_nppage))
664            && (m=x->d.m) != FREE) {            && !is_marked_or_free(x)) {
         if (m==TRUE) continue;  
         if (m!=0) {  
           fprintf(stdout,  
                   "**bad value %ld of d.m in gbc page %ld skipping mark**"  
                   ,m,p);fflush(stdout);  
           continue;  
         }  
665          sgc_mark_object(x);          sgc_mark_object(x);
666        }        }
667      }      }
# Line 673  sgc_mark_phase(void) { Line 699  sgc_mark_phase(void) {
699            object x = (object) p;            object x = (object) p;
700            if (SGC_OR_M(x))            if (SGC_OR_M(x))
701              continue;              continue;
702            if (x->d.t==t_cons) {            if (type_of(x)==t_cons) {
703              x->d.m = TRUE;              mark(x);
704              sgc_mark_cons(x);              sgc_mark_cons(x);
705            } else            } else
706              sgc_mark_object1(x);              sgc_mark_object1(x);
# Line 764  sgc_sweep_phase(void) { Line 790  sgc_sweep_phase(void) {
790    STATIC object f;    STATIC object f;
791    int size;    int size;
792        
793    Cnil->s.m = FALSE;    unmark(Cnil);
794    Ct->s.m = FALSE;    unmark(Ct);
795        
796  #ifdef DEBUG  #ifdef DEBUG
797    if (debug)    if (debug)
# Line 808  sgc_sweep_phase(void) { Line 834  sgc_sweep_phase(void) {
834        for (j = tm->tm_nppage; --j >= 0;  p += size) {        for (j = tm->tm_nppage; --j >= 0;  p += size) {
835          x = (object)p;          x = (object)p;
836                    
837          if (x->d.m == FREE)          if (is_free(x))
838            continue;            continue;
839          else if (x->d.m) {          else if (is_marked(x)) {
840            x->d.m = FALSE;            unmark(x);
841            continue;            continue;
842          }          }
843          if(x->d.s == SGC_NORMAL)          if(!is_cons(x) && x->d.s == SGC_NORMAL)
844            continue;            continue;
845                    
846          /* it is ok to free x */          /* it is ok to free x */
847                    
848  #ifdef OLD_DISPLACE  #ifdef OLD_DISPLACE
849          /* old_displace: from might be free, to not */          /* old_displace: from might be free, to not */
850          if(x->d.t >=t_array && x->d.t <= t_bitvector) {          if(type_of(x) >=t_array && type_of(x) <= t_bitvector) {
851            /*                    case t_array:            /*                    case t_array:
852                                  case t_vector:                                  case t_vector:
853                                  case t_string:                                  case t_string:
# Line 841  sgc_sweep_phase(void) { Line 867  sgc_sweep_phase(void) {
867          }          }
868  #endif /* OLD_DISPLACE */  #endif /* OLD_DISPLACE */
869  #ifdef GMP_USE_MALLOC                    #ifdef GMP_USE_MALLOC                  
870          if (x->d.t == t_bignum)          if (type_of(x) == t_bignum)
871            mpz_clear(MP(x));            mpz_clear(MP(x));
872  #endif  #endif
873                    
874          SET_LINK(x,f);          SET_LINK(x,f);
875          x->d.m = FREE;          make_free(x);
876          x->d.s = (int)SGC_RECENT;          if (!is_cons(x)) x->d.s = (int)SGC_RECENT;
877          f = x;          f = x;
878          k++;          k++;
879        }        }
# Line 857  sgc_sweep_phase(void) { Line 883  sgc_sweep_phase(void) {
883      else /*non sgc_page */      else /*non sgc_page */
884        for (j = tm->tm_nppage; --j >= 0;  p += size) {        for (j = tm->tm_nppage; --j >= 0;  p += size) {
885          x = (object)p;          x = (object)p;
886          if (x->d.m == TRUE) x->d.m=FALSE;          if (is_marked(x) && !is_free(x)) {unmark(x);}
887        }        }
888            
889    }    }
# Line 892  sgc_contblock_sweep_phase(void) { Line 918  sgc_contblock_sweep_phase(void) {
918      s = pagetochar(i);      s = pagetochar(i);
919      e = pagetochar(j);      e = pagetochar(j);
920      for (p = s;  p < e;) {      for (p = s;  p < e;) {
921        if (get_mark_bit((int *)p)) {        if (get_mark_bit(p)) {
922          /* SGC cont pages: cont blocks must be no smaller than          /* SGC cont pages: cont blocks must be no smaller than
923             sizeof(struct contblock), and must not have a sweep             sizeof(struct contblock), and must not have a sweep
924             granularity greater than this amount (e.g. CPTR_ALIGN) if             granularity greater than this amount (e.g. CPTR_ALIGN) if
# Line 903  sgc_contblock_sweep_phase(void) { Line 929  sgc_contblock_sweep_phase(void) {
929        }        }
930        q = p + CPTR_ALIGN;        q = p + CPTR_ALIGN;
931        while (q < e) {        while (q < e) {
932          if (!get_mark_bit((int *)q)) {          if (!get_mark_bit(q)) {
933            q += CPTR_ALIGN;            q += CPTR_ALIGN;
934            continue;            continue;
935          }          }
# Line 917  sgc_contblock_sweep_phase(void) { Line 943  sgc_contblock_sweep_phase(void) {
943  #ifdef DEBUG  #ifdef DEBUG
944    if (debug) {    if (debug) {
945      for (cbp = cb_pointer; cbp != NULL; cbp = cbp->cb_link)      for (cbp = cb_pointer; cbp != NULL; cbp = cbp->cb_link)
946        printf("%d-byte contblock\n", cbp->cb_size);        printf("%ld-byte contblock\n", cbp->cb_size);
947      fflush(stdout);      fflush(stdout);
948    }    }
949  #endif  #endif
# Line 1201  memprotect_test_reset(void) { Line 1227  memprotect_test_reset(void) {
1227  #define WSGC(tm) ({long _t=MMAX(MMIN(tm->tm_opt_maxpage,tm->tm_npage),tm->tm_sgc);_t;})  #define WSGC(tm) ({long _t=MMAX(MMIN(tm->tm_opt_maxpage,tm->tm_npage),tm->tm_sgc);_t;})
1228  /* If opt_maxpage is set, add full pages to the sgc set if needed  /* If opt_maxpage is set, add full pages to the sgc set if needed
1229     too. 20040804 CM*/     too. 20040804 CM*/
1230  #define FSGC(tm) (tm->tm_opt_maxpage ? 0 : tm->tm_sgc_minfree)  #define FSGC(tm) (tm->tm_type==t_cons ? tm->tm_nppage : (tm->tm_opt_maxpage ? 0 : tm->tm_sgc_minfree))
1231    
1232  int  int
1233  sgc_start(void) {  sgc_start(void) {
# Line 1463  sgc_start(void) { Line 1489  sgc_start(void) {
1489        while (f!=0) {        while (f!=0) {
1490          next=OBJ_LINK(f);          next=OBJ_LINK(f);
1491  #ifdef SDEBUG          #ifdef SDEBUG        
1492          if (f->d.m!=FREE)          if (!is_free(f))
1493            printf("Not FREE in freelist f=%d",f);            printf("Not FREE in freelist f=%d",f);
1494  #endif  #endif
1495          if (ON_SGC_PAGE(f)) {          if (ON_SGC_PAGE(f)) {
1496            SET_LINK(f,x);            SET_LINK(f,x);
1497            f->d.s = SGC_RECENT;            if (!is_cons(f)) f->d.s = SGC_RECENT;
1498            x=f;            x=f;
1499            count++;            count++;
1500          } else {          } else {
1501            SET_LINK(f,y);            SET_LINK(f,y);
1502            f->d.s = SGC_NORMAL;            if (!is_cons(f)) f->d.s = SGC_NORMAL;
1503            y=f;            y=f;
1504          }          }
1505          f=next;          f=next;
# Line 1580  sgc_quit(void) { Line 1606  sgc_quit(void) {
1606              if (type_map[i]==t && (sgc_type_map[i] & SGC_PAGE_FLAG))              if (type_map[i]==t && (sgc_type_map[i] & SGC_PAGE_FLAG))
1607                for (p= pagetochar(i),j = tm->tm_nppage;                for (p= pagetochar(i),j = tm->tm_nppage;
1608                     j > 0; --j, p += tm->tm_size)                     j > 0; --j, p += tm->tm_size)
1609                  ((object) p)->d.s = SGC_NORMAL;                  if (!is_cons((object)p))  ((object) p)->d.s = SGC_NORMAL;
1610          }          }
1611        }        }
1612      }      }
# Line 1659  memprotect_handler(int sig, long code, v Line 1685  memprotect_handler(int sig, long code, v
1685    INSTALL_MPROTECT_HANDLER;    INSTALL_MPROTECT_HANDLER;
1686  #endif  #endif
1687    
1688    segmentation_catcher(0);    segmentation_catcher(sig,code,scp,addr);
1689    
1690  }  }
1691    

Legend:
Removed from v.1.25  
changed lines
  Added in v.1.26

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26