Index: src/scanner.h |
diff --git a/src/scanner.h b/src/scanner.h |
index 387d3319c167c014177499e90698047e2b4364ae..d02909e213616af30eedbc46e016078ee2dca4b8 100644 |
--- a/src/scanner.h |
+++ b/src/scanner.h |
@@ -350,6 +350,8 @@ class Scanner { |
int end_pos; |
}; |
+ enum Mode { None, TemplateLiteral }; |
+ |
// -1 is outside of the range of any real source code. |
static const int kNoOctalLocation = -1; |
@@ -358,7 +360,7 @@ class Scanner { |
void Initialize(Utf16CharacterStream* source); |
// Returns the next token and advances input. |
- Token::Value Next(); |
+ Token::Value Next(Mode mode = None); |
arv (Not doing code reviews)
2014/10/27 18:14:06
I'm not sure you want to use a mode here. Once you
caitp (gmail)
2014/10/27 20:22:36
Done.
SpiderMonkey uses the mode strategy for thi
|
// Returns the current token again. |
Token::Value current_token() { return current_.token; } |
// Returns the location information for the current token |
@@ -391,7 +393,9 @@ class Scanner { |
} |
const AstRawString* CurrentSymbol(AstValueFactory* ast_value_factory); |
+ const AstRawString* CurrentRawSymbol(AstValueFactory* ast_value_factory); |
const AstRawString* NextSymbol(AstValueFactory* ast_value_factory); |
+ const AstRawString* NextRawSymbol(AstValueFactory* ast_value_factory); |
double DoubleValue(); |
bool LiteralMatches(const char* data, int length, bool allow_escapes = true) { |
@@ -458,6 +462,8 @@ class Scanner { |
void SetHarmonyClasses(bool classes) { |
harmony_classes_ = classes; |
} |
+ bool HarmonyTemplates() const { return harmony_templates_; } |
+ void SetHarmonyTemplates(bool templates) { harmony_templates_ = templates; } |
// Returns true if there was a line terminator before the peek'ed token, |
// possibly inside a multi-line comment. |
@@ -486,12 +492,13 @@ class Scanner { |
Token::Value token; |
Location location; |
LiteralBuffer* literal_chars; |
+ LiteralBuffer* raw_literal_chars; |
}; |
static const int kCharacterLookaheadBufferSize = 1; |
// Scans octal escape sequence. Also accepts "\0" decimal escape sequence. |
- uc32 ScanOctalEscape(uc32 c, int length); |
+ uc32 ScanOctalEscape(uc32 c, int length, bool recordRaw = false); |
// Call this after setting source_ to the input. |
void Init() { |
@@ -500,14 +507,19 @@ class Scanner { |
Advance(); |
// Initialize current_ to not refer to a literal. |
current_.literal_chars = NULL; |
+ current_.raw_literal_chars = NULL; |
} |
// Literal buffer support |
inline void StartLiteral() { |
LiteralBuffer* free_buffer = (current_.literal_chars == &literal_buffer1_) ? |
&literal_buffer2_ : &literal_buffer1_; |
+ LiteralBuffer* raw_buffer = (current_.raw_literal_chars == &raw_buffer1_) |
+ ? &raw_buffer2_ |
+ : &raw_buffer1_; |
free_buffer->Reset(); |
next_.literal_chars = free_buffer; |
+ next_.raw_literal_chars = raw_buffer; |
} |
INLINE(void AddLiteralChar(uc32 c)) { |
@@ -515,6 +527,11 @@ class Scanner { |
next_.literal_chars->AddChar(c); |
} |
+ INLINE(void AddRawLiteralChar(uc32 c)) { |
+ DCHECK_NOT_NULL(next_.raw_literal_chars); |
+ next_.raw_literal_chars->AddChar(c); |
+ } |
+ |
// Complete scanning of a literal. |
inline void TerminateLiteral() { |
// Does nothing in the current implementation. |
@@ -583,10 +600,22 @@ class Scanner { |
DCHECK_NOT_NULL(current_.literal_chars); |
return current_.literal_chars->two_byte_literal(); |
} |
+ Vector<const uint8_t> raw_one_byte_string() { |
+ DCHECK_NOT_NULL(current_.raw_literal_chars); |
+ return current_.raw_literal_chars->one_byte_literal(); |
+ } |
+ Vector<const uint16_t> raw_two_byte_string() { |
+ DCHECK_NOT_NULL(current_.raw_literal_chars); |
+ return current_.raw_literal_chars->two_byte_literal(); |
+ } |
bool is_literal_one_byte() { |
DCHECK_NOT_NULL(current_.literal_chars); |
return current_.literal_chars->is_one_byte(); |
} |
+ bool is_raw_one_byte() { |
+ DCHECK_NOT_NULL(current_.raw_literal_chars); |
+ return current_.raw_literal_chars->is_one_byte(); |
+ } |
int literal_length() const { |
DCHECK_NOT_NULL(current_.literal_chars); |
return current_.literal_chars->length(); |
@@ -601,19 +630,31 @@ class Scanner { |
DCHECK_NOT_NULL(next_.literal_chars); |
return next_.literal_chars->two_byte_literal(); |
} |
+ Vector<const uint8_t> next_raw_one_byte_string() { |
+ DCHECK_NOT_NULL(next_.raw_literal_chars); |
+ return next_.raw_literal_chars->one_byte_literal(); |
+ } |
+ Vector<const uint16_t> next_raw_two_byte_string() { |
+ DCHECK_NOT_NULL(next_.raw_literal_chars); |
+ return next_.raw_literal_chars->two_byte_literal(); |
+ } |
bool is_next_literal_one_byte() { |
DCHECK_NOT_NULL(next_.literal_chars); |
return next_.literal_chars->is_one_byte(); |
} |
+ bool is_next_raw_one_byte() { |
+ DCHECK_NOT_NULL(next_.raw_literal_chars); |
+ return next_.raw_literal_chars->is_one_byte(); |
+ } |
int next_literal_length() const { |
DCHECK_NOT_NULL(next_.literal_chars); |
return next_.literal_chars->length(); |
} |
- uc32 ScanHexNumber(int expected_length); |
+ uc32 ScanHexNumber(int expected_length, bool recordRaw = false); |
// Scans a single JavaScript token. |
- void Scan(); |
+ void Scan(Mode mode = None); |
bool SkipWhiteSpace(); |
Token::Value SkipSingleLineComment(); |
@@ -629,11 +670,12 @@ class Scanner { |
Token::Value ScanIdentifierSuffix(LiteralScope* literal); |
Token::Value ScanString(); |
+ Token::Value ScanTemplateSpan(); |
// Scans an escape-sequence which is part of a string and adds the |
// decoded character to the current literal. Returns true if a pattern |
// is scanned. |
- bool ScanEscape(); |
+ bool ScanEscape(bool recordRaw = false); |
// Decodes a Unicode escape-sequence which is part of an identifier. |
// If the escape sequence cannot be decoded the result is kBadChar. |
uc32 ScanIdentifierUnicodeEscape(); |
@@ -653,6 +695,10 @@ class Scanner { |
LiteralBuffer literal_buffer1_; |
LiteralBuffer literal_buffer2_; |
+ // Buffer to store raw string values |
+ LiteralBuffer raw_buffer1_; |
+ LiteralBuffer raw_buffer2_; |
+ |
// Values parsed from magic comments. |
LiteralBuffer source_url_; |
LiteralBuffer source_mapping_url_; |
@@ -685,6 +731,8 @@ class Scanner { |
bool harmony_numeric_literals_; |
// Whether we scan 'class', 'extends', 'static' and 'super' as keywords. |
bool harmony_classes_; |
+ // Whether we scan TEMPLATE_SPAN and TEMPLATE_TAIL |
+ bool harmony_templates_; |
}; |
} } // namespace v8::internal |