Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index c2d6c5754849a1601b23569e6b1aef8f562a255b..712fdd4f44e8d4e1fd61d6de14bac0be6f013222 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -5295,14 +5295,7 @@ ZoneList<Expression*>* Parser::TemplateRawStrings(const TemplateLiteral* lit, |
raw_strings = new (zone()) ZoneList<Expression*>(total, zone()); |
- int num_hash_chars = (total - 1) * 3; |
- for (int index = 0; index < total; ++index) { |
- // Allow about length * 4 to handle most UTF8 sequences. |
- num_hash_chars += lengths->at(index) * 4; |
- } |
- |
- Vector<uint8_t> hash_string = Vector<uint8_t>::New(num_hash_chars); |
- num_hash_chars = 0; |
+ uint32_t running_hash = 0; |
for (int index = 0; index < total; ++index) { |
int span_start = cooked_strings->at(index)->position() + 1; |
@@ -5311,9 +5304,8 @@ ZoneList<Expression*>* Parser::TemplateRawStrings(const TemplateLiteral* lit, |
int to_index = 0; |
if (index) { |
- hash_string[num_hash_chars++] = '$'; |
- hash_string[num_hash_chars++] = '{'; |
- hash_string[num_hash_chars++] = '}'; |
+ running_hash = StringHasher::ComputeRunningHashOneByte( |
+ running_hash, "${}", 3); |
} |
SmartArrayPointer<char> raw_chars = |
@@ -5330,7 +5322,6 @@ ZoneList<Expression*>* Parser::TemplateRawStrings(const TemplateLiteral* lit, |
++from_index; |
} |
} |
- hash_string[num_hash_chars++] = ch; |
raw_chars[to_index++] = ch; |
} |
@@ -5342,6 +5333,8 @@ ZoneList<Expression*>* Parser::TemplateRawStrings(const TemplateLiteral* lit, |
if (utf16_length > 0) { |
uc16* utf16_buffer = zone()->NewArray<uc16>(utf16_length); |
to_index = decoder->WriteUtf16(utf16_buffer, utf16_length); |
+ running_hash = StringHasher::ComputeRunningHash( |
+ running_hash, utf16_buffer, to_index); |
const uint16_t* data = reinterpret_cast<const uint16_t*>(utf16_buffer); |
const AstRawString* raw_str = ast_value_factory()->GetTwoByteString( |
Vector<const uint16_t>(data, to_index)); |
@@ -5354,11 +5347,10 @@ ZoneList<Expression*>* Parser::TemplateRawStrings(const TemplateLiteral* lit, |
raw_strings->Add(raw_lit, zone()); |
} |
- hash_string.Truncate(num_hash_chars); |
- int utf16_length; |
- *hash = StringHasher::ComputeUtf8Hash(Vector<const char>::cast(hash_string), |
- num_hash_chars, &utf16_length); |
- hash_string.Dispose(); |
+ // Hash key is used exclusively by template call site caching. There are no |
+ // real security implications for unseeded hashes, and no issues with changing |
+ // the hashing algorithm to improve performance or entropy. |
+ *hash = running_hash; |
return raw_strings; |
} |