diff options
author | 2023-02-02 15:56:16 -0800 | |
---|---|---|
committer | 2023-02-02 15:56:16 -0800 | |
commit | b12762af6c0fa3576733ca5e4d8ef8e69a1848cd (patch) | |
tree | 6766427cf33647988547c619d20983d3074a6555 /src | |
parent | 440a21eb1d4d75eb23f2d53ed665fec44e7eab8e (diff) | |
download | bun-b12762af6c0fa3576733ca5e4d8ef8e69a1848cd.tar.gz bun-b12762af6c0fa3576733ca5e4d8ef8e69a1848cd.tar.zst bun-b12762af6c0fa3576733ca5e4d8ef8e69a1848cd.zip |
Fix stack overflow when console.log'ing strings
Diffstat (limited to 'src')
-rw-r--r-- | src/string_immutable.zig | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/string_immutable.zig b/src/string_immutable.zig index cf6f6126c..b09d6bd2d 100644 --- a/src/string_immutable.zig +++ b/src/string_immutable.zig @@ -3542,13 +3542,20 @@ test "firstNonASCII16" { } } +fn getSharedBuffer() void { + return std.mem.asBytes(shared_temp_buffer_ptr orelse brk: { + shared_temp_buffer_ptr = bun.default_allocator.create([32 * 1024]u8) catch unreachable; + break :brk shared_temp_buffer_ptr.?; + }); +} +threadlocal var shared_temp_buffer_ptr: ?*[32 * 1024]u8 = null; + pub fn formatUTF16Type(comptime Slice: type, slice_: Slice, writer: anytype) !void { + var chunk = getSharedBuffer(); var slice = slice_; - const chunk_size = 2048; - var chunk: [chunk_size + 4]u8 = undefined; while (slice.len > 0) { - const result = strings.copyUTF16IntoUTF8(&chunk, Slice, slice); + const result = strings.copyUTF16IntoUTF8(chunk, Slice, slice); if (result.read == 0 or result.written == 0) break; try writer.writeAll(chunk[0..result.written]); @@ -3561,16 +3568,15 @@ pub fn formatUTF16(slice_: []align(1) const u16, writer: anytype) !void { } pub fn formatLatin1(slice_: []const u8, writer: anytype) !void { + var chunk = getSharedBuffer(); var slice = slice_; - const chunk_size = 2048; - var chunk: [chunk_size + 4]u8 = undefined; while (strings.firstNonASCII(slice)) |i| { if (i > 0) { try writer.writeAll(slice[0..i]); slice = slice[i..]; } - const result = strings.copyLatin1IntoUTF8(&chunk, @TypeOf(slice), slice[0..@min(chunk.len, slice.len)]); + const result = strings.copyLatin1IntoUTF8(chunk, @TypeOf(slice), slice[0..@min(chunk.len, slice.len)]); if (result.read == 0 or result.written == 0) break; try writer.writeAll(chunk[0..result.written]); |