Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index 18366443b70c1955069e97ec1026fb9d2ce493d7..e6f93f4a19b1b1a4d0f681398bdd9d15a2669a02 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -224,7 +224,8 @@ class ParserBase { |
allow_harmony_restrictive_generators_(false), |
allow_harmony_trailing_commas_(false), |
allow_harmony_class_fields_(false), |
- allow_harmony_object_rest_spread_(false) {} |
+ allow_harmony_object_rest_spread_(false), |
+ allow_harmony_dynamic_import_(false) {} |
#define ALLOW_ACCESSORS(name) \ |
bool allow_##name() const { return allow_##name##_; } \ |
@@ -238,6 +239,7 @@ class ParserBase { |
ALLOW_ACCESSORS(harmony_trailing_commas); |
ALLOW_ACCESSORS(harmony_class_fields); |
ALLOW_ACCESSORS(harmony_object_rest_spread); |
+ ALLOW_ACCESSORS(harmony_dynamic_import); |
#undef ALLOW_ACCESSORS |
@@ -1206,6 +1208,7 @@ class ParserBase { |
int class_token_pos, bool* ok); |
ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); |
ExpressionT ParseSuperExpression(bool is_new, bool* ok); |
+ ExpressionT ParseDynamicImportExpression(bool* ok); |
ExpressionT ParseNewTargetExpression(bool* ok); |
void ParseFormalParameter(FormalParametersT* parameters, bool* ok); |
@@ -1484,6 +1487,7 @@ class ParserBase { |
bool allow_harmony_trailing_commas_; |
bool allow_harmony_class_fields_; |
bool allow_harmony_object_rest_spread_; |
+ bool allow_harmony_dynamic_import_; |
friend class DiscardableZoneScope; |
}; |
@@ -3350,7 +3354,11 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseMemberExpression( |
// MemberExpression :: |
// (PrimaryExpression | FunctionLiteral | ClassLiteral) |
// ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)* |
- |
+ // |
+ // CallExpression :: |
+ // (SuperCall | ImportCall) |
+ // ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)* |
+ // |
// The '[' Expression ']' and '.' Identifier parts are parsed by |
// ParseMemberExpressionContinuation, and the Arguments part is parsed by the |
// caller. |
@@ -3403,6 +3411,8 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseMemberExpression( |
} else if (peek() == Token::SUPER) { |
const bool is_new = false; |
result = ParseSuperExpression(is_new, CHECK_OK); |
+ } else if (allow_harmony_dynamic_import() && peek() == Token::IMPORT) { |
+ result = ParseDynamicImportExpression(CHECK_OK); |
} else { |
result = ParsePrimaryExpression(is_async, CHECK_OK); |
} |
@@ -3412,6 +3422,20 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseMemberExpression( |
} |
template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::ParseDynamicImportExpression(bool* ok) { |
+ DCHECK(allow_harmony_dynamic_import()); |
+ Consume(Token::IMPORT); |
+ int pos = position(); |
+ Expect(Token::LPAREN, CHECK_OK); |
+ ExpressionT arg = ParseAssignmentExpression(true, CHECK_OK); |
+ Expect(Token::RPAREN, CHECK_OK); |
+ ZoneList<ExpressionT>* args = new (zone()) ZoneList<ExpressionT>(1, zone()); |
+ args->Add(arg, zone()); |
+ return factory()->NewCallRuntime(Runtime::kDynamicImportCall, args, pos); |
+} |
+ |
+template <typename Impl> |
typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseSuperExpression( |
bool is_new, bool* ok) { |
Expect(Token::SUPER, CHECK_OK); |