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

Side by Side Diff: src/preparser.h

Issue 4331003: Simplify preparsing of "new"-expressions. (Closed)
Patch Set: Created 10 years, 1 month 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 | « no previous file | test/cctest/test-parsing.cc » ('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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 179
180 Expression ParseExpression(bool accept_IN, bool* ok); 180 Expression ParseExpression(bool accept_IN, bool* ok);
181 Expression ParseAssignmentExpression(bool accept_IN, bool* ok); 181 Expression ParseAssignmentExpression(bool accept_IN, bool* ok);
182 Expression ParseConditionalExpression(bool accept_IN, bool* ok); 182 Expression ParseConditionalExpression(bool accept_IN, bool* ok);
183 Expression ParseBinaryExpression(int prec, bool accept_IN, bool* ok); 183 Expression ParseBinaryExpression(int prec, bool accept_IN, bool* ok);
184 Expression ParseUnaryExpression(bool* ok); 184 Expression ParseUnaryExpression(bool* ok);
185 Expression ParsePostfixExpression(bool* ok); 185 Expression ParsePostfixExpression(bool* ok);
186 Expression ParseLeftHandSideExpression(bool* ok); 186 Expression ParseLeftHandSideExpression(bool* ok);
187 Expression ParseNewExpression(bool* ok); 187 Expression ParseNewExpression(bool* ok);
188 Expression ParseMemberExpression(bool* ok); 188 Expression ParseMemberExpression(bool* ok);
189 Expression ParseNewPrefix(int* new_count, bool* ok); 189 Expression ParseMemberWithNewPrefixesExpression(unsigned new_count, bool* ok);
190 Expression ParseMemberWithNewPrefixesExpression(int* new_count, bool* ok);
191 Expression ParsePrimaryExpression(bool* ok); 190 Expression ParsePrimaryExpression(bool* ok);
192 Expression ParseArrayLiteral(bool* ok); 191 Expression ParseArrayLiteral(bool* ok);
193 Expression ParseObjectLiteral(bool* ok); 192 Expression ParseObjectLiteral(bool* ok);
194 Expression ParseRegExpLiteral(bool seen_equal, bool* ok); 193 Expression ParseRegExpLiteral(bool seen_equal, bool* ok);
195 Expression ParseV8Intrinsic(bool* ok); 194 Expression ParseV8Intrinsic(bool* ok);
196 195
197 Arguments ParseArguments(bool* ok); 196 Arguments ParseArguments(bool* ok);
198 Expression ParseFunctionLiteral(bool* ok); 197 Expression ParseFunctionLiteral(bool* ok);
199 198
200 Identifier ParseIdentifier(bool* ok); 199 Identifier ParseIdentifier(bool* ok);
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after
958 break; 957 break;
959 } 958 }
960 959
961 default: 960 default:
962 return result; 961 return result;
963 } 962 }
964 } 963 }
965 } 964 }
966 965
967 966
968
969 template <typename Scanner, typename Log> 967 template <typename Scanner, typename Log>
970 Expression PreParser<Scanner, Log>::ParseNewPrefix(int* new_count, bool* ok) { 968 Expression PreParser<Scanner, Log>::ParseNewExpression(bool* ok) {
971 // NewExpression :: 969 // NewExpression ::
972 // ('new')+ MemberExpression 970 // ('new')+ MemberExpression
973 971
974 // The grammar for new expressions is pretty warped. The keyword 972 // The grammar for new expressions is pretty warped. The keyword
975 // 'new' can either be a part of the new expression (where it isn't 973 // 'new' can either be a part of the new expression (where it isn't
976 // followed by an argument list) or a part of the member expression, 974 // followed by an argument list) or a part of the member expression,
977 // where it must be followed by an argument list. To accommodate 975 // where it must be followed by an argument list. To accommodate
978 // this, we parse the 'new' keywords greedily and keep track of how 976 // this, we parse the 'new' keywords greedily and keep track of how
979 // many we have parsed. This information is then passed on to the 977 // many we have parsed. This information is then passed on to the
980 // member expression parser, which is only allowed to match argument 978 // member expression parser, which is only allowed to match argument
981 // lists as long as it has 'new' prefixes left 979 // lists as long as it has 'new' prefixes left
982 Expect(Token::NEW, CHECK_OK); 980 unsigned new_count = 0;
983 *new_count++; 981 do {
982 Consume(Token::NEW);
983 new_count++;
984 } while (peek() == Token::NEW);
984 985
985 if (peek() == Token::NEW) { 986 return ParseMemberWithNewPrefixesExpression(new_count, ok);
986 ParseNewPrefix(new_count, CHECK_OK);
987 } else {
988 ParseMemberWithNewPrefixesExpression(new_count, CHECK_OK);
989 }
990
991 if (*new_count > 0) {
992 *new_count--;
993 }
994 return kUnknownExpression;
995 }
996
997
998 template <typename Scanner, typename Log>
999 Expression PreParser<Scanner, Log>::ParseNewExpression(bool* ok) {
1000 int new_count = 0;
1001 return ParseNewPrefix(&new_count, ok);
1002 } 987 }
1003 988
1004 989
1005 template <typename Scanner, typename Log> 990 template <typename Scanner, typename Log>
1006 Expression PreParser<Scanner, Log>::ParseMemberExpression(bool* ok) { 991 Expression PreParser<Scanner, Log>::ParseMemberExpression(bool* ok) {
1007 return ParseMemberWithNewPrefixesExpression(NULL, ok); 992 return ParseMemberWithNewPrefixesExpression(0, ok);
1008 } 993 }
1009 994
1010 995
1011 template <typename Scanner, typename Log> 996 template <typename Scanner, typename Log>
1012 Expression PreParser<Scanner, Log>::ParseMemberWithNewPrefixesExpression( 997 Expression PreParser<Scanner, Log>::ParseMemberWithNewPrefixesExpression(
1013 int* new_count, bool* ok) { 998 unsigned new_count, bool* ok) {
1014 // MemberExpression :: 999 // MemberExpression ::
1015 // (PrimaryExpression | FunctionLiteral) 1000 // (PrimaryExpression | FunctionLiteral)
1016 // ('[' Expression ']' | '.' Identifier | Arguments)* 1001 // ('[' Expression ']' | '.' Identifier | Arguments)*
1017 1002
1018 // Parse the initial primary or function expression. 1003 // Parse the initial primary or function expression.
1019 Expression result = NULL; 1004 Expression result = NULL;
1020 if (peek() == Token::FUNCTION) { 1005 if (peek() == Token::FUNCTION) {
1021 Consume(Token::FUNCTION); 1006 Consume(Token::FUNCTION);
1022 if (peek() == Token::IDENTIFIER) { 1007 if (peek() == Token::IDENTIFIER) {
1023 ParseIdentifier(CHECK_OK); 1008 ParseIdentifier(CHECK_OK);
(...skipping 20 matching lines...) Expand all
1044 Consume(Token::PERIOD); 1029 Consume(Token::PERIOD);
1045 ParseIdentifierName(CHECK_OK); 1030 ParseIdentifierName(CHECK_OK);
1046 if (result == kThisExpression) { 1031 if (result == kThisExpression) {
1047 result = kThisPropertyExpression; 1032 result = kThisPropertyExpression;
1048 } else { 1033 } else {
1049 result = kUnknownExpression; 1034 result = kUnknownExpression;
1050 } 1035 }
1051 break; 1036 break;
1052 } 1037 }
1053 case Token::LPAREN: { 1038 case Token::LPAREN: {
1054 if ((new_count == NULL) || *new_count == 0) return result; 1039 if (new_count == 0) return result;
1055 // Consume one of the new prefixes (already parsed). 1040 // Consume one of the new prefixes (already parsed).
1056 ParseArguments(CHECK_OK); 1041 ParseArguments(CHECK_OK);
1057 *new_count--; 1042 new_count--;
1058 result = kUnknownExpression; 1043 result = kUnknownExpression;
1059 break; 1044 break;
1060 } 1045 }
1061 default: 1046 default:
1062 return result; 1047 return result;
1063 } 1048 }
1064 } 1049 }
1065 } 1050 }
1066 1051
1067 1052
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
1419 *is_get = strncmp(token, "get", 3) == 0; 1404 *is_get = strncmp(token, "get", 3) == 0;
1420 *is_set = !*is_get && strncmp(token, "set", 3) == 0; 1405 *is_set = !*is_get && strncmp(token, "set", 3) == 0;
1421 } 1406 }
1422 return GetIdentifierSymbol(); 1407 return GetIdentifierSymbol();
1423 } 1408 }
1424 1409
1425 #undef CHECK_OK 1410 #undef CHECK_OK
1426 } } } // v8::internal::preparser 1411 } } } // v8::internal::preparser
1427 1412
1428 #endif // V8_PREPARSER_H 1413 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « no previous file | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698