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

Side by Side Diff: src/scopes.cc

Issue 918373002: Strip Interface class of most of its logic, make it all about Module exports (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Properly freeze interface at the end of ParseModule Created 5 years, 10 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
« no previous file with comments | « src/scopes.h ('k') | src/typing.cc » ('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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/scopes.h" 7 #include "src/scopes.h"
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 16 matching lines...) Expand all
27 VariableMap::VariableMap(Zone* zone) 27 VariableMap::VariableMap(Zone* zone)
28 : ZoneHashMap(ZoneHashMap::PointersMatch, 8, ZoneAllocationPolicy(zone)), 28 : ZoneHashMap(ZoneHashMap::PointersMatch, 8, ZoneAllocationPolicy(zone)),
29 zone_(zone) {} 29 zone_(zone) {}
30 VariableMap::~VariableMap() {} 30 VariableMap::~VariableMap() {}
31 31
32 32
33 Variable* VariableMap::Declare(Scope* scope, const AstRawString* name, 33 Variable* VariableMap::Declare(Scope* scope, const AstRawString* name,
34 VariableMode mode, bool is_valid_lhs, 34 VariableMode mode, bool is_valid_lhs,
35 Variable::Kind kind, 35 Variable::Kind kind,
36 InitializationFlag initialization_flag, 36 InitializationFlag initialization_flag,
37 MaybeAssignedFlag maybe_assigned_flag, 37 MaybeAssignedFlag maybe_assigned_flag) {
38 Interface* interface) {
39 // AstRawStrings are unambiguous, i.e., the same string is always represented 38 // AstRawStrings are unambiguous, i.e., the same string is always represented
40 // by the same AstRawString*. 39 // by the same AstRawString*.
41 // FIXME(marja): fix the type of Lookup. 40 // FIXME(marja): fix the type of Lookup.
42 Entry* p = ZoneHashMap::Lookup(const_cast<AstRawString*>(name), name->hash(), 41 Entry* p = ZoneHashMap::Lookup(const_cast<AstRawString*>(name), name->hash(),
43 true, ZoneAllocationPolicy(zone())); 42 true, ZoneAllocationPolicy(zone()));
44 if (p->value == NULL) { 43 if (p->value == NULL) {
45 // The variable has not been declared yet -> insert it. 44 // The variable has not been declared yet -> insert it.
46 DCHECK(p->key == name); 45 DCHECK(p->key == name);
47 p->value = new (zone()) 46 p->value = new (zone()) Variable(scope, name, mode, is_valid_lhs, kind,
48 Variable(scope, name, mode, is_valid_lhs, kind, initialization_flag, 47 initialization_flag, maybe_assigned_flag);
49 maybe_assigned_flag, interface);
50 } 48 }
51 return reinterpret_cast<Variable*>(p->value); 49 return reinterpret_cast<Variable*>(p->value);
52 } 50 }
53 51
54 52
55 Variable* VariableMap::Lookup(const AstRawString* name) { 53 Variable* VariableMap::Lookup(const AstRawString* name) {
56 Entry* p = ZoneHashMap::Lookup(const_cast<AstRawString*>(name), name->hash(), 54 Entry* p = ZoneHashMap::Lookup(const_cast<AstRawString*>(name), name->hash(),
57 false, ZoneAllocationPolicy(NULL)); 55 false, ZoneAllocationPolicy(NULL));
58 if (p != NULL) { 56 if (p != NULL) {
59 DCHECK(reinterpret_cast<const AstRawString*>(p->key) == name); 57 DCHECK(reinterpret_cast<const AstRawString*>(p->key) == name);
60 DCHECK(p->value != NULL); 58 DCHECK(p->value != NULL);
61 return reinterpret_cast<Variable*>(p->value); 59 return reinterpret_cast<Variable*>(p->value);
62 } 60 }
63 return NULL; 61 return NULL;
64 } 62 }
65 63
66 64
67 // ---------------------------------------------------------------------------- 65 // ----------------------------------------------------------------------------
68 // Implementation of Scope 66 // Implementation of Scope
69 67
70 Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type, 68 Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type,
71 AstValueFactory* ast_value_factory) 69 AstValueFactory* ast_value_factory)
72 : inner_scopes_(4, zone), 70 : inner_scopes_(4, zone),
73 variables_(zone), 71 variables_(zone),
74 internals_(4, zone), 72 internals_(4, zone),
75 temps_(4, zone), 73 temps_(4, zone),
76 params_(4, zone), 74 params_(4, zone),
77 unresolved_(16, zone), 75 unresolved_(16, zone),
78 decls_(4, zone), 76 decls_(4, zone),
79 interface_(scope_type == MODULE_SCOPE ? Interface::NewModule(zone) 77 interface_(scope_type == MODULE_SCOPE ? Interface::New(zone)
80 : NULL), 78 : NULL),
81 already_resolved_(false), 79 already_resolved_(false),
82 ast_value_factory_(ast_value_factory), 80 ast_value_factory_(ast_value_factory),
83 zone_(zone) { 81 zone_(zone) {
84 SetDefaults(scope_type, outer_scope, Handle<ScopeInfo>::null()); 82 SetDefaults(scope_type, outer_scope, Handle<ScopeInfo>::null());
85 // The outermost scope must be a script scope. 83 // The outermost scope must be a script scope.
86 DCHECK(scope_type == SCRIPT_SCOPE || outer_scope != NULL); 84 DCHECK(scope_type == SCRIPT_SCOPE || outer_scope != NULL);
87 DCHECK(!HasIllegalRedeclaration()); 85 DCHECK(!HasIllegalRedeclaration());
88 } 86 }
89 87
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 rest_parameter_ = var; 460 rest_parameter_ = var;
463 rest_index_ = num_parameters(); 461 rest_index_ = num_parameters();
464 } 462 }
465 params_.Add(var, zone()); 463 params_.Add(var, zone());
466 return var; 464 return var;
467 } 465 }
468 466
469 467
470 Variable* Scope::DeclareLocal(const AstRawString* name, VariableMode mode, 468 Variable* Scope::DeclareLocal(const AstRawString* name, VariableMode mode,
471 InitializationFlag init_flag, 469 InitializationFlag init_flag,
472 MaybeAssignedFlag maybe_assigned_flag, 470 MaybeAssignedFlag maybe_assigned_flag) {
473 Interface* interface) {
474 DCHECK(!already_resolved()); 471 DCHECK(!already_resolved());
475 // This function handles VAR, LET, and CONST modes. DYNAMIC variables are 472 // This function handles VAR, LET, and CONST modes. DYNAMIC variables are
476 // introduces during variable allocation, INTERNAL variables are allocated 473 // introduces during variable allocation, INTERNAL variables are allocated
477 // explicitly, and TEMPORARY variables are allocated via NewTemporary(). 474 // explicitly, and TEMPORARY variables are allocated via NewTemporary().
478 DCHECK(IsDeclaredVariableMode(mode)); 475 DCHECK(IsDeclaredVariableMode(mode));
479 ++num_var_or_const_; 476 ++num_var_or_const_;
480 return variables_.Declare(this, name, mode, true, Variable::NORMAL, init_flag, 477 return variables_.Declare(this, name, mode, true, Variable::NORMAL, init_flag,
481 maybe_assigned_flag, interface); 478 maybe_assigned_flag);
482 } 479 }
483 480
484 481
485 Variable* Scope::DeclareDynamicGlobal(const AstRawString* name) { 482 Variable* Scope::DeclareDynamicGlobal(const AstRawString* name) {
486 DCHECK(is_script_scope()); 483 DCHECK(is_script_scope());
487 return variables_.Declare(this, 484 return variables_.Declare(this,
488 name, 485 name,
489 DYNAMIC_GLOBAL, 486 DYNAMIC_GLOBAL,
490 true, 487 true,
491 Variable::NORMAL, 488 Variable::NORMAL,
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 1085
1089 case DYNAMIC_LOOKUP: 1086 case DYNAMIC_LOOKUP:
1090 // The variable could not be resolved statically. 1087 // The variable could not be resolved statically.
1091 var = NonLocal(proxy->raw_name(), DYNAMIC); 1088 var = NonLocal(proxy->raw_name(), DYNAMIC);
1092 break; 1089 break;
1093 } 1090 }
1094 1091
1095 DCHECK(var != NULL); 1092 DCHECK(var != NULL);
1096 if (proxy->is_assigned()) var->set_maybe_assigned(); 1093 if (proxy->is_assigned()) var->set_maybe_assigned();
1097 1094
1098 if (FLAG_harmony_modules) {
1099 bool ok;
1100 #ifdef DEBUG
1101 if (FLAG_print_interface_details) {
1102 PrintF("# Resolve %.*s:\n", var->raw_name()->length(),
1103 var->raw_name()->raw_data());
1104 }
1105 #endif
1106 proxy->interface()->Unify(var->interface(), zone(), &ok);
1107 if (!ok) {
1108 #ifdef DEBUG
1109 if (FLAG_print_interfaces) {
1110 PrintF("SCOPES TYPE ERROR\n");
1111 PrintF("proxy: ");
1112 proxy->interface()->Print();
1113 PrintF("var: ");
1114 var->interface()->Print();
1115 }
1116 #endif
1117
1118 // Inconsistent use of module. Throw a syntax error.
1119 // TODO(rossberg): generate more helpful error message.
1120 MessageLocation location(
1121 info->script(), proxy->position(), proxy->position());
1122 Isolate* isolate = info->isolate();
1123 Factory* factory = isolate->factory();
1124 Handle<JSArray> array = factory->NewJSArray(1);
1125 JSObject::SetElement(array, 0, var->name(), NONE, STRICT).Assert();
1126 Handle<Object> error;
1127 MaybeHandle<Object> maybe_error =
1128 factory->NewSyntaxError("module_type_error", array);
1129 if (maybe_error.ToHandle(&error)) isolate->Throw(*error, &location);
1130 return false;
1131 }
1132 }
1133
1134 proxy->BindTo(var); 1095 proxy->BindTo(var);
1135 1096
1136 return true; 1097 return true;
1137 } 1098 }
1138 1099
1139 1100
1140 bool Scope::ResolveVariablesRecursively(CompilationInfo* info, 1101 bool Scope::ResolveVariablesRecursively(CompilationInfo* info,
1141 AstNodeFactory* factory) { 1102 AstNodeFactory* factory) {
1142 DCHECK(info->script_scope()->is_script_scope()); 1103 DCHECK(info->script_scope()->is_script_scope());
1143 1104
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
1425 } 1386 }
1426 1387
1427 1388
1428 int Scope::ContextLocalCount() const { 1389 int Scope::ContextLocalCount() const {
1429 if (num_heap_slots() == 0) return 0; 1390 if (num_heap_slots() == 0) return 0;
1430 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - 1391 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS -
1431 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); 1392 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0);
1432 } 1393 }
1433 1394
1434 } } // namespace v8::internal 1395 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/scopes.h ('k') | src/typing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698