OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 #include <cmath> | 5 #include <cmath> |
6 | 6 |
7 #include "src/allocation.h" | 7 #include "src/allocation.h" |
8 #include "src/base/logging.h" | 8 #include "src/base/logging.h" |
9 #include "src/conversions-inl.h" | 9 #include "src/conversions-inl.h" |
10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 ParseExpression(true, CHECK_OK); | 291 ParseExpression(true, CHECK_OK); |
292 } | 292 } |
293 Expect(Token::RPAREN, CHECK_OK); | 293 Expect(Token::RPAREN, CHECK_OK); |
294 | 294 |
295 ParseScopedStatement(nullptr, true, ok); | 295 ParseScopedStatement(nullptr, true, ok); |
296 } | 296 } |
297 return Statement::Default(); | 297 return Statement::Default(); |
298 } | 298 } |
299 | 299 |
300 | 300 |
301 PreParser::Statement PreParser::ParseTryStatement(bool* ok) { | |
302 // TryStatement :: | |
303 // 'try' Block Catch | |
304 // 'try' Block Finally | |
305 // 'try' Block Catch Finally | |
306 // | |
307 // Catch :: | |
308 // 'catch' '(' Identifier ')' Block | |
309 // | |
310 // Finally :: | |
311 // 'finally' Block | |
312 | |
313 Expect(Token::TRY, CHECK_OK); | |
314 | |
315 { | |
316 ReturnExprScope no_tail_calls(function_state_, | |
317 ReturnExprContext::kInsideTryBlock); | |
318 ParseBlock(nullptr, CHECK_OK); | |
319 } | |
320 | |
321 Token::Value tok = peek(); | |
322 if (tok != Token::CATCH && tok != Token::FINALLY) { | |
323 ReportMessageAt(scanner()->location(), MessageTemplate::kNoCatchOrFinally); | |
324 *ok = false; | |
325 return Statement::Default(); | |
326 } | |
327 TailCallExpressionList tail_call_expressions_in_catch_block(zone()); | |
328 bool catch_block_exists = false; | |
329 if (tok == Token::CATCH) { | |
330 Consume(Token::CATCH); | |
331 Expect(Token::LPAREN, CHECK_OK); | |
332 Scope* catch_scope = NewScope(CATCH_SCOPE); | |
333 ExpressionClassifier pattern_classifier(this); | |
334 ParsePrimaryExpression(CHECK_OK); | |
335 ValidateBindingPattern(CHECK_OK); | |
336 Expect(Token::RPAREN, CHECK_OK); | |
337 { | |
338 CollectExpressionsInTailPositionToListScope | |
339 collect_tail_call_expressions_scope( | |
340 function_state_, &tail_call_expressions_in_catch_block); | |
341 BlockState block_state(&scope_state_, catch_scope); | |
342 { | |
343 BlockState block_state(&scope_state_); | |
344 ParseBlock(nullptr, CHECK_OK); | |
345 } | |
346 } | |
347 catch_block_exists = true; | |
348 tok = peek(); | |
349 } | |
350 if (tok == Token::FINALLY) { | |
351 Consume(Token::FINALLY); | |
352 ParseBlock(nullptr, CHECK_OK); | |
353 if (FLAG_harmony_explicit_tailcalls && catch_block_exists && | |
354 tail_call_expressions_in_catch_block.has_explicit_tail_calls()) { | |
355 // TODO(ishell): update chapter number. | |
356 // ES8 XX.YY.ZZ | |
357 ReportMessageAt(tail_call_expressions_in_catch_block.location(), | |
358 MessageTemplate::kUnexpectedTailCallInCatchBlock); | |
359 *ok = false; | |
360 return Statement::Default(); | |
361 } | |
362 } | |
363 return Statement::Default(); | |
364 } | |
365 | |
366 | |
367 // Redefinition of CHECK_OK for parsing expressions. | 301 // Redefinition of CHECK_OK for parsing expressions. |
368 #undef CHECK_OK | 302 #undef CHECK_OK |
369 #define CHECK_OK CHECK_OK_VALUE(Expression::Default()) | 303 #define CHECK_OK CHECK_OK_VALUE(Expression::Default()) |
370 | 304 |
371 PreParser::Expression PreParser::ParseFunctionLiteral( | 305 PreParser::Expression PreParser::ParseFunctionLiteral( |
372 Identifier function_name, Scanner::Location function_name_location, | 306 Identifier function_name, Scanner::Location function_name_location, |
373 FunctionNameValidity function_name_validity, FunctionKind kind, | 307 FunctionNameValidity function_name_validity, FunctionKind kind, |
374 int function_token_pos, FunctionLiteral::FunctionType function_type, | 308 int function_token_pos, FunctionLiteral::FunctionType function_type, |
375 LanguageMode language_mode, bool* ok) { | 309 LanguageMode language_mode, bool* ok) { |
376 // Function :: | 310 // Function :: |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 | 473 |
540 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); | 474 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); |
541 } | 475 } |
542 | 476 |
543 #undef CHECK_OK | 477 #undef CHECK_OK |
544 #undef CHECK_OK_CUSTOM | 478 #undef CHECK_OK_CUSTOM |
545 | 479 |
546 | 480 |
547 } // namespace internal | 481 } // namespace internal |
548 } // namespace v8 | 482 } // namespace v8 |
OLD | NEW |