Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 4ddb6c18fc46e28c706c0b229255a2e81fa2a32a..2f2a04980fcfe7f7c1e67f6ba0eee8b9584c3e54 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -15,6 +15,7 @@ |
#include "src/compiler.h" |
#include "src/messages.h" |
#include "src/preparser.h" |
+#include "src/rewriter.h" |
#include "src/runtime/runtime.h" |
#include "src/scanner-character-streams.h" |
#include "src/scopeinfo.h" |
@@ -924,6 +925,7 @@ Parser::Parser(ParseInfo* info) |
set_allow_harmony_new_target(FLAG_harmony_new_target); |
set_allow_strong_mode(FLAG_strong_mode); |
set_allow_legacy_const(FLAG_legacy_const); |
+ set_allow_do_expression_parsing(FLAG_do_expression_parsing); |
for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; |
++feature) { |
use_counts_[feature] = 0; |
@@ -4026,6 +4028,24 @@ void ParserTraits::ParseArrowFunctionFormalParameters( |
} |
+DoExpression* Parser::ParseDoExpression(bool* ok) { |
+ // AssignmentExpression :: |
+ // do '{' StatementList '}' |
+ int pos = peek_position(); |
+ |
+ Expect(Token::DO, CHECK_OK); |
+ Variable* result = |
+ scope_->NewTemporary(ast_value_factory()->dot_result_string()); |
+ Block* block = ParseScopedBlock(nullptr, CHECK_OK); |
+ DoExpression* expr = factory()->NewDoExpression(block, result, pos); |
+ if (!Rewriter::Rewrite(this, expr, ast_value_factory())) { |
+ *ok = false; |
+ return nullptr; |
+ } |
+ return expr; |
+} |
+ |
+ |
void ParserTraits::ParseArrowFunctionFormalParameterList( |
ParserFormalParameters* parameters, Expression* expr, |
const Scanner::Location& params_loc, |
@@ -4768,6 +4788,7 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( |
SET_ALLOW(harmony_spread_arrays); |
SET_ALLOW(harmony_new_target); |
SET_ALLOW(strong_mode); |
+ SET_ALLOW(do_expression_parsing); |
#undef SET_ALLOW |
} |
PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( |