// Copyright 2019 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/objects/source-text-module.h" #include "src/api/api-inl.h" #include "src/ast/modules.h" #include "src/builtins/accessors.h" #include "src/common/assert-scope.h" #include "src/objects/js-generator-inl.h" #include "src/objects/module-inl.h" #include "src/objects/objects-inl.h" #include "src/objects/shared-function-info.h" #include "src/utils/ostreams.h" namespace v8 { namespace internal { struct StringHandleHash { V8_INLINE size_t operator()(Handle string) const { return string->EnsureHash(); } }; struct StringHandleEqual { V8_INLINE bool operator()(Handle lhs, Handle rhs) const { return lhs->Equals(*rhs); } }; class UnorderedStringSet : public std::unordered_set, StringHandleHash, StringHandleEqual, ZoneAllocator>> { public: explicit UnorderedStringSet(Zone* zone) : std::unordered_set, StringHandleHash, StringHandleEqual, ZoneAllocator>>( 2 /* bucket count */, StringHandleHash(), StringHandleEqual(), ZoneAllocator>(zone)) {} }; class UnorderedStringMap : public std::unordered_map< Handle, Handle, StringHandleHash, StringHandleEqual, ZoneAllocator, Handle>>> { public: explicit UnorderedStringMap(Zone* zone) : std::unordered_map< Handle, Handle, StringHandleHash, StringHandleEqual, ZoneAllocator, Handle>>>( 2 /* bucket count */, StringHandleHash(), StringHandleEqual(), ZoneAllocator, Handle>>( zone)) {} }; class Module::ResolveSet : public std::unordered_map< Handle, UnorderedStringSet*, ModuleHandleHash, ModuleHandleEqual, ZoneAllocator, UnorderedStringSet*>>> { public: explicit ResolveSet(Zone* zone) : std::unordered_map, UnorderedStringSet*, ModuleHandleHash, ModuleHandleEqual, ZoneAllocator, UnorderedStringSet*>>>( 2 /* bucket count */, ModuleHandleHash(), ModuleHandleEqual(), ZoneAllocator, UnorderedStringSet*>>( zone)), zone_(zone) {} Zone* zone() const { return zone_; } private: Zone* zone_; }; struct SourceTextModule::AsyncEvaluatingOrdinalCompare { bool operator()(Handle lhs, Handle rhs) const { DCHECK(lhs->IsAsyncEvaluating()); DCHECK(rhs->IsAsyncEvaluating()); return lhs->async_evaluating_ordinal() < rhs->async_evaluating_ordinal(); } }; Tagged SourceTextModule::GetSharedFunctionInfo() const { DisallowGarbageCollection no_gc; switch (status()) { case kUnlinked: case kPreLinking: return SharedFunctionInfo::cast(code()); case kLinking: return JSFunction::cast(code())->shared(); case kLinked: case kEvaluating: case kEvaluatingAsync: case kEvaluated: return JSGeneratorObject::cast(code())->function()->shared(); case kErrored: return SharedFunctionInfo::cast(code()); } UNREACHABLE(); } Tagged