| ... | ... | @@ -118,14 +118,22 @@ pub const DirectAllocator = struct { |
| 118 | 118 | } |
| 119 | 119 | return old_mem[0..new_size]; |
| 120 | 120 | }, |
| 121 | | Os.windows => return realloc(allocator, old_mem, old_align, new_size, new_align) catch { |
| 122 | | const old_adjusted_addr = @ptrToInt(old_mem.ptr); |
| 123 | | const old_record_addr = old_adjusted_addr + old_mem.len; |
| 124 | | const root_addr = @intToPtr(*align(1) usize, old_record_addr).*; |
| 125 | | const old_ptr = @intToPtr(*c_void, root_addr); |
| 126 | | const new_record_addr = old_record_addr - new_size + old_mem.len; |
| 127 | | @intToPtr(*align(1) usize, new_record_addr).* = root_addr; |
| 128 | | return old_mem[0..new_size]; |
| 121 | Os.windows => { |
| 122 | if (new_size == 0) { |
| 123 | const self = @fieldParentPtr(DirectAllocator, "allocator", allocator); |
| 124 | _ = os.windows.HeapFree(self.heap_handle.?, 0, old_mem.ptr); |
| 125 | return old_mem[0..new_size]; |
| 126 | } |
| 127 | |
| 128 | return realloc(allocator, old_mem, old_align, new_size, new_align) catch { |
| 129 | const old_adjusted_addr = @ptrToInt(old_mem.ptr); |
| 130 | const old_record_addr = old_adjusted_addr + old_mem.len; |
| 131 | const root_addr = @intToPtr(*align(1) usize, old_record_addr).*; |
| 132 | const old_ptr = @intToPtr(*c_void, root_addr); |
| 133 | const new_record_addr = old_record_addr - new_size + old_mem.len; |
| 134 | @intToPtr(*align(1) usize, new_record_addr).* = root_addr; |
| 135 | return old_mem[0..new_size]; |
| 136 | }; |
| 129 | 137 | }, |
| 130 | 138 | else => @compileError("Unsupported OS"), |
| 131 | 139 | } |
| ... | ... | @@ -143,6 +151,7 @@ pub const DirectAllocator = struct { |
| 143 | 151 | return result; |
| 144 | 152 | }, |
| 145 | 153 | Os.windows => { |
| 154 | assert(new_size > 0); |
| 146 | 155 | if (old_mem.len == 0) return alloc(allocator, new_size, new_align); |
| 147 | 156 | |
| 148 | 157 | const self = @fieldParentPtr(DirectAllocator, "allocator", allocator); |