Index: hash.c =================================================================== RCS file: /cvs/public/parrot/hash.c,v retrieving revision 1.19 diff -u -r1.19 hash.c --- hash.c 7 Aug 2002 20:27:53 -0000 1.19 +++ hash.c 13 Aug 2002 03:30:56 -0000 @@ -126,8 +126,14 @@ HashIndex i; buffer_lives((Buffer *)hash); - buffer_lives(hash->bucket_pool); - + if(hash->bucket_pool){ + buffer_lives(hash->bucket_pool); + } + + if (hash->buffer.bufstart == NULL) { + return end_of_used_list; + } + for (i = 0; i <= hash->max_chain; i++) { HASHBUCKET *bucket = lookupBucket(hash, i); while (bucket) { @@ -281,10 +287,12 @@ return NULL; } -HASH * -new_hash(Interp *interpreter) +void +new_hash(Interp *interpreter, HASH **hash_ptr) { HASH *hash = (HASH *)new_bufferlike_header(interpreter, sizeof(*hash)); + *hash_ptr = hash; + /* hash->buffer.flags |= BUFFER_report_FLAG; */ /* We rely on the fact that expand_hash() will be called before @@ -295,11 +303,13 @@ hash->max_chain = (HashIndex) -1; hash->entries = 0; + + /* Ensure mark_hash doesn't try to mark the buffer live */ + hash->bucket_pool = NULL; hash->bucket_pool = new_buffer_header(interpreter); /* hash->bucket_pool->flags |= BUFFER_report_FLAG; */ hash->free_list = NULLBucketIndex; expand_hash(interpreter, hash); - return hash; } /*=for api key hash_size @@ -412,9 +422,10 @@ HASH * hash_clone(struct Parrot_Interp * interp, HASH * hash) { - HASH * ret = new_hash(interp); + HASH *ret; BucketIndex* table = (BucketIndex*) hash->buffer.bufstart; BucketIndex i; + new_hash(interp, &ret); for (i = 0; i <= hash->max_chain; i++) { HASHBUCKET * b = lookupBucket(hash, i); while (b) { Index: classes/perlhash.pmc =================================================================== RCS file: /cvs/public/parrot/classes/perlhash.pmc,v retrieving revision 1.25 diff -u -r1.25 perlhash.pmc --- classes/perlhash.pmc 12 Aug 2002 07:47:06 -0000 1.25 +++ classes/perlhash.pmc 13 Aug 2002 03:30:57 -0000 @@ -61,7 +61,7 @@ undef->flags |= PMC_constant_FLAG; } SELF->flags |= PMC_custom_mark_FLAG; - SELF->data = new_hash(INTERP); + new_hash(INTERP, (HASH **)&SELF->data); } /* The end of used parameter is passed into the mark_used function of Index: include/parrot/hash.h =================================================================== RCS file: /cvs/public/parrot/include/parrot/hash.h,v retrieving revision 1.6 diff -u -r1.6 hash.h --- include/parrot/hash.h 7 Aug 2002 19:02:06 -0000 1.6 +++ include/parrot/hash.h 13 Aug 2002 03:30:57 -0000 @@ -20,7 +20,7 @@ /* HASH is really a hashtable, but 'hash' is standard perl nomenclature. */ typedef struct _hash HASH; -HASH *new_hash(Interp * interpreter); +void new_hash(Interp * interpreter, HASH **hash_ptr); HASH *hash_clone(Interp * interpreter, HASH * hash); INTVAL hash_size(Interp * interpreter, HASH *hash); void hash_set_size(Interp * interpreter, HASH *hash, UINTVAL size);