/* Sun-$Revision: 23.3 $ */ /* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University. See the LICENSE file for license information. */ # pragma interface // The string table (Memory->string_table) holds all canonical strings. // It is implemented as an open hash table with a fixed number of buckets. // A bucket (stringTableEntry) is a union containing either: // NULL => bucket is empty. // stringOop => bucket has one element. // stringTableLink* => bucket has more than one element. // SPACE HACK: // - stringTableLinks are allocated in blocks to reduce the malloc overhead. const int32 string_table_size = 20011; int32 hash(char* name, int32 len); struct stringTableLink { // instance variable stringOop string; stringTableLink* next; // memory operations bool verify(fint i); }; struct stringTableEntry { void* string_or_link; bool is_string() { return oop(string_or_link)->is_mem(); } void clear() { string_or_link = NULL; } stringOop get_string() { return stringOop(string_or_link); } void set_string(stringOop s) { string_or_link = (void*) s; } stringTableLink* get_link() { return (stringTableLink*) string_or_link; } void set_link(stringTableLink* l) { string_or_link = (void*) l; } // memory operations bool verify(fint i); # ifdef UNUSED void deallocate(); #endif fint length(); }; class stringTable: public CHeapObj { private: // instance variables stringTableEntry buckets[string_table_size]; stringTableLink* free_list; stringTableLink* first_free_link; stringTableLink* end_block; public: // constructor stringTable(); // operations stringOop lookup(char* name, int32 len, bool mustAllocate= true); protected: stringOop basic_add(char *name, int32 len, int32 hashValue, bool mustAllocate= true); stringOop basic_add(stringOop s, int32 hashValue); stringTableEntry* bucketFor(int32 hashValue) { assert(hashValue % string_table_size >= 0, "must be positive"); return &buckets[hashValue % string_table_size]; } stringTableEntry* firstBucket() { return &buckets[0]; } stringTableEntry* lastBucket() { return &buckets[string_table_size-1]; } public: void add(stringOop s); // memory operations void switch_pointers(oop from, oop to); void scavenge_contents() {} // nothing to scavenge; all tenured void gc_mark_contents(); void gc_unmark_contents(); void relocate(); void verify(); // snapshot operations void read_snapshot(FILE* file); void write_snapshot(FILE* file); // memory management for stringTableLinks stringTableLink* new_link(stringOop s, stringTableLink* n = NULL); void delete_link(stringTableLink* l); // histogram void print_histogram(); };