From bd45900257065cd2fd6db508c2f96c0200db994a Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 29 Sep 2024 10:53:31 +0200 Subject: [PATCH 1/4] container/bit_array: add 'init' procedure --- core/container/bit_array/bit_array.odin | 41 +++++++++++++++++++++---- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index 9a76dc78f..85b941d12 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -259,6 +259,7 @@ Inputs: unsafe_unset :: proc(b: ^Bit_Array, bit: int) #no_bounds_check { b.bits[bit >> INDEX_SHIFT] &~= 1 << uint(bit & INDEX_MASK) } + /* A helper function to create a Bit Array with optional bias, in case your smallest index is non-zero (including negative). @@ -276,22 +277,50 @@ Returns: - ba: Allocates a bit_Array, backing data is set to `max-min / 64` indices, rounded up (eg 65 - 0 allocates for [2]u64). */ create :: proc(max_index: int, min_index: int = 0, allocator := context.allocator) -> (res: ^Bit_Array, ok: bool) #optional_ok { - context.allocator = allocator size_in_bits := max_index - min_index if size_in_bits < 0 { return {}, false } + res = new(Bit_Array, allocator) + ok = init(res, max_index, min_index, allocator) + res.free_pointer = true + + if !ok { free(res, allocator) } + + return +} + +/* +A helper function to initialize a Bit Array with optional bias, in case your smallest index is non-zero (including negative). + +The range of bits created by this procedure is `min_index.. (ok: bool) { + size_in_bits := max_index - min_index + + if size_in_bits < 0 { return false } + legs := size_in_bits >> INDEX_SHIFT - if size_in_bits & INDEX_MASK > 0 {legs+=1} - bits, err := make([dynamic]u64, legs) - ok = err == mem.Allocator_Error.None - res = new(Bit_Array) + if size_in_bits & INDEX_MASK > 0 { legs += 1 } + + bits, err := make([dynamic]u64, legs, allocator) + ok = err == nil + res.bits = bits res.bias = min_index res.length = max_index - min_index - res.free_pointer = true + res.free_pointer = false return } + /* Sets all values in the Bit_Array to zero. From 152479052e75419df943422beccd3904f080e891 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 29 Sep 2024 13:35:11 +0200 Subject: [PATCH 2/4] va_list fixes for raylib & stb sprintf --- vendor/raylib/raylib.odin | 2 +- vendor/stb/lib/darwin/stb_sprintf.a | Bin 0 -> 47224 bytes vendor/stb/lib/stb_sprintf.lib | Bin 0 -> 25212 bytes vendor/stb/sprintf/stb_sprintf.odin | 2 +- vendor/stb/src/build.bat | 3 ++- 5 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 vendor/stb/lib/darwin/stb_sprintf.a create mode 100644 vendor/stb/lib/stb_sprintf.lib diff --git a/vendor/raylib/raylib.odin b/vendor/raylib/raylib.odin index 8d26c8824..4c6e4fe78 100644 --- a/vendor/raylib/raylib.odin +++ b/vendor/raylib/raylib.odin @@ -861,7 +861,7 @@ NPatchLayout :: enum c.int { // Callbacks to hook some internal functions // WARNING: This callbacks are intended for advance users -TraceLogCallback :: #type proc "c" (logLevel: TraceLogLevel, text: cstring, args: c.va_list) // Logging: Redirect trace log messages +TraceLogCallback :: #type proc "c" (logLevel: TraceLogLevel, text: cstring, args: ^c.va_list) // Logging: Redirect trace log messages LoadFileDataCallback :: #type proc "c"(fileName: cstring, dataSize: ^c.int) -> [^]u8 // FileIO: Load binary data SaveFileDataCallback :: #type proc "c" (fileName: cstring, data: rawptr, dataSize: c.int) -> bool // FileIO: Save binary data LoadFileTextCallback :: #type proc "c" (fileName: cstring) -> [^]u8 // FileIO: Load text data diff --git a/vendor/stb/lib/darwin/stb_sprintf.a b/vendor/stb/lib/darwin/stb_sprintf.a new file mode 100644 index 0000000000000000000000000000000000000000..e364ee200008215f925ffc1686c24f5011a8e997 GIT binary patch literal 47224 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 CPeAYh literal 0 HcmV?d00001 diff --git a/vendor/stb/lib/stb_sprintf.lib b/vendor/stb/lib/stb_sprintf.lib new file mode 100644 index 0000000000000000000000000000000000000000..35c2cecc9df45b36284b05d6441dc8a8d9850c1a GIT binary patch literal 25212 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 i32 --- snprintf :: proc(buf: [^]byte, count: i32, fmt: cstring, #c_vararg args: ..any) -> i32 --- - vsprintf :: proc(buf: [^]byte, fmt: cstring, va: c.va_list) -> i32 --- + vsprintf :: proc(buf: [^]byte, fmt: cstring, va: ^c.va_list) -> i32 --- vsnprintf :: proc(buf: [^]byte, count: i32, fmt: cstring, va: ^c.va_list) -> i32 --- vsprintfcb :: proc(callback: SPRINTFCB, user: rawptr, buf: [^]byte, fmt: cstring, va: ^c.va_list) -> i32 --- } diff --git a/vendor/stb/src/build.bat b/vendor/stb/src/build.bat index 5fd0e1789..54a0d249f 100644 --- a/vendor/stb/src/build.bat +++ b/vendor/stb/src/build.bat @@ -2,12 +2,13 @@ if not exist "..\lib" mkdir ..\lib -cl -nologo -MT -TC -O2 -c stb_image.c stb_image_write.c stb_image_resize.c stb_truetype.c stb_rect_pack.c stb_vorbis.c +cl -nologo -MT -TC -O2 -c stb_image.c stb_image_write.c stb_image_resize.c stb_truetype.c stb_rect_pack.c stb_vorbis.c stb_sprintf.c lib -nologo stb_image.obj -out:..\lib\stb_image.lib lib -nologo stb_image_write.obj -out:..\lib\stb_image_write.lib lib -nologo stb_image_resize.obj -out:..\lib\stb_image_resize.lib lib -nologo stb_truetype.obj -out:..\lib\stb_truetype.lib lib -nologo stb_rect_pack.obj -out:..\lib\stb_rect_pack.lib lib -nologo stb_vorbis.obj -out:..\lib\stb_vorbis.lib +lib -nologo stb_sprintf.obj -out:..\lib\stb_sprintf.lib del *.obj From 82aefd42033f2d34065ceac4eee404b689d2a186 Mon Sep 17 00:00:00 2001 From: mtarik34b Date: Sun, 29 Sep 2024 16:03:49 +0200 Subject: [PATCH 3/4] Add documentation to `runtime.container_of` --- base/runtime/core_builtin.odin | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 67d249d11..dbeff51d4 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -6,6 +6,39 @@ import "base:intrinsics" Maybe :: union($T: typeid) {T} +/* +Recovers the containing/parent struct from a pointer to one of its fields. +Works by "walking back" to the struct's starting address using the offset between the field and the struct. + +Inputs: +- ptr: Pointer to the field of a container struct +- T: The type of the container struct +- field_name: The name of the field in the `T` struct + +Returns: +- A pointer to the container struct based on a pointer to a field in it + +Example: + package container_of + import "base:runtime" + + Node :: struct { + value: int, + prev: ^Node, + next: ^Node, + } + + main :: proc() { + node: Node + field_ptr := &node.next + container_struct_ptr: ^Node = runtime.container_of(field_ptr, Node, "next") + assert(container_struct_ptr == &node) + assert(uintptr(field_ptr) - uintptr(container_struct_ptr) == size_of(node.value) + size_of(node.prev)) + } + +Output: + ^Node +*/ @(builtin, require_results) container_of :: #force_inline proc "contextless" (ptr: $P/^$Field_Type, $T: typeid, $field_name: string) -> ^T where intrinsics.type_has_field(T, field_name), From cf7d705c1f24d9e34c1c38fe0f8b472d0361ca73 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 30 Sep 2024 21:49:01 +0900 Subject: [PATCH 4/4] core/crypto/_sha3: Fix edge case in cSHAKE bytepad If the domain separator happens to be exactly the rate, we would previously incorrectly add another rate-bytes of 0s. --- core/crypto/_sha3/sp800_185.odin | 14 ++++++++------ .../crypto/test_core_crypto_sha3_variants.odin | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/core/crypto/_sha3/sp800_185.odin b/core/crypto/_sha3/sp800_185.odin index f32398d5c..a96f78cc1 100644 --- a/core/crypto/_sha3/sp800_185.odin +++ b/core/crypto/_sha3/sp800_185.odin @@ -81,16 +81,18 @@ bytepad :: proc(ctx: ^Context, x_strings: [][]byte, w: int) { // 2. while len(z) mod 8 ≠ 0: // z = z || 0 - // 3. while (len(z)/8) mod w ≠ 0: + // 3. while (len(z)/8) mod w != 0: // z = z || 00000000 z_len := u128(z_hi) << 64 | u128(z_lo) z_rem := int(z_len % u128(w)) - pad := _PAD[:w - z_rem] + if z_rem != 0 { + pad := _PAD[:w - z_rem] - // We just add the padding to the state, instead of returning z. - // - // 4. return z. - update(ctx, pad) + // We just add the padding to the state, instead of returning z. + // + // 4. return z. + update(ctx, pad) + } } encode_string :: #force_inline proc(ctx: ^Context, s: []byte) -> (u64, u64) { diff --git a/tests/core/crypto/test_core_crypto_sha3_variants.odin b/tests/core/crypto/test_core_crypto_sha3_variants.odin index c11868e72..ca254c383 100644 --- a/tests/core/crypto/test_core_crypto_sha3_variants.odin +++ b/tests/core/crypto/test_core_crypto_sha3_variants.odin @@ -6,6 +6,7 @@ import "core:testing" import "core:crypto/kmac" import "core:crypto/shake" import "core:crypto/tuplehash" +import "core:strings" @(test) test_shake :: proc(t: ^testing.T) { @@ -102,6 +103,22 @@ test_cshake :: proc(t: ^testing.T) { "07dc27b11e51fbac75bc7b3c1d983e8b4b85fb1defaf218912ac86430273091727f42b17ed1df63e8ec118f04b23633c1dfb1574c8fb55cb45da8e25afb092bb", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7", }, + + // cSHAKE128 - bytepad edge case (https://github.com/golang/go/issues/69169) + // + // If the implementation incorrectly pads an extra rate-bytes of 0s + // if the domain separator is exactly rate-bytes long, this will + // return: + // + // 430d3ebae1528304465f3b6f2ed34a7b931af804afe97d0e2a2796abf5725281 + // + // See: https://github.com/golang/go/issues/69169 + { + 128, + strings.repeat("x", 168-7, context.temp_allocator), + "2cf20c4b26c9ee7751eaa273368e616c868e7275178634e1ecdbac80d4cab5f4", + "", + }, } for v in test_vectors {