| OLD | NEW |
| 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/ast/modules.h" | 5 #include "src/ast/modules.h" |
| 6 #include "src/ast/ast-value-factory.h" | 6 #include "src/ast/ast-value-factory.h" |
| 7 #include "src/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 | 73 |
| 74 | 74 |
| 75 void ModuleDescriptor::AddStarExport( | 75 void ModuleDescriptor::AddStarExport( |
| 76 const AstRawString* module_request, Scanner::Location loc, Zone* zone) { | 76 const AstRawString* module_request, Scanner::Location loc, Zone* zone) { |
| 77 DCHECK_NOT_NULL(module_request); | 77 DCHECK_NOT_NULL(module_request); |
| 78 ModuleEntry* entry = new (zone) ModuleEntry(loc); | 78 ModuleEntry* entry = new (zone) ModuleEntry(loc); |
| 79 entry->module_request = module_request; | 79 entry->module_request = module_request; |
| 80 exports_.Add(entry, zone); | 80 exports_.Add(entry, zone); |
| 81 } | 81 } |
| 82 | 82 |
| 83 void ModuleDescriptor::MakeIndirectExportsExplicit() { |
| 84 for (auto entry : exports_) { |
| 85 if (entry->export_name == nullptr) continue; |
| 86 if (entry->import_name != nullptr) continue; |
| 87 DCHECK_NOT_NULL(entry->local_name); |
| 88 auto it = regular_imports_.find(entry->local_name); |
| 89 if (it != regular_imports_.end()) { |
| 90 // Found an indirect export. |
| 91 DCHECK_NOT_NULL(it->second->module_request); |
| 92 DCHECK_NOT_NULL(it->second->import_name); |
| 93 entry->import_name = it->second->import_name; |
| 94 entry->module_request = it->second->module_request; |
| 95 entry->local_name = nullptr; |
| 96 } |
| 97 } |
| 98 } |
| 99 |
| 83 bool ModuleDescriptor::Validate(DeclarationScope* module_scope, | 100 bool ModuleDescriptor::Validate(DeclarationScope* module_scope, |
| 84 PendingCompilationErrorHandler* error_handler, | 101 PendingCompilationErrorHandler* error_handler, |
| 85 Zone* zone) const { | 102 Zone* zone) { |
| 86 DCHECK(module_scope->is_module_scope()); | 103 DCHECK(module_scope->is_module_scope()); |
| 87 DCHECK_EQ(this, module_scope->module()); | 104 DCHECK_EQ(this, module_scope->module()); |
| 88 DCHECK_NOT_NULL(error_handler); | 105 DCHECK_NOT_NULL(error_handler); |
| 89 | 106 |
| 90 // Report error iff there are duplicate exports. | 107 // Report error iff there are duplicate exports. |
| 91 { | 108 { |
| 92 ZoneAllocationPolicy allocator(zone); | 109 ZoneAllocationPolicy allocator(zone); |
| 93 ZoneHashMap* export_names = new (zone->New(sizeof(ZoneHashMap))) | 110 ZoneHashMap* export_names = new (zone->New(sizeof(ZoneHashMap))) |
| 94 ZoneHashMap(ZoneHashMap::PointersMatch, | 111 ZoneHashMap(ZoneHashMap::PointersMatch, |
| 95 ZoneHashMap::kDefaultHashMapCapacity, allocator); | 112 ZoneHashMap::kDefaultHashMapCapacity, allocator); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 113 for (auto entry : exports_) { | 130 for (auto entry : exports_) { |
| 114 if (entry->local_name == nullptr) continue; | 131 if (entry->local_name == nullptr) continue; |
| 115 if (module_scope->LookupLocal(entry->local_name) == nullptr) { | 132 if (module_scope->LookupLocal(entry->local_name) == nullptr) { |
| 116 error_handler->ReportMessageAt( | 133 error_handler->ReportMessageAt( |
| 117 entry->location.beg_pos, entry->location.end_pos, | 134 entry->location.beg_pos, entry->location.end_pos, |
| 118 MessageTemplate::kModuleExportUndefined, entry->local_name); | 135 MessageTemplate::kModuleExportUndefined, entry->local_name); |
| 119 return false; | 136 return false; |
| 120 } | 137 } |
| 121 } | 138 } |
| 122 | 139 |
| 140 MakeIndirectExportsExplicit(); |
| 123 return true; | 141 return true; |
| 124 } | 142 } |
| 125 | 143 |
| 126 } // namespace internal | 144 } // namespace internal |
| 127 } // namespace v8 | 145 } // namespace v8 |
| OLD | NEW |