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

Side by Side Diff: src/preparser.cc

Issue 8688007: Statically check for assignments to const in harmony mode. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed second round of comments. Created 9 years 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
« no previous file with comments | « src/parser.cc ('k') | src/scopes.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 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 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 // labels can be simply ignored in all other cases; except for 192 // labels can be simply ignored in all other cases; except for
193 // trivial labeled break statements 'label: break label' which is 193 // trivial labeled break statements 'label: break label' which is
194 // parsed into an empty statement. 194 // parsed into an empty statement.
195 195
196 // Keep the source position of the statement 196 // Keep the source position of the statement
197 switch (peek()) { 197 switch (peek()) {
198 case i::Token::LBRACE: 198 case i::Token::LBRACE:
199 return ParseBlock(ok); 199 return ParseBlock(ok);
200 200
201 case i::Token::CONST: 201 case i::Token::CONST:
202 case i::Token::LET:
202 case i::Token::VAR: 203 case i::Token::VAR:
203 return ParseVariableStatement(kStatement, ok); 204 return ParseVariableStatement(kStatement, ok);
204 205
205 case i::Token::SEMICOLON: 206 case i::Token::SEMICOLON:
206 Next(); 207 Next();
207 return Statement::Default(); 208 return Statement::Default();
208 209
209 case i::Token::IF: 210 case i::Token::IF:
210 return ParseIfStatement(ok); 211 return ParseIfStatement(ok);
211 212
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 // ConstBinding :: 343 // ConstBinding ::
343 // Identifier '=' AssignmentExpression 344 // Identifier '=' AssignmentExpression
344 // 345 //
345 // TODO(ES6): 346 // TODO(ES6):
346 // ConstBinding :: 347 // ConstBinding ::
347 // BindingPattern '=' AssignmentExpression 348 // BindingPattern '=' AssignmentExpression
348 bool require_initializer = false; 349 bool require_initializer = false;
349 if (peek() == i::Token::VAR) { 350 if (peek() == i::Token::VAR) {
350 Consume(i::Token::VAR); 351 Consume(i::Token::VAR);
351 } else if (peek() == i::Token::CONST) { 352 } else if (peek() == i::Token::CONST) {
353 // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads:
354 //
355 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';'
356 //
357 // * It is a Syntax Error if the code that matches this production is not
358 // contained in extended code.
359 //
360 // However disallowing const in classic mode will break compatibility with
361 // existing pages. Therefore we keep allowing const with the old
362 // non-harmony semantics in classic mode.
363 Consume(i::Token::CONST);
352 switch (language_mode()) { 364 switch (language_mode()) {
353 case i::CLASSIC_MODE: 365 case i::CLASSIC_MODE:
354 break; 366 break;
355 case i::STRICT_MODE: { 367 case i::STRICT_MODE: {
356 i::Scanner::Location location = scanner_->peek_location(); 368 i::Scanner::Location location = scanner_->peek_location();
357 ReportMessageAt(location, "strict_const", NULL); 369 ReportMessageAt(location, "strict_const", NULL);
358 *ok = false; 370 *ok = false;
359 return Statement::Default(); 371 return Statement::Default();
360 } 372 }
361 case i::EXTENDED_MODE: 373 case i::EXTENDED_MODE:
362 if (var_context != kSourceElement && 374 if (var_context != kSourceElement &&
363 var_context != kForStatement) { 375 var_context != kForStatement) {
364 i::Scanner::Location location = scanner_->peek_location(); 376 i::Scanner::Location location = scanner_->peek_location();
365 ReportMessageAt(location.beg_pos, location.end_pos, 377 ReportMessageAt(location.beg_pos, location.end_pos,
366 "unprotected_const", NULL); 378 "unprotected_const", NULL);
367 *ok = false; 379 *ok = false;
368 return Statement::Default(); 380 return Statement::Default();
369 } 381 }
370 require_initializer = true; 382 require_initializer = true;
371 break; 383 break;
372 } 384 }
373 Consume(i::Token::CONST);
374 } else if (peek() == i::Token::LET) { 385 } else if (peek() == i::Token::LET) {
375 ASSERT(is_extended_mode()); 386 // ES6 Draft Rev4 section 12.2.1:
387 //
388 // LetDeclaration : let LetBindingList ;
389 //
390 // * It is a Syntax Error if the code that matches this production is not
391 // contained in extended code.
392 if (!is_extended_mode()) {
393 i::Scanner::Location location = scanner_->peek_location();
394 ReportMessageAt(location.beg_pos, location.end_pos,
395 "illegal_let", NULL);
396 *ok = false;
397 return Statement::Default();
398 }
399 Consume(i::Token::LET);
376 if (var_context != kSourceElement && 400 if (var_context != kSourceElement &&
377 var_context != kForStatement) { 401 var_context != kForStatement) {
378 i::Scanner::Location location = scanner_->peek_location(); 402 i::Scanner::Location location = scanner_->peek_location();
379 ReportMessageAt(location.beg_pos, location.end_pos, 403 ReportMessageAt(location.beg_pos, location.end_pos,
380 "unprotected_let", NULL); 404 "unprotected_let", NULL);
381 *ok = false; 405 *ok = false;
382 return Statement::Default(); 406 return Statement::Default();
383 } 407 }
384 Consume(i::Token::LET);
385 } else { 408 } else {
386 *ok = false; 409 *ok = false;
387 return Statement::Default(); 410 return Statement::Default();
388 } 411 }
389 412
390 // The scope of a var/const declared variable anywhere inside a function 413 // The scope of a var/const declared variable anywhere inside a function
391 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). The scope 414 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). The scope
392 // of a let declared variable is the scope of the immediately enclosing 415 // of a let declared variable is the scope of the immediately enclosing
393 // block. 416 // block.
394 int nvars = 0; // the number of variables declared 417 int nvars = 0; // the number of variables declared
(...skipping 1329 matching lines...) Expand 10 before | Expand all | Expand 10 after
1724 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u)); 1747 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u));
1725 } 1748 }
1726 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u)); 1749 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u));
1727 } 1750 }
1728 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f)); 1751 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f));
1729 1752
1730 backing_store_.AddBlock(bytes); 1753 backing_store_.AddBlock(bytes);
1731 return backing_store_.EndSequence().start(); 1754 return backing_store_.EndSequence().start();
1732 } 1755 }
1733 } } // v8::preparser 1756 } } // v8::preparser
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | src/scopes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698