PkmnLib/src/ScriptResolving/WASM/InterfaceMethods/WASMCoreMethods.cpp

46 lines
2.3 KiB
C++

#include "WASMCoreMethods.hpp"
#include <cstring>
#include "../WebAssemblyScriptResolver.hpp"
#include "WASMHelperFile.hpp"
#include "wasm.h"
wasm_func_t* CreateErrorFunc(WebAssemblyScriptResolver* resolver) {
// This is probably the most horrific function we need to expose. As we do not want the scripting library to be
// responsible for string formatting for size reasons, we pass a lot of data separately. This includes several
// strings.
return WasmHelpers::CreateFunc<wasm_trap_t*, i32, i32, i32, i32, i32, i32>(
resolver, {[](WebAssemblyScriptResolver* resolver, i32 msg, i32 msg_len, i32 file, i32 file_len, i32 line,
i32 position) -> wasm_trap_t* {
auto* msgPointer = wasm_memory_data(resolver->GetMemory()) + msg;
auto* filePointer = wasm_memory_data(resolver->GetMemory()) + file;
auto msgString = std::string_view(msgPointer, msg_len);
auto fileString = std::string_view(filePointer, file_len);
std::stringstream fullMessage;
fullMessage << "WASM Error with message: " << msgString << std::endl
<< "in file: " << fileString << ". Line: " << line << ":" << position;
wasm_message_t message;
wasm_name_new_from_string_nt(&message, fullMessage.str().c_str());
wasm_trap_t* trap = wasm_trap_new(resolver->GetStore(), &message);
wasm_name_delete(&message);
return trap;
}});
}
wasm_func_t* CreatePrintFunc(WebAssemblyScriptResolver* resolver) {
return WasmHelpers::CreateFunc<void, i32, i32>(resolver,
{[](WebAssemblyScriptResolver* resolver, i32 msg, i32 msg_len) {
auto* msgPointer = wasm_memory_data(resolver->GetMemory()) + msg;
auto msgString = std::string_view(msgPointer, msg_len);
std::cout << msgString << std::endl;
}});
}
void WASMCoreMethods::Register(ArbUt::Dictionary<std::string, wasm_func_t*>& externs,
WebAssemblyScriptResolver* resolver) {
externs.Insert("_error", CreateErrorFunc(resolver));
externs.Insert("_print", CreatePrintFunc(resolver));
}