@@ -17,7 +17,8 @@ pub const Config = struct {
17
17
mode_name : ModeName ,
18
18
cycles_per_gen : u32 ,
19
19
20
- zig_env : std .json .Parsed (ZigEnv ),
20
+ zig_env_arena : std.heap.ArenaAllocator.State ,
21
+ zig_env : ZigEnv ,
21
22
zls_version : []const u8 ,
22
23
23
24
pub const Defaults = struct {
@@ -35,7 +36,7 @@ pub const Config = struct {
35
36
};
36
37
37
38
pub fn deinit (self : * Config , allocator : std.mem.Allocator ) void {
38
- self .zig_env .deinit ();
39
+ self .zig_env_arena . promote ( allocator ) .deinit ();
39
40
allocator .free (self .zls_path );
40
41
allocator .free (self .zls_version );
41
42
self .* = undefined ;
@@ -58,11 +59,12 @@ cycle: usize = 0,
58
59
zls_process : std.process.Child ,
59
60
id : i64 = 0 ,
60
61
61
- transport : lsp.TransportOverStdio ,
62
+ transport_read_buffer : [256 ]u8 = undefined ,
63
+ stdio_transport : lsp.Transport.Stdio ,
62
64
63
- sent_data : std .ArrayListUnmanaged (u8 ) = .{} ,
64
- sent_messages : std .ArrayListUnmanaged (SentMessage ) = .{} ,
65
- sent_ids : std .AutoArrayHashMapUnmanaged (i64 , void ) = .{} ,
65
+ sent_data : std .ArrayList (u8 ) = .empty ,
66
+ sent_messages : std .ArrayList (SentMessage ) = .empty ,
67
+ sent_ids : std .AutoArrayHashMapUnmanaged (i64 , void ) = .empty ,
66
68
67
69
principal_file_source : []const u8 = "" ,
68
70
principal_file_uri : []const u8 ,
@@ -92,7 +94,7 @@ pub fn create(
92
94
else
93
95
&.{ config .zls_path , "--log-file" , if (builtin .target .os .tag == .windows ) "nul" else "/dev/null" , "--disable-lsp-logs" };
94
96
95
- var zls_process = std .process .Child .init (argv , allocator );
97
+ var zls_process : std.process.Child = .init (argv , allocator );
96
98
zls_process .env_map = & env_map ;
97
99
zls_process .stdin_behavior = .Pipe ;
98
100
zls_process .stderr_behavior = .Ignore ;
@@ -101,17 +103,17 @@ pub fn create(
101
103
try zls_process .spawn ();
102
104
errdefer _ = zls_process .kill () catch @panic ("failed to kill zls process" );
103
105
104
- var sent_ids = std .AutoArrayHashMapUnmanaged (i64 , void ){} ;
106
+ var sent_ids : std .AutoArrayHashMapUnmanaged (i64 , void ) = .empty ;
105
107
try sent_ids .ensureTotalCapacity (allocator , config .cycles_per_gen );
106
108
107
109
fuzzer .* = .{
108
110
.allocator = allocator ,
109
111
.progress_node = progress .start ("fuzzer" , 0 ),
110
112
.mode = mode ,
111
113
.config = config ,
112
- .rand = std . Random . DefaultPrng .init (seed ),
114
+ .rand = .init (seed ),
113
115
.zls_process = zls_process ,
114
- .transport = lsp . TransportOverStdio . init (zls_process .stdout .? , zls_process .stdin .? ),
116
+ .stdio_transport = . init (& fuzzer . transport_read_buffer , zls_process .stdout .? , zls_process .stdin .? ),
115
117
.sent_ids = sent_ids ,
116
118
.principal_file_uri = principal_file_uri ,
117
119
};
@@ -148,10 +150,10 @@ pub fn initCycle(fuzzer: *Fuzzer) !void {
148
150
});
149
151
try fuzzer .sendNotification ("initialized" , .{});
150
152
151
- var settings = std .json .ObjectMap .init (fuzzer .allocator );
153
+ var settings : std.json.ObjectMap = .init (fuzzer .allocator );
152
154
defer settings .deinit ();
153
155
try settings .putNoClobber ("skip_std_references" , .{ .bool = true }); // references collection into std is very slow
154
- try settings .putNoClobber ("zig_exe_path" , .{ .string = fuzzer .config .zig_env .value . zig_exe });
156
+ try settings .putNoClobber ("zig_exe_path" , .{ .string = fuzzer .config .zig_env .zig_exe });
155
157
156
158
try fuzzer .sendNotification ("workspace/didChangeConfiguration" , lsp.types.DidChangeConfigurationParams {
157
159
.settings = .{ .object = settings },
@@ -177,7 +179,7 @@ pub fn closeCycle(fuzzer: *Fuzzer) !void {
177
179
}
178
180
179
181
pub fn reduce (fuzzer : * Fuzzer ) ! void {
180
- var reducer = Reducer .fromFuzzer (fuzzer );
182
+ var reducer : Reducer = .fromFuzzer (fuzzer );
181
183
defer reducer .deinit ();
182
184
183
185
try reducer .reduce ();
@@ -190,7 +192,7 @@ pub fn fuzz(fuzzer: *Fuzzer) !void {
190
192
// detch from cycle count to prevent pipe fillage on windows
191
193
try utils .waitForResponseToRequests (
192
194
fuzzer .allocator ,
193
- & fuzzer .transport ,
195
+ & fuzzer .stdio_transport . transport ,
194
196
& fuzzer .sent_ids ,
195
197
);
196
198
@@ -239,7 +241,7 @@ pub fn fuzzFeatureRandom(
239
241
fuzzer : * Fuzzer ,
240
242
file_uri : []const u8 ,
241
243
file_data : []const u8 ,
242
- ) (lsp .AnyTransport .WriteError || error {OutOfMemory })! void {
244
+ ) (lsp .Transport .WriteError || error {OutOfMemory })! void {
243
245
const rand = fuzzer .random ();
244
246
const wtf = rand .enumValue (WhatToFuzz );
245
247
@@ -289,7 +291,7 @@ pub fn fuzzFeatureRandom(
289
291
}
290
292
}
291
293
292
- fn sendRequest (fuzzer : * Fuzzer , comptime method : []const u8 , params : lsp .ParamsType (method )) (lsp .AnyTransport .WriteError || error {OutOfMemory })! void {
294
+ fn sendRequest (fuzzer : * Fuzzer , comptime method : []const u8 , params : lsp .ParamsType (method )) (lsp .Transport .WriteError || error {OutOfMemory })! void {
293
295
defer fuzzer .id += 1 ;
294
296
295
297
const request : lsp .TypedJsonRPCRequest (lsp .ParamsType (method )) = .{
@@ -299,8 +301,12 @@ fn sendRequest(fuzzer: *Fuzzer, comptime method: []const u8, params: lsp.ParamsT
299
301
};
300
302
301
303
const start = fuzzer .sent_data .items .len ;
302
- try std .json .stringify (request , .{ .emit_null_optional_fields = false }, fuzzer .sent_data .writer (fuzzer .allocator ));
303
- try fuzzer .transport .writeJsonMessage (fuzzer .sent_data .items [start .. ]);
304
+ {
305
+ var aw : std.Io.Writer.Allocating = .fromArrayList (fuzzer .allocator , & fuzzer .sent_data );
306
+ defer fuzzer .sent_data = aw .toArrayList ();
307
+ std .json .Stringify .value (request , .{ .emit_null_optional_fields = false }, & aw .writer ) catch return error .OutOfMemory ;
308
+ }
309
+ try fuzzer .stdio_transport .transport .writeJsonMessage (fuzzer .sent_data .items [start .. ]);
304
310
305
311
try fuzzer .sent_messages .append (fuzzer .allocator , .{
306
312
.id = fuzzer .id ,
@@ -311,13 +317,17 @@ fn sendRequest(fuzzer: *Fuzzer, comptime method: []const u8, params: lsp.ParamsT
311
317
fuzzer .sent_ids .putAssumeCapacityNoClobber (fuzzer .id , {});
312
318
}
313
319
314
- fn sendNotification (fuzzer : * Fuzzer , comptime method : []const u8 , params : lsp .ParamsType (method )) (lsp .AnyTransport .WriteError || error {OutOfMemory })! void {
320
+ fn sendNotification (fuzzer : * Fuzzer , comptime method : []const u8 , params : lsp .ParamsType (method )) (lsp .Transport .WriteError || error {OutOfMemory })! void {
315
321
const notification : lsp .TypedJsonRPCNotification (lsp .ParamsType (method )) = .{
316
322
.method = method ,
317
323
.params = params ,
318
324
};
319
325
320
326
const start = fuzzer .sent_data .items .len ;
321
- try std .json .stringify (notification , .{ .emit_null_optional_fields = false }, fuzzer .sent_data .writer (fuzzer .allocator ));
322
- try fuzzer .transport .writeJsonMessage (fuzzer .sent_data .items [start .. ]);
327
+ {
328
+ var aw : std.Io.Writer.Allocating = .fromArrayList (fuzzer .allocator , & fuzzer .sent_data );
329
+ defer fuzzer .sent_data = aw .toArrayList ();
330
+ std .json .Stringify .value (notification , .{ .emit_null_optional_fields = false }, & aw .writer ) catch return error .OutOfMemory ;
331
+ }
332
+ try fuzzer .stdio_transport .transport .writeJsonMessage (fuzzer .sent_data .items [start .. ]);
323
333
}
0 commit comments