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

Side by Side Diff: src/preparser.h

Issue 1097723005: Lolcode candidate: Both Expression and FunctionLiteral define the same accessor (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 5 years, 8 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/parser.cc ('k') | no next file » | 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_PREPARSER_H 5 #ifndef V8_PREPARSER_H
6 #define V8_PREPARSER_H 6 #define V8_PREPARSER_H
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/bailout-reason.h" 10 #include "src/bailout-reason.h"
(...skipping 885 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 896
897 static PreParserExpression FromIdentifier(PreParserIdentifier id) { 897 static PreParserExpression FromIdentifier(PreParserIdentifier id) {
898 return PreParserExpression(TypeField::encode(kIdentifierExpression) | 898 return PreParserExpression(TypeField::encode(kIdentifierExpression) |
899 IdentifierTypeField::encode(id.type_)); 899 IdentifierTypeField::encode(id.type_));
900 } 900 }
901 901
902 static PreParserExpression BinaryOperation(PreParserExpression left, 902 static PreParserExpression BinaryOperation(PreParserExpression left,
903 Token::Value op, 903 Token::Value op,
904 PreParserExpression right) { 904 PreParserExpression right) {
905 ValidArrowParam valid_arrow_param_list = 905 ValidArrowParam valid_arrow_param_list =
906 (op == Token::COMMA && !left.is_parenthesized() && 906 (op == Token::COMMA && !left.is_single_parenthesized() &&
907 !right.is_parenthesized()) ? 907 !right.is_single_parenthesized())
908 std::min(left.ValidateArrowParams(), right.ValidateArrowParams()) 908 ? std::min(left.ValidateArrowParams(), right.ValidateArrowParams())
909 : kInvalidArrowParam; 909 : kInvalidArrowParam;
910 return PreParserExpression( 910 return PreParserExpression(
911 TypeField::encode(kBinaryOperationExpression) | 911 TypeField::encode(kBinaryOperationExpression) |
912 IsValidArrowParamListField::encode(valid_arrow_param_list)); 912 IsValidArrowParamListField::encode(valid_arrow_param_list));
913 } 913 }
914 914
915 static PreParserExpression StringLiteral() { 915 static PreParserExpression StringLiteral() {
916 return PreParserExpression(TypeField::encode(kStringLiteralExpression)); 916 return PreParserExpression(TypeField::encode(kStringLiteralExpression));
917 } 917 }
918 918
919 static PreParserExpression UseStrictStringLiteral() { 919 static PreParserExpression UseStrictStringLiteral() {
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 bool IsSpreadExpression() const { 1038 bool IsSpreadExpression() const {
1039 return TypeField::decode(code_) == kSpreadExpression; 1039 return TypeField::decode(code_) == kSpreadExpression;
1040 } 1040 }
1041 1041
1042 PreParserExpression AsFunctionLiteral() { return *this; } 1042 PreParserExpression AsFunctionLiteral() { return *this; }
1043 1043
1044 bool IsBinaryOperation() const { 1044 bool IsBinaryOperation() const {
1045 return TypeField::decode(code_) == kBinaryOperationExpression; 1045 return TypeField::decode(code_) == kBinaryOperationExpression;
1046 } 1046 }
1047 1047
1048 bool is_parenthesized() const { 1048 bool is_single_parenthesized() const {
1049 return ParenthesizationField::decode(code_) != kNotParenthesized; 1049 return ParenthesizationField::decode(code_) != kNotParenthesized;
1050 } 1050 }
1051 1051
1052 void increase_parenthesization_level() { 1052 void increase_parenthesization_level() {
1053 code_ = ParenthesizationField::update( 1053 code_ = ParenthesizationField::update(
1054 code_, is_parenthesized() ? kMultiParenthesizedExpression 1054 code_, is_single_parenthesized() ? kMultiParenthesizedExpression
1055 : kParanthesizedExpression); 1055 : kParanthesizedExpression);
1056 } 1056 }
1057 1057
1058 // Dummy implementation for making expression->somefunc() work in both Parser 1058 // Dummy implementation for making expression->somefunc() work in both Parser
1059 // and PreParser. 1059 // and PreParser.
1060 PreParserExpression* operator->() { return this; } 1060 PreParserExpression* operator->() { return this; }
1061 1061
1062 // More dummy implementations of things PreParser doesn't need to track: 1062 // More dummy implementations of things PreParser doesn't need to track:
1063 void set_index(int index) {} // For YieldExpressions 1063 void set_index(int index) {} // For YieldExpressions
1064 void set_parenthesized() {} 1064 void set_should_eager_compile() {}
1065 1065
1066 int position() const { return RelocInfo::kNoPosition; } 1066 int position() const { return RelocInfo::kNoPosition; }
1067 void set_function_token_position(int position) {} 1067 void set_function_token_position(int position) {}
1068 1068
1069 private: 1069 private:
1070 enum Type { 1070 enum Type {
1071 kExpression, 1071 kExpression,
1072 kIdentifierExpression, 1072 kIdentifierExpression,
1073 kStringLiteralExpression, 1073 kStringLiteralExpression,
1074 kBinaryOperationExpression, 1074 kBinaryOperationExpression,
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1342 int pos) { 1342 int pos) {
1343 return PreParserStatement::Default(); 1343 return PreParserStatement::Default();
1344 } 1344 }
1345 PreParserExpression NewFunctionLiteral( 1345 PreParserExpression NewFunctionLiteral(
1346 PreParserIdentifier name, AstValueFactory* ast_value_factory, 1346 PreParserIdentifier name, AstValueFactory* ast_value_factory,
1347 Scope* scope, PreParserStatementList body, int materialized_literal_count, 1347 Scope* scope, PreParserStatementList body, int materialized_literal_count,
1348 int expected_property_count, int handler_count, int parameter_count, 1348 int expected_property_count, int handler_count, int parameter_count,
1349 FunctionLiteral::ParameterFlag has_duplicate_parameters, 1349 FunctionLiteral::ParameterFlag has_duplicate_parameters,
1350 FunctionLiteral::FunctionType function_type, 1350 FunctionLiteral::FunctionType function_type,
1351 FunctionLiteral::IsFunctionFlag is_function, 1351 FunctionLiteral::IsFunctionFlag is_function,
1352 FunctionLiteral::IsParenthesizedFlag is_parenthesized, FunctionKind kind, 1352 FunctionLiteral::EagerCompileHint eager_compile_hint, FunctionKind kind,
1353 int position) { 1353 int position) {
1354 return PreParserExpression::Default(); 1354 return PreParserExpression::Default();
1355 } 1355 }
1356 1356
1357 PreParserExpression NewSpread(PreParserExpression expression, int pos) { 1357 PreParserExpression NewSpread(PreParserExpression expression, int pos) {
1358 return PreParserExpression::Spread(expression); 1358 return PreParserExpression::Spread(expression);
1359 } 1359 }
1360 1360
1361 // Return the object itself as AstVisitor and implement the needed 1361 // Return the object itself as AstVisitor and implement the needed
1362 // dummy method right in this class. 1362 // dummy method right in this class.
(...skipping 1593 matching lines...) Expand 10 before | Expand all | Expand 10 after
2956 // For other kinds of calls we record position of the parenthesis as 2956 // For other kinds of calls we record position of the parenthesis as
2957 // position of the call. Note that this is extremely important for 2957 // position of the call. Note that this is extremely important for
2958 // expressions of the form function(){...}() for which call position 2958 // expressions of the form function(){...}() for which call position
2959 // should not point to the closing brace otherwise it will intersect 2959 // should not point to the closing brace otherwise it will intersect
2960 // with positions recorded for function literal and confuse debugger. 2960 // with positions recorded for function literal and confuse debugger.
2961 pos = peek_position(); 2961 pos = peek_position();
2962 // Also the trailing parenthesis are a hint that the function will 2962 // Also the trailing parenthesis are a hint that the function will
2963 // be called immediately. If we happen to have parsed a preceding 2963 // be called immediately. If we happen to have parsed a preceding
2964 // function literal eagerly, we can also compile it eagerly. 2964 // function literal eagerly, we can also compile it eagerly.
2965 if (result->IsFunctionLiteral() && mode() == PARSE_EAGERLY) { 2965 if (result->IsFunctionLiteral() && mode() == PARSE_EAGERLY) {
2966 result->AsFunctionLiteral()->set_parenthesized(); 2966 result->AsFunctionLiteral()->set_should_eager_compile();
2967 } 2967 }
2968 } 2968 }
2969 Scanner::Location spread_pos; 2969 Scanner::Location spread_pos;
2970 typename Traits::Type::ExpressionList args = 2970 typename Traits::Type::ExpressionList args =
2971 ParseArguments(&spread_pos, classifier, CHECK_OK); 2971 ParseArguments(&spread_pos, classifier, CHECK_OK);
2972 2972
2973 // Keep track of eval() calls since they disable all local variable 2973 // Keep track of eval() calls since they disable all local variable
2974 // optimizations. 2974 // optimizations.
2975 // The calls that need special treatment are the 2975 // The calls that need special treatment are the
2976 // direct eval calls. These calls are all of the form eval(...), with 2976 // direct eval calls. These calls are all of the form eval(...), with
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
3318 case Token::TEMPLATE_SPAN: 3318 case Token::TEMPLATE_SPAN:
3319 case Token::TEMPLATE_TAIL: { 3319 case Token::TEMPLATE_TAIL: {
3320 int pos; 3320 int pos;
3321 if (scanner()->current_token() == Token::IDENTIFIER) { 3321 if (scanner()->current_token() == Token::IDENTIFIER) {
3322 pos = position(); 3322 pos = position();
3323 } else { 3323 } else {
3324 pos = peek_position(); 3324 pos = peek_position();
3325 if (expression->IsFunctionLiteral() && mode() == PARSE_EAGERLY) { 3325 if (expression->IsFunctionLiteral() && mode() == PARSE_EAGERLY) {
3326 // If the tag function looks like an IIFE, set_parenthesized() to 3326 // If the tag function looks like an IIFE, set_parenthesized() to
3327 // force eager compilation. 3327 // force eager compilation.
3328 expression->AsFunctionLiteral()->set_parenthesized(); 3328 expression->AsFunctionLiteral()->set_should_eager_compile();
3329 } 3329 }
3330 } 3330 }
3331 expression = 3331 expression =
3332 ParseTemplateLiteral(expression, pos, classifier, CHECK_OK); 3332 ParseTemplateLiteral(expression, pos, classifier, CHECK_OK);
3333 break; 3333 break;
3334 } 3334 }
3335 default: 3335 default:
3336 return expression; 3336 return expression;
3337 } 3337 }
3338 } 3338 }
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
3513 scanner()->location().end_pos, CHECK_OK); 3513 scanner()->location().end_pos, CHECK_OK);
3514 this->CheckConflictingVarDeclarations(scope, CHECK_OK); 3514 this->CheckConflictingVarDeclarations(scope, CHECK_OK);
3515 } 3515 }
3516 } 3516 }
3517 3517
3518 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( 3518 FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
3519 this->EmptyIdentifierString(), ast_value_factory(), scope, body, 3519 this->EmptyIdentifierString(), ast_value_factory(), scope, body,
3520 materialized_literal_count, expected_property_count, handler_count, 3520 materialized_literal_count, expected_property_count, handler_count,
3521 num_parameters, FunctionLiteral::kNoDuplicateParameters, 3521 num_parameters, FunctionLiteral::kNoDuplicateParameters,
3522 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, 3522 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction,
3523 FunctionLiteral::kNotParenthesized, FunctionKind::kArrowFunction, 3523 FunctionLiteral::kShouldLazyCompile, FunctionKind::kArrowFunction,
3524 scope->start_position()); 3524 scope->start_position());
3525 3525
3526 function_literal->set_function_token_position(scope->start_position()); 3526 function_literal->set_function_token_position(scope->start_position());
3527 if (super_loc.IsValid()) function_state_->set_super_location(super_loc); 3527 if (super_loc.IsValid()) function_state_->set_super_location(super_loc);
3528 3528
3529 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); 3529 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal);
3530 3530
3531 return function_literal; 3531 return function_literal;
3532 } 3532 }
3533 3533
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
3713 *ok = false; 3713 *ok = false;
3714 return; 3714 return;
3715 } 3715 }
3716 has_seen_constructor_ = true; 3716 has_seen_constructor_ = true;
3717 return; 3717 return;
3718 } 3718 }
3719 } 3719 }
3720 } } // v8::internal 3720 } } // v8::internal
3721 3721
3722 #endif // V8_PREPARSER_H 3722 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698