symbolOop SymbolTable::lookup(int index, const char* name, int len, unsigned int hash) { for (HashtableEntry* e = bucket(index); e != NULL; e = e->next()) { if (e->hash() == hash) { symbolOop sym = symbolOop(e->literal()); if (sym->equals(name, len)) { return sym; } } } return NULL; }
Symbol* SymbolTable::lookup(int index, const char* name, int len, unsigned int hash) { int count = 0; for (HashtableEntry<Symbol*, mtSymbol>* e = bucket(index); e != NULL; e = e->next()) { count++; // count all entries in this bucket, not just ones with same hash if (e->hash() == hash) { Symbol* sym = e->literal(); if (sym->equals(name, len)) { // something is referencing this symbol now. sym->increment_refcount(); return sym; } } } // If the bucket size is too deep check if this hash code is insufficient. if (count >= BasicHashtable<mtSymbol>::rehash_count && !needs_rehashing()) { _needs_rehashing = check_rehash_table(count); } return NULL; }