Removed (now) unused Token-lookup code.

Review URL: http://codereview.chromium.org/361026


git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3223 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
lrn@chromium.org 2009-11-05 10:24:20 +00:00
parent c1e7dd83a4
commit e8db709be1
3 changed files with 1 additions and 117 deletions

View File

@ -329,9 +329,7 @@ void KeywordMatcher::Step(uc32 input) {
// ----------------------------------------------------------------------------
// Scanner
Scanner::Scanner(bool pre) : stack_overflow_(false), is_pre_parsing_(pre) {
Token::Initialize();
}
Scanner::Scanner(bool pre) : stack_overflow_(false), is_pre_parsing_(pre) { }
void Scanner::Init(Handle<String> source, unibrow::CharacterStream* stream,

View File

@ -55,109 +55,4 @@ int8_t Token::precedence_[NUM_TOKENS] = {
#undef T
// A perfect (0 collision) hash table of keyword token values.
// larger N will reduce the number of collisions (power of 2 for fast %)
const unsigned int N = 128;
// make this small since we have <= 256 tokens
static uint8_t Hashtable[N];
static bool IsInitialized = false;
static unsigned int Hash(const char* s) {
// The following constants have been found using trial-and-error. If the
// keyword set changes, they may have to be recomputed (make them flags
// and play with the flag values). Increasing N is the simplest way to
// reduce the number of collisions.
// we must use at least 4 or more chars ('const' and 'continue' share
// 'con')
const unsigned int L = 5;
// smaller S tend to reduce the number of collisions
const unsigned int S = 4;
// make this a prime, or at least an odd number
const unsigned int M = 3;
unsigned int h = 0;
for (unsigned int i = 0; s[i] != '\0' && i < L; i++) {
h += (h << S) + s[i];
}
// unsigned int % by a power of 2 (otherwise this will not be a bit mask)
return h * M % N;
}
Token::Value Token::Lookup(const char* str) {
ASSERT(IsInitialized);
Value k = static_cast<Value>(Hashtable[Hash(str)]);
const char* s = string_[k];
ASSERT(s != NULL || k == IDENTIFIER);
if (s == NULL || strcmp(s, str) == 0) {
return k;
}
return IDENTIFIER;
}
#ifdef DEBUG
// We need this function because C++ doesn't allow the expression
// NULL == NULL, which is a result of macro expansion below. What
// the hell?
static bool IsNull(const char* s) {
return s == NULL;
}
#endif
void Token::Initialize() {
if (IsInitialized) return;
// A list of all keywords, terminated by ILLEGAL.
#define T(name, string, precedence) name,
static Value keyword[] = {
TOKEN_LIST(IGNORE_TOKEN, T, IGNORE_TOKEN)
ILLEGAL
};
#undef T
// Assert that the keyword array contains the 25 keywords, 3 future
// reserved words (const, debugger, and native), and the 3 named literals
// defined by ECMA-262 standard.
ASSERT(ARRAY_SIZE(keyword) == 25 + 3 + 3 + 1); // +1 for ILLEGAL sentinel
// Initialize Hashtable.
ASSERT(NUM_TOKENS <= 256); // Hashtable contains uint8_t elements
for (unsigned int i = 0; i < N; i++) {
Hashtable[i] = IDENTIFIER;
}
// Insert all keywords into Hashtable.
int collisions = 0;
for (int i = 0; keyword[i] != ILLEGAL; i++) {
Value k = keyword[i];
unsigned int h = Hash(string_[k]);
if (Hashtable[h] != IDENTIFIER) collisions++;
Hashtable[h] = k;
}
if (collisions > 0) {
PrintF("%d collisions in keyword hashtable\n", collisions);
FATAL("Fix keyword lookup!");
}
IsInitialized = true;
// Verify hash table.
#define T(name, string, precedence) \
ASSERT(IsNull(string) || Lookup(string) == IDENTIFIER);
#define K(name, string, precedence) \
ASSERT(Lookup(string) == name);
TOKEN_LIST(T, K, IGNORE_TOKEN)
#undef K
#undef T
}
} } // namespace v8::internal

View File

@ -260,15 +260,6 @@ class Token {
return precedence_[tok];
}
// Returns the keyword value if str is a keyword;
// returns IDENTIFIER otherwise. The class must
// have been initialized.
static Value Lookup(const char* str);
// Must be called once to initialize the class.
// Multiple calls are ignored.
static void Initialize();
private:
#ifdef DEBUG
static const char* name_[NUM_TOKENS];