46 lines
2.3 KiB
C++
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));
|
|
}
|