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

Side by Side Diff: src/preparser.cc

Issue 7837028: Let bound iteration variables in for-loops (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased. Created 9 years, 2 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 305
306 306
307 PreParser::Statement PreParser::ParseVariableStatement( 307 PreParser::Statement PreParser::ParseVariableStatement(
308 VariableDeclarationContext var_context, 308 VariableDeclarationContext var_context,
309 bool* ok) { 309 bool* ok) {
310 // VariableStatement :: 310 // VariableStatement ::
311 // VariableDeclarations ';' 311 // VariableDeclarations ';'
312 312
313 Statement result = ParseVariableDeclarations(var_context, 313 Statement result = ParseVariableDeclarations(var_context,
314 NULL, 314 NULL,
315 NULL,
315 CHECK_OK); 316 CHECK_OK);
316 ExpectSemicolon(CHECK_OK); 317 ExpectSemicolon(CHECK_OK);
317 return result; 318 return result;
318 } 319 }
319 320
320 321
321 // If the variable declaration declares exactly one non-const 322 // If the variable declaration declares exactly one non-const
322 // variable, then *var is set to that variable. In all other cases, 323 // variable, then *var is set to that variable. In all other cases,
323 // *var is untouched; in particular, it is the caller's responsibility 324 // *var is untouched; in particular, it is the caller's responsibility
324 // to initialize it properly. This mechanism is also used for the parsing 325 // to initialize it properly. This mechanism is also used for the parsing
325 // of 'for-in' loops. 326 // of 'for-in' loops.
326 PreParser::Statement PreParser::ParseVariableDeclarations( 327 PreParser::Statement PreParser::ParseVariableDeclarations(
327 VariableDeclarationContext var_context, 328 VariableDeclarationContext var_context,
329 VariableDeclarationProperties* decl_props,
328 int* num_decl, 330 int* num_decl,
329 bool* ok) { 331 bool* ok) {
330 // VariableDeclarations :: 332 // VariableDeclarations ::
331 // ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[','] 333 // ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[',']
332 334
333 if (peek() == i::Token::VAR) { 335 if (peek() == i::Token::VAR) {
334 Consume(i::Token::VAR); 336 Consume(i::Token::VAR);
335 } else if (peek() == i::Token::CONST) { 337 } else if (peek() == i::Token::CONST) {
336 if (strict_mode()) { 338 if (strict_mode()) {
337 i::Scanner::Location location = scanner_->peek_location(); 339 i::Scanner::Location location = scanner_->peek_location();
(...skipping 30 matching lines...) Expand all
368 StrictModeIdentifierViolation(scanner_->location(), 370 StrictModeIdentifierViolation(scanner_->location(),
369 "strict_var_name", 371 "strict_var_name",
370 identifier, 372 identifier,
371 ok); 373 ok);
372 return Statement::Default(); 374 return Statement::Default();
373 } 375 }
374 nvars++; 376 nvars++;
375 if (peek() == i::Token::ASSIGN) { 377 if (peek() == i::Token::ASSIGN) {
376 Expect(i::Token::ASSIGN, CHECK_OK); 378 Expect(i::Token::ASSIGN, CHECK_OK);
377 ParseAssignmentExpression(var_context != kForStatement, CHECK_OK); 379 ParseAssignmentExpression(var_context != kForStatement, CHECK_OK);
380 if (decl_props != NULL) *decl_props = kHasInitializers;
378 } 381 }
379 } while (peek() == i::Token::COMMA); 382 } while (peek() == i::Token::COMMA);
380 383
381 if (num_decl != NULL) *num_decl = nvars; 384 if (num_decl != NULL) *num_decl = nvars;
382 return Statement::Default(); 385 return Statement::Default();
383 } 386 }
384 387
385 388
386 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { 389 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) {
387 // ExpressionStatement | LabelledStatement :: 390 // ExpressionStatement | LabelledStatement ::
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 565
563 PreParser::Statement PreParser::ParseForStatement(bool* ok) { 566 PreParser::Statement PreParser::ParseForStatement(bool* ok) {
564 // ForStatement :: 567 // ForStatement ::
565 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement 568 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement
566 569
567 Expect(i::Token::FOR, CHECK_OK); 570 Expect(i::Token::FOR, CHECK_OK);
568 Expect(i::Token::LPAREN, CHECK_OK); 571 Expect(i::Token::LPAREN, CHECK_OK);
569 if (peek() != i::Token::SEMICOLON) { 572 if (peek() != i::Token::SEMICOLON) {
570 if (peek() == i::Token::VAR || peek() == i::Token::CONST || 573 if (peek() == i::Token::VAR || peek() == i::Token::CONST ||
571 peek() == i::Token::LET) { 574 peek() == i::Token::LET) {
575 bool is_let = peek() == i::Token::LET;
572 int decl_count; 576 int decl_count;
573 ParseVariableDeclarations(kForStatement, &decl_count, CHECK_OK); 577 VariableDeclarationProperties decl_props = kHasNoInitializers;
574 if (peek() == i::Token::IN && decl_count == 1) { 578 ParseVariableDeclarations(
579 kForStatement, &decl_props, &decl_count, CHECK_OK);
580 bool accept_IN = decl_count == 1 &&
581 !(is_let && decl_props == kHasInitializers);
582 if (peek() == i::Token::IN && accept_IN) {
575 Expect(i::Token::IN, CHECK_OK); 583 Expect(i::Token::IN, CHECK_OK);
576 ParseExpression(true, CHECK_OK); 584 ParseExpression(true, CHECK_OK);
577 Expect(i::Token::RPAREN, CHECK_OK); 585 Expect(i::Token::RPAREN, CHECK_OK);
578 586
579 ParseStatement(CHECK_OK); 587 ParseStatement(CHECK_OK);
580 return Statement::Default(); 588 return Statement::Default();
581 } 589 }
582 } else { 590 } else {
583 ParseExpression(false, CHECK_OK); 591 ParseExpression(false, CHECK_OK);
584 if (peek() == i::Token::IN) { 592 if (peek() == i::Token::IN) {
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after
1680 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u)); 1688 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u));
1681 } 1689 }
1682 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u)); 1690 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u));
1683 } 1691 }
1684 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f)); 1692 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f));
1685 1693
1686 backing_store_.AddBlock(bytes); 1694 backing_store_.AddBlock(bytes);
1687 return backing_store_.EndSequence().start(); 1695 return backing_store_.EndSequence().start();
1688 } 1696 }
1689 } } // v8::preparser 1697 } } // v8::preparser
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698