diff options
Diffstat (limited to 'deps/v8/src/wasm/well-known-imports.h')
-rw-r--r-- | deps/v8/src/wasm/well-known-imports.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/deps/v8/src/wasm/well-known-imports.h b/deps/v8/src/wasm/well-known-imports.h new file mode 100644 index 0000000000..11c7b46580 --- /dev/null +++ b/deps/v8/src/wasm/well-known-imports.h @@ -0,0 +1,82 @@ +// Copyright 2023 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. + +#if !V8_ENABLE_WEBASSEMBLY +#error This header should only be included if WebAssembly is enabled. +#endif // !V8_ENABLE_WEBASSEMBLY + +#ifndef V8_WASM_WELL_KNOWN_IMPORTS_H_ +#define V8_WASM_WELL_KNOWN_IMPORTS_H_ + +#include <memory> + +#include "src/base/atomicops.h" +#include "src/base/platform/mutex.h" +#include "src/base/vector.h" +#include "src/common/globals.h" + +namespace v8::internal::wasm { + +enum class WellKnownImport : uint8_t { + kUninstantiated, + kGeneric, + kStringToLowerCaseStringref, +}; + +class NativeModule; + +// For debugging/tracing. +const char* WellKnownImportName(WellKnownImport wki); + +class WellKnownImportsList { + public: + enum class UpdateResult : bool { kFoundIncompatibility, kOK }; + + WellKnownImportsList() = default; + + // Regular initialization. Allocates size-dependent internal data. + void Initialize(int size) { +#if DEBUG + DCHECK_EQ(-1, size_); + size_ = size; +#endif + static_assert(static_cast<int>(WellKnownImport::kUninstantiated) == 0); + statuses_ = std::make_unique<std::atomic<WellKnownImport>[]>(size); +#if !defined(__cpp_lib_atomic_value_initialization) || \ + __cpp_lib_atomic_value_initialization < 201911L + for (int i = 0; i < size; i++) { + std::atomic_init(&statuses_.get()[i], WellKnownImport::kUninstantiated); + } +#endif + } + + // Intended for deserialization. Does not check consistency with code. + void Initialize(base::Vector<const WellKnownImport> entries); + + WellKnownImport get(int index) const { + DCHECK_LT(index, size_); + return statuses_[index].load(std::memory_order_relaxed); + } + + V8_WARN_UNUSED_RESULT UpdateResult + Update(base::Vector<WellKnownImport> entries); + + // If you need this mutex and the NativeModule's allocation_mutex_, always + // get the latter first. + base::Mutex* mutex() { return &mutex_; } + + private: + // This mutex guards {statuses_}, for operations that need to ensure that + // they see a consistent view of {statutes_} for some period of time. + base::Mutex mutex_; + std::unique_ptr<std::atomic<WellKnownImport>[]> statuses_; + +#if DEBUG + int size_{-1}; +#endif +}; + +} // namespace v8::internal::wasm + +#endif // V8_WASM_WELL_KNOWN_IMPORTS_H_ |