1/*
2 * Copyright (C) 2017 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#if ENABLE(WEBASSEMBLY)
29
30#include "WasmCodeBlock.h"
31#include "WasmEmbedder.h"
32#include "WasmMemory.h"
33#include <wtf/Expected.h>
34#include <wtf/Lock.h>
35#include <wtf/SharedTask.h>
36#include <wtf/ThreadSafeRefCounted.h>
37
38namespace JSC { namespace Wasm {
39
40struct Context;
41struct ModuleInformation;
42class Plan;
43
44using SignatureIndex = uint64_t;
45
46class Module : public ThreadSafeRefCounted<Module> {
47public:
48 using ValidationResult = Expected<RefPtr<Module>, String>;
49 typedef void CallbackType(ValidationResult&&);
50 using AsyncValidationCallback = RefPtr<SharedTask<CallbackType>>;
51
52 static ValidationResult validateSync(Context*, Vector<uint8_t>&& source);
53 static void validateAsync(Context*, Vector<uint8_t>&& source, Module::AsyncValidationCallback&&);
54
55 static Ref<Module> create(Ref<ModuleInformation>&& moduleInformation)
56 {
57 return adoptRef(*new Module(WTFMove(moduleInformation)));
58 }
59
60 Wasm::SignatureIndex signatureIndexFromFunctionIndexSpace(unsigned functionIndexSpace) const;
61 const Wasm::ModuleInformation& moduleInformation() const { return m_moduleInformation.get(); }
62
63 Ref<CodeBlock> compileSync(Context*, MemoryMode, CreateEmbedderWrapper&&, ThrowWasmException);
64 void compileAsync(Context*, MemoryMode, CodeBlock::AsyncCompilationCallback&&, CreateEmbedderWrapper&&, ThrowWasmException);
65
66 JS_EXPORT_PRIVATE ~Module();
67
68 CodeBlock* codeBlockFor(MemoryMode mode) { return m_codeBlocks[static_cast<uint8_t>(mode)].get(); }
69private:
70 Ref<CodeBlock> getOrCreateCodeBlock(Context*, MemoryMode, CreateEmbedderWrapper&&, ThrowWasmException);
71
72 Module(Ref<ModuleInformation>&&);
73 Ref<ModuleInformation> m_moduleInformation;
74 RefPtr<CodeBlock> m_codeBlocks[Wasm::NumberOfMemoryModes];
75 Lock m_lock;
76};
77
78} } // namespace JSC::Wasm
79
80#endif // ENABLE(WEBASSEMBLY)
81