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

Side by Side Diff: src/preparser.h

Issue 345513003: Revert "Parser: Delay internalizing strings and values." (r21841) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 6 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/prettyprinter.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 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/func-name-inferrer.h" 8 #include "src/func-name-inferrer.h"
9 #include "src/hashmap.h" 9 #include "src/hashmap.h"
10 #include "src/scopes.h" 10 #include "src/scopes.h"
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 typename Traits::Type::Scope* outer_scope_; 142 typename Traits::Type::Scope* outer_scope_;
143 typename Traits::Type::Scope* scope_; 143 typename Traits::Type::Scope* scope_;
144 }; 144 };
145 145
146 class FunctionState BASE_EMBEDDED { 146 class FunctionState BASE_EMBEDDED {
147 public: 147 public:
148 FunctionState( 148 FunctionState(
149 FunctionState** function_state_stack, 149 FunctionState** function_state_stack,
150 typename Traits::Type::Scope** scope_stack, 150 typename Traits::Type::Scope** scope_stack,
151 typename Traits::Type::Scope* scope, 151 typename Traits::Type::Scope* scope,
152 typename Traits::Type::Zone* zone = NULL, 152 typename Traits::Type::Zone* zone = NULL);
153 AstValueFactory* ast_value_factory = NULL);
154 ~FunctionState(); 153 ~FunctionState();
155 154
156 int NextMaterializedLiteralIndex() { 155 int NextMaterializedLiteralIndex() {
157 return next_materialized_literal_index_++; 156 return next_materialized_literal_index_++;
158 } 157 }
159 int materialized_literal_count() { 158 int materialized_literal_count() {
160 return next_materialized_literal_index_ - JSFunction::kLiteralsPrefixSize; 159 return next_materialized_literal_index_ - JSFunction::kLiteralsPrefixSize;
161 } 160 }
162 161
163 int NextHandlerIndex() { return next_handler_index_++; } 162 int NextHandlerIndex() { return next_handler_index_++; }
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 349
351 // Report syntax errors. 350 // Report syntax errors.
352 void ReportMessage(const char* message, const char* arg = NULL, 351 void ReportMessage(const char* message, const char* arg = NULL,
353 bool is_reference_error = false) { 352 bool is_reference_error = false) {
354 Scanner::Location source_location = scanner()->location(); 353 Scanner::Location source_location = scanner()->location();
355 Traits::ReportMessageAt(source_location, message, arg, is_reference_error); 354 Traits::ReportMessageAt(source_location, message, arg, is_reference_error);
356 } 355 }
357 356
358 void ReportMessageAt(Scanner::Location location, const char* message, 357 void ReportMessageAt(Scanner::Location location, const char* message,
359 bool is_reference_error = false) { 358 bool is_reference_error = false) {
360 Traits::ReportMessageAt(location, message, 359 Traits::ReportMessageAt(location, message, NULL, is_reference_error);
361 reinterpret_cast<const char*>(NULL),
362 is_reference_error);
363 } 360 }
364 361
365 void ReportUnexpectedToken(Token::Value token); 362 void ReportUnexpectedToken(Token::Value token);
366 363
367 // Recursive descent functions: 364 // Recursive descent functions:
368 365
369 // Parses an identifier that is valid for the current scope, in particular it 366 // Parses an identifier that is valid for the current scope, in particular it
370 // fails on strict mode future reserved keywords in a strict scope. If 367 // fails on strict mode future reserved keywords in a strict scope. If
371 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or 368 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or
372 // "arguments" as identifier even in strict mode (this is needed in cases like 369 // "arguments" as identifier even in strict mode (this is needed in cases like
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 void SetStrictMode(StrictMode strict_mode) { strict_mode_ = strict_mode; } 736 void SetStrictMode(StrictMode strict_mode) { strict_mode_ = strict_mode; }
740 737
741 private: 738 private:
742 ScopeType scope_type_; 739 ScopeType scope_type_;
743 StrictMode strict_mode_; 740 StrictMode strict_mode_;
744 }; 741 };
745 742
746 743
747 class PreParserFactory { 744 class PreParserFactory {
748 public: 745 public:
749 explicit PreParserFactory(void* extra_param1, void* extra_param2) {} 746 explicit PreParserFactory(void* extra_param) {}
750 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, 747 PreParserExpression NewLiteral(PreParserIdentifier identifier,
751 int pos) { 748 int pos) {
752 return PreParserExpression::Default(); 749 return PreParserExpression::Default();
753 } 750 }
754 PreParserExpression NewNumberLiteral(double number, 751 PreParserExpression NewNumberLiteral(double number,
755 int pos) { 752 int pos) {
756 return PreParserExpression::Default(); 753 return PreParserExpression::Default();
757 } 754 }
758 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern, 755 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern,
759 PreParserIdentifier js_flags, 756 PreParserIdentifier js_flags,
760 int literal_index, 757 int literal_index,
761 int pos) { 758 int pos) {
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 } 990 }
994 991
995 // Odd-ball literal creators. 992 // Odd-ball literal creators.
996 static PreParserExpression GetLiteralTheHole(int position, 993 static PreParserExpression GetLiteralTheHole(int position,
997 PreParserFactory* factory) { 994 PreParserFactory* factory) {
998 return PreParserExpression::Default(); 995 return PreParserExpression::Default();
999 } 996 }
1000 997
1001 // Producing data during the recursive descent. 998 // Producing data during the recursive descent.
1002 PreParserIdentifier GetSymbol(Scanner* scanner); 999 PreParserIdentifier GetSymbol(Scanner* scanner);
1003 1000 static PreParserIdentifier NextLiteralString(Scanner* scanner,
1004 static PreParserIdentifier GetNextSymbol(Scanner* scanner) { 1001 PretenureFlag tenured) {
1005 return PreParserIdentifier::Default(); 1002 return PreParserIdentifier::Default();
1006 } 1003 }
1007 1004
1008 static PreParserExpression ThisExpression(PreParserScope* scope, 1005 static PreParserExpression ThisExpression(PreParserScope* scope,
1009 PreParserFactory* factory) { 1006 PreParserFactory* factory) {
1010 return PreParserExpression::This(); 1007 return PreParserExpression::This();
1011 } 1008 }
1012 1009
1013 static PreParserExpression ExpressionFromLiteral( 1010 static PreParserExpression ExpressionFromLiteral(
1014 Token::Value token, int pos, Scanner* scanner, 1011 Token::Value token, int pos, Scanner* scanner,
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1182 void ParseLazyFunctionLiteralBody(bool* ok); 1179 void ParseLazyFunctionLiteralBody(bool* ok);
1183 1180
1184 bool CheckInOrOf(bool accept_OF); 1181 bool CheckInOrOf(bool accept_OF);
1185 }; 1182 };
1186 1183
1187 template<class Traits> 1184 template<class Traits>
1188 ParserBase<Traits>::FunctionState::FunctionState( 1185 ParserBase<Traits>::FunctionState::FunctionState(
1189 FunctionState** function_state_stack, 1186 FunctionState** function_state_stack,
1190 typename Traits::Type::Scope** scope_stack, 1187 typename Traits::Type::Scope** scope_stack,
1191 typename Traits::Type::Scope* scope, 1188 typename Traits::Type::Scope* scope,
1192 typename Traits::Type::Zone* extra_param, 1189 typename Traits::Type::Zone* extra_param)
1193 AstValueFactory* ast_value_factory)
1194 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize), 1190 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize),
1195 next_handler_index_(0), 1191 next_handler_index_(0),
1196 expected_property_count_(0), 1192 expected_property_count_(0),
1197 is_generator_(false), 1193 is_generator_(false),
1198 generator_object_variable_(NULL), 1194 generator_object_variable_(NULL),
1199 function_state_stack_(function_state_stack), 1195 function_state_stack_(function_state_stack),
1200 outer_function_state_(*function_state_stack), 1196 outer_function_state_(*function_state_stack),
1201 scope_stack_(scope_stack), 1197 scope_stack_(scope_stack),
1202 outer_scope_(*scope_stack), 1198 outer_scope_(*scope_stack),
1203 saved_ast_node_id_(0), 1199 saved_ast_node_id_(0),
1204 extra_param_(extra_param), 1200 extra_param_(extra_param),
1205 factory_(extra_param, ast_value_factory) { 1201 factory_(extra_param) {
1206 *scope_stack_ = scope; 1202 *scope_stack_ = scope;
1207 *function_state_stack = this; 1203 *function_state_stack = this;
1208 Traits::SetUpFunctionState(this, extra_param); 1204 Traits::SetUpFunctionState(this, extra_param);
1209 } 1205 }
1210 1206
1211 1207
1212 template<class Traits> 1208 template<class Traits>
1213 ParserBase<Traits>::FunctionState::~FunctionState() { 1209 ParserBase<Traits>::FunctionState::~FunctionState() {
1214 *scope_stack_ = outer_scope_; 1210 *scope_stack_ = outer_scope_;
1215 *function_state_stack_ = outer_function_state_; 1211 *function_state_stack_ = outer_function_state_;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1321 int pos = peek_position(); 1317 int pos = peek_position();
1322 if (!scanner()->ScanRegExpPattern(seen_equal)) { 1318 if (!scanner()->ScanRegExpPattern(seen_equal)) {
1323 Next(); 1319 Next();
1324 ReportMessage("unterminated_regexp"); 1320 ReportMessage("unterminated_regexp");
1325 *ok = false; 1321 *ok = false;
1326 return Traits::EmptyExpression(); 1322 return Traits::EmptyExpression();
1327 } 1323 }
1328 1324
1329 int literal_index = function_state_->NextMaterializedLiteralIndex(); 1325 int literal_index = function_state_->NextMaterializedLiteralIndex();
1330 1326
1331 IdentifierT js_pattern = this->GetNextSymbol(scanner()); 1327 IdentifierT js_pattern = this->NextLiteralString(scanner(), TENURED);
1332 if (!scanner()->ScanRegExpFlags()) { 1328 if (!scanner()->ScanRegExpFlags()) {
1333 Next(); 1329 Next();
1334 ReportMessage("invalid_regexp_flags"); 1330 ReportMessage("invalid_regexp_flags");
1335 *ok = false; 1331 *ok = false;
1336 return Traits::EmptyExpression(); 1332 return Traits::EmptyExpression();
1337 } 1333 }
1338 IdentifierT js_flags = this->GetNextSymbol(scanner()); 1334 IdentifierT js_flags = this->NextLiteralString(scanner(), TENURED);
1339 Next(); 1335 Next();
1340 return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index, pos); 1336 return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index, pos);
1341 } 1337 }
1342 1338
1343 1339
1344 #define CHECK_OK ok); \ 1340 #define CHECK_OK ok); \
1345 if (!*ok) return this->EmptyExpression(); \ 1341 if (!*ok) return this->EmptyExpression(); \
1346 ((void)0 1342 ((void)0
1347 #define DUMMY ) // to make indentation work 1343 #define DUMMY ) // to make indentation work
1348 #undef DUMMY 1344 #undef DUMMY
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
1573 } 1569 }
1574 1570
1575 if (fni_ != NULL) { 1571 if (fni_ != NULL) {
1576 fni_->Infer(); 1572 fni_->Infer();
1577 fni_->Leave(); 1573 fni_->Leave();
1578 } 1574 }
1579 continue; // restart the while 1575 continue; // restart the while
1580 } 1576 }
1581 // Failed to parse as get/set property, so it's just a normal property 1577 // Failed to parse as get/set property, so it's just a normal property
1582 // (which might be called "get" or "set" or something else). 1578 // (which might be called "get" or "set" or something else).
1583 key = factory()->NewStringLiteral(id, next_pos); 1579 key = factory()->NewLiteral(id, next_pos);
1584 break; 1580 break;
1585 } 1581 }
1586 case Token::STRING: { 1582 case Token::STRING: {
1587 Consume(Token::STRING); 1583 Consume(Token::STRING);
1588 IdentifierT string = this->GetSymbol(scanner_); 1584 IdentifierT string = this->GetSymbol(scanner_);
1589 if (fni_ != NULL) this->PushLiteralName(fni_, string); 1585 if (fni_ != NULL) this->PushLiteralName(fni_, string);
1590 uint32_t index; 1586 uint32_t index;
1591 if (this->IsArrayIndex(string, &index)) { 1587 if (this->IsArrayIndex(string, &index)) {
1592 key = factory()->NewNumberLiteral(index, next_pos); 1588 key = factory()->NewNumberLiteral(index, next_pos);
1593 break; 1589 break;
1594 } 1590 }
1595 key = factory()->NewStringLiteral(string, next_pos); 1591 key = factory()->NewLiteral(string, next_pos);
1596 break; 1592 break;
1597 } 1593 }
1598 case Token::NUMBER: { 1594 case Token::NUMBER: {
1599 Consume(Token::NUMBER); 1595 Consume(Token::NUMBER);
1600 key = this->ExpressionFromLiteral(Token::NUMBER, next_pos, scanner_, 1596 key = this->ExpressionFromLiteral(Token::NUMBER, next_pos, scanner_,
1601 factory()); 1597 factory());
1602 break; 1598 break;
1603 } 1599 }
1604 default: 1600 default:
1605 if (Token::IsKeyword(next)) { 1601 if (Token::IsKeyword(next)) {
1606 Consume(next); 1602 Consume(next);
1607 IdentifierT string = this->GetSymbol(scanner_); 1603 IdentifierT string = this->GetSymbol(scanner_);
1608 key = factory()->NewStringLiteral(string, next_pos); 1604 key = factory()->NewLiteral(string, next_pos);
1609 } else { 1605 } else {
1610 Token::Value next = Next(); 1606 Token::Value next = Next();
1611 ReportUnexpectedToken(next); 1607 ReportUnexpectedToken(next);
1612 *ok = false; 1608 *ok = false;
1613 return this->EmptyLiteral(); 1609 return this->EmptyLiteral();
1614 } 1610 }
1615 } 1611 }
1616 1612
1617 // Validate the property 1613 // Validate the property
1618 checker.CheckProperty(next, kValueProperty, CHECK_OK); 1614 checker.CheckProperty(next, kValueProperty, CHECK_OK);
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
1967 result = factory()->NewCall(result, args, pos); 1963 result = factory()->NewCall(result, args, pos);
1968 if (fni_ != NULL) fni_->RemoveLastFunction(); 1964 if (fni_ != NULL) fni_->RemoveLastFunction();
1969 break; 1965 break;
1970 } 1966 }
1971 1967
1972 case Token::PERIOD: { 1968 case Token::PERIOD: {
1973 Consume(Token::PERIOD); 1969 Consume(Token::PERIOD);
1974 int pos = position(); 1970 int pos = position();
1975 IdentifierT name = ParseIdentifierName(CHECK_OK); 1971 IdentifierT name = ParseIdentifierName(CHECK_OK);
1976 result = factory()->NewProperty( 1972 result = factory()->NewProperty(
1977 result, factory()->NewStringLiteral(name, pos), pos); 1973 result, factory()->NewLiteral(name, pos), pos);
1978 if (fni_ != NULL) this->PushLiteralName(fni_, name); 1974 if (fni_ != NULL) this->PushLiteralName(fni_, name);
1979 break; 1975 break;
1980 } 1976 }
1981 1977
1982 default: 1978 default:
1983 return result; 1979 return result;
1984 } 1980 }
1985 } 1981 }
1986 } 1982 }
1987 1983
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
2090 this->PushPropertyName(fni_, index); 2086 this->PushPropertyName(fni_, index);
2091 } 2087 }
2092 Expect(Token::RBRACK, CHECK_OK); 2088 Expect(Token::RBRACK, CHECK_OK);
2093 break; 2089 break;
2094 } 2090 }
2095 case Token::PERIOD: { 2091 case Token::PERIOD: {
2096 Consume(Token::PERIOD); 2092 Consume(Token::PERIOD);
2097 int pos = position(); 2093 int pos = position();
2098 IdentifierT name = ParseIdentifierName(CHECK_OK); 2094 IdentifierT name = ParseIdentifierName(CHECK_OK);
2099 expression = factory()->NewProperty( 2095 expression = factory()->NewProperty(
2100 expression, factory()->NewStringLiteral(name, pos), pos); 2096 expression, factory()->NewLiteral(name, pos), pos);
2101 if (fni_ != NULL) { 2097 if (fni_ != NULL) {
2102 this->PushLiteralName(fni_, name); 2098 this->PushLiteralName(fni_, name);
2103 } 2099 }
2104 break; 2100 break;
2105 } 2101 }
2106 default: 2102 default:
2107 return expression; 2103 return expression;
2108 } 2104 }
2109 } 2105 }
2110 ASSERT(false); 2106 ASSERT(false);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2168 parser()->ReportMessage("accessor_get_set"); 2164 parser()->ReportMessage("accessor_get_set");
2169 } 2165 }
2170 *ok = false; 2166 *ok = false;
2171 } 2167 }
2172 } 2168 }
2173 2169
2174 2170
2175 } } // v8::internal 2171 } } // v8::internal
2176 2172
2177 #endif // V8_PREPARSER_H 2173 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | src/prettyprinter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698