// 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/wasm/wasm-import-wrapper-cache.h" #include #include "src/counters.h" #include "src/wasm/wasm-code-manager.h" namespace v8 { namespace internal { namespace wasm { WasmImportWrapperCache::~WasmImportWrapperCache() { std::vector ptrs; ptrs.reserve(entry_map_.size()); for (auto& e : entry_map_) ptrs.push_back(e.second); WasmCode::DecrementRefCount(VectorOf(ptrs)); } WasmCode* WasmImportWrapperCache::GetOrCompile( WasmEngine* wasm_engine, Counters* counters, compiler::WasmImportCallKind kind, FunctionSig* sig) { base::MutexGuard lock(&mutex_); CacheKey key(static_cast(kind), *sig); WasmCode*& cached = entry_map_[key]; if (cached == nullptr) { // TODO(wasm): no need to hold the lock while compiling an import wrapper. bool source_positions = native_module_->module()->origin == kAsmJsOrigin; // Keep the {WasmCode} alive until we explicitly call {IncRef}. WasmCodeRefScope code_ref_scope; cached = compiler::CompileWasmImportCallWrapper( wasm_engine, native_module_, kind, sig, source_positions); cached->IncRef(); counters->wasm_generated_code_size()->Increment( cached->instructions().length()); counters->wasm_reloc_size()->Increment(cached->reloc_info().length()); } return cached; } } // namespace wasm } // namespace internal } // namespace v8