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

Side by Side Diff: src/preparser.h

Issue 156673002: Revert "Unify paren handling in Parser and PreParser." (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 10 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
« no previous file with comments | « src/parser.cc ('k') | src/preparser.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 Type type_; 340 Type type_;
341 341
342 friend class Expression; 342 friend class Expression;
343 }; 343 };
344 344
345 // Bits 0 and 1 are used to identify the type of expression: 345 // Bits 0 and 1 are used to identify the type of expression:
346 // If bit 0 is set, it's an identifier. 346 // If bit 0 is set, it's an identifier.
347 // if bit 1 is set, it's a string literal. 347 // if bit 1 is set, it's a string literal.
348 // If neither is set, it's no particular type, and both set isn't 348 // If neither is set, it's no particular type, and both set isn't
349 // use yet. 349 // use yet.
350 // Bit 2 is used to mark the expression as being parenthesized,
351 // so "(foo)" isn't recognized as a pure identifier (and possible label).
350 class Expression { 352 class Expression {
351 public: 353 public:
352 static Expression Default() { 354 static Expression Default() {
353 return Expression(kUnknownExpression); 355 return Expression(kUnknownExpression);
354 } 356 }
355 357
356 static Expression FromIdentifier(Identifier id) { 358 static Expression FromIdentifier(Identifier id) {
357 return Expression(kIdentifierFlag | (id.type_ << kIdentifierShift)); 359 return Expression(kIdentifierFlag | (id.type_ << kIdentifierShift));
358 } 360 }
359 361
(...skipping 20 matching lines...) Expand all
380 bool IsIdentifier() { 382 bool IsIdentifier() {
381 return (code_ & kIdentifierFlag) != 0; 383 return (code_ & kIdentifierFlag) != 0;
382 } 384 }
383 385
384 // Only works corretly if it is actually an identifier expression. 386 // Only works corretly if it is actually an identifier expression.
385 PreParser::Identifier AsIdentifier() { 387 PreParser::Identifier AsIdentifier() {
386 return PreParser::Identifier( 388 return PreParser::Identifier(
387 static_cast<PreParser::Identifier::Type>(code_ >> kIdentifierShift)); 389 static_cast<PreParser::Identifier::Type>(code_ >> kIdentifierShift));
388 } 390 }
389 391
392 bool IsParenthesized() {
393 // If bit 0 or 1 is set, we interpret bit 2 as meaning parenthesized.
394 return (code_ & 7) > 4;
395 }
396
397 bool IsRawIdentifier() {
398 return !IsParenthesized() && IsIdentifier();
399 }
400
390 bool IsStringLiteral() { return (code_ & kStringLiteralFlag) != 0; } 401 bool IsStringLiteral() { return (code_ & kStringLiteralFlag) != 0; }
391 402
403 bool IsRawStringLiteral() {
404 return !IsParenthesized() && IsStringLiteral();
405 }
406
392 bool IsUseStrictLiteral() { 407 bool IsUseStrictLiteral() {
393 return (code_ & kStringLiteralMask) == kUseStrictString; 408 return (code_ & kStringLiteralMask) == kUseStrictString;
394 } 409 }
395 410
396 bool IsThis() { 411 bool IsThis() {
397 return code_ == kThisExpression; 412 return code_ == kThisExpression;
398 } 413 }
399 414
400 bool IsThisProperty() { 415 bool IsThisProperty() {
401 return code_ == kThisPropertyExpression; 416 return code_ == kThisPropertyExpression;
402 } 417 }
403 418
404 bool IsStrictFunction() { 419 bool IsStrictFunction() {
405 return code_ == kStrictFunctionExpression; 420 return code_ == kStrictFunctionExpression;
406 } 421 }
407 422
423 Expression Parenthesize() {
424 int type = code_ & 3;
425 if (type != 0) {
426 // Identifiers and string literals can be parenthesized.
427 // They no longer work as labels or directive prologues,
428 // but are still recognized in other contexts.
429 return Expression(code_ | kParenthesizedExpressionFlag);
430 }
431 // For other types of expressions, it's not important to remember
432 // the parentheses.
433 return *this;
434 }
435
408 private: 436 private:
409 // First two/three bits are used as flags. 437 // First two/three bits are used as flags.
410 // Bit 0 and 1 represent identifiers or strings literals, and are 438 // Bit 0 and 1 represent identifiers or strings literals, and are
411 // mutually exclusive, but can both be absent. 439 // mutually exclusive, but can both be absent.
440 // If bit 0 or 1 are set, bit 2 marks that the expression has
441 // been wrapped in parentheses (a string literal can no longer
442 // be a directive prologue, and an identifier can no longer be
443 // a label.
412 enum { 444 enum {
413 kUnknownExpression = 0, 445 kUnknownExpression = 0,
414 // Identifiers 446 // Identifiers
415 kIdentifierFlag = 1, // Used to detect labels. 447 kIdentifierFlag = 1, // Used to detect labels.
416 kIdentifierShift = 3, 448 kIdentifierShift = 3,
417 449
418 kStringLiteralFlag = 2, // Used to detect directive prologue. 450 kStringLiteralFlag = 2, // Used to detect directive prologue.
419 kUnknownStringLiteral = kStringLiteralFlag, 451 kUnknownStringLiteral = kStringLiteralFlag,
420 kUseStrictString = kStringLiteralFlag | 8, 452 kUseStrictString = kStringLiteralFlag | 8,
421 kStringLiteralMask = kUseStrictString, 453 kStringLiteralMask = kUseStrictString,
422 454
455 // Only if identifier or string literal.
456 kParenthesizedExpressionFlag = 4,
457
423 // Below here applies if neither identifier nor string literal. 458 // Below here applies if neither identifier nor string literal.
424 kThisExpression = 4, 459 kThisExpression = 4,
425 kThisPropertyExpression = 8, 460 kThisPropertyExpression = 8,
426 kStrictFunctionExpression = 12 461 kStrictFunctionExpression = 12
427 }; 462 };
428 463
429 explicit Expression(int expression_code) : code_(expression_code) { } 464 explicit Expression(int expression_code) : code_(expression_code) { }
430 465
431 int code_; 466 int code_;
432 }; 467 };
433 468
434 class Statement { 469 class Statement {
435 public: 470 public:
436 static Statement Default() { 471 static Statement Default() {
437 return Statement(kUnknownStatement); 472 return Statement(kUnknownStatement);
438 } 473 }
439 474
440 static Statement FunctionDeclaration() { 475 static Statement FunctionDeclaration() {
441 return Statement(kFunctionDeclaration); 476 return Statement(kFunctionDeclaration);
442 } 477 }
443 478
444 // Creates expression statement from expression. 479 // Creates expression statement from expression.
445 // Preserves being an unparenthesized string literal, possibly 480 // Preserves being an unparenthesized string literal, possibly
446 // "use strict". 481 // "use strict".
447 static Statement ExpressionStatement(Expression expression) { 482 static Statement ExpressionStatement(Expression expression) {
448 if (expression.IsUseStrictLiteral()) { 483 if (!expression.IsParenthesized()) {
449 return Statement(kUseStrictExpressionStatement); 484 if (expression.IsUseStrictLiteral()) {
450 } 485 return Statement(kUseStrictExpressionStatement);
451 if (expression.IsStringLiteral()) { 486 }
452 return Statement(kStringLiteralExpressionStatement); 487 if (expression.IsStringLiteral()) {
488 return Statement(kStringLiteralExpressionStatement);
489 }
453 } 490 }
454 return Default(); 491 return Default();
455 } 492 }
456 493
457 bool IsStringLiteral() { 494 bool IsStringLiteral() {
458 return code_ == kStringLiteralExpressionStatement; 495 return code_ == kStringLiteralExpressionStatement;
459 } 496 }
460 497
461 bool IsUseStrictLiteral() { 498 bool IsUseStrictLiteral() {
462 return code_ == kUseStrictExpressionStatement; 499 return code_ == kUseStrictExpressionStatement;
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 ParserRecorder* log_; 687 ParserRecorder* log_;
651 Scope* scope_; 688 Scope* scope_;
652 Scanner::Location strict_mode_violation_location_; 689 Scanner::Location strict_mode_violation_location_;
653 const char* strict_mode_violation_type_; 690 const char* strict_mode_violation_type_;
654 bool parenthesized_function_; 691 bool parenthesized_function_;
655 }; 692 };
656 693
657 } } // v8::internal 694 } } // v8::internal
658 695
659 #endif // V8_PREPARSER_H 696 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698