Chromium Code Reviews| Index: src/preparser.h |
| diff --git a/src/preparser.h b/src/preparser.h |
| index 847f994efe750fce20afa057c86878c46538f9e2..3b221ac09235654af5ff7fe241b6a507e6839df7 100644 |
| --- a/src/preparser.h |
| +++ b/src/preparser.h |
| @@ -756,6 +756,12 @@ class PreParserExpression { |
| ExpressionTypeField::encode(kCallExpression)); |
| } |
| + static PreParserExpression NoTemplateTag() { |
| + return PreParserExpression(TypeField::encode(kExpression) | |
| + ExpressionTypeField::encode( |
| + kNoTemplateTagExpression)); |
|
arv (Not doing code reviews)
2014/12/11 15:29:38
Is this the formatting `git cl format` gives you?
caitp (gmail)
2014/12/11 16:14:04
clang-formatter doesn't complain about this becaus
|
| + } |
| + |
| bool IsIdentifier() const { |
| return TypeField::decode(code_) == kIdentifierExpression; |
| } |
| @@ -809,6 +815,11 @@ class PreParserExpression { |
| bool IsFunctionLiteral() const { return false; } |
| bool IsCallNew() const { return false; } |
| + bool IsNoTemplateTag() const { |
| + return TypeField::decode(code_) == kExpression && |
| + ExpressionTypeField::decode(code_) == kNoTemplateTagExpression; |
| + } |
| + |
| PreParserExpression AsFunctionLiteral() { return *this; } |
| bool IsBinaryOperation() const { |
| @@ -855,7 +866,8 @@ class PreParserExpression { |
| kThisPropertyExpression, |
| kPropertyExpression, |
| kCallExpression, |
| - kSuperExpression |
| + kSuperExpression, |
| + kNoTemplateTagExpression |
| }; |
| explicit PreParserExpression(uint32_t expression_code) |
| @@ -1398,10 +1410,21 @@ class PreParserTraits { |
| void AddTemplateSpan(TemplateLiteralState*, bool) {} |
| void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} |
| PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, |
| - PreParserExpression) { |
| + PreParserExpression tag) { |
| + if (IsTaggedTemplate(tag)) { |
| + // Emulate generation of array literals for tag callsite |
|
arv (Not doing code reviews)
2014/12/11 15:29:38
This comment goes better with PreParserTraits::Mat
|
| + // 1st is array of cooked strings, second is array of raw strings |
| + MaterializeTemplateCallsiteLiterals(); |
| + } |
| return EmptyExpression(); |
| } |
| - PreParserExpression NoTemplateTag() { return PreParserExpression::Default(); } |
| + inline void MaterializeTemplateCallsiteLiterals(); |
| + PreParserExpression NoTemplateTag() { |
| + return PreParserExpression::NoTemplateTag(); |
| + } |
| + static bool IsTaggedTemplate(const PreParserExpression tag) { |
| + return !tag.IsNoTemplateTag(); |
| + } |
| static AstValueFactory* ast_value_factory() { return NULL; } |
| void CheckConflictingVarDeclarations(PreParserScope scope, bool* ok) {} |
| @@ -1455,7 +1478,7 @@ class PreParser : public ParserBase<PreParserTraits> { |
| // success (even if parsing failed, the pre-parse data successfully |
| // captured the syntax error), and false if a stack-overflow happened |
| // during parsing. |
| - PreParseResult PreParseProgram() { |
| + PreParseResult PreParseProgram(int* materialized_literals = 0) { |
| PreParserScope scope(scope_, SCRIPT_SCOPE); |
| PreParserFactory factory(NULL); |
| FunctionState top_scope(&function_state_, &scope_, &scope, &factory); |
| @@ -1468,6 +1491,9 @@ class PreParser : public ParserBase<PreParserTraits> { |
| } else if (scope_->strict_mode() == STRICT) { |
| CheckOctalLiteral(start_position, scanner()->location().end_pos, &ok); |
| } |
| + if (materialized_literals) { |
| + *materialized_literals = function_state_->materialized_literal_count(); |
| + } |
| return kPreParseSuccess; |
| } |
| @@ -1565,6 +1591,12 @@ class PreParser : public ParserBase<PreParserTraits> { |
| }; |
| +void PreParserTraits::MaterializeTemplateCallsiteLiterals() { |
| + pre_parser_->function_state_->NextMaterializedLiteralIndex(); |
| + pre_parser_->function_state_->NextMaterializedLiteralIndex(); |
| +} |
| + |
| + |
| PreParserStatementList PreParser::ParseEagerFunctionBody( |
| PreParserIdentifier function_name, int pos, Variable* fvar, |
| Token::Value fvar_init_op, bool is_generator, bool* ok) { |