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

Side by Side Diff: src/parser.cc

Issue 722203006: Disable classes in sloppy mode unless --harmony-sloppy is set (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Introduce harmony-sloppy flag Created 6 years, 1 month 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 // 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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
(...skipping 777 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 target_stack_(NULL), 788 target_stack_(NULL),
789 cached_parse_data_(NULL), 789 cached_parse_data_(NULL),
790 info_(info), 790 info_(info),
791 has_pending_error_(false), 791 has_pending_error_(false),
792 pending_error_message_(NULL), 792 pending_error_message_(NULL),
793 pending_error_arg_(NULL), 793 pending_error_arg_(NULL),
794 pending_error_char_arg_(NULL), 794 pending_error_char_arg_(NULL),
795 total_preparse_skipped_(0), 795 total_preparse_skipped_(0),
796 pre_parse_timer_(NULL) { 796 pre_parse_timer_(NULL) {
797 DCHECK(!script().is_null() || info->source_stream() != NULL); 797 DCHECK(!script().is_null() || info->source_stream() != NULL);
798 set_allow_lazy(false); // Must be explicitly enabled.
799 set_allow_natives(FLAG_allow_natives_syntax || info->is_native());
798 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping); 800 set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping);
799 set_allow_modules(!info->is_native() && FLAG_harmony_modules); 801 set_allow_harmony_modules(!info->is_native() && FLAG_harmony_modules);
800 set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native()); 802 set_allow_harmony_arrow_functions(FLAG_harmony_arrow_functions);
801 set_allow_lazy(false); // Must be explicitly enabled.
802 set_allow_arrow_functions(FLAG_harmony_arrow_functions);
803 set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); 803 set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals);
804 set_allow_classes(FLAG_harmony_classes); 804 set_allow_harmony_classes(FLAG_harmony_classes);
805 set_allow_harmony_object_literals(FLAG_harmony_object_literals); 805 set_allow_harmony_object_literals(FLAG_harmony_object_literals);
806 set_allow_harmony_templates(FLAG_harmony_templates); 806 set_allow_harmony_templates(FLAG_harmony_templates);
807 set_allow_harmony_sloppy(FLAG_harmony_sloppy);
807 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; 808 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount;
808 ++feature) { 809 ++feature) {
809 use_counts_[feature] = 0; 810 use_counts_[feature] = 0;
810 } 811 }
811 if (info->ast_value_factory() == NULL) { 812 if (info->ast_value_factory() == NULL) {
812 // info takes ownership of AstValueFactory. 813 // info takes ownership of AstValueFactory.
813 info->SetAstValueFactory( 814 info->SetAstValueFactory(
814 new AstValueFactory(zone(), parse_info->hash_seed)); 815 new AstValueFactory(zone(), parse_info->hash_seed));
815 } 816 }
816 } 817 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
909 *scope = NewScope(*scope, EVAL_SCOPE); 910 *scope = NewScope(*scope, EVAL_SCOPE);
910 } 911 }
911 } else if (info->is_global()) { 912 } else if (info->is_global()) {
912 *scope = NewScope(*scope, SCRIPT_SCOPE); 913 *scope = NewScope(*scope, SCRIPT_SCOPE);
913 } 914 }
914 (*scope)->set_start_position(0); 915 (*scope)->set_start_position(0);
915 // End position will be set by the caller. 916 // End position will be set by the caller.
916 917
917 // Compute the parsing mode. 918 // Compute the parsing mode.
918 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; 919 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY;
919 if (allow_natives_syntax() || extension_ != NULL || 920 if (allow_natives() || extension_ != NULL ||
920 (*scope)->is_eval_scope()) { 921 (*scope)->is_eval_scope()) {
921 mode = PARSE_EAGERLY; 922 mode = PARSE_EAGERLY;
922 } 923 }
923 ParsingModeScope parsing_mode(this, mode); 924 ParsingModeScope parsing_mode(this, mode);
924 925
925 // Enters 'scope'. 926 // Enters 'scope'.
926 AstNodeFactory function_factory(ast_value_factory()); 927 AstNodeFactory function_factory(ast_value_factory());
927 FunctionState function_state(&function_state_, &scope_, *scope, 928 FunctionState function_state(&function_state_, &scope_, *scope,
928 &function_factory); 929 &function_factory);
929 930
(...skipping 1055 matching lines...) Expand 10 before | Expand all | Expand 10 after
1985 // 1986 //
1986 // class C { ... } 1987 // class C { ... }
1987 // 1988 //
1988 // has the same semantics as: 1989 // has the same semantics as:
1989 // 1990 //
1990 // let C = class C { ... }; 1991 // let C = class C { ... };
1991 // 1992 //
1992 // so rewrite it as such. 1993 // so rewrite it as such.
1993 1994
1994 Expect(Token::CLASS, CHECK_OK); 1995 Expect(Token::CLASS, CHECK_OK);
1996 if (!allow_harmony_sloppy() && strict_mode() == SLOPPY) {
1997 ReportMessage("sloppy_lexical");
1998 *ok = false;
1999 return NULL;
2000 }
2001
1995 int pos = position(); 2002 int pos = position();
1996 bool is_strict_reserved = false; 2003 bool is_strict_reserved = false;
1997 const AstRawString* name = 2004 const AstRawString* name =
1998 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); 2005 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK);
1999 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(), 2006 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(),
2000 is_strict_reserved, pos, CHECK_OK); 2007 is_strict_reserved, pos, CHECK_OK);
2001 2008
2002 VariableProxy* proxy = NewUnresolved(name, LET, Interface::NewValue()); 2009 VariableProxy* proxy = NewUnresolved(name, LET, Interface::NewValue());
2003 Declaration* declaration = 2010 Declaration* declaration =
2004 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); 2011 factory()->NewVariableDeclaration(proxy, LET, scope_, pos);
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
2482 // Also detect attempts at 'let' declarations in sloppy mode. 2489 // Also detect attempts at 'let' declarations in sloppy mode.
2483 if (!FLAG_harmony_modules || peek() != Token::IDENTIFIER || 2490 if (!FLAG_harmony_modules || peek() != Token::IDENTIFIER ||
2484 scanner()->HasAnyLineTerminatorBeforeNext() || 2491 scanner()->HasAnyLineTerminatorBeforeNext() ||
2485 expr->AsVariableProxy() == NULL || 2492 expr->AsVariableProxy() == NULL ||
2486 expr->AsVariableProxy()->raw_name() != 2493 expr->AsVariableProxy()->raw_name() !=
2487 ast_value_factory()->module_string() || 2494 ast_value_factory()->module_string() ||
2488 scanner()->literal_contains_escapes()) { 2495 scanner()->literal_contains_escapes()) {
2489 if (peek() == Token::IDENTIFIER && expr->AsVariableProxy() != NULL && 2496 if (peek() == Token::IDENTIFIER && expr->AsVariableProxy() != NULL &&
2490 expr->AsVariableProxy()->raw_name() == 2497 expr->AsVariableProxy()->raw_name() ==
2491 ast_value_factory()->let_string()) { 2498 ast_value_factory()->let_string()) {
2492 ReportMessage("lexical_strict_mode", NULL); 2499 ReportMessage("sloppy_lexical", NULL);
2493 *ok = false; 2500 *ok = false;
2494 return NULL; 2501 return NULL;
2495 } 2502 }
2496 ExpectSemicolon(CHECK_OK); 2503 ExpectSemicolon(CHECK_OK);
2497 } 2504 }
2498 return factory()->NewExpressionStatement(expr, pos); 2505 return factory()->NewExpressionStatement(expr, pos);
2499 } 2506 }
2500 2507
2501 2508
2502 IfStatement* Parser::ParseIfStatement(ZoneList<const AstRawString*>* labels, 2509 IfStatement* Parser::ParseIfStatement(ZoneList<const AstRawString*>* labels,
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after
3366 } 3373 }
3367 3374
3368 // Standard 'for' loop 3375 // Standard 'for' loop
3369 ForStatement* loop = factory()->NewForStatement(labels, stmt_pos); 3376 ForStatement* loop = factory()->NewForStatement(labels, stmt_pos);
3370 Target target(&this->target_stack_, loop); 3377 Target target(&this->target_stack_, loop);
3371 3378
3372 // Parsed initializer at this point. 3379 // Parsed initializer at this point.
3373 // Detect attempts at 'let' declarations in sloppy mode. 3380 // Detect attempts at 'let' declarations in sloppy mode.
3374 if (peek() == Token::IDENTIFIER && strict_mode() == SLOPPY && 3381 if (peek() == Token::IDENTIFIER && strict_mode() == SLOPPY &&
3375 is_let_identifier_expression) { 3382 is_let_identifier_expression) {
3376 ReportMessage("lexical_strict_mode", NULL); 3383 ReportMessage("sloppy_lexical", NULL);
3377 *ok = false; 3384 *ok = false;
3378 return NULL; 3385 return NULL;
3379 } 3386 }
3380 Expect(Token::SEMICOLON, CHECK_OK); 3387 Expect(Token::SEMICOLON, CHECK_OK);
3381 3388
3382 // If there are let bindings, then condition and the next statement of the 3389 // If there are let bindings, then condition and the next statement of the
3383 // for loop must be parsed in a new scope. 3390 // for loop must be parsed in a new scope.
3384 Scope* inner_scope = NULL; 3391 Scope* inner_scope = NULL;
3385 if (let_bindings.length() > 0) { 3392 if (let_bindings.length() > 0) {
3386 inner_scope = NewScope(for_scope, BLOCK_SCOPE); 3393 inner_scope = NewScope(for_scope, BLOCK_SCOPE);
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after
3957 SingletonLogger* logger) { 3964 SingletonLogger* logger) {
3958 // This function may be called on a background thread too; record only the 3965 // This function may be called on a background thread too; record only the
3959 // main thread preparse times. 3966 // main thread preparse times.
3960 if (pre_parse_timer_ != NULL) { 3967 if (pre_parse_timer_ != NULL) {
3961 pre_parse_timer_->Start(); 3968 pre_parse_timer_->Start();
3962 } 3969 }
3963 DCHECK_EQ(Token::LBRACE, scanner()->current_token()); 3970 DCHECK_EQ(Token::LBRACE, scanner()->current_token());
3964 3971
3965 if (reusable_preparser_ == NULL) { 3972 if (reusable_preparser_ == NULL) {
3966 reusable_preparser_ = new PreParser(&scanner_, NULL, stack_limit_); 3973 reusable_preparser_ = new PreParser(&scanner_, NULL, stack_limit_);
3974 reusable_preparser_->set_allow_lazy(true);
3975 reusable_preparser_->set_allow_natives(allow_natives());
3967 reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping()); 3976 reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping());
3968 reusable_preparser_->set_allow_modules(allow_modules()); 3977 reusable_preparser_->set_allow_harmony_modules(allow_harmony_modules());
3969 reusable_preparser_->set_allow_natives_syntax(allow_natives_syntax()); 3978 reusable_preparser_->set_allow_harmony_arrow_functions(
3970 reusable_preparser_->set_allow_lazy(true); 3979 allow_harmony_arrow_functions());
3971 reusable_preparser_->set_allow_arrow_functions(allow_arrow_functions());
3972 reusable_preparser_->set_allow_harmony_numeric_literals( 3980 reusable_preparser_->set_allow_harmony_numeric_literals(
3973 allow_harmony_numeric_literals()); 3981 allow_harmony_numeric_literals());
3974 reusable_preparser_->set_allow_classes(allow_classes()); 3982 reusable_preparser_->set_allow_harmony_classes(allow_harmony_classes());
3975 reusable_preparser_->set_allow_harmony_object_literals( 3983 reusable_preparser_->set_allow_harmony_object_literals(
3976 allow_harmony_object_literals()); 3984 allow_harmony_object_literals());
3977 reusable_preparser_->set_allow_harmony_templates(allow_harmony_templates()); 3985 reusable_preparser_->set_allow_harmony_templates(allow_harmony_templates());
3986 reusable_preparser_->set_allow_harmony_sloppy(allow_harmony_sloppy());
3978 } 3987 }
3979 PreParser::PreParseResult result = 3988 PreParser::PreParseResult result =
3980 reusable_preparser_->PreParseLazyFunction(strict_mode(), 3989 reusable_preparser_->PreParseLazyFunction(strict_mode(),
3981 is_generator(), 3990 is_generator(),
3982 logger); 3991 logger);
3983 if (pre_parse_timer_ != NULL) { 3992 if (pre_parse_timer_ != NULL) {
3984 pre_parse_timer_->Stop(); 3993 pre_parse_timer_->Stop();
3985 } 3994 }
3986 return result; 3995 return result;
3987 } 3996 }
(...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after
5102 result->capture_count = capture_count; 5111 result->capture_count = capture_count;
5103 } 5112 }
5104 return !parser.failed(); 5113 return !parser.failed();
5105 } 5114 }
5106 5115
5107 5116
5108 bool Parser::Parse() { 5117 bool Parser::Parse() {
5109 DCHECK(info()->function() == NULL); 5118 DCHECK(info()->function() == NULL);
5110 FunctionLiteral* result = NULL; 5119 FunctionLiteral* result = NULL;
5111 pre_parse_timer_ = isolate()->counters()->pre_parse(); 5120 pre_parse_timer_ = isolate()->counters()->pre_parse();
5112 if (FLAG_trace_parse || allow_natives_syntax() || extension_ != NULL) { 5121 if (FLAG_trace_parse || allow_natives() || extension_ != NULL) {
5113 // If intrinsics are allowed, the Parser cannot operate independent of the 5122 // If intrinsics are allowed, the Parser cannot operate independent of the
5114 // V8 heap because of Runtime. Tell the string table to internalize strings 5123 // V8 heap because of Runtime. Tell the string table to internalize strings
5115 // and values right after they're created. 5124 // and values right after they're created.
5116 ast_value_factory()->Internalize(isolate()); 5125 ast_value_factory()->Internalize(isolate());
5117 } 5126 }
5118 5127
5119 if (info()->is_lazy()) { 5128 if (info()->is_lazy()) {
5120 DCHECK(!info()->is_eval()); 5129 DCHECK(!info()->is_eval());
5121 if (info()->shared_info()->is_function()) { 5130 if (info()->shared_info()->is_function()) {
5122 result = ParseLazy(); 5131 result = ParseLazy();
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
5306 5315
5307 const AstRawString* raw_str = ast_value_factory()->GetOneByteString( 5316 const AstRawString* raw_str = ast_value_factory()->GetOneByteString(
5308 OneByteVector(raw_chars.get(), to_index)); 5317 OneByteVector(raw_chars.get(), to_index));
5309 Literal* raw_lit = factory()->NewStringLiteral(raw_str, span_start - 1); 5318 Literal* raw_lit = factory()->NewStringLiteral(raw_str, span_start - 1);
5310 raw_strings->Add(raw_lit, zone()); 5319 raw_strings->Add(raw_lit, zone());
5311 } 5320 }
5312 5321
5313 return raw_strings; 5322 return raw_strings;
5314 } 5323 }
5315 } } // namespace v8::internal 5324 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/messages.js ('k') | src/preparser.h » ('j') | test/cctest/test-parsing.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698