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:
parent
c1e7dd83a4
commit
e8db709be1
@ -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,
|
||||
|
105
src/token.cc
105
src/token.cc
@ -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
|
||||
|
@ -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];
|
||||
|
Loading…
Reference in New Issue
Block a user