diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c5355dcc6..832f00994 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -184,7 +184,7 @@ jobs: fail-fast: false matrix: build_type: [Release, Debug] - llvm_version: [16] + llvm_version: [16, 17] steps: - uses: actions/checkout@v3 diff --git a/lib/std/collections/list.c3 b/lib/std/collections/list.c3 index 6eac30d9d..06fdda514 100644 --- a/lib/std/collections/list.c3 +++ b/lib/std/collections/list.c3 @@ -38,6 +38,26 @@ fn void List.tinit(List* list, usz initial_capacity = 16) list.init(initial_capacity, mem::temp()) @inline; } +fn String List.to_string(List* list, Allocator* using = mem::heap()) @dynamic +{ + if (!list.size) return "[]".copy(using); + if (list.size == 1) return string::printf("[%s]", list.entries[0], .using = using); + + @stack_mem(512 + 128; Allocator* mem) + { + DString str; + str.init(512, mem); + str.append("["); + foreach (i, element : list.entries[:list.size]) + { + if (i != 0) str.append(", "); + str.printf("%s", element); + } + str.printf("]"); + return str.copy_str(using); + }; +} + fn void List.push(List* list, Type element) @inline { list.append(element); diff --git a/lib/std/io/io_printf.c3 b/lib/std/io/io_printf.c3 index fcaa7a256..c2c1a3356 100644 --- a/lib/std/io/io_printf.c3 +++ b/lib/std/io/io_printf.c3 @@ -135,9 +135,9 @@ macro bool! Formatter.print_with_function(Formatter* this, any arg) this.width = old_width; this.prec = old_prec; } - @pool() + @stack_mem(512; Allocator* mem) { - this.out_substr(arg.to_string(mem::temp()))!; + this.out_substr(arg.to_string(mem))!; return true; }; } diff --git a/lib/std/net/inetaddr.c3 b/lib/std/net/inetaddr.c3 index ded894cd5..2a20d597d 100644 --- a/lib/std/net/inetaddr.c3 +++ b/lib/std/net/inetaddr.c3 @@ -50,18 +50,18 @@ fn void! InetAddress.to_format(InetAddress* addr, Formatter* formatter) @dynamic formatter.printf("%d.%d.%d.%d", addr.ipv4.a, addr.ipv4.b, addr.ipv4.c, addr.ipv4.d)!; } -fn String! InetAddress.to_string(InetAddress* addr, Allocator* using = mem::heap()) @dynamic +fn String InetAddress.to_string(InetAddress* addr, Allocator* using = mem::heap()) @dynamic { if (addr.is_ipv6) { char[8 * 5 + 1] buffer; String res = (String)io::bprintf(&buffer, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x", addr.ipv6.a, addr.ipv6.b, addr.ipv6.c, addr.ipv6.d, - addr.ipv6.e, addr.ipv6.f, addr.ipv6.g, addr.ipv6.h)!; + addr.ipv6.e, addr.ipv6.f, addr.ipv6.g, addr.ipv6.h)!!; return res.copy(using); } char[3 * 4 + 3 + 1] buffer; - String res = (String)io::bprintf(&buffer, "%d.%d.%d.%d", addr.ipv4.a, addr.ipv4.b, addr.ipv4.c, addr.ipv4.d)!; + String res = (String)io::bprintf(&buffer, "%d.%d.%d.%d", addr.ipv4.a, addr.ipv4.b, addr.ipv4.c, addr.ipv4.d)!!; return res.copy(using); } diff --git a/src/build/build_options.c b/src/build/build_options.c index 2b12fdba7..cdd8a4794 100644 --- a/src/build/build_options.c +++ b/src/build/build_options.c @@ -134,7 +134,7 @@ static void usage(void) OUTPUT(" --x86vec=