Commit a7840a2b authored by adamk's avatar adamk Committed by Commit bot

Allow lookup of module exports by export name.

This required fixing the exports_ hash map to use the appropriate
comparison function instead of pointer comparison.

BUG=v8:1569
LOG=n

Review URL: https://codereview.chromium.org/960793003

Cr-Commit-Position: refs/heads/master@{#26920}
parent bd21d72d
...@@ -20,9 +20,8 @@ void ModuleDescriptor::AddLocalExport(const AstRawString* export_name, ...@@ -20,9 +20,8 @@ void ModuleDescriptor::AddLocalExport(const AstRawString* export_name,
ZoneAllocationPolicy allocator(zone); ZoneAllocationPolicy allocator(zone);
if (exports_ == nullptr) { if (exports_ == nullptr) {
exports_ = new (zone->New(sizeof(ZoneHashMap))) exports_ = new (zone->New(sizeof(ZoneHashMap))) ZoneHashMap(
ZoneHashMap(ZoneHashMap::PointersMatch, AstRawString::Compare, ZoneHashMap::kDefaultHashMapCapacity, allocator);
ZoneHashMap::kDefaultHashMapCapacity, allocator);
} }
ZoneHashMap::Entry* p = ZoneHashMap::Entry* p =
...@@ -33,5 +32,18 @@ void ModuleDescriptor::AddLocalExport(const AstRawString* export_name, ...@@ -33,5 +32,18 @@ void ModuleDescriptor::AddLocalExport(const AstRawString* export_name,
p->value = const_cast<AstRawString*>(local_name); p->value = const_cast<AstRawString*>(local_name);
} }
const AstRawString* ModuleDescriptor::LookupLocalExport(
const AstRawString* export_name, Zone* zone) {
if (exports_ == nullptr) return nullptr;
ZoneAllocationPolicy allocator(zone);
ZoneHashMap::Entry* entry =
exports_->Lookup(const_cast<AstRawString*>(export_name),
export_name->hash(), false, allocator);
if (entry == nullptr) return nullptr;
DCHECK_NOT_NULL(entry->value);
return static_cast<const AstRawString*>(entry->value);
}
} }
} // namespace v8::internal } // namespace v8::internal
...@@ -58,6 +58,9 @@ class ModuleDescriptor : public ZoneObject { ...@@ -58,6 +58,9 @@ class ModuleDescriptor : public ZoneObject {
return index_; return index_;
} }
const AstRawString* LookupLocalExport(const AstRawString* export_name,
Zone* zone);
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Iterators. // Iterators.
......
...@@ -5223,6 +5223,8 @@ TEST(ModuleParsingInternals) { ...@@ -5223,6 +5223,8 @@ TEST(ModuleParsingInternals) {
i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource); i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource);
i::Handle<i::Script> script = factory->NewScript(source); i::Handle<i::Script> script = factory->NewScript(source);
i::CompilationInfoWithZone info(script); i::CompilationInfoWithZone info(script);
i::Zone* zone = info.zone();
i::AstValueFactory avf(zone, isolate->heap()->HashSeed());
i::Parser parser(&info, isolate->stack_guard()->real_climit(), i::Parser parser(&info, isolate->stack_guard()->real_climit(),
isolate->heap()->HashSeed(), isolate->unicode_cache()); isolate->heap()->HashSeed(), isolate->unicode_cache());
parser.set_allow_harmony_modules(true); parser.set_allow_harmony_modules(true);
...@@ -5233,13 +5235,12 @@ TEST(ModuleParsingInternals) { ...@@ -5233,13 +5235,12 @@ TEST(ModuleParsingInternals) {
CHECK_EQ(i::MODULE_SCOPE, func->scope()->scope_type()); CHECK_EQ(i::MODULE_SCOPE, func->scope()->scope_type());
i::ModuleDescriptor* descriptor = func->scope()->module(); i::ModuleDescriptor* descriptor = func->scope()->module();
CHECK_NOT_NULL(descriptor); CHECK_NOT_NULL(descriptor);
int num_exports = 0; CHECK_EQ(1, descriptor->Length());
for (auto it = descriptor->iterator(); !it.done(); it.Advance()) { const i::AstRawString* export_name = avf.GetOneByteString("y");
++num_exports; const i::AstRawString* local_name =
CHECK(it.local_name()->IsOneByteEqualTo("x")); descriptor->LookupLocalExport(export_name, zone);
CHECK(it.export_name()->IsOneByteEqualTo("y")); CHECK_NOT_NULL(local_name);
} CHECK(local_name->IsOneByteEqualTo("x"));
CHECK_EQ(1, num_exports);
i::ZoneList<i::Declaration*>* declarations = func->scope()->declarations(); i::ZoneList<i::Declaration*>* declarations = func->scope()->declarations();
CHECK_EQ(2, declarations->length()); CHECK_EQ(2, declarations->length());
CHECK(declarations->at(0)->proxy()->raw_name()->IsOneByteEqualTo("x")); CHECK(declarations->at(0)->proxy()->raw_name()->IsOneByteEqualTo("x"));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment