Chromium Code Reviews| Index: src/preparser.h |
| diff --git a/src/preparser.h b/src/preparser.h |
| index 8a932582586ed15b6b5b886ccecbe6933ee6d7e1..ee09742890adba7d9633c5b971895d643dd60f37 100644 |
| --- a/src/preparser.h |
| +++ b/src/preparser.h |
| @@ -95,6 +95,7 @@ class ParserBase : public Traits { |
| bool allow_harmony_numeric_literals() const { |
| return scanner()->HarmonyNumericLiterals(); |
| } |
| + bool allow_classes() const { return scanner()->HarmonyClasses(); } |
| // Setters that determine whether certain syntactical constructs are |
| // allowed to be parsed by this instance of the parser. |
| @@ -109,6 +110,9 @@ class ParserBase : public Traits { |
| void set_allow_harmony_numeric_literals(bool allow) { |
| scanner()->SetHarmonyNumericLiterals(allow); |
| } |
| + void set_allow_classes(bool allow) { |
| + scanner()->SetHarmonyClasses(allow); |
| + } |
| protected: |
| friend class Traits::Type::Checkpoint; |
| @@ -677,6 +681,10 @@ class PreParserExpression { |
| return PreParserExpression(kThisExpression); |
| } |
| + static PreParserExpression Super() { |
| + return PreParserExpression(kSuperExpression); |
| + } |
| + |
| static PreParserExpression ThisProperty() { |
| return PreParserExpression(kThisPropertyExpression); |
| } |
| @@ -798,7 +806,8 @@ class PreParserExpression { |
| kThisExpression = (1 << 4), |
| kThisPropertyExpression = (2 << 4), |
| kPropertyExpression = (3 << 4), |
| - kCallExpression = (4 << 4) |
| + kCallExpression = (4 << 4), |
| + kSuperExpression = (5 << 4) |
| }; |
| explicit PreParserExpression(int expression_code) : code_(expression_code) {} |
| @@ -1248,6 +1257,11 @@ class PreParserTraits { |
| return PreParserExpression::This(); |
| } |
| + static PreParserExpression SuperReference(PreParserScope* scope, |
| + PreParserFactory* factory) { |
| + return PreParserExpression::Super(); |
| + } |
| + |
| static PreParserExpression ExpressionFromLiteral( |
| Token::Value token, int pos, Scanner* scanner, |
| PreParserFactory* factory) { |
| @@ -2383,7 +2397,13 @@ ParserBase<Traits>::ParseMemberWithNewPrefixesExpression(bool* ok) { |
| if (peek() == Token::NEW) { |
| Consume(Token::NEW); |
| int new_pos = position(); |
| - ExpressionT result = this->ParseMemberWithNewPrefixesExpression(CHECK_OK); |
| + ExpressionT result = this->EmptyExpression(); |
| + if (peek() == Token::SUPER) { |
|
arv (Not doing code reviews)
2014/08/15 19:41:07
You can use Check here instead.
if (Check(Token::
Dmitry Lomov (no reviews)
2014/08/15 22:11:41
Done.
|
| + Consume(Token::SUPER); |
| + result = this->SuperReference(scope_, factory()); |
| + } else { |
| + result = this->ParseMemberWithNewPrefixesExpression(CHECK_OK); |
| + } |
| if (peek() == Token::LPAREN) { |
| // NewExpression with arguments. |
| typename Traits::Type::ExpressionList args = |
| @@ -2397,7 +2417,7 @@ ParserBase<Traits>::ParseMemberWithNewPrefixesExpression(bool* ok) { |
| return factory()->NewCallNew(result, this->NewExpressionList(0, zone_), |
| new_pos); |
| } |
| - // No 'new' keyword. |
| + // No 'new' or 'super' keyword. |
| return this->ParseMemberExpression(ok); |
| } |
| @@ -2438,6 +2458,19 @@ ParserBase<Traits>::ParseMemberExpression(bool* ok) { |
| function_type, |
| FunctionLiteral::NORMAL_ARITY, |
| CHECK_OK); |
| + } else if (peek() == Token::SUPER) { |
| + int beg_pos = position(); |
| + Consume(Token::SUPER); |
| + Token::Value next = peek(); |
| + if (next == Token::PERIOD || next == Token::LBRACK || |
| + next == Token::LPAREN) { |
| + result = this->SuperReference(scope_, factory()); |
| + } else { |
| + ReportMessageAt(Scanner::Location(beg_pos, position()), |
| + "unexpected_super"); |
| + *ok = false; |
| + return this->EmptyExpression(); |
| + } |
| } else { |
| result = ParsePrimaryExpression(CHECK_OK); |
| } |