#pragma once
#if ENABLE(WEBASSEMBLY)
#include "CompilationResult.h"
#include "WasmB3IRGenerator.h"
#include "WasmEmbedder.h"
#include "WasmModuleInformation.h"
#include <wtf/Bag.h>
#include <wtf/SharedTask.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/Vector.h>
namespace JSC {
class CallLinkInfo;
namespace Wasm {
struct Context;
class Plan : public ThreadSafeRefCounted<Plan> {
public:
typedef void CallbackType(Plan&);
using CompletionTask = RefPtr<SharedTask<CallbackType>>;
static CompletionTask dontFinalize() { return createSharedTask<CallbackType>([](Plan&) { }); }
Plan(Context*, Ref<ModuleInformation>, CompletionTask&&, CreateEmbedderWrapper&&, ThrowWasmException);
Plan(Context*, Ref<ModuleInformation>, CompletionTask&&);
JS_EXPORT_PRIVATE Plan(Context*, CompletionTask&&);
virtual JS_EXPORT_PRIVATE ~Plan();
void addCompletionTask(Context*, CompletionTask&&);
void setMode(MemoryMode mode) { m_mode = mode; }
MemoryMode mode() const { return m_mode; }
const String& errorMessage() const { return m_errorMessage; }
bool WARN_UNUSED_RETURN failed() const { return !errorMessage().isNull(); }
virtual bool hasWork() const = 0;
enum CompilationEffort { All, Partial };
virtual void work(CompilationEffort = All) = 0;
virtual bool multiThreaded() const = 0;
void waitForCompletion();
bool tryRemoveContextAndCancelIfLast(Context&);
protected:
void runCompletionTasks(const AbstractLocker&);
void fail(const AbstractLocker&, String&& errorMessage);
virtual bool isComplete() const = 0;
virtual void complete(const AbstractLocker&) = 0;
Ref<ModuleInformation> m_moduleInformation;
Vector<std::pair<Context*, CompletionTask>, 1> m_completionTasks;
CreateEmbedderWrapper m_createEmbedderWrapper;
ThrowWasmException m_throwWasmException { nullptr };
String m_errorMessage;
MemoryMode m_mode { MemoryMode::BoundsChecking };
Lock m_lock;
Condition m_completed;
};
} }
#endif // ENABLE(WEBASSEMBLY)