Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: src/parser.cc

Issue 1027183002: [es6] call ToString() on template substitutions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Test ToString behaviour for tagged templates + String.raw Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ast-value-factory.h ('k') | test/mjsunit/es6/string-raw.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
(...skipping 5460 matching lines...) Expand 10 before | Expand all | Expand 10 after
5471 TemplateLiteral* lit = *state; 5471 TemplateLiteral* lit = *state;
5472 int pos = lit->position(); 5472 int pos = lit->position();
5473 const ZoneList<Expression*>* cooked_strings = lit->cooked(); 5473 const ZoneList<Expression*>* cooked_strings = lit->cooked();
5474 const ZoneList<Expression*>* raw_strings = lit->raw(); 5474 const ZoneList<Expression*>* raw_strings = lit->raw();
5475 const ZoneList<Expression*>* expressions = lit->expressions(); 5475 const ZoneList<Expression*>* expressions = lit->expressions();
5476 DCHECK_EQ(cooked_strings->length(), raw_strings->length()); 5476 DCHECK_EQ(cooked_strings->length(), raw_strings->length());
5477 DCHECK_EQ(cooked_strings->length(), expressions->length() + 1); 5477 DCHECK_EQ(cooked_strings->length(), expressions->length() + 1);
5478 5478
5479 if (!tag) { 5479 if (!tag) {
5480 // Build tree of BinaryOps to simplify code-generation 5480 // Build tree of BinaryOps to simplify code-generation
5481 Expression* expr = NULL; 5481 Expression* expr = cooked_strings->at(0);
5482 int i = 0;
5483 while (i < expressions->length()) {
5484 Expression* sub = expressions->at(i++);
5485 Expression* cooked_str = cooked_strings->at(i);
5482 5486
5483 if (expressions->length() == 0) { 5487 // Let middle be ToString(sub).
5484 // Simple case: treat as string literal 5488 ZoneList<Expression*>* args =
5485 expr = cooked_strings->at(0); 5489 new (zone()) ZoneList<Expression*>(1, zone());
5486 } else { 5490 args->Add(sub, zone());
5487 int i; 5491 Expression* middle = factory()->NewCallRuntime(
5488 Expression* cooked_str = cooked_strings->at(0); 5492 ast_value_factory()->to_string_string(), NULL, args,
5493 sub->position());
5494
5489 expr = factory()->NewBinaryOperation( 5495 expr = factory()->NewBinaryOperation(
5490 Token::ADD, cooked_str, expressions->at(0), cooked_str->position()); 5496 Token::ADD, factory()->NewBinaryOperation(
5491 for (i = 1; i < expressions->length(); ++i) { 5497 Token::ADD, expr, middle, expr->position()),
5492 cooked_str = cooked_strings->at(i); 5498 cooked_str, sub->position());
5493 expr = factory()->NewBinaryOperation(
5494 Token::ADD, expr, factory()->NewBinaryOperation(
5495 Token::ADD, cooked_str, expressions->at(i),
5496 cooked_str->position()),
5497 cooked_str->position());
5498 }
5499 cooked_str = cooked_strings->at(i);
5500 expr = factory()->NewBinaryOperation(Token::ADD, expr, cooked_str,
5501 cooked_str->position());
5502 } 5499 }
5503 return expr; 5500 return expr;
5504 } else { 5501 } else {
5505 uint32_t hash = ComputeTemplateLiteralHash(lit); 5502 uint32_t hash = ComputeTemplateLiteralHash(lit);
5506 5503
5507 int cooked_idx = function_state_->NextMaterializedLiteralIndex(); 5504 int cooked_idx = function_state_->NextMaterializedLiteralIndex();
5508 int raw_idx = function_state_->NextMaterializedLiteralIndex(); 5505 int raw_idx = function_state_->NextMaterializedLiteralIndex();
5509 5506
5510 // GetTemplateCallSite 5507 // GetTemplateCallSite
5511 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(4, zone()); 5508 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(4, zone());
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
5558 } else { 5555 } else {
5559 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); 5556 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data());
5560 running_hash = StringHasher::ComputeRunningHash(running_hash, data, 5557 running_hash = StringHasher::ComputeRunningHash(running_hash, data,
5561 raw_string->length()); 5558 raw_string->length());
5562 } 5559 }
5563 } 5560 }
5564 5561
5565 return running_hash; 5562 return running_hash;
5566 } 5563 }
5567 } } // namespace v8::internal 5564 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ast-value-factory.h ('k') | test/mjsunit/es6/string-raw.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698