| // Copyright 2018 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. |
| |
| #ifndef V8_WASM_JS_TO_WASM_WRAPPER_CACHE_H_ |
| #define V8_WASM_JS_TO_WASM_WRAPPER_CACHE_H_ |
| |
| #include "src/compiler/wasm-compiler.h" |
| #include "src/logging/counters.h" |
| #include "src/wasm/value-type.h" |
| #include "src/wasm/wasm-code-manager.h" |
| |
| namespace v8 { |
| namespace internal { |
| namespace wasm { |
| |
| class JSToWasmWrapperCache { |
| public: |
| Handle<Code> GetOrCompileJSToWasmWrapper(Isolate* isolate, FunctionSig* sig, |
| bool is_import) { |
| std::pair<bool, FunctionSig> key(is_import, *sig); |
| Handle<Code>& cached = cache_[key]; |
| if (cached.is_null()) { |
| cached = compiler::CompileJSToWasmWrapper(isolate, sig, is_import) |
| .ToHandleChecked(); |
| } |
| return cached; |
| } |
| |
| private: |
| // We generate different code for calling imports than calling wasm functions |
| // in this module. Both are cached separately. |
| using CacheKey = std::pair<bool, FunctionSig>; |
| std::unordered_map<CacheKey, Handle<Code>, base::hash<CacheKey>> cache_; |
| }; |
| |
| } // namespace wasm |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_WASM_JS_TO_WASM_WRAPPER_CACHE_H_ |