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

Side by Side Diff: src/preparser.h

Issue 13450007: Refactor parser mode configuration for correctness (Closed) Base URL: git://github.com/v8/v8.git@master
Patch Set: Created 7 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
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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 class PreParser { 112 class PreParser {
113 public: 113 public:
114 enum PreParseResult { 114 enum PreParseResult {
115 kPreParseStackOverflow, 115 kPreParseStackOverflow,
116 kPreParseSuccess 116 kPreParseSuccess
117 }; 117 };
118 118
119 119
120 PreParser(i::Scanner* scanner, 120 PreParser(i::Scanner* scanner,
121 i::ParserRecorder* log, 121 i::ParserRecorder* log,
122 uintptr_t stack_limit, 122 uintptr_t stack_limit)
123 bool allow_lazy,
124 bool allow_natives_syntax,
125 bool allow_modules,
126 bool allow_generators)
127 : scanner_(scanner), 123 : scanner_(scanner),
128 log_(log), 124 log_(log),
129 scope_(NULL), 125 scope_(NULL),
130 stack_limit_(stack_limit), 126 stack_limit_(stack_limit),
131 strict_mode_violation_location_(i::Scanner::Location::invalid()), 127 strict_mode_violation_location_(i::Scanner::Location::invalid()),
132 strict_mode_violation_type_(NULL), 128 strict_mode_violation_type_(NULL),
133 stack_overflow_(false), 129 stack_overflow_(false),
134 allow_lazy_(allow_lazy), 130 allow_lazy_(false),
135 allow_modules_(allow_modules), 131 allow_natives_syntax_(false),
136 allow_natives_syntax_(allow_natives_syntax), 132 allow_generators_(false),
137 allow_generators_(allow_generators), 133 parenthesized_function_(false) { }
138 parenthesized_function_(false),
139 harmony_scoping_(scanner->HarmonyScoping()) { }
140 134
141 ~PreParser() {} 135 ~PreParser() {}
142 136
137 bool allow_natives_syntax() const { return allow_natives_syntax_; }
138 bool allow_lazy() const { return allow_lazy_; }
139 bool allow_modules() const { return scanner_->HarmonyModules(); }
140 bool allow_harmony_scoping() const { return scanner_->HarmonyScoping(); }
141 bool allow_generators() const { return allow_generators_; }
142
143 void set_allow_natives_syntax(bool allow) { allow_natives_syntax_ = allow; }
144 void set_allow_lazy(bool allow) { allow_lazy_ = allow; }
145 void set_allow_modules(bool allow) { scanner_->SetHarmonyModules(allow); }
146 void set_allow_harmony_scoping(bool allow) {
147 scanner_->SetHarmonyScoping(allow);
148 }
149 void set_allow_generators(bool allow) { allow_generators_ = allow; }
150
143 // Pre-parse the program from the character stream; returns true on 151 // Pre-parse the program from the character stream; returns true on
144 // success (even if parsing failed, the pre-parse data successfully 152 // success (even if parsing failed, the pre-parse data successfully
145 // captured the syntax error), and false if a stack-overflow happened 153 // captured the syntax error), and false if a stack-overflow happened
146 // during parsing. 154 // during parsing.
147 static PreParseResult PreParseProgram(i::Scanner* scanner, 155 PreParseResult PreParseProgram() {
148 i::ParserRecorder* log, 156 Scope top_scope(&scope_, kTopLevelScope);
149 int flags, 157 bool ok = true;
150 uintptr_t stack_limit) { 158 int start_position = scanner_->peek_location().beg_pos;
151 bool allow_lazy = (flags & i::kAllowLazy) != 0; 159 ParseSourceElements(i::Token::EOS, &ok);
152 bool allow_natives_syntax = (flags & i::kAllowNativesSyntax) != 0; 160 if (stack_overflow_) return kPreParseStackOverflow;
153 bool allow_modules = (flags & i::kAllowModules) != 0; 161 if (!ok) {
154 bool allow_generators = (flags & i::kAllowGenerators) != 0; 162 ReportUnexpectedToken(scanner_->current_token());
155 return PreParser(scanner, log, stack_limit, allow_lazy, 163 } else if (!scope_->is_classic_mode()) {
156 allow_natives_syntax, allow_modules, 164 CheckOctalLiteral(start_position, scanner_->location().end_pos, &ok);
157 allow_generators).PreParse(); 165 }
166 return kPreParseSuccess;
158 } 167 }
159 168
160 // Parses a single function literal, from the opening parentheses before 169 // Parses a single function literal, from the opening parentheses before
161 // parameters to the closing brace after the body. 170 // parameters to the closing brace after the body.
162 // Returns a FunctionEntry describing the body of the function in enough 171 // Returns a FunctionEntry describing the body of the function in enough
163 // detail that it can be lazily compiled. 172 // detail that it can be lazily compiled.
164 // The scanner is expected to have matched the "function" or "function*" 173 // The scanner is expected to have matched the "function" or "function*"
165 // keyword and parameters, and have consumed the initial '{'. 174 // keyword and parameters, and have consumed the initial '{'.
166 // At return, unless an error occurred, the scanner is positioned before the 175 // At return, unless an error occurred, the scanner is positioned before the
167 // the final '}'. 176 // the final '}'.
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 Scope** const variable_; 516 Scope** const variable_;
508 Scope* const prev_; 517 Scope* const prev_;
509 const ScopeType type_; 518 const ScopeType type_;
510 int materialized_literal_count_; 519 int materialized_literal_count_;
511 int expected_properties_; 520 int expected_properties_;
512 int with_nesting_count_; 521 int with_nesting_count_;
513 i::LanguageMode language_mode_; 522 i::LanguageMode language_mode_;
514 bool is_generator_; 523 bool is_generator_;
515 }; 524 };
516 525
517 // Preparse the program. Only called in PreParseProgram after creating
518 // the instance.
519 PreParseResult PreParse() {
520 Scope top_scope(&scope_, kTopLevelScope);
521 bool ok = true;
522 int start_position = scanner_->peek_location().beg_pos;
523 ParseSourceElements(i::Token::EOS, &ok);
524 if (stack_overflow_) return kPreParseStackOverflow;
525 if (!ok) {
526 ReportUnexpectedToken(scanner_->current_token());
527 } else if (!scope_->is_classic_mode()) {
528 CheckOctalLiteral(start_position, scanner_->location().end_pos, &ok);
529 }
530 return kPreParseSuccess;
531 }
532
533 // Report syntax error 526 // Report syntax error
534 void ReportUnexpectedToken(i::Token::Value token); 527 void ReportUnexpectedToken(i::Token::Value token);
535 void ReportMessageAt(i::Scanner::Location location, 528 void ReportMessageAt(i::Scanner::Location location,
536 const char* type, 529 const char* type,
537 const char* name_opt) { 530 const char* name_opt) {
538 log_->LogMessage(location.beg_pos, location.end_pos, type, name_opt); 531 log_->LogMessage(location.beg_pos, location.end_pos, type, name_opt);
539 } 532 }
540 void ReportMessageAt(int start_pos, 533 void ReportMessageAt(int start_pos,
541 int end_pos, 534 int end_pos,
542 const char* type, 535 const char* type,
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 bool* ok); 669 bool* ok);
677 670
678 i::Scanner* scanner_; 671 i::Scanner* scanner_;
679 i::ParserRecorder* log_; 672 i::ParserRecorder* log_;
680 Scope* scope_; 673 Scope* scope_;
681 uintptr_t stack_limit_; 674 uintptr_t stack_limit_;
682 i::Scanner::Location strict_mode_violation_location_; 675 i::Scanner::Location strict_mode_violation_location_;
683 const char* strict_mode_violation_type_; 676 const char* strict_mode_violation_type_;
684 bool stack_overflow_; 677 bool stack_overflow_;
685 bool allow_lazy_; 678 bool allow_lazy_;
686 bool allow_modules_; 679 bool allow_modules_;
Michael Starzinger 2013/04/05 10:30:33 The allow_modules_ flag seems to be unused and als
wingo 2013/04/05 12:00:14 Good catch! Done.
687 bool allow_natives_syntax_; 680 bool allow_natives_syntax_;
688 bool allow_generators_; 681 bool allow_generators_;
689 bool parenthesized_function_; 682 bool parenthesized_function_;
690 bool harmony_scoping_;
691 }; 683 };
692 } } // v8::preparser 684 } } // v8::preparser
693 685
694 #endif // V8_PREPARSER_H 686 #endif // V8_PREPARSER_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698