From 2bccd07426ef3288d53ea357e29ee1a87c8873ff Mon Sep 17 00:00:00 2001 From: Jonathan Tron Date: Fri, 21 Mar 2025 09:38:23 +0100 Subject: [PATCH 1/6] Prevent registering the same event listener twice on the same element with the exact same data in wasm. --- core/sys/wasm/js/odin.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 1599aa4fe..b3a49523b 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -1662,6 +1662,10 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { if (element == undefined) { return false; } + let key = listener_key(id, name, data, callback, !!use_capture); + if (wasmMemoryInterface.listenerMap.has(key)) { + return false; + } let listener = (e) => { let event_data = {}; @@ -1672,7 +1676,6 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { onEventReceived(event_data, data, callback); }; - let key = listener_key(id, name, data, callback, !!use_capture); wasmMemoryInterface.listenerMap.set(key, listener); element.addEventListener(name, listener, !!use_capture); return true; @@ -1681,6 +1684,11 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { add_window_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => { let name = wasmMemoryInterface.loadString(name_ptr, name_len); let element = window; + let key = listener_key('window', name, data, callback, !!use_capture); + if (wasmMemoryInterface.listenerMap.has(key)) { + return false; + } + let listener = (e) => { let event_data = {}; event_data.id_ptr = 0; @@ -1690,7 +1698,6 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { onEventReceived(event_data, data, callback); }; - let key = listener_key('window', name, data, callback, !!use_capture); wasmMemoryInterface.listenerMap.set(key, listener); element.addEventListener(name, listener, !!use_capture); return true; From 057144dea33ca6b6c8131a79cdbe117c2dec236f Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 21 Mar 2025 21:47:40 +0100 Subject: [PATCH 2/6] fix linux release trying to use non-existant llvm 20 package --- .github/workflows/nightly.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 80b2a72af..314711efb 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -53,8 +53,8 @@ jobs: - name: (Linux) Download LLVM run: | apk add --no-cache \ - musl-dev llvm20-dev clang20 git mold lz4 \ - libxml2-static llvm20-static zlib-static zstd-static \ + musl-dev llvm18-dev clang18 git mold lz4 \ + libxml2-static llvm18-static zlib-static zstd-static \ make shell: alpine.sh --root {0} - name: build odin From f85db012b80f0ddbd33833c0aa617c8d5a6892cb Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 21 Mar 2025 22:53:00 +0100 Subject: [PATCH 3/6] fix off by one temp cstring and put objc names on permanent allocator to be safe Fixes #4922 --- src/llvm_backend_general.cpp | 6 +----- src/llvm_backend_utility.cpp | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 71d368ec9..b7f70893f 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -2812,15 +2812,11 @@ gb_internal lbAddr lb_add_global_generated_with_name(lbModule *m, Type *type, lb GB_ASSERT(type != nullptr); type = default_type(type); - u8 *str = cast(u8 *)gb_alloc_array(temporary_allocator(), u8, name.len); - memcpy(str, name.text, name.len); - str[name.len] = 0; - Scope *scope = nullptr; Entity *e = alloc_entity_variable(scope, make_token_ident(name), type); lbValue g = {}; g.type = alloc_type_pointer(type); - g.value = LLVMAddGlobal(m->mod, lb_type(m, type), cast(char const *)str); + g.value = LLVMAddGlobal(m->mod, lb_type(m, type), alloc_cstring(temporary_allocator(), name)); if (value.value != nullptr) { GB_ASSERT_MSG(LLVMIsConstant(value.value), LLVMPrintValueToString(value.value)); LLVMSetInitializer(g.value, value.value); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index c21e88792..e06369be3 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -2112,7 +2112,7 @@ gb_internal lbAddr lb_handle_objc_find_or_register_selector(lbProcedure *p, Stri } if (!entity) { - gbString global_name = gb_string_make(temporary_allocator(), "__$objc_SEL::"); + gbString global_name = gb_string_make(permanent_allocator(), "__$objc_SEL::"); global_name = gb_string_append_length(global_name, name.text, name.len); lbAddr default_addr = lb_add_global_generated_with_name(default_module, t_objc_SEL, {}, @@ -2174,7 +2174,7 @@ gb_internal lbAddr lb_handle_objc_find_or_register_class(lbProcedure *p, String } if (!entity) { - gbString global_name = gb_string_make(temporary_allocator(), "__$objc_Class::"); + gbString global_name = gb_string_make(permanent_allocator(), "__$objc_Class::"); global_name = gb_string_append_length(global_name, name.text, name.len); lbAddr default_addr = lb_add_global_generated_with_name(default_module, t_objc_Class, {}, From 73fd56463461ff9d783ce6edc02f205696f51d99 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 21 Mar 2025 23:02:00 +0100 Subject: [PATCH 4/6] fix tabs --- core/sys/wasm/js/events.odin | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/sys/wasm/js/events.odin b/core/sys/wasm/js/events.odin index d217f57e6..37a6e6c35 100644 --- a/core/sys/wasm/js/events.odin +++ b/core/sys/wasm/js/events.odin @@ -374,16 +374,16 @@ remove_window_event_listener :: proc(kind: Event_Kind, user_data: rawptr, callba } remove_event_listener_from_event :: proc(e: Event) -> bool { - from_use_capture_false: bool - from_use_capture_true: bool + from_use_capture_false: bool + from_use_capture_true: bool if e.id == "" { - from_use_capture_false = remove_window_event_listener(e.kind, e.user_data, e.callback, false) - from_use_capture_true = remove_window_event_listener(e.kind, e.user_data, e.callback, true) + from_use_capture_false = remove_window_event_listener(e.kind, e.user_data, e.callback, false) + from_use_capture_true = remove_window_event_listener(e.kind, e.user_data, e.callback, true) } else { - from_use_capture_false = remove_event_listener(e.id, e.kind, e.user_data, e.callback, false) - from_use_capture_true = remove_event_listener(e.id, e.kind, e.user_data, e.callback, true) - } - return from_use_capture_false || from_use_capture_true + from_use_capture_false = remove_event_listener(e.id, e.kind, e.user_data, e.callback, false) + from_use_capture_true = remove_event_listener(e.id, e.kind, e.user_data, e.callback, true) + } + return from_use_capture_false || from_use_capture_true } add_custom_event_listener :: proc(id: string, name: string, user_data: rawptr, callback: proc(e: Event), use_capture := false) -> bool { From cf0f73e0cfee96e54e6347d572a39b2611b523e0 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 21 Mar 2025 23:52:52 +0100 Subject: [PATCH 5/6] fix typo for freebsd arm64 MINSIGSTKSZ Fixes #4878 --- core/sys/posix/signal.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/posix/signal.odin b/core/sys/posix/signal.odin index c7e2cc09b..d2f737946 100644 --- a/core/sys/posix/signal.odin +++ b/core/sys/posix/signal.odin @@ -565,7 +565,7 @@ when ODIN_OS == .Darwin { SS_ONSTACK :: 0x0001 SS_DISABLE :: 0x0004 - when ODIN_ARCH == .amd64 || ODIN_ARCH == .arm32 { + when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32 { MINSIGSTKSZ :: 1024 * 4 } else when ODIN_ARCH == .amd64 || ODIN_ARCH == .i386 { MINSIGSTKSZ :: 512 * 4 From e4bc9677af62c74bb23f4c00d82d2a685ce64e50 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sat, 22 Mar 2025 00:20:00 +0100 Subject: [PATCH 6/6] fix unmarshalling bit sets in json Fixes #4761 --- core/encoding/json/unmarshal.odin | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 57371e360..151bd69c3 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -117,9 +117,25 @@ assign_int :: proc(val: any, i: $T) -> bool { case uint: dst = uint (i) case uintptr: dst = uintptr(i) case: + is_bit_set_different_endian_to_platform :: proc(ti: ^runtime.Type_Info) -> bool { + if ti == nil { + return false + } + t := runtime.type_info_base(ti) + #partial switch info in t.variant { + case runtime.Type_Info_Integer: + switch info.endianness { + case .Platform: return false + case .Little: return ODIN_ENDIAN != .Little + case .Big: return ODIN_ENDIAN != .Big + } + } + return false + } + ti := type_info_of(v.id) - if _, ok := ti.variant.(runtime.Type_Info_Bit_Set); ok { - do_byte_swap := !reflect.bit_set_is_big_endian(v) + if info, ok := ti.variant.(runtime.Type_Info_Bit_Set); ok { + do_byte_swap := is_bit_set_different_endian_to_platform(info.underlying) switch ti.size * 8 { case 0: // no-op. case 8: