From 9f2c11b6bcbbabf0454dbbfa40bb913c62267fe2 Mon Sep 17 00:00:00 2001 From: Piotr Sikora Date: Sat, 16 Mar 2019 03:23:54 +0000 Subject: [PATCH 1/4] wasm: pull getFunction() into WasmVm abstraction layer. Signed-off-by: Piotr Sikora --- source/extensions/common/wasm/wasm.cc | 4 +-- source/extensions/common/wasm/wasm.h | 36 ++++++++++------------ source/extensions/common/wasm/wavm/wavm.cc | 24 +++++++++++++++ 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/source/extensions/common/wasm/wasm.cc b/source/extensions/common/wasm/wasm.cc index c45cd7d6f215..c2b48e70df9f 100644 --- a/source/extensions/common/wasm/wasm.cc +++ b/source/extensions/common/wasm/wasm.cc @@ -1025,12 +1025,12 @@ void Wasm::establishEnvironment() { } void Wasm::getFunctions() { -#define _GET(_fn) getFunction(wasm_vm_.get(), "_" #_fn, &_fn##_); +#define _GET(_fn) wasm_vm_.get()->getFunction("_" #_fn, &_fn##_); _GET(malloc); _GET(free); #undef _GET -#define _GET_PROXY(_fn) getFunction(wasm_vm_.get(), "_proxy_" #_fn, &_fn##_); +#define _GET_PROXY(_fn) wasm_vm_.get()->getFunction("_proxy_" #_fn, &_fn##_); _GET_PROXY(onStart); _GET_PROXY(onConfigure); _GET_PROXY(onTick); diff --git a/source/extensions/common/wasm/wasm.h b/source/extensions/common/wasm/wasm.h index 1bba65d0ba84..c5ba01dd417b 100644 --- a/source/extensions/common/wasm/wasm.h +++ b/source/extensions/common/wasm/wasm.h @@ -33,16 +33,16 @@ using PairsWithStringValues = std::vector; using WasmCall1Void = std::function; -using WasmCall1Int = std::function; using WasmCall2Void = std::function; +using WasmCall8Void = std::function; +using WasmCall1Int = std::function; +using WasmCall3Int = std::function; -using WasmContextCall0Void = std::function; -using WasmContextCall7Void = std::function; - -using WasmContextCall0Int = std::function; -using WasmContextCall2Int = - std::function; +using WasmContextCall0Void = WasmCall1Void; // context_id is passed as 1st arg. +using WasmContextCall7Void = WasmCall8Void; // context_id is passed as 1st arg. +using WasmContextCall0Int = WasmCall1Int; // context_id is passed as 1st arg. +using WasmContextCall2Int = WasmCall3Int; // context_id is passed as 1st arg. // A context which will be the target of callbacks for a particular session // e.g. a handler of a stream. @@ -435,6 +435,14 @@ class WasmVm : public Logger::Loggable { // Get the contents of the user section with the given name or "" if it does not exist and // optionally a presence indicator. virtual absl::string_view getUserSection(absl::string_view name, bool* present = nullptr) PURE; + + // Get typed function exported by the WASM module. + virtual void getFunction(absl::string_view functionName, WasmCall0Void* f) PURE; + virtual void getFunction(absl::string_view functionName, WasmCall1Void* f) PURE; + virtual void getFunction(absl::string_view functionName, WasmCall2Void* f) PURE; + virtual void getFunction(absl::string_view functionName, WasmCall8Void* f) PURE; + virtual void getFunction(absl::string_view functionName, WasmCall1Int* f) PURE; + virtual void getFunction(absl::string_view functionName, WasmCall3Int* f) PURE; }; // Create a new low-level WASM VM of the give type (e.g. "envoy.wasm.vm.wavm"). @@ -470,10 +478,6 @@ inline Context::Context(Wasm* wasm) : wasm_(wasm), id_(wasm->allocContextId()) { template void registerCallbackWavm(WasmVm* vm, absl::string_view moduleName, absl::string_view functionName, R (*)(Args...)); -template -void getFunctionWavm(WasmVm* vm, absl::string_view functionName, - std::function*); - template std::unique_ptr> makeGlobalWavm(WasmVm* vm, absl::string_view moduleName, absl::string_view name, T initialValue); @@ -488,14 +492,6 @@ void registerCallback(WasmVm* vm, absl::string_view moduleName, absl::string_vie } } -template void getFunction(WasmVm* vm, absl::string_view functionName, F* function) { - if (vm->vm() == WasmVmNames::get().Wavm) { - getFunctionWavm(vm, functionName, function); - } else { - throw WasmVmException("unsupported wasm vm"); - } -} - template std::unique_ptr> makeGlobal(WasmVm* vm, absl::string_view moduleName, absl::string_view name, T initialValue) { diff --git a/source/extensions/common/wasm/wavm/wavm.cc b/source/extensions/common/wasm/wavm/wavm.cc index 703cac28aeb5..c9b535fd8d14 100644 --- a/source/extensions/common/wasm/wavm/wavm.cc +++ b/source/extensions/common/wasm/wavm/wavm.cc @@ -54,6 +54,11 @@ namespace Wasm { extern thread_local Envoy::Extensions::Common::Wasm::Context* current_context_; +// Forward declaration. +template +void getFunctionWavm(WasmVm* vm, absl::string_view functionName, + std::function* function); + namespace Wavm { struct Wavm; @@ -221,6 +226,25 @@ struct Wavm : public WasmVm { void getInstantiatedGlobals(); + void getFunction(absl::string_view functionName, WasmCall0Void* f) override { + getFunctionWavm(this, functionName, f); + }; + void getFunction(absl::string_view functionName, WasmCall1Void* f) override { + getFunctionWavm(this, functionName, f); + }; + void getFunction(absl::string_view functionName, WasmCall2Void* f) override { + getFunctionWavm(this, functionName, f); + }; + void getFunction(absl::string_view functionName, WasmCall8Void* f) override { + getFunctionWavm(this, functionName, f); + }; + void getFunction(absl::string_view functionName, WasmCall1Int* f) override { + getFunctionWavm(this, functionName, f); + }; + void getFunction(absl::string_view functionName, WasmCall3Int* f) override { + getFunctionWavm(this, functionName, f); + }; + bool hasInstantiatedModule_ = false; IR::Module irModule_; WAVM::Runtime::ModuleRef module_ = nullptr; From b5472bb96d19fec670b4ab0d9b4737d5532357f1 Mon Sep 17 00:00:00 2001 From: Piotr Sikora Date: Mon, 18 Mar 2019 23:19:13 +0000 Subject: [PATCH 2/4] wasm: pull registerCallback() into WasmVm abstraction layer. Signed-off-by: Piotr Sikora --- source/extensions/common/wasm/wasm.cc | 9 ++-- source/extensions/common/wasm/wasm.h | 58 +++++++++++++++------- source/extensions/common/wasm/wavm/wavm.cc | 46 ++++++++++++++++- 3 files changed, 90 insertions(+), 23 deletions(-) diff --git a/source/extensions/common/wasm/wasm.cc b/source/extensions/common/wasm/wasm.cc index c2b48e70df9f..db0ac1ec69a9 100644 --- a/source/extensions/common/wasm/wasm.cc +++ b/source/extensions/common/wasm/wasm.cc @@ -953,7 +953,7 @@ Wasm::Wasm(absl::string_view vm, absl::string_view id, absl::string_view initial } void Wasm::registerCallbacks() { -#define _REGISTER(_fn) registerCallback(wasm_vm_.get(), "envoy", #_fn, &_fn##Handler); +#define _REGISTER(_fn) wasm_vm_->registerCallback("envoy", #_fn, &_fn##Handler); if (is_emscripten_) { _REGISTER(getTotalMemory); _REGISTER(_emscripten_get_heap_size); @@ -962,8 +962,7 @@ void Wasm::registerCallbacks() { #undef _REGISTER // Calls with the "_proxy_" prefix. -#define _REGISTER_PROXY(_fn) \ - registerCallback(wasm_vm_.get(), "envoy", "_proxy_" #_fn, &_fn##Handler); +#define _REGISTER_PROXY(_fn) wasm_vm_->registerCallback("envoy", "_proxy_" #_fn, &_fn##Handler); _REGISTER_PROXY(log); _REGISTER_PROXY(getRequestStreamInfoProtocol); @@ -1025,12 +1024,12 @@ void Wasm::establishEnvironment() { } void Wasm::getFunctions() { -#define _GET(_fn) wasm_vm_.get()->getFunction("_" #_fn, &_fn##_); +#define _GET(_fn) wasm_vm_->getFunction("_" #_fn, &_fn##_); _GET(malloc); _GET(free); #undef _GET -#define _GET_PROXY(_fn) wasm_vm_.get()->getFunction("_proxy_" #_fn, &_fn##_); +#define _GET_PROXY(_fn) wasm_vm_->getFunction("_proxy_" #_fn, &_fn##_); _GET_PROXY(onStart); _GET_PROXY(onConfigure); _GET_PROXY(onTick); diff --git a/source/extensions/common/wasm/wasm.h b/source/extensions/common/wasm/wasm.h index c5ba01dd417b..4ad08c06ec03 100644 --- a/source/extensions/common/wasm/wasm.h +++ b/source/extensions/common/wasm/wasm.h @@ -31,6 +31,7 @@ class WasmVm; using Pairs = std::vector>; using PairsWithStringValues = std::vector>; +// 1st arg is always a pointer to Context (Context*). using WasmCall0Void = std::function; using WasmCall1Void = std::function; using WasmCall2Void = std::function; @@ -39,10 +40,24 @@ using WasmCall8Void = std::function; using WasmCall3Int = std::function; -using WasmContextCall0Void = WasmCall1Void; // context_id is passed as 1st arg. -using WasmContextCall7Void = WasmCall8Void; // context_id is passed as 1st arg. -using WasmContextCall0Int = WasmCall1Int; // context_id is passed as 1st arg. -using WasmContextCall2Int = WasmCall3Int; // context_id is passed as 1st arg. +// 1st arg is always a context_id (uint32_t). +using WasmContextCall0Void = WasmCall1Void; +using WasmContextCall7Void = WasmCall8Void; +using WasmContextCall0Int = WasmCall1Int; +using WasmContextCall2Int = WasmCall3Int; + +// 1st arg is always a pointer to raw_context (void*). +using WasmCallback0Void = void (*)(void*); +using WasmCallback1Void = void (*)(void*, uint32_t); +using WasmCallback2Void = void (*)(void*, uint32_t, uint32_t); +using WasmCallback3Void = void (*)(void*, uint32_t, uint32_t, uint32_t); +using WasmCallback4Void = void (*)(void*, uint32_t, uint32_t, uint32_t, uint32_t); +using WasmCallback5Void = void (*)(void*, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t); +using WasmCallback0Int = uint32_t (*)(void*); +using WasmCallback3Int = uint32_t (*)(void*, uint32_t, uint32_t, uint32_t); +using WasmCallback5Int = uint32_t (*)(void*, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t); +using WasmCallback9Int = uint32_t (*)(void*, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, + uint32_t, uint32_t, uint32_t, uint32_t); // A context which will be the target of callbacks for a particular session // e.g. a handler of a stream. @@ -443,6 +458,28 @@ class WasmVm : public Logger::Loggable { virtual void getFunction(absl::string_view functionName, WasmCall8Void* f) PURE; virtual void getFunction(absl::string_view functionName, WasmCall1Int* f) PURE; virtual void getFunction(absl::string_view functionName, WasmCall3Int* f) PURE; + + // Register typed callbacks exported by the host environment. + virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback0Void f) PURE; + virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback1Void f) PURE; + virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback2Void f) PURE; + virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback3Void f) PURE; + virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback4Void f) PURE; + virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback5Void f) PURE; + virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback0Int f) PURE; + virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback3Int f) PURE; + virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback5Int f) PURE; + virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback9Int f) PURE; }; // Create a new low-level WASM VM of the give type (e.g. "envoy.wasm.vm.wavm"). @@ -475,23 +512,10 @@ class WasmVmException : public EnvoyException { inline Context::Context(Wasm* wasm) : wasm_(wasm), id_(wasm->allocContextId()) {} // Forward declarations for VM implemenations. -template -void registerCallbackWavm(WasmVm* vm, absl::string_view moduleName, absl::string_view functionName, - R (*)(Args...)); template std::unique_ptr> makeGlobalWavm(WasmVm* vm, absl::string_view moduleName, absl::string_view name, T initialValue); -template -void registerCallback(WasmVm* vm, absl::string_view moduleName, absl::string_view functionName, - R (*f)(Args...)) { - if (vm->vm() == WasmVmNames::get().Wavm) { - registerCallbackWavm(vm, moduleName, functionName, f); - } else { - throw WasmVmException("unsupported wasm vm"); - } -} - template std::unique_ptr> makeGlobal(WasmVm* vm, absl::string_view moduleName, absl::string_view name, T initialValue) { diff --git a/source/extensions/common/wasm/wavm/wavm.cc b/source/extensions/common/wasm/wavm/wavm.cc index c9b535fd8d14..2c52fb29f05b 100644 --- a/source/extensions/common/wasm/wavm/wavm.cc +++ b/source/extensions/common/wasm/wavm/wavm.cc @@ -54,10 +54,13 @@ namespace Wasm { extern thread_local Envoy::Extensions::Common::Wasm::Context* current_context_; -// Forward declaration. +// Forward declarations. template void getFunctionWavm(WasmVm* vm, absl::string_view functionName, std::function* function); +template +void registerCallbackWavm(WasmVm* vm, absl::string_view moduleName, absl::string_view functionName, + R (*)(Args...)); namespace Wavm { @@ -245,6 +248,47 @@ struct Wavm : public WasmVm { getFunctionWavm(this, functionName, f); }; + void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback0Void f) override { + registerCallbackWavm(this, moduleName, functionName, f); + }; + void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback1Void f) override { + registerCallbackWavm(this, moduleName, functionName, f); + }; + void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback2Void f) override { + registerCallbackWavm(this, moduleName, functionName, f); + }; + void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback3Void f) override { + registerCallbackWavm(this, moduleName, functionName, f); + }; + void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback4Void f) override { + registerCallbackWavm(this, moduleName, functionName, f); + }; + void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback5Void f) override { + registerCallbackWavm(this, moduleName, functionName, f); + }; + void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback0Int f) override { + registerCallbackWavm(this, moduleName, functionName, f); + }; + void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback3Int f) override { + registerCallbackWavm(this, moduleName, functionName, f); + }; + void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback5Int f) override { + registerCallbackWavm(this, moduleName, functionName, f); + }; + void registerCallback(absl::string_view moduleName, absl::string_view functionName, + WasmCallback9Int f) override { + registerCallbackWavm(this, moduleName, functionName, f); + }; + bool hasInstantiatedModule_ = false; IR::Module irModule_; WAVM::Runtime::ModuleRef module_ = nullptr; From 1245257e72477c64db1b0836a228a6896cdca4ba Mon Sep 17 00:00:00 2001 From: Piotr Sikora Date: Mon, 18 Mar 2019 23:29:54 +0000 Subject: [PATCH 3/4] wasm: pull makeGlobal() into WasmVm abstraction layer. Signed-off-by: Piotr Sikora --- source/extensions/common/wasm/wasm.cc | 4 ++-- source/extensions/common/wasm/wasm.h | 19 ++++--------------- source/extensions/common/wasm/wavm/wavm.cc | 8 ++++++++ 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/source/extensions/common/wasm/wasm.cc b/source/extensions/common/wasm/wasm.cc index db0ac1ec69a9..aa0a475390c6 100644 --- a/source/extensions/common/wasm/wasm.cc +++ b/source/extensions/common/wasm/wasm.cc @@ -1017,9 +1017,9 @@ void Wasm::registerCallbacks() { void Wasm::establishEnvironment() { if (is_emscripten_) { wasm_vm_->makeModule("global"); - emscripten_NaN_ = makeGlobal(wasm_vm_.get(), "global", "NaN", std::nan("0")); + emscripten_NaN_ = wasm_vm_->makeGlobal("global", "NaN", std::nan("0")); emscripten_Infinity_ = - makeGlobal(wasm_vm_.get(), "global", "Infinity", std::numeric_limits::infinity()); + wasm_vm_->makeGlobal("global", "Infinity", std::numeric_limits::infinity()); } } diff --git a/source/extensions/common/wasm/wasm.h b/source/extensions/common/wasm/wasm.h index 4ad08c06ec03..ed01d79c90fd 100644 --- a/source/extensions/common/wasm/wasm.h +++ b/source/extensions/common/wasm/wasm.h @@ -480,6 +480,10 @@ class WasmVm : public Logger::Loggable { WasmCallback5Int f) PURE; virtual void registerCallback(absl::string_view moduleName, absl::string_view functionName, WasmCallback9Int f) PURE; + + // Register typed value exported by the host environment. + virtual std::unique_ptr> + makeGlobal(absl::string_view moduleName, absl::string_view name, double initialValue) PURE; }; // Create a new low-level WASM VM of the give type (e.g. "envoy.wasm.vm.wavm"). @@ -511,21 +515,6 @@ class WasmVmException : public EnvoyException { inline Context::Context(Wasm* wasm) : wasm_(wasm), id_(wasm->allocContextId()) {} -// Forward declarations for VM implemenations. -template -std::unique_ptr> makeGlobalWavm(WasmVm* vm, absl::string_view moduleName, - absl::string_view name, T initialValue); - -template -std::unique_ptr> makeGlobal(WasmVm* vm, absl::string_view moduleName, - absl::string_view name, T initialValue) { - if (vm->vm() == WasmVmNames::get().Wavm) { - return makeGlobalWavm(vm, moduleName, name, initialValue); - } else { - throw WasmVmException("unsupported wasm vm"); - } -} - inline void* Wasm::allocMemory(uint32_t size, uint32_t* address) { uint32_t a = malloc_(generalContext(), size); *address = a; diff --git a/source/extensions/common/wasm/wavm/wavm.cc b/source/extensions/common/wasm/wavm/wavm.cc index 2c52fb29f05b..54c817837772 100644 --- a/source/extensions/common/wasm/wavm/wavm.cc +++ b/source/extensions/common/wasm/wavm/wavm.cc @@ -61,6 +61,9 @@ void getFunctionWavm(WasmVm* vm, absl::string_view functionName, template void registerCallbackWavm(WasmVm* vm, absl::string_view moduleName, absl::string_view functionName, R (*)(Args...)); +template +std::unique_ptr> makeGlobalWavm(WasmVm* vm, absl::string_view moduleName, + absl::string_view name, T initialValue); namespace Wavm { @@ -289,6 +292,11 @@ struct Wavm : public WasmVm { registerCallbackWavm(this, moduleName, functionName, f); }; + std::unique_ptr> makeGlobal(absl::string_view moduleName, absl::string_view name, + double initialValue) override { + return makeGlobalWavm(this, moduleName, name, initialValue); + }; + bool hasInstantiatedModule_ = false; IR::Module irModule_; WAVM::Runtime::ModuleRef module_ = nullptr; From e28362e86d0a7620b8ae64cf584afe5d8d5dac7c Mon Sep 17 00:00:00 2001 From: Piotr Sikora Date: Fri, 22 Mar 2019 11:44:21 +0000 Subject: [PATCH 4/4] review: use macros. Signed-off-by: Piotr Sikora --- source/extensions/common/wasm/wavm/wavm.cc | 83 +++++++--------------- 1 file changed, 26 insertions(+), 57 deletions(-) diff --git a/source/extensions/common/wasm/wavm/wavm.cc b/source/extensions/common/wasm/wavm/wavm.cc index 54c817837772..6a733ce1113a 100644 --- a/source/extensions/common/wasm/wavm/wavm.cc +++ b/source/extensions/common/wasm/wavm/wavm.cc @@ -232,65 +232,34 @@ struct Wavm : public WasmVm { void getInstantiatedGlobals(); - void getFunction(absl::string_view functionName, WasmCall0Void* f) override { - getFunctionWavm(this, functionName, f); +#define _GET_FUNCTION(_type) \ + void getFunction(absl::string_view functionName, _type* f) override { \ + getFunctionWavm(this, functionName, f); \ }; - void getFunction(absl::string_view functionName, WasmCall1Void* f) override { - getFunctionWavm(this, functionName, f); - }; - void getFunction(absl::string_view functionName, WasmCall2Void* f) override { - getFunctionWavm(this, functionName, f); - }; - void getFunction(absl::string_view functionName, WasmCall8Void* f) override { - getFunctionWavm(this, functionName, f); - }; - void getFunction(absl::string_view functionName, WasmCall1Int* f) override { - getFunctionWavm(this, functionName, f); - }; - void getFunction(absl::string_view functionName, WasmCall3Int* f) override { - getFunctionWavm(this, functionName, f); - }; - - void registerCallback(absl::string_view moduleName, absl::string_view functionName, - WasmCallback0Void f) override { - registerCallbackWavm(this, moduleName, functionName, f); - }; - void registerCallback(absl::string_view moduleName, absl::string_view functionName, - WasmCallback1Void f) override { - registerCallbackWavm(this, moduleName, functionName, f); - }; - void registerCallback(absl::string_view moduleName, absl::string_view functionName, - WasmCallback2Void f) override { - registerCallbackWavm(this, moduleName, functionName, f); - }; - void registerCallback(absl::string_view moduleName, absl::string_view functionName, - WasmCallback3Void f) override { - registerCallbackWavm(this, moduleName, functionName, f); - }; - void registerCallback(absl::string_view moduleName, absl::string_view functionName, - WasmCallback4Void f) override { - registerCallbackWavm(this, moduleName, functionName, f); - }; - void registerCallback(absl::string_view moduleName, absl::string_view functionName, - WasmCallback5Void f) override { - registerCallbackWavm(this, moduleName, functionName, f); - }; - void registerCallback(absl::string_view moduleName, absl::string_view functionName, - WasmCallback0Int f) override { - registerCallbackWavm(this, moduleName, functionName, f); - }; - void registerCallback(absl::string_view moduleName, absl::string_view functionName, - WasmCallback3Int f) override { - registerCallbackWavm(this, moduleName, functionName, f); - }; - void registerCallback(absl::string_view moduleName, absl::string_view functionName, - WasmCallback5Int f) override { - registerCallbackWavm(this, moduleName, functionName, f); - }; - void registerCallback(absl::string_view moduleName, absl::string_view functionName, - WasmCallback9Int f) override { - registerCallbackWavm(this, moduleName, functionName, f); + _GET_FUNCTION(WasmCall0Void); + _GET_FUNCTION(WasmCall1Void); + _GET_FUNCTION(WasmCall2Void); + _GET_FUNCTION(WasmCall8Void); + _GET_FUNCTION(WasmCall1Int); + _GET_FUNCTION(WasmCall3Int); +#undef _GET_FUNCTION + +#define _REGISTER_CALLBACK(_type) \ + void registerCallback(absl::string_view moduleName, absl::string_view functionName, \ + _type f) override { \ + registerCallbackWavm(this, moduleName, functionName, f); \ }; + _REGISTER_CALLBACK(WasmCallback0Void); + _REGISTER_CALLBACK(WasmCallback1Void); + _REGISTER_CALLBACK(WasmCallback2Void); + _REGISTER_CALLBACK(WasmCallback3Void); + _REGISTER_CALLBACK(WasmCallback4Void); + _REGISTER_CALLBACK(WasmCallback5Void); + _REGISTER_CALLBACK(WasmCallback0Int); + _REGISTER_CALLBACK(WasmCallback3Int); + _REGISTER_CALLBACK(WasmCallback5Int); + _REGISTER_CALLBACK(WasmCallback9Int); +#undef _REGISTER_CALLBACK std::unique_ptr> makeGlobal(absl::string_view moduleName, absl::string_view name, double initialValue) override {