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

Side by Side Diff: src/parsing/parser-base.h

Issue 2305523002: [parser] Clean up ParserBase typedefs (Closed)
Patch Set: document Block typedef Created 4 years, 3 months 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 | « src/parsing/parser.h ('k') | src/parsing/preparser.h » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_PARSING_PARSER_BASE_H 5 #ifndef V8_PARSING_PARSER_BASE_H
6 #define V8_PARSING_PARSER_BASE_H 6 #define V8_PARSING_PARSER_BASE_H
7 7
8 #include "src/ast/scopes.h" 8 #include "src/ast/scopes.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/base/hashmap.h" 10 #include "src/base/hashmap.h"
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 // The ParserTypes structure encapsulates the differences in the 168 // The ParserTypes structure encapsulates the differences in the
169 // types used in parsing methods. E.g., Parser methods use Expression* 169 // types used in parsing methods. E.g., Parser methods use Expression*
170 // and PreParser methods use PreParserExpression. For any given parser 170 // and PreParser methods use PreParserExpression. For any given parser
171 // implementation class Impl, it is expected to contain the following typedefs: 171 // implementation class Impl, it is expected to contain the following typedefs:
172 // 172 //
173 // template <> 173 // template <>
174 // struct ParserTypes<Impl> { 174 // struct ParserTypes<Impl> {
175 // // Synonyms for ParserBase<Impl> and Impl, respectively. 175 // // Synonyms for ParserBase<Impl> and Impl, respectively.
176 // typedef Base; 176 // typedef Base;
177 // typedef Impl; 177 // typedef Impl;
178 // // TODO(nikolaos): these two will probably go away, as they are 178 // // TODO(nikolaos): this one will probably go away, as it is
179 // // not related to pure parsing. 179 // // not related to pure parsing.
180 // typedef GeneratorVariable; 180 // typedef GeneratorVariable;
181 // typedef AstProperties;
182 // // Return types for traversing functions. 181 // // Return types for traversing functions.
183 // typedef Identifier; 182 // typedef Identifier;
184 // typedef Expression; 183 // typedef Expression;
185 // typedef YieldExpression;
186 // typedef FunctionLiteral; 184 // typedef FunctionLiteral;
187 // typedef ClassLiteral;
188 // typedef Literal;
189 // typedef ObjectLiteralProperty; 185 // typedef ObjectLiteralProperty;
190 // typedef ExpressionList; 186 // typedef ExpressionList;
191 // typedef PropertyList; 187 // typedef PropertyList;
192 // typedef FormalParameter;
193 // typedef FormalParameters; 188 // typedef FormalParameters;
194 // typedef StatementList; 189 // typedef StatementList;
190 // typedef Block;
195 // // For constructing objects returned by the traversing functions. 191 // // For constructing objects returned by the traversing functions.
196 // typedef Factory; 192 // typedef Factory;
197 // }; 193 // };
198 194
199 template <typename Impl> 195 template <typename Impl>
200 struct ParserTypes; 196 struct ParserTypes;
201 197
202 template <typename Impl> 198 template <typename Impl>
203 class ParserBase { 199 class ParserBase {
204 public: 200 public:
205 // Shorten type names defined by ParserTypes<Impl>. 201 // Shorten type names defined by ParserTypes<Impl>.
206 typedef ParserTypes<Impl> Types; 202 typedef ParserTypes<Impl> Types;
203 typedef typename Types::Identifier IdentifierT;
207 typedef typename Types::Expression ExpressionT; 204 typedef typename Types::Expression ExpressionT;
208 typedef typename Types::Identifier IdentifierT; 205 typedef typename Types::FunctionLiteral FunctionLiteralT;
209 typedef typename Types::FormalParameter FormalParameterT; 206 typedef typename Types::ObjectLiteralProperty ObjectLiteralPropertyT;
207 typedef typename Types::ExpressionList ExpressionListT;
208 typedef typename Types::PropertyList PropertyListT;
210 typedef typename Types::FormalParameters FormalParametersT; 209 typedef typename Types::FormalParameters FormalParametersT;
211 typedef typename Types::FunctionLiteral FunctionLiteralT;
212 typedef typename Types::Literal LiteralT;
213 typedef typename Types::ObjectLiteralProperty ObjectLiteralPropertyT;
214 typedef typename Types::StatementList StatementListT; 210 typedef typename Types::StatementList StatementListT;
211 typedef typename Types::Block BlockT;
215 typedef typename v8::internal::ExpressionClassifier<Types> 212 typedef typename v8::internal::ExpressionClassifier<Types>
216 ExpressionClassifier; 213 ExpressionClassifier;
217 typedef typename Types::Block BlockT;
218 214
219 // All implementation-specific methods must be called through this. 215 // All implementation-specific methods must be called through this.
220 Impl* impl() { return static_cast<Impl*>(this); } 216 Impl* impl() { return static_cast<Impl*>(this); }
221 const Impl* impl() const { return static_cast<const Impl*>(this); } 217 const Impl* impl() const { return static_cast<const Impl*>(this); }
222 218
223 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, 219 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit,
224 v8::Extension* extension, AstValueFactory* ast_value_factory, 220 v8::Extension* extension, AstValueFactory* ast_value_factory,
225 ParserRecorder* log) 221 ParserRecorder* log)
226 : scope_state_(nullptr), 222 : scope_state_(nullptr),
227 function_state_(nullptr), 223 function_state_(nullptr),
(...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 ExpressionT ParsePropertyName(IdentifierT* name, PropertyKind* kind, 1134 ExpressionT ParsePropertyName(IdentifierT* name, PropertyKind* kind,
1139 bool in_class, bool* is_generator, bool* is_get, 1135 bool in_class, bool* is_generator, bool* is_get,
1140 bool* is_set, bool* is_async, bool* is_static, 1136 bool* is_set, bool* is_async, bool* is_static,
1141 bool* is_computed_name, bool* ok); 1137 bool* is_computed_name, bool* ok);
1142 1138
1143 ExpressionT ParseObjectLiteral(bool* ok); 1139 ExpressionT ParseObjectLiteral(bool* ok);
1144 ObjectLiteralPropertyT ParsePropertyDefinition( 1140 ObjectLiteralPropertyT ParsePropertyDefinition(
1145 ObjectLiteralCheckerBase* checker, bool in_class, bool has_extends, 1141 ObjectLiteralCheckerBase* checker, bool in_class, bool has_extends,
1146 bool* is_computed_name, bool* has_seen_constructor, IdentifierT* name, 1142 bool* is_computed_name, bool* has_seen_constructor, IdentifierT* name,
1147 bool* ok); 1143 bool* ok);
1148 typename Types::ExpressionList ParseArguments( 1144 ExpressionListT ParseArguments(Scanner::Location* first_spread_pos,
1149 Scanner::Location* first_spread_pos, bool maybe_arrow, bool* ok); 1145 bool maybe_arrow, bool* ok);
1150 typename Types::ExpressionList ParseArguments( 1146 ExpressionListT ParseArguments(Scanner::Location* first_spread_pos,
1151 Scanner::Location* first_spread_pos, bool* ok) { 1147 bool* ok) {
1152 return ParseArguments(first_spread_pos, false, ok); 1148 return ParseArguments(first_spread_pos, false, ok);
1153 } 1149 }
1154 1150
1155 ExpressionT ParseAssignmentExpression(bool accept_IN, bool* ok); 1151 ExpressionT ParseAssignmentExpression(bool accept_IN, bool* ok);
1156 ExpressionT ParseYieldExpression(bool accept_IN, bool* ok); 1152 ExpressionT ParseYieldExpression(bool accept_IN, bool* ok);
1157 ExpressionT ParseTailCallExpression(bool* ok); 1153 ExpressionT ParseTailCallExpression(bool* ok);
1158 ExpressionT ParseConditionalExpression(bool accept_IN, bool* ok); 1154 ExpressionT ParseConditionalExpression(bool accept_IN, bool* ok);
1159 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok); 1155 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok);
1160 ExpressionT ParseUnaryExpression(bool* ok); 1156 ExpressionT ParseUnaryExpression(bool* ok);
1161 ExpressionT ParsePostfixExpression(bool* ok); 1157 ExpressionT ParsePostfixExpression(bool* ok);
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after
1821 return result; 1817 return result;
1822 } 1818 }
1823 1819
1824 template <typename Impl> 1820 template <typename Impl>
1825 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseArrayLiteral( 1821 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseArrayLiteral(
1826 bool* ok) { 1822 bool* ok) {
1827 // ArrayLiteral :: 1823 // ArrayLiteral ::
1828 // '[' Expression? (',' Expression?)* ']' 1824 // '[' Expression? (',' Expression?)* ']'
1829 1825
1830 int pos = peek_position(); 1826 int pos = peek_position();
1831 typename Types::ExpressionList values = impl()->NewExpressionList(4); 1827 ExpressionListT values = impl()->NewExpressionList(4);
1832 int first_spread_index = -1; 1828 int first_spread_index = -1;
1833 Expect(Token::LBRACK, CHECK_OK); 1829 Expect(Token::LBRACK, CHECK_OK);
1834 while (peek() != Token::RBRACK) { 1830 while (peek() != Token::RBRACK) {
1835 ExpressionT elem; 1831 ExpressionT elem;
1836 if (peek() == Token::COMMA) { 1832 if (peek() == Token::COMMA) {
1837 elem = impl()->GetLiteralTheHole(peek_position()); 1833 elem = impl()->GetLiteralTheHole(peek_position());
1838 } else if (peek() == Token::ELLIPSIS) { 1834 } else if (peek() == Token::ELLIPSIS) {
1839 int start_pos = peek_position(); 1835 int start_pos = peek_position();
1840 Consume(Token::ELLIPSIS); 1836 Consume(Token::ELLIPSIS);
1841 int expr_pos = peek_position(); 1837 int expr_pos = peek_position();
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
2238 2234
2239 classifier()->RecordPatternError( 2235 classifier()->RecordPatternError(
2240 Scanner::Location(next_beg_pos, scanner()->location().end_pos), 2236 Scanner::Location(next_beg_pos, scanner()->location().end_pos),
2241 MessageTemplate::kInvalidDestructuringTarget); 2237 MessageTemplate::kInvalidDestructuringTarget);
2242 if (!*is_computed_name) { 2238 if (!*is_computed_name) {
2243 checker->CheckProperty(name_token, PropertyKind::kAccessorProperty, 2239 checker->CheckProperty(name_token, PropertyKind::kAccessorProperty,
2244 method_kind, 2240 method_kind,
2245 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 2241 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
2246 } 2242 }
2247 2243
2248 typename Types::FunctionLiteral value = impl()->ParseFunctionLiteral( 2244 FunctionLiteralT value = impl()->ParseFunctionLiteral(
2249 *name, scanner()->location(), kSkipFunctionNameCheck, 2245 *name, scanner()->location(), kSkipFunctionNameCheck,
2250 is_get ? FunctionKind::kGetterFunction 2246 is_get ? FunctionKind::kGetterFunction
2251 : FunctionKind::kSetterFunction, 2247 : FunctionKind::kSetterFunction,
2252 kNoSourcePosition, FunctionLiteral::kAccessorOrMethod, 2248 kNoSourcePosition, FunctionLiteral::kAccessorOrMethod,
2253 language_mode(), CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 2249 language_mode(), CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
2254 2250
2255 // Make sure the name expression is a string since we need a Name for 2251 // Make sure the name expression is a string since we need a Name for
2256 // Runtime_DefineAccessorPropertyUnchecked and since we can determine this 2252 // Runtime_DefineAccessorPropertyUnchecked and since we can determine this
2257 // statically we can skip the extra runtime check. 2253 // statically we can skip the extra runtime check.
2258 if (!*is_computed_name) { 2254 if (!*is_computed_name) {
(...skipping 14 matching lines...) Expand all
2273 return impl()->EmptyObjectLiteralProperty(); 2269 return impl()->EmptyObjectLiteralProperty();
2274 } 2270 }
2275 2271
2276 template <typename Impl> 2272 template <typename Impl>
2277 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral( 2273 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral(
2278 bool* ok) { 2274 bool* ok) {
2279 // ObjectLiteral :: 2275 // ObjectLiteral ::
2280 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}' 2276 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}'
2281 2277
2282 int pos = peek_position(); 2278 int pos = peek_position();
2283 typename Types::PropertyList properties = impl()->NewPropertyList(4); 2279 PropertyListT properties = impl()->NewPropertyList(4);
2284 int number_of_boilerplate_properties = 0; 2280 int number_of_boilerplate_properties = 0;
2285 bool has_computed_names = false; 2281 bool has_computed_names = false;
2286 ObjectLiteralChecker checker(this); 2282 ObjectLiteralChecker checker(this);
2287 2283
2288 Expect(Token::LBRACE, CHECK_OK); 2284 Expect(Token::LBRACE, CHECK_OK);
2289 2285
2290 while (peek() != Token::RBRACE) { 2286 while (peek() != Token::RBRACE) {
2291 FuncNameInferrer::State fni_state(fni_); 2287 FuncNameInferrer::State fni_state(fni_);
2292 2288
2293 const bool in_class = false; 2289 const bool in_class = false;
(...skipping 28 matching lines...) Expand all
2322 // Computation of literal_index must happen before pre parse bailout. 2318 // Computation of literal_index must happen before pre parse bailout.
2323 int literal_index = function_state_->NextMaterializedLiteralIndex(); 2319 int literal_index = function_state_->NextMaterializedLiteralIndex();
2324 2320
2325 return factory()->NewObjectLiteral(properties, 2321 return factory()->NewObjectLiteral(properties,
2326 literal_index, 2322 literal_index,
2327 number_of_boilerplate_properties, 2323 number_of_boilerplate_properties,
2328 pos); 2324 pos);
2329 } 2325 }
2330 2326
2331 template <typename Impl> 2327 template <typename Impl>
2332 typename ParserBase<Impl>::Types::ExpressionList 2328 typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments(
2333 ParserBase<Impl>::ParseArguments(Scanner::Location* first_spread_arg_loc, 2329 Scanner::Location* first_spread_arg_loc, bool maybe_arrow, bool* ok) {
2334 bool maybe_arrow, bool* ok) {
2335 // Arguments :: 2330 // Arguments ::
2336 // '(' (AssignmentExpression)*[','] ')' 2331 // '(' (AssignmentExpression)*[','] ')'
2337 2332
2338 Scanner::Location spread_arg = Scanner::Location::invalid(); 2333 Scanner::Location spread_arg = Scanner::Location::invalid();
2339 typename Types::ExpressionList result = impl()->NewExpressionList(4); 2334 ExpressionListT result = impl()->NewExpressionList(4);
2340 Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullExpressionList)); 2335 Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullExpressionList));
2341 bool done = (peek() == Token::RPAREN); 2336 bool done = (peek() == Token::RPAREN);
2342 bool was_unspread = false; 2337 bool was_unspread = false;
2343 int unspread_sequences_count = 0; 2338 int unspread_sequences_count = 0;
2344 while (!done) { 2339 while (!done) {
2345 int start_pos = peek_position(); 2340 int start_pos = peek_position();
2346 bool is_spread = Check(Token::ELLIPSIS); 2341 bool is_spread = Check(Token::ELLIPSIS);
2347 int expr_pos = peek_position(); 2342 int expr_pos = peek_position();
2348 2343
2349 ExpressionT argument = 2344 ExpressionT argument =
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after
2971 // with positions recorded for function literal and confuse debugger. 2966 // with positions recorded for function literal and confuse debugger.
2972 pos = peek_position(); 2967 pos = peek_position();
2973 // Also the trailing parenthesis are a hint that the function will 2968 // Also the trailing parenthesis are a hint that the function will
2974 // be called immediately. If we happen to have parsed a preceding 2969 // be called immediately. If we happen to have parsed a preceding
2975 // function literal eagerly, we can also compile it eagerly. 2970 // function literal eagerly, we can also compile it eagerly.
2976 if (result->IsFunctionLiteral() && mode() == PARSE_EAGERLY) { 2971 if (result->IsFunctionLiteral() && mode() == PARSE_EAGERLY) {
2977 result->AsFunctionLiteral()->set_should_eager_compile(); 2972 result->AsFunctionLiteral()->set_should_eager_compile();
2978 } 2973 }
2979 } 2974 }
2980 Scanner::Location spread_pos; 2975 Scanner::Location spread_pos;
2981 typename Types::ExpressionList args; 2976 ExpressionListT args;
2982 if (V8_UNLIKELY(is_async && impl()->IsIdentifier(result))) { 2977 if (V8_UNLIKELY(is_async && impl()->IsIdentifier(result))) {
2983 ExpressionClassifier async_classifier(this); 2978 ExpressionClassifier async_classifier(this);
2984 args = ParseArguments(&spread_pos, true, CHECK_OK); 2979 args = ParseArguments(&spread_pos, true, CHECK_OK);
2985 if (peek() == Token::ARROW) { 2980 if (peek() == Token::ARROW) {
2986 if (fni_) { 2981 if (fni_) {
2987 fni_->RemoveAsyncKeywordFromEnd(); 2982 fni_->RemoveAsyncKeywordFromEnd();
2988 } 2983 }
2989 ValidateBindingPattern(CHECK_OK); 2984 ValidateBindingPattern(CHECK_OK);
2990 ValidateFormalParameterInitializer(CHECK_OK); 2985 ValidateFormalParameterInitializer(CHECK_OK);
2991 if (!classifier()->is_valid_async_arrow_formal_parameters()) { 2986 if (!classifier()->is_valid_async_arrow_formal_parameters()) {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
3104 result = ParseSuperExpression(is_new, CHECK_OK); 3099 result = ParseSuperExpression(is_new, CHECK_OK);
3105 } else if (peek() == Token::PERIOD) { 3100 } else if (peek() == Token::PERIOD) {
3106 return ParseNewTargetExpression(CHECK_OK); 3101 return ParseNewTargetExpression(CHECK_OK);
3107 } else { 3102 } else {
3108 result = ParseMemberWithNewPrefixesExpression(is_async, CHECK_OK); 3103 result = ParseMemberWithNewPrefixesExpression(is_async, CHECK_OK);
3109 } 3104 }
3110 impl()->RewriteNonPattern(CHECK_OK); 3105 impl()->RewriteNonPattern(CHECK_OK);
3111 if (peek() == Token::LPAREN) { 3106 if (peek() == Token::LPAREN) {
3112 // NewExpression with arguments. 3107 // NewExpression with arguments.
3113 Scanner::Location spread_pos; 3108 Scanner::Location spread_pos;
3114 typename Types::ExpressionList args = 3109 ExpressionListT args = ParseArguments(&spread_pos, CHECK_OK);
3115 ParseArguments(&spread_pos, CHECK_OK);
3116 3110
3117 if (spread_pos.IsValid()) { 3111 if (spread_pos.IsValid()) {
3118 args = impl()->PrepareSpreadArguments(args); 3112 args = impl()->PrepareSpreadArguments(args);
3119 result = impl()->SpreadCallNew(result, args, new_pos); 3113 result = impl()->SpreadCallNew(result, args, new_pos);
3120 } else { 3114 } else {
3121 result = factory()->NewCallNew(result, args, new_pos); 3115 result = factory()->NewCallNew(result, args, new_pos);
3122 } 3116 }
3123 // The expression can still continue with . or [ after the arguments. 3117 // The expression can still continue with . or [ after the arguments.
3124 result = ParseMemberExpressionContinuation(result, is_async, CHECK_OK); 3118 result = ParseMemberExpressionContinuation(result, is_async, CHECK_OK);
3125 return result; 3119 return result;
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
3642 bool* ok) { 3636 bool* ok) {
3643 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { 3637 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) {
3644 // ASI inserts `;` after arrow parameters if a line terminator is found. 3638 // ASI inserts `;` after arrow parameters if a line terminator is found.
3645 // `=> ...` is never a valid expression, so report as syntax error. 3639 // `=> ...` is never a valid expression, so report as syntax error.
3646 // If next token is not `=>`, it's a syntax error anyways. 3640 // If next token is not `=>`, it's a syntax error anyways.
3647 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); 3641 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW);
3648 *ok = false; 3642 *ok = false;
3649 return impl()->EmptyExpression(); 3643 return impl()->EmptyExpression();
3650 } 3644 }
3651 3645
3652 typename Types::StatementList body = impl()->NullStatementList(); 3646 StatementListT body = impl()->NullStatementList();
3653 int num_parameters = formal_parameters.scope->num_parameters(); 3647 int num_parameters = formal_parameters.scope->num_parameters();
3654 int materialized_literal_count = -1; 3648 int materialized_literal_count = -1;
3655 int expected_property_count = -1; 3649 int expected_property_count = -1;
3656 3650
3657 FunctionKind arrow_kind = is_async ? kAsyncArrowFunction : kArrowFunction; 3651 FunctionKind arrow_kind = is_async ? kAsyncArrowFunction : kArrowFunction;
3658 FunctionLiteral::EagerCompileHint eager_compile_hint = 3652 FunctionLiteral::EagerCompileHint eager_compile_hint =
3659 FunctionLiteral::kShouldLazyCompile; 3653 FunctionLiteral::kShouldLazyCompile;
3660 bool should_be_used_once_hint = false; 3654 bool should_be_used_once_hint = false;
3661 { 3655 {
3662 FunctionState function_state(&function_state_, &scope_state_, 3656 FunctionState function_state(&function_state_, &scope_state_,
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
3977 has_seen_constructor_ = true; 3971 has_seen_constructor_ = true;
3978 return; 3972 return;
3979 } 3973 }
3980 } 3974 }
3981 3975
3982 3976
3983 } // namespace internal 3977 } // namespace internal
3984 } // namespace v8 3978 } // namespace v8
3985 3979
3986 #endif // V8_PARSING_PARSER_BASE_H 3980 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698