Chromium Code Reviews| Index: src/scanner.cc |
| diff --git a/src/scanner.cc b/src/scanner.cc |
| index 0265a8fa7810a797361e202f05dfd5ff045d11d1..edf59d64b433d1365f99761eab69630a2bfa59c8 100644 |
| --- a/src/scanner.cc |
| +++ b/src/scanner.cc |
| @@ -18,6 +18,15 @@ |
| namespace v8 { |
| namespace internal { |
| + |
| +Handle<String> LiteralBuffer::Internalize(Isolate* isolate) const { |
| + if (is_one_byte()) { |
| + return isolate->factory()->InternalizeOneByteString(one_byte_literal()); |
| + } |
| + return isolate->factory()->InternalizeTwoByteString(two_byte_literal()); |
| +} |
| + |
| + |
| // ---------------------------------------------------------------------------- |
| // Scanner |
| @@ -294,6 +303,52 @@ Token::Value Scanner::SkipSingleLineComment() { |
| } |
| +Token::Value Scanner::SkipMagicComment() { |
| + TryToParseMagicComment(); |
| + while (c0_ >= 0 && !unicode_cache_->IsLineTerminator(c0_)) { |
| + Advance(); |
| + } |
| + |
| + return Token::WHITESPACE; |
| +} |
| + |
| + |
| +void Scanner::TryToParseMagicComment() { |
| + // Magic comments are of the form: //[#@]\s<name>=\s*<value>\s*.* and this |
| + // function will just return if it cannot parse a magic comment. |
| + if (!unicode_cache_->IsWhiteSpace(c0_)) |
| + return; |
| + Advance(); |
| + LiteralBuffer name; |
| + while (c0_ >= 0 && !unicode_cache_->IsWhiteSpaceOrLineTerminator(c0_) && |
| + c0_ != '=') { |
| + name.AddChar(c0_); |
| + Advance(); |
| + } |
| + if (!name.is_one_byte()) return; |
| + Vector<const uint8_t> name_literal = name.one_byte_literal(); |
| + LiteralBuffer* value; |
| + if (name_literal.IsEqualTo(STATIC_ASCII_VECTOR("sourceURL"))) { |
| + value = &source_url_; |
| + } else if (name_literal.IsEqualTo(STATIC_ASCII_VECTOR("sourceMappingURL"))) { |
| + value = &source_mapping_url_; |
| + } else { |
| + return; |
| + } |
| + if (c0_ != '=') |
| + return; |
| + Advance(); |
| + value->Reset(); |
| + while (c0_ >= 0 && unicode_cache_->IsWhiteSpace(c0_)) { |
| + Advance(); |
| + } |
| + while (c0_ >= 0 && !unicode_cache_->IsWhiteSpaceOrLineTerminator(c0_)) { |
|
yurys
2014/06/10 14:41:04
This will stop at first whitepace while ContentSea
yurys
2014/06/10 14:46:53
As Vsevolod pointed out sourceURLs that contain wh
|
| + value->AddChar(c0_); |
| + Advance(); |
| + } |
| +} |
| + |
| + |
| Token::Value Scanner::SkipMultiLineComment() { |
| ASSERT(c0_ == '*'); |
| Advance(); |
| @@ -458,7 +513,14 @@ void Scanner::Scan() { |
| // / // /* /= |
| Advance(); |
| if (c0_ == '/') { |
| - token = SkipSingleLineComment(); |
| + Advance(); |
| + if (c0_ == '@' || c0_ == '#') { |
| + Advance(); |
| + token = SkipMagicComment(); |
| + } else { |
| + PushBack(c0_); |
| + token = SkipSingleLineComment(); |
| + } |
| } else if (c0_ == '*') { |
| token = SkipMultiLineComment(); |
| } else if (c0_ == '=') { |
| @@ -1106,13 +1168,7 @@ Handle<String> Scanner::AllocateNextLiteralString(Isolate* isolate, |
| Handle<String> Scanner::AllocateInternalizedString(Isolate* isolate) { |
| - if (is_literal_one_byte()) { |
| - return isolate->factory()->InternalizeOneByteString( |
| - literal_one_byte_string()); |
| - } else { |
| - return isolate->factory()->InternalizeTwoByteString( |
| - literal_two_byte_string()); |
| - } |
| + return current_.literal_chars->Internalize(isolate); |
| } |