diff --git a/src/gc.c b/src/gc.c index d4e86ada7a6033a4a47a884f92ad3f30d3ba6d47..7b9b2d91203700f9ca32fbffbed006da631fd967 100644 --- a/src/gc.c +++ b/src/gc.c @@ -19,6 +19,7 @@ struct callback *gc_evaluator_callback=0; #include "stuff.h" #include "error.h" #include "pike_memory.h" +#include "pike_macros.h" #include "gc.h" #include "main.h" @@ -251,7 +252,7 @@ void do_gc(void) { static int in_gc = 0; double tmp; - INT32 tmp2; + INT32 tmp2,tmp3; struct marker_chunk *m; if(in_gc) return; @@ -282,12 +283,13 @@ void do_gc(void) /* init hash , hashsize will be a prime between num_objects/8 and * num_objects/4, this will assure that no re-hashing is needed. */ - hashsize=my_log2(num_objects); + tmp3=my_log2(num_objects); - if(!d_flag) hashsize-=2; + if(!d_flag) tmp3-=2; + if(tmp3<0) tmp3=0; + if(tmp3>=(long)NELEM(hashprimes)) tmp3=NELEM(hashprimes)-1; + hashsize=hashprimes[tmp3]; - if(hashsize<0) hashsize=0; - hashsize=hashprimes[hashsize]; hash=(struct marker **)xalloc(sizeof(struct marker **)*hashsize); MEMSET((char *)hash,0,sizeof(struct marker **)*hashsize); markers_left_in_chunk=0;