diff --git a/samples/clock/src/main.c b/samples/clock/src/main.c index e5b21ac..fefd5ee 100644 --- a/samples/clock/src/main.c +++ b/samples/clock/src/main.c @@ -19,7 +19,7 @@ f32 minf(f32 a, f32 b); ORCA_EXPORT void oc_on_init(void) { - oc_runtime_window_set_title(OC_STR8("clock")); + oc_window_set_title(OC_STR8("clock")); oc_runtime_window_set_size((oc_vec2){ .x = 400, .y = 400 }); surface = oc_surface_canvas(); diff --git a/samples/fluid/src/main.c b/samples/fluid/src/main.c index b86e9a6..019019a 100644 --- a/samples/fluid/src/main.c +++ b/samples/fluid/src/main.c @@ -615,7 +615,7 @@ ORCA_EXPORT void oc_on_init() { oc_log_info("Hello, world (from C)"); - oc_runtime_window_set_title(OC_STR8("fluid")); + oc_window_set_title(OC_STR8("fluid")); surface = oc_surface_gles(); oc_surface_select(surface); diff --git a/samples/glesTriangle/src/main.c b/samples/glesTriangle/src/main.c index 9ccb81a..b5a09cc 100644 --- a/samples/glesTriangle/src/main.c +++ b/samples/glesTriangle/src/main.c @@ -37,7 +37,7 @@ void compile_shader(GLuint shader, const char* source) ORCA_EXPORT void oc_on_init(void) { - oc_runtime_window_set_title(OC_STR8("triangle")); + oc_window_set_title(OC_STR8("triangle")); surface = oc_surface_gles(); oc_surface_select(surface); diff --git a/samples/pong/src/main.c b/samples/pong/src/main.c index 978eb94..0cfb47a 100644 --- a/samples/pong/src/main.c +++ b/samples/pong/src/main.c @@ -69,7 +69,7 @@ oc_str8 loadFile(oc_arena* arena, oc_str8 filename) ORCA_EXPORT void oc_on_init(void) { - oc_runtime_window_set_title(OC_STR8("pong")); + oc_window_set_title(OC_STR8("pong")); surface = oc_surface_canvas(); canvas = oc_canvas_create(); diff --git a/samples/ui/src/main.c b/samples/ui/src/main.c index 48c0f9c..72ef890 100644 --- a/samples/ui/src/main.c +++ b/samples/ui/src/main.c @@ -10,7 +10,7 @@ oc_arena textArena = { 0 }; ORCA_EXPORT void oc_on_init(void) { - oc_runtime_window_set_title(OC_STR8("ui")); + oc_window_set_title(OC_STR8("ui")); surface = oc_surface_canvas(); canvas = oc_canvas_create(); diff --git a/src/app/app.h b/src/app/app.h index 3f1005c..a99a5a7 100644 --- a/src/app/app.h +++ b/src/app/app.h @@ -457,9 +457,10 @@ ORCA_API int oc_directory_create(oc_str8 path); #else +void oc_window_set_title(oc_str8 title); +void oc_window_set_size(oc_vec2 size); + void ORCA_IMPORT(oc_request_quit)(void); -void ORCA_IMPORT(oc_runtime_window_set_title)(oc_str8 title); -void ORCA_IMPORT(oc_runtime_window_set_size)(oc_vec2 size); #endif // !defined(OC_PLATFORM_ORCA) || !(OC_PLATFORM_ORCA) diff --git a/src/platform/orca_debug.c b/src/platform/orca_debug.c index 2ccdc5a..a71742e 100644 --- a/src/platform/orca_debug.c +++ b/src/platform/orca_debug.c @@ -49,7 +49,7 @@ typedef struct oc_log_output static oc_log_output oc_logDefaultOutput = { .kind = ORCA_LOG_OUTPUT_CONSOLE }; oc_log_output* OC_LOG_DEFAULT_OUTPUT = &oc_logDefaultOutput; -void ORCA_IMPORT(oc_runtime_log)(oc_log_level level, +void ORCA_IMPORT(oc_bridge_log)(oc_log_level level, int fileLen, const char* file, int functionLen, @@ -77,7 +77,7 @@ void platform_log_push(oc_log_output* output, oc_str8 string = oc_str8_list_join(scratch, ctx.list); - oc_runtime_log(level, strlen(file), file, strlen(function), function, line, oc_str8_ip(string)); + oc_bridge_log(level, strlen(file), file, strlen(function), function, line, oc_str8_ip(string)); oc_arena_scope_end(tmp); } @@ -86,8 +86,8 @@ void platform_log_push(oc_log_output* output, // Assert/Abort //---------------------------------------------------------------- -_Noreturn void ORCA_IMPORT(oc_runtime_abort_ext)(const char* file, const char* function, int line, const char* msg); -_Noreturn void ORCA_IMPORT(oc_runtime_assert_fail)(const char* file, const char* function, int line, const char* src, const char* msg); +_Noreturn void ORCA_IMPORT(oc_bridge_abort_ext)(const char* file, const char* function, int line, const char* msg); +_Noreturn void ORCA_IMPORT(oc_bridge_assert_fail)(const char* file, const char* function, int line, const char* src, const char* msg); _Noreturn void oc_abort_ext(const char* file, const char* function, int line, const char* fmt, ...) { @@ -108,7 +108,7 @@ _Noreturn void oc_abort_ext(const char* file, const char* function, int line, co oc_str8 msg = oc_str8_list_join(scratch.arena, ctx.list); - oc_runtime_abort_ext(file, function, line, msg.ptr); + oc_bridge_abort_ext(file, function, line, msg.ptr); oc_scratch_end(scratch); } @@ -132,7 +132,7 @@ _Noreturn void oc_assert_fail(const char* file, const char* function, int line, oc_str8 msg = oc_str8_list_join(scratch.arena, ctx.list); - oc_runtime_assert_fail(file, function, line, src, msg.ptr); + oc_bridge_assert_fail(file, function, line, src, msg.ptr); oc_scratch_end(scratch); } diff --git a/src/runtime.c b/src/runtime.c index 896c708..ac38895 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -56,11 +56,20 @@ oc_runtime* oc_runtime_get() return (&__orcaApp); } -oc_runtime_env* oc_runtime_env_get() +oc_wasm_env* oc_runtime_get_env() { return (&__orcaApp.env); } +oc_str8 oc_runtime_get_wasm_memory() +{ + oc_str8 mem = { 0 }; + u32 size = 0; + mem.ptr = (char*)m3_GetMemory(__orcaApp.env.m3Runtime, &size, 0); + mem.len = size; + return (mem); +} + void orca_wasm3_abort(IM3Runtime runtime, M3Result res, const char* file, const char* function, int line, const char* msg) { M3ErrorInfo errInfo = { 0 }; @@ -75,67 +84,21 @@ void orca_wasm3_abort(IM3Runtime runtime, M3Result res, const char* file, const } } -#define ORCA_WASM3_ABORT(runtime, err, msg) orca_wasm3_abort(runtime, err, __FILE__, __FUNCTION__, __LINE__, msg) - -void* oc_runtime_env_ptr_to_native(oc_runtime_env* env, void* wasmPtr, u32 length) +void oc_bridge_window_set_title(oc_wasm_str8 title) { - // We can't use the runtime's memory pointer directly because wasm3 embeds a - // header at the beginning of the block we give it. - u64 bufferIndex = (u64)wasmPtr & 0xffffffff; - u32 memSize = 0; - char* memory = (char*)m3_GetMemory(env->m3Runtime, &memSize, 0); - - if(bufferIndex + length < memSize) + oc_str8 nativeTitle = oc_wasm_str8_to_native(title); + if(nativeTitle.ptr) { - char* nativePtr = memory + bufferIndex; - return nativePtr; - } - //TODO directly abort here? - - return NULL; -} - -void* oc_runtime_ptr_to_native(oc_runtime* orca, void* wasmPtr, u32 length) -{ - return (oc_runtime_env_ptr_to_native(&orca->env, wasmPtr, length)); -} - -void* oc_wasm_arena_push(oc_runtime_env* env, i32 arenaIndex, u64 size) -{ - void* retValues[1] = { 0 }; - const void* retPointers[1] = { &retValues[0] }; - const void* args[2] = { &arenaIndex, &size }; - - M3Result res = m3_Call(env->exports[OC_EXPORT_ARENA_PUSH], 2, args); - if(res) - { - ORCA_WASM3_ABORT(env->m3Runtime, res, "Runtime error"); - } - - res = m3_GetResults(env->exports[OC_EXPORT_ARENA_PUSH], 1, retPointers); - if(res) - { - ORCA_WASM3_ABORT(env->m3Runtime, res, "Runtime error"); - } - void* ptr = oc_runtime_env_ptr_to_native(env, retValues[0], size); - return (ptr); -} - -void oc_runtime_window_set_title(oc_str8 title) -{ - title.ptr = oc_runtime_ptr_to_native(oc_runtime_get(), title.ptr, title.len); - if(title.ptr) - { - oc_window_set_title(__orcaApp.window, title); + oc_window_set_title(__orcaApp.window, nativeTitle); } } -void oc_runtime_window_set_size(oc_vec2 size) +void oc_bridge_window_set_size(oc_vec2 size) { oc_window_set_content_size(__orcaApp.window, size); } -void oc_runtime_log(oc_log_level level, +void oc_bridge_log(oc_log_level level, int fileLen, char* file, int functionLen, @@ -372,9 +335,9 @@ char m3_type_to_tag(M3ValueType type) } } -void oc_runtime_env_init(oc_runtime_env* runtime) +void oc_wasm_env_init(oc_wasm_env* runtime) { - memset(runtime, 0, sizeof(oc_runtime_env)); + memset(runtime, 0, sizeof(oc_wasm_env)); oc_base_allocator* allocator = oc_base_allocator_default(); runtime->wasmMemory.committed = 0; runtime->wasmMemory.reserved = 4ULL << 30; @@ -392,7 +355,7 @@ i32 orca_runloop(void* user) { oc_runtime* app = &__orcaApp; - oc_runtime_env_init(&app->env); + oc_wasm_env_init(&app->env); //NOTE: loads wasm module const char* bundleNameCString = "module"; @@ -418,7 +381,7 @@ i32 orca_runloop(void* user) app->env.m3Runtime = m3_NewRuntime(app->env.m3Env, stackSize, NULL); //NOTE: host memory will be freed when runtime is freed. - m3_RuntimeSetMemoryCallbacks(app->env.m3Runtime, wasm_memory_resize_callback, wasm_memory_free_callback, &app->env.wasmMemory); + m3_RuntimeSetMemoryCallbacks(app->env.m3Runtime, oc_wasm_memory_resize_callback, oc_wasm_memory_free_callback, &app->env.wasmMemory); M3Result res = m3_ParseModule(app->env.m3Env, &app->env.m3Module, (u8*)app->env.wasmBytecode.ptr, app->env.wasmBytecode.len); if(res) @@ -569,7 +532,7 @@ i32 orca_runloop(void* user) if(exports[OC_EXPORT_RAW_EVENT]) { #ifndef M3_BIG_ENDIAN - oc_event* eventPtr = (oc_event*)wasm_memory_offset_to_ptr(&app->env.wasmMemory, app->env.rawEventOffset); + oc_event* eventPtr = (oc_event*)oc_wasm_address_to_ptr(app->env.rawEventOffset, sizeof(oc_event)); memcpy(eventPtr, event, sizeof(*event)); const void* args[1] = { &app->env.rawEventOffset }; diff --git a/src/runtime.h b/src/runtime.h index ae958e9..133670e 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -54,18 +54,18 @@ const oc_export_desc OC_EXPORT_DESC[] = { #undef OC_STR8_LIT }; -typedef struct wasm_memory +typedef struct oc_wasm_memory { char* ptr; u64 reserved; u64 committed; -} wasm_memory; +} oc_wasm_memory; -typedef struct oc_runtime_env +typedef struct oc_wasm_env { oc_str8 wasmBytecode; - wasm_memory wasmMemory; + oc_wasm_memory wasmMemory; // wasm3 data IM3Environment m3Env; @@ -74,7 +74,7 @@ typedef struct oc_runtime_env IM3Function exports[OC_EXPORT_COUNT]; u32 rawEventOffset; -} oc_runtime_env; +} oc_wasm_env; typedef struct log_entry { @@ -114,20 +114,20 @@ typedef struct oc_runtime { bool quit; oc_window window; + oc_debug_overlay debugOverlay; oc_file_table fileTable; oc_file rootDir; - oc_runtime_env env; - - oc_debug_overlay debugOverlay; + oc_wasm_env env; } oc_runtime; -oc_runtime* oc_runtime_get(); -oc_runtime_env* oc_runtime_env_get(); +oc_runtime* oc_runtime_get(void); +oc_wasm_env* oc_runtime_get_env(void); +oc_str8 oc_runtime_get_wasm_memory(void); -void* oc_runtime_ptr_to_native(oc_runtime* runtime, void* wasmPtr, u32 length); -void* oc_wasm_arena_push(oc_runtime_env* env, i32 arenaIndex, u64 size); +void orca_wasm3_abort(IM3Runtime runtime, M3Result res, const char* file, const char* function, int line, const char* msg); +#define ORCA_WASM3_ABORT(runtime, err, msg) orca_wasm3_abort(runtime, err, __FILE__, __FUNCTION__, __LINE__, msg) #endif //__RUNTIME_H_ diff --git a/src/runtime_io.c b/src/runtime_io.c index 5605e41..2fcb245 100644 --- a/src/runtime_io.c +++ b/src/runtime_io.c @@ -7,15 +7,17 @@ *****************************************************************/ #include "platform/platform_io_internal.h" #include "runtime.h" +#include "runtime_memory.h" -oc_io_cmp oc_runtime_io_wait_single_req(oc_io_req* wasmReq) +oc_io_cmp oc_bridge_io_single_rect(oc_io_req* wasmReq) { oc_runtime* orca = oc_runtime_get(); oc_io_cmp cmp = { 0 }; oc_io_req req = *wasmReq; - void* buffer = oc_runtime_ptr_to_native(orca, req.buffer, req.size); + //TODO have a separate oc_wasm_io_req struct + void* buffer = oc_wasm_address_to_ptr((oc_wasm_addr)(uintptr_t)req.buffer, req.size); if(buffer) { @@ -40,51 +42,20 @@ oc_io_cmp oc_runtime_io_wait_single_req(oc_io_req* wasmReq) return (cmp); } -oc_file oc_file_open_with_request_bridge(oc_str8 path, oc_file_access rights, oc_file_open_flags flags) +oc_file oc_file_open_with_request_bridge(oc_wasm_str8 path, oc_file_access rights, oc_file_open_flags flags) { oc_file file = oc_file_nil(); oc_runtime* orca = oc_runtime_get(); - path.ptr = oc_runtime_ptr_to_native(orca, path.ptr, path.len); - if(path.ptr) + oc_str8 nativePath = oc_wasm_str8_to_native(path); + + if(nativePath.ptr) { - file = oc_file_open_with_request_for_table(path, rights, flags, &orca->fileTable); + file = oc_file_open_with_request_for_table(nativePath, rights, flags, &orca->fileTable); } return (file); } -typedef struct oc_wasm_list -{ - u32 first; - u32 last; -} oc_wasm_list; - -typedef struct oc_wasm_list_elt -{ - u32 prev; - u32 next; -} oc_wasm_list_elt; - -typedef struct oc_wasm_str8 -{ - u64 len; - u32 ptr; -} oc_wasm_str8; - -typedef struct oc_wasm_str8_elt -{ - oc_wasm_list_elt listElt; - oc_wasm_str8 string; - -} oc_wasm_str8_elt; - -typedef struct oc_wasm_str8_list -{ - oc_wasm_list list; - u64 eltCount; - u64 len; -} oc_wasm_str8_list; - typedef struct oc_wasm_file_dialog_desc { oc_file_dialog_kind kind; @@ -111,7 +82,7 @@ typedef struct oc_wasm_file_open_with_dialog_result } oc_wasm_file_open_with_dialog_result; -oc_wasm_file_open_with_dialog_result oc_file_open_with_dialog_bridge(i32 wasmArenaIndex, +oc_wasm_file_open_with_dialog_result oc_file_open_with_dialog_bridge(oc_wasm_addr wasmArena, oc_file_access rights, oc_file_open_flags flags, oc_wasm_file_dialog_desc* desc) @@ -124,10 +95,10 @@ oc_wasm_file_open_with_dialog_result oc_file_open_with_dialog_bridge(i32 wasmAre .flags = desc->flags }; - nativeDesc.title.ptr = oc_runtime_ptr_to_native(orca, (char*)(uintptr_t)desc->title.ptr, desc->title.len); + nativeDesc.title.ptr = oc_wasm_address_to_ptr(desc->title.ptr, desc->title.len); nativeDesc.title.len = desc->title.len; - nativeDesc.okLabel.ptr = oc_runtime_ptr_to_native(orca, (char*)(uintptr_t)desc->okLabel.ptr, desc->okLabel.len); + nativeDesc.okLabel.ptr = oc_wasm_address_to_ptr(desc->okLabel.ptr, desc->okLabel.len); nativeDesc.okLabel.len = desc->okLabel.len; if(oc_file_is_nil(desc->startAt) && desc->startPath.len) @@ -138,17 +109,14 @@ oc_wasm_file_open_with_dialog_result oc_file_open_with_dialog_bridge(i32 wasmAre { nativeDesc.startAt = desc->startAt; } - nativeDesc.startPath.ptr = oc_runtime_ptr_to_native(orca, (char*)(uintptr_t)desc->startPath.ptr, desc->startPath.len); + nativeDesc.startPath.ptr = oc_wasm_address_to_ptr(desc->startPath.ptr, desc->startPath.len); nativeDesc.startPath.len = desc->startPath.len; u32 eltIndex = desc->filters.list.first; while(eltIndex) { - oc_wasm_str8_elt* elt = oc_runtime_ptr_to_native(orca, (char*)(uintptr_t)eltIndex, sizeof(oc_wasm_str8_elt)); - - oc_str8 filter = { 0 }; - filter.ptr = oc_runtime_ptr_to_native(orca, (char*)(uintptr_t)elt->string.ptr, elt->string.len); - filter.len = elt->string.len; + oc_wasm_str8_elt* elt = oc_wasm_address_to_ptr(eltIndex, sizeof(oc_wasm_str8_elt)); + oc_str8 filter = oc_wasm_str8_to_native(elt->string); oc_str8_list_push(scratch.arena, &nativeDesc.filters, filter); @@ -164,31 +132,12 @@ oc_wasm_file_open_with_dialog_result oc_file_open_with_dialog_bridge(i32 wasmAre .file = nativeResult.file }; - u32 memSize; - char* wasmMemory = (char*)m3_GetMemory(orca->env.m3Runtime, &memSize, 0); - oc_wasm_file_open_with_dialog_elt* lastElt = 0; - oc_list_for(&nativeResult.selection, elt, oc_file_open_with_dialog_elt, listElt) { - oc_wasm_file_open_with_dialog_elt* wasmElt = oc_wasm_arena_push(&orca->env, wasmArenaIndex, sizeof(oc_wasm_file_open_with_dialog_elt)); + oc_wasm_file_open_with_dialog_elt* wasmElt = oc_wasm_arena_push(wasmArena, sizeof(oc_wasm_file_open_with_dialog_elt)); wasmElt->file = elt->file; - if(result.selection.last == 0) - { - result.selection.first = ((char*)wasmElt - wasmMemory); - result.selection.last = result.selection.first; - wasmElt->listElt.prev = 0; - wasmElt->listElt.next = 0; - } - else - { - wasmElt->listElt.prev = result.selection.last; - wasmElt->listElt.next = 0; - lastElt->listElt.next = ((char*)wasmElt - wasmMemory); - - result.selection.last = ((char*)wasmElt - wasmMemory); - } - lastElt = wasmElt; + oc_wasm_list_push_back(&result.selection, &wasmElt->listElt); } oc_scratch_end(scratch); diff --git a/src/runtime_memory.c b/src/runtime_memory.c index 1c0158c..8e5ee43 100644 --- a/src/runtime_memory.c +++ b/src/runtime_memory.c @@ -7,10 +7,11 @@ *****************************************************************/ #include "runtime.h" +#include "runtime_memory.h" -void* wasm_memory_resize_callback(void* p, unsigned long size, void* userData) +void* oc_wasm_memory_resize_callback(void* p, unsigned long size, void* userData) { - wasm_memory* memory = (wasm_memory*)userData; + oc_wasm_memory* memory = (oc_wasm_memory*)userData; if(memory->committed >= size) { @@ -32,35 +33,119 @@ void* wasm_memory_resize_callback(void* p, unsigned long size, void* userData) } } -void wasm_memory_free_callback(void* p, void* userData) +void oc_wasm_memory_free_callback(void* p, void* userData) { - wasm_memory* memory = (wasm_memory*)userData; + oc_wasm_memory* memory = (oc_wasm_memory*)userData; oc_base_allocator* allocator = oc_base_allocator_default(); oc_base_release(allocator, memory->ptr, memory->reserved); - memset(memory, 0, sizeof(wasm_memory)); + memset(memory, 0, sizeof(oc_wasm_memory)); } extern u32 oc_mem_grow(u64 size) { - oc_runtime_env* runtime = oc_runtime_env_get(); - wasm_memory* memory = &runtime->wasmMemory; + oc_wasm_env* env = oc_runtime_get_env(); + oc_wasm_memory* memory = &env->wasmMemory; size = oc_align_up_pow2(size, d_m3MemPageSize); - u64 totalSize = size + m3_GetMemorySize(runtime->m3Runtime); + u64 totalSize = size + m3_GetMemorySize(env->m3Runtime); u32 addr = memory->committed; //NOTE: call resize memory, which will call our custom resize callback... this is a bit involved because // wasm3 doesn't allow resizing the memory directly - M3Result res = ResizeMemory(runtime->m3Runtime, totalSize / d_m3MemPageSize); + M3Result res = ResizeMemory(env->m3Runtime, totalSize / d_m3MemPageSize); return (addr); } -void* wasm_memory_offset_to_ptr(wasm_memory* memory, u32 offset) +void* oc_wasm_address_to_ptr(oc_wasm_addr addr, oc_wasm_size size) { - M3MemoryHeader* header = (M3MemoryHeader*)(memory->ptr); - OC_DEBUG_ASSERT(offset < header->length, "Wasm offset exceeds memory length"); - return memory->ptr + sizeof(M3MemoryHeader) + offset; + oc_str8 mem = oc_runtime_get_wasm_memory(); + OC_ASSERT(addr + size < mem.len, "Object overflows wasm memory"); + + void* ptr = (addr == 0) ? 0 : mem.ptr + addr; + return (ptr); +} + +oc_wasm_addr oc_wasm_address_from_ptr(void* ptr, oc_wasm_size size) +{ + oc_wasm_addr addr = 0; + if(ptr != 0) + { + oc_str8 mem = oc_runtime_get_wasm_memory(); + OC_ASSERT((char*)ptr > mem.ptr && (((char*)ptr - mem.ptr) + size < mem.len), "Object overflows wasm memory"); + + addr = (char*)ptr - mem.ptr; + } + return (addr); +} + +//------------------------------------------------------------------------------------ +// oc_wasm_list helpers +//------------------------------------------------------------------------------------ + +void oc_wasm_list_push(oc_wasm_list* list, oc_wasm_list_elt* elt) +{ + elt->next = list->first; + elt->prev = 0; + + oc_wasm_addr eltAddr = oc_wasm_address_from_ptr(elt, sizeof(oc_wasm_list_elt)); + + if(list->first) + { + oc_wasm_list_elt* first = oc_wasm_address_to_ptr(list->first, sizeof(oc_wasm_list_elt)); + first->prev = eltAddr; + } + else + { + list->last = eltAddr; + } + list->first = eltAddr; +} + +void oc_wasm_list_push_back(oc_wasm_list* list, oc_wasm_list_elt* elt) +{ + elt->prev = list->last; + elt->next = 0; + + oc_wasm_addr eltAddr = oc_wasm_address_from_ptr(elt, sizeof(oc_wasm_list_elt)); + + if(list->last) + { + oc_wasm_list_elt* last = oc_wasm_address_to_ptr(list->last, sizeof(oc_wasm_list_elt)); + last->next = eltAddr; + } + else + { + list->first = eltAddr; + } + list->last = eltAddr; +} + +//------------------------------------------------------------------------------------ +// Wasm arenas helpers +//------------------------------------------------------------------------------------ + +void* oc_wasm_arena_push(oc_wasm_addr arena, u64 size) +{ + oc_wasm_env* env = oc_runtime_get_env(); + + oc_wasm_addr retValues[1] = { 0 }; + const void* retPointers[1] = { (void*)&retValues[0] }; + const void* args[2] = { &arena, &size }; + + M3Result res = m3_Call(env->exports[OC_EXPORT_ARENA_PUSH], 2, args); + if(res) + { + ORCA_WASM3_ABORT(env->m3Runtime, res, "Runtime error"); + } + + res = m3_GetResults(env->exports[OC_EXPORT_ARENA_PUSH], 1, retPointers); + if(res) + { + ORCA_WASM3_ABORT(env->m3Runtime, res, "Runtime error"); + } + void* ptr = oc_wasm_address_to_ptr(retValues[0], size); + return (ptr); } diff --git a/src/runtime_memory.h b/src/runtime_memory.h new file mode 100644 index 0000000..75fbe41 --- /dev/null +++ b/src/runtime_memory.h @@ -0,0 +1,101 @@ +/************************************************************/ /** +* +* @file: runtime_memory.h +* @author: Martin Fouilleul +* @date: 02/09/2023 +* +*****************************************************************/ +#ifndef __RUNTIME_MEMORY_H_ +#define __RUNTIME_MEMORY_H_ + +#include "runtime.h" + +typedef u32 oc_wasm_addr; +typedef u32 oc_wasm_size; + +void* oc_wasm_address_to_ptr(oc_wasm_addr addr, oc_wasm_size size); +oc_wasm_addr oc_wasm_address_from_ptr(void* ptr, oc_wasm_size size); + +//------------------------------------------------------------------------------------ +// oc_wasm_list helpers +//------------------------------------------------------------------------------------ + +typedef struct oc_wasm_list +{ + u32 first; + u32 last; +} oc_wasm_list; + +typedef struct oc_wasm_list_elt +{ + u32 prev; + u32 next; +} oc_wasm_list_elt; + +bool oc_wasm_list_empty(oc_wasm_list* list); + +#define oc_wasm_list_begin(list) oc_wasm_address_to_ptr(list->first, sizeof(oc_wasm_list_elt)) +#define oc_wasm_list_end(list) oc_wasm_address_to_ptr(list->last, sizeof(oc_wasm_list_elt)) + +#define oc_wasm_list_next(elt) oc_wasm_address_to_ptr((elt)->next, sizeof(oc_wasm_list_elt)) +#define oc_wasm_list_prev(elt) oc_wasm_address_to_ptr((elt)->prev, sizeof(oc_wasm_list_elt)) + +#define oc_wasm_list_entry(ptr, type, member) \ + oc_container_of(ptr, type, member) + +#define oc_wasm_list_next_entry(list, elt, type, member) \ + (((elt)->member.next != 0) ? oc_wasm_list_entry(oc_wasm_list_next((elt)->member), type, member) : 0) + +#define oc_wasm_list_prev_entry(list, elt, type, member) \ + (((elt)->member.prev != 0) ? oc_wasm_list_entry(oc_wasm_list_prev((elt)->member), type, member) : 0) + +#define oc_wasm_list_checked_entry(elt, type, member) \ + (((elt) != 0) ? oc_wasm_list_entry(elt, type, member) : 0) + +#define oc_wasm_list_first_entry(list, type, member) \ + (oc_wasm_list_checked_entry(oc_wasm_list_begin(list), type, member)) + +#define oc_wasm_list_last_entry(list, type, member) \ + (oc_wasm_list_checked_entry(oc_wasm_list_last(list), type, member)) + +#define oc_wasm_list_for(list, elt, type, member) \ + for(type* elt = oc_wasm_list_checked_entry(oc_wasm_list_begin(list), type, member); \ + elt != 0; \ + elt = oc_wasm_list_checked_entry(oc_wasm_list_next((elt)->member), type, member)) + +void oc_wasm_list_push(oc_wasm_list* list, oc_wasm_list_elt* elt); +void oc_wasm_list_push_back(oc_wasm_list* list, oc_wasm_list_elt* elt); + +//------------------------------------------------------------------------------------ +// oc_wasm_str8 helpers +//------------------------------------------------------------------------------------ + +typedef struct oc_wasm_str8 +{ + u64 len; + u32 ptr; +} oc_wasm_str8; + +typedef struct oc_wasm_str8_elt +{ + oc_wasm_list_elt listElt; + oc_wasm_str8 string; + +} oc_wasm_str8_elt; + +typedef struct oc_wasm_str8_list +{ + oc_wasm_list list; + u64 eltCount; + u64 len; +} oc_wasm_str8_list; + +#define oc_wasm_str8_to_native(wasmString) ((oc_str8){ .ptr = oc_wasm_address_to_ptr(wasmString.ptr, wasmString.len), .len = wasmString.len }) + +//------------------------------------------------------------------------------------ +// Wasm arenas helpers +//------------------------------------------------------------------------------------ + +void* oc_wasm_arena_push(oc_wasm_addr arena, u64 size); + +#endif //__RUNTIME_MEMORY_H_ diff --git a/src/wasmbind/core_api.json b/src/wasmbind/core_api.json index 7cc1a5f..8d43000 100644 --- a/src/wasmbind/core_api.json +++ b/src/wasmbind/core_api.json @@ -1,7 +1,7 @@ [ { - "name": "oc_runtime_log", - "cname": "oc_runtime_log", + "name": "oc_bridge_log", + "cname": "oc_bridge_log", "ret": {"name": "void", "tag": "v"}, "args": [ {"name": "level", "type": {"name": "oc_log_level", "tag": "i"}}, @@ -29,7 +29,7 @@ "type": {"name": "u64", "tag": "I"}}] }, { - "name": "oc_runtime_assert_fail", + "name": "oc_bridge_assert_fail", "cname": "oc_assert_fail", "ret": {"name": "void", "tag": "v"}, "args": [ {"name": "file", @@ -45,7 +45,7 @@ ] }, { - "name": "oc_runtime_abort_ext", + "name": "oc_bridge_abort_ext", "cname": "oc_abort_ext", "ret": {"name": "void", "tag": "v"}, "args": [ {"name": "file", @@ -71,17 +71,17 @@ "args": [] }, { - "name": "oc_runtime_window_set_title", - "cname": "oc_runtime_window_set_title", + "name": "oc_window_set_title", + "cname": "oc_bridge_window_set_title", "ret": {"name": "void", "tag": "v"}, "args": [ { "name": "title", - "type": {"name": "oc_str8", "tag": "S"}} + "type": {"name": "oc_str8", "cname": "oc_wasm_str8", "tag": "S"}} ] }, { - "name": "oc_runtime_window_set_size", - "cname": "oc_runtime_window_set_size", + "name": "oc_window_set_size", + "cname": "oc_bridge_window_set_size", "ret": {"name": "void", "tag": "v"}, "args": [ { "name": "size", diff --git a/src/wasmbind/io_api.json b/src/wasmbind/io_api.json index b164b37..5f720f3 100644 --- a/src/wasmbind/io_api.json +++ b/src/wasmbind/io_api.json @@ -1,7 +1,7 @@ [ { "name": "oc_io_wait_single_req", - "cname": "oc_runtime_io_wait_single_req", + "cname": "oc_bridge_io_single_rect", "ret": {"name": "oc_io_cmp", "tag": "S"}, "args": [ {"name": "req", "type": {"name": "oc_io_req*", "tag": "p"}}] @@ -12,7 +12,7 @@ "ret": {"name": "oc_file", "tag": "S"}, "args": [ {"name": "path", - "type": {"name": "oc_str8", "tag": "S"}}, + "type": {"name": "oc_str8", "cname": "oc_wasm_str8", "tag": "S"}}, {"name": "rights", "type": {"name": "oc_file_access", "tag": "i"}}, {"name": "flags",