| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index 08f77b8f304e68e157b72b6796e9c146525599b4..03819eea0192d1fa3ec207c27a5bbebd2e9e0be3 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -323,22 +323,24 @@ TemporaryScope::~TemporaryScope() {
|
| }
|
|
|
|
|
| -Handle<String> Parser::LookupSymbol(int symbol_id,
|
| - Vector<const char> string) {
|
| +Handle<String> Parser::LookupSymbol(int symbol_id) {
|
| // Length of symbol cache is the number of identified symbols.
|
| // If we are larger than that, or negative, it's not a cached symbol.
|
| // This might also happen if there is no preparser symbol data, even
|
| // if there is some preparser data.
|
| if (static_cast<unsigned>(symbol_id)
|
| >= static_cast<unsigned>(symbol_cache_.length())) {
|
| - return Factory::LookupSymbol(string);
|
| + if (scanner().is_literal_ascii()) {
|
| + return Factory::LookupAsciiSymbol(scanner().literal_ascii_string());
|
| + } else {
|
| + return Factory::LookupTwoByteSymbol(scanner().literal_uc16_string());
|
| + }
|
| }
|
| - return LookupCachedSymbol(symbol_id, string);
|
| + return LookupCachedSymbol(symbol_id);
|
| }
|
|
|
|
|
| -Handle<String> Parser::LookupCachedSymbol(int symbol_id,
|
| - Vector<const char> string) {
|
| +Handle<String> Parser::LookupCachedSymbol(int symbol_id) {
|
| // Make sure the cache is large enough to hold the symbol identifier.
|
| if (symbol_cache_.length() <= symbol_id) {
|
| // Increase length to index + 1.
|
| @@ -347,7 +349,11 @@ Handle<String> Parser::LookupCachedSymbol(int symbol_id,
|
| }
|
| Handle<String> result = symbol_cache_.at(symbol_id);
|
| if (result.is_null()) {
|
| - result = Factory::LookupSymbol(string);
|
| + if (scanner().is_literal_ascii()) {
|
| + result = Factory::LookupAsciiSymbol(scanner().literal_ascii_string());
|
| + } else {
|
| + result = Factory::LookupTwoByteSymbol(scanner().literal_uc16_string());
|
| + }
|
| symbol_cache_.at(symbol_id) = result;
|
| return result;
|
| }
|
| @@ -615,11 +621,11 @@ FunctionLiteral* Parser::ParseProgram(Handle<String> source,
|
| // identical calls.
|
| ExternalTwoByteStringUC16CharacterStream stream(
|
| Handle<ExternalTwoByteString>::cast(source), 0, source->length());
|
| - scanner_.Initialize(&stream, JavaScriptScanner::kAllLiterals);
|
| + scanner_.Initialize(&stream);
|
| return DoParseProgram(source, in_global_context, &zone_scope);
|
| } else {
|
| GenericStringUC16CharacterStream stream(source, 0, source->length());
|
| - scanner_.Initialize(&stream, JavaScriptScanner::kAllLiterals);
|
| + scanner_.Initialize(&stream);
|
| return DoParseProgram(source, in_global_context, &zone_scope);
|
| }
|
| }
|
| @@ -705,7 +711,7 @@ FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info) {
|
| FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info,
|
| UC16CharacterStream* source,
|
| ZoneScope* zone_scope) {
|
| - scanner_.Initialize(source, JavaScriptScanner::kAllLiterals);
|
| + scanner_.Initialize(source);
|
| ASSERT(target_stack_ == NULL);
|
|
|
| Handle<String> name(String::cast(info->name()));
|
| @@ -757,7 +763,7 @@ Handle<String> Parser::GetSymbol(bool* ok) {
|
| if (pre_data() != NULL) {
|
| symbol_id = pre_data()->GetSymbolIdentifier();
|
| }
|
| - return LookupSymbol(symbol_id, scanner().literal());
|
| + return LookupSymbol(symbol_id);
|
| }
|
|
|
|
|
| @@ -2715,8 +2721,9 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) {
|
|
|
| case Token::NUMBER: {
|
| Consume(Token::NUMBER);
|
| - double value =
|
| - StringToDouble(scanner().literal(), ALLOW_HEX | ALLOW_OCTALS);
|
| + ASSERT(scanner().is_literal_ascii());
|
| + double value = StringToDouble(scanner().literal_ascii_string(),
|
| + ALLOW_HEX | ALLOW_OCTALS);
|
| result = NewNumberLiteral(value);
|
| break;
|
| }
|
| @@ -3066,8 +3073,9 @@ Expression* Parser::ParseObjectLiteral(bool* ok) {
|
| }
|
| case Token::NUMBER: {
|
| Consume(Token::NUMBER);
|
| - double value =
|
| - StringToDouble(scanner().literal(), ALLOW_HEX | ALLOW_OCTALS);
|
| + ASSERT(scanner().is_literal_ascii());
|
| + double value = StringToDouble(scanner().literal_ascii_string(),
|
| + ALLOW_HEX | ALLOW_OCTALS);
|
| key = NewNumberLiteral(value);
|
| break;
|
| }
|
| @@ -3137,11 +3145,9 @@ Expression* Parser::ParseRegExpLiteral(bool seen_equal, bool* ok) {
|
|
|
| int literal_index = temp_scope_->NextMaterializedLiteralIndex();
|
|
|
| - Handle<String> js_pattern =
|
| - Factory::NewStringFromUtf8(scanner().next_literal(), TENURED);
|
| + Handle<String> js_pattern = NextLiteralString(TENURED);
|
| scanner().ScanRegExpFlags();
|
| - Handle<String> js_flags =
|
| - Factory::NewStringFromUtf8(scanner().next_literal(), TENURED);
|
| + Handle<String> js_flags = NextLiteralString(TENURED);
|
| Next();
|
|
|
| return new RegExpLiteral(js_pattern, js_flags, literal_index);
|
| @@ -3423,10 +3429,10 @@ Handle<String> Parser::ParseIdentifierOrGetOrSet(bool* is_get,
|
| bool* ok) {
|
| Expect(Token::IDENTIFIER, ok);
|
| if (!*ok) return Handle<String>();
|
| - if (scanner().literal_length() == 3) {
|
| - const char* token = scanner().literal_string();
|
| - *is_get = strcmp(token, "get") == 0;
|
| - *is_set = !*is_get && strcmp(token, "set") == 0;
|
| + if (scanner().is_literal_ascii() && scanner().literal_length() == 3) {
|
| + const char* token = scanner().literal_ascii_string().start();
|
| + *is_get = strncmp(token, "get", 3) == 0;
|
| + *is_set = !*is_get && strncmp(token, "set", 3) == 0;
|
| }
|
| return GetSymbol(ok);
|
| }
|
| @@ -3604,9 +3610,11 @@ Handle<String> JsonParser::GetString() {
|
| if (literal_length == 0) {
|
| return Factory::empty_string();
|
| }
|
| - const char* literal_string = scanner_.literal_string();
|
| - Vector<const char> literal(literal_string, literal_length);
|
| - return Factory::NewStringFromUtf8(literal);
|
| + if (scanner_.is_literal_ascii()) {
|
| + return Factory::NewStringFromAscii(scanner_.literal_ascii_string());
|
| + } else {
|
| + return Factory::NewStringFromTwoByte(scanner_.literal_uc16_string());
|
| + }
|
| }
|
|
|
|
|
| @@ -3618,7 +3626,8 @@ Handle<Object> JsonParser::ParseJsonValue() {
|
| return GetString();
|
| }
|
| case Token::NUMBER: {
|
| - double value = StringToDouble(scanner_.literal(),
|
| + ASSERT(scanner_.is_literal_ascii());
|
| + double value = StringToDouble(scanner_.literal_ascii_string(),
|
| NO_FLAGS, // Hex, octal or trailing junk.
|
| OS::nan_value());
|
| return Factory::NewNumber(value);
|
| @@ -4597,10 +4606,9 @@ int ScriptDataImpl::ReadNumber(byte** source) {
|
| // Create a Scanner for the preparser to use as input, and preparse the source.
|
| static ScriptDataImpl* DoPreParse(UC16CharacterStream* source,
|
| bool allow_lazy,
|
| - ParserRecorder* recorder,
|
| - int literal_flags) {
|
| + ParserRecorder* recorder) {
|
| V8JavaScriptScanner scanner;
|
| - scanner.Initialize(source, literal_flags);
|
| + scanner.Initialize(source);
|
| intptr_t stack_limit = StackGuard::real_climit();
|
| if (!preparser::PreParser::PreParseProgram(&scanner,
|
| recorder,
|
| @@ -4628,8 +4636,7 @@ ScriptDataImpl* ParserApi::PartialPreParse(UC16CharacterStream* source,
|
| return NULL;
|
| }
|
| PartialParserRecorder recorder;
|
| - return DoPreParse(source, allow_lazy, &recorder,
|
| - JavaScriptScanner::kNoLiterals);
|
| + return DoPreParse(source, allow_lazy, &recorder);
|
| }
|
|
|
|
|
| @@ -4638,9 +4645,7 @@ ScriptDataImpl* ParserApi::PreParse(UC16CharacterStream* source,
|
| Handle<Script> no_script;
|
| bool allow_lazy = FLAG_lazy && (extension == NULL);
|
| CompleteParserRecorder recorder;
|
| - int kPreParseLiteralsFlags =
|
| - JavaScriptScanner::kLiteralString | JavaScriptScanner::kLiteralIdentifier;
|
| - return DoPreParse(source, allow_lazy, &recorder, kPreParseLiteralsFlags);
|
| + return DoPreParse(source, allow_lazy, &recorder);
|
| }
|
|
|
|
|
|
|