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

Side by Side Diff: src/parser.cc

Issue 11033025: Reject local module declarations. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 2 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.h ('k') | test/mjsunit/harmony/module-parsing.js » ('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 624 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 scope = NewScope(scope, GLOBAL_SCOPE); 635 scope = NewScope(scope, GLOBAL_SCOPE);
636 } 636 }
637 scope->set_start_position(0); 637 scope->set_start_position(0);
638 scope->set_end_position(source->length()); 638 scope->set_end_position(source->length());
639 639
640 FunctionState function_state(this, scope, isolate()); // Enters 'scope'. 640 FunctionState function_state(this, scope, isolate()); // Enters 'scope'.
641 top_scope_->SetLanguageMode(info->language_mode()); 641 top_scope_->SetLanguageMode(info->language_mode());
642 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); 642 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
643 bool ok = true; 643 bool ok = true;
644 int beg_loc = scanner().location().beg_pos; 644 int beg_loc = scanner().location().beg_pos;
645 ParseSourceElements(body, Token::EOS, info->is_eval(), &ok); 645 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok);
646 if (ok && !top_scope_->is_classic_mode()) { 646 if (ok && !top_scope_->is_classic_mode()) {
647 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); 647 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok);
648 } 648 }
649 649
650 if (ok && is_extended_mode()) { 650 if (ok && is_extended_mode()) {
651 CheckConflictingVarDeclarations(top_scope_, &ok); 651 CheckConflictingVarDeclarations(top_scope_, &ok);
652 } 652 }
653 653
654 if (ok) { 654 if (ok) {
655 result = factory()->NewFunctionLiteral( 655 result = factory()->NewFunctionLiteral(
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 ZoneStringList names_; 1000 ZoneStringList names_;
1001 ZoneList<int> assigned_arguments_; 1001 ZoneList<int> assigned_arguments_;
1002 ZoneObjectList assigned_constants_; 1002 ZoneObjectList assigned_constants_;
1003 Zone* zone_; 1003 Zone* zone_;
1004 }; 1004 };
1005 1005
1006 1006
1007 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor, 1007 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor,
1008 int end_token, 1008 int end_token,
1009 bool is_eval, 1009 bool is_eval,
1010 bool is_global,
1010 bool* ok) { 1011 bool* ok) {
1011 // SourceElements :: 1012 // SourceElements ::
1012 // (ModuleElement)* <end_token> 1013 // (ModuleElement)* <end_token>
1013 1014
1014 // Allocate a target stack to use for this set of source 1015 // Allocate a target stack to use for this set of source
1015 // elements. This way, all scripts and functions get their own 1016 // elements. This way, all scripts and functions get their own
1016 // target stack thus avoiding illegal breaks and continues across 1017 // target stack thus avoiding illegal breaks and continues across
1017 // functions. 1018 // functions.
1018 TargetScope scope(&this->target_stack_); 1019 TargetScope scope(&this->target_stack_);
1019 1020
1020 ASSERT(processor != NULL); 1021 ASSERT(processor != NULL);
1021 ThisNamedPropertyAssignmentFinder this_property_assignment_finder(isolate(), 1022 ThisNamedPropertyAssignmentFinder this_property_assignment_finder(isolate(),
1022 zone()); 1023 zone());
1023 bool directive_prologue = true; // Parsing directive prologue. 1024 bool directive_prologue = true; // Parsing directive prologue.
1024 1025
1025 while (peek() != end_token) { 1026 while (peek() != end_token) {
1026 if (directive_prologue && peek() != Token::STRING) { 1027 if (directive_prologue && peek() != Token::STRING) {
1027 directive_prologue = false; 1028 directive_prologue = false;
1028 } 1029 }
1029 1030
1030 Scanner::Location token_loc = scanner().peek_location(); 1031 Scanner::Location token_loc = scanner().peek_location();
1031 Statement* stat = ParseModuleElement(NULL, CHECK_OK); 1032 Statement* stat;
1033 if (is_global && !is_eval) {
1034 stat = ParseModuleElement(NULL, CHECK_OK);
1035 } else {
1036 stat = ParseBlockElement(NULL, CHECK_OK);
1037 }
1032 if (stat == NULL || stat->IsEmpty()) { 1038 if (stat == NULL || stat->IsEmpty()) {
1033 directive_prologue = false; // End of directive prologue. 1039 directive_prologue = false; // End of directive prologue.
1034 continue; 1040 continue;
1035 } 1041 }
1036 1042
1037 if (directive_prologue) { 1043 if (directive_prologue) {
1038 // A shot at a directive. 1044 // A shot at a directive.
1039 ExpressionStatement* e_stat; 1045 ExpressionStatement* e_stat;
1040 Literal* literal; 1046 Literal* literal;
1041 // Still processing directive prologue? 1047 // Still processing directive prologue?
(...skipping 3482 matching lines...) Expand 10 before | Expand all | Expand 10 after
4524 VariableProxy* fproxy = top_scope_->NewUnresolved( 4530 VariableProxy* fproxy = top_scope_->NewUnresolved(
4525 factory(), function_name, Interface::NewConst()); 4531 factory(), function_name, Interface::NewConst());
4526 fproxy->BindTo(fvar); 4532 fproxy->BindTo(fvar);
4527 body->Add(factory()->NewExpressionStatement( 4533 body->Add(factory()->NewExpressionStatement(
4528 factory()->NewAssignment(fvar_init_op, 4534 factory()->NewAssignment(fvar_init_op,
4529 fproxy, 4535 fproxy,
4530 factory()->NewThisFunction(), 4536 factory()->NewThisFunction(),
4531 RelocInfo::kNoPosition)), 4537 RelocInfo::kNoPosition)),
4532 zone()); 4538 zone());
4533 } 4539 }
4534 ParseSourceElements(body, Token::RBRACE, false, CHECK_OK); 4540 ParseSourceElements(body, Token::RBRACE, false, false, CHECK_OK);
4535 4541
4536 materialized_literal_count = function_state.materialized_literal_count(); 4542 materialized_literal_count = function_state.materialized_literal_count();
4537 expected_property_count = function_state.expected_property_count(); 4543 expected_property_count = function_state.expected_property_count();
4538 handler_count = function_state.handler_count(); 4544 handler_count = function_state.handler_count();
4539 only_simple_this_property_assignments = 4545 only_simple_this_property_assignments =
4540 function_state.only_simple_this_property_assignments(); 4546 function_state.only_simple_this_property_assignments();
4541 this_property_assignments = function_state.this_property_assignments(); 4547 this_property_assignments = function_state.this_property_assignments();
4542 4548
4543 Expect(Token::RBRACE, CHECK_OK); 4549 Expect(Token::RBRACE, CHECK_OK);
4544 scope->set_end_position(scanner().location().end_pos); 4550 scope->set_end_position(scanner().location().end_pos);
(...skipping 1423 matching lines...) Expand 10 before | Expand all | Expand 10 after
5968 ASSERT(info->isolate()->has_pending_exception()); 5974 ASSERT(info->isolate()->has_pending_exception());
5969 } else { 5975 } else {
5970 result = parser.ParseProgram(); 5976 result = parser.ParseProgram();
5971 } 5977 }
5972 } 5978 }
5973 info->SetFunction(result); 5979 info->SetFunction(result);
5974 return (result != NULL); 5980 return (result != NULL);
5975 } 5981 }
5976 5982
5977 } } // namespace v8::internal 5983 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | test/mjsunit/harmony/module-parsing.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698