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

Side by Side Diff: src/scopes.cc

Issue 7756014: Detect conflicting variable bindings in harmony mode. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 3 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
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 } 376 }
377 377
378 378
379 Variable* Scope::DeclareFunctionVar(Handle<String> name) { 379 Variable* Scope::DeclareFunctionVar(Handle<String> name) {
380 ASSERT(is_function_scope() && function_ == NULL); 380 ASSERT(is_function_scope() && function_ == NULL);
381 function_ = new Variable(this, name, Variable::CONST, true, Variable::NORMAL); 381 function_ = new Variable(this, name, Variable::CONST, true, Variable::NORMAL);
382 return function_; 382 return function_;
383 } 383 }
384 384
385 385
386 void Scope::DeclareParameter(Handle<String> name) { 386 void Scope::DeclareParameter(Handle<String> name, Variable::Mode mode) {
387 ASSERT(!already_resolved()); 387 ASSERT(!already_resolved());
388 ASSERT(is_function_scope()); 388 ASSERT(is_function_scope());
389 Variable* var = 389 Variable* var =
390 variables_.Declare(this, name, Variable::VAR, true, Variable::NORMAL); 390 variables_.Declare(this, name, mode, true, Variable::NORMAL);
391 params_.Add(var); 391 params_.Add(var);
392 } 392 }
393 393
394 394
395 Variable* Scope::DeclareLocal(Handle<String> name, Variable::Mode mode) { 395 Variable* Scope::DeclareLocal(Handle<String> name, Variable::Mode mode) {
396 ASSERT(!already_resolved()); 396 ASSERT(!already_resolved());
397 // This function handles VAR and CONST modes. DYNAMIC variables are 397 // This function handles VAR and CONST modes. DYNAMIC variables are
398 // introduces during variable allocation, INTERNAL variables are allocated 398 // introduces during variable allocation, INTERNAL variables are allocated
399 // explicitly, and TEMPORARY variables are allocated via NewTemporary(). 399 // explicitly, and TEMPORARY variables are allocated via NewTemporary().
400 ASSERT(mode == Variable::VAR || 400 ASSERT(mode == Variable::VAR ||
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 ASSERT(HasIllegalRedeclaration()); 460 ASSERT(HasIllegalRedeclaration());
461 } 461 }
462 462
463 463
464 void Scope::VisitIllegalRedeclaration(AstVisitor* visitor) { 464 void Scope::VisitIllegalRedeclaration(AstVisitor* visitor) {
465 ASSERT(HasIllegalRedeclaration()); 465 ASSERT(HasIllegalRedeclaration());
466 illegal_redecl_->Accept(visitor); 466 illegal_redecl_->Accept(visitor);
467 } 467 }
468 468
469 469
470 Declaration* Scope::CheckConflictingVarDeclarations() {
471 int length = decls_.length();
472 for (int i = 0; i < length; i++) {
473 Declaration* decl = decls_[i];
474 if (decl->mode() != Variable::VAR) continue;
475 Handle<String> name = decl->proxy()->name();
476 for (Scope* scope = decl->scope();
477 scope->is_block_scope() || scope->is_catch_scope();
478 scope = scope->outer_scope_) {
479 Variable* other_var = scope->variables_.Lookup(name);
Lasse Reichstein 2011/09/01 07:34:04 This should be able to skip the first scope, where
Steven 2011/09/01 15:01:33 When by first scope you mean the innermost scope w
480 if (other_var != NULL && other_var->mode() == Variable::LET) {
Lasse Reichstein 2011/09/01 07:34:04 Is it only LET declarations that can conflict, or
Steven 2011/09/01 15:01:33 Yes any non-VAR. Will fix it. On 2011/09/01 07:34:
481 return decl;
482 }
483 }
484 }
485 return NULL;
486 }
487
488
470 template<class Allocator> 489 template<class Allocator>
471 void Scope::CollectUsedVariables(List<Variable*, Allocator>* locals) { 490 void Scope::CollectUsedVariables(List<Variable*, Allocator>* locals) {
472 // Collect variables in this scope. 491 // Collect variables in this scope.
473 // Note that the function_ variable - if present - is not 492 // Note that the function_ variable - if present - is not
474 // collected here but handled separately in ScopeInfo 493 // collected here but handled separately in ScopeInfo
475 // which is the current user of this function). 494 // which is the current user of this function).
476 for (int i = 0; i < temps_.length(); i++) { 495 for (int i = 0; i < temps_.length(); i++) {
477 Variable* var = temps_[i]; 496 Variable* var = temps_[i];
478 if (var->is_used()) { 497 if (var->is_used()) {
479 locals->Add(var); 498 locals->Add(var);
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS && 1150 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS &&
1132 !must_have_local_context) { 1151 !must_have_local_context) {
1133 num_heap_slots_ = 0; 1152 num_heap_slots_ = 0;
1134 } 1153 }
1135 1154
1136 // Allocation done. 1155 // Allocation done.
1137 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); 1156 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS);
1138 } 1157 }
1139 1158
1140 } } // namespace v8::internal 1159 } } // namespace v8::internal
OLDNEW
« src/parser.cc ('K') | « src/scopes.h ('k') | test/mjsunit/harmony/block-conflicts.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698