authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-02-17 15:51:48-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-01 16:35:26-07:00
logbb1dffcf32b5f59c2eaadbb522063d6c0415d924
tree05764a0ce0a1d852eb9046085f68e3ae7d4e8410
parentf3be721785013de85faf5d0fa454a7a8bc049c0b

much of the compiler upgraded to new API


26 files changed, 816 insertions(+), 846 deletions(-)

lib/std/crypto/tls/Client.zig+2-2
......@@ -125,9 +125,9 @@ pub const Options = struct {
125125 /// Verify that the server certificate is authorized by a given ca bundle.
126126 bundle: Certificate.Bundle,
127127 },
128 /// If non-null, ssl secrets are logged to this file. Creating such a log file allows
128 /// If non-null, ssl secrets are logged to this stream. Creating such a log file allows
129129 /// other programs with access to that file to decrypt all traffic over this connection.
130 ssl_key_log_file: ?std.fs.File = null,
130 ssl_key_log_file: ?*std.io.BufferedWriter = null,
131131};
132132
133133pub fn InitError(comptime Stream: type) type {
lib/std/io.zig-2
......@@ -282,8 +282,6 @@ pub const Reader = GenericReader;
282282pub const Writer = @import("io/Writer.zig");
283283
284284pub const AnyReader = @import("io/Reader.zig");
285/// Deprecated; to be removed after 0.14.0 is tagged.
286pub const AnyWriter = Writer;
287285
288286pub const SeekableStream = @import("io/seekable_stream.zig").SeekableStream;
289287
lib/std/io/BufferedWriter.zig+8-3
......@@ -663,9 +663,14 @@ pub fn printValue(
663663 }
664664 },
665665 .error_set => {
666 if (actual_fmt.len != 0) invalidFmtError(fmt, value);
667 try bw.writeAll("error.");
668 return bw.writeAll(@errorName(value));
666 if (actual_fmt.len > 0 and actual_fmt.len[0] == 's') {
667 return bw.writeAll(@errorName(value));
668 } else if (actual_fmt.len != 0) {
669 invalidFmtError(fmt, value);
670 } else {
671 try bw.writeAll("error.");
672 return bw.writeAll(@errorName(value));
673 }
669674 },
670675 .@"enum" => |enumInfo| {
671676 try bw.writeAll(@typeName(T));
lib/std/tar.zig+4-3
......@@ -603,9 +603,10 @@ fn PaxIterator(comptime ReaderType: type) type {
603603 return null;
604604 }
605605
606 fn readUntil(self: *Self, delimiter: u8) ![]const u8 {
607 var fbs: std.io.FixedBufferStream = .{ .buffer = &self.scratch };
608 try self.reader.streamUntilDelimiter(fbs.writer(), delimiter, null);
606 fn readUntil(self: *Self, delimiter: u8) anyerror![]const u8 {
607 var fbs: std.io.BufferedWriter = undefined;
608 fbs.initFixed(&self.scratch);
609 try self.reader.streamUntilDelimiter(&fbs, delimiter, null);
609610 return fbs.getWritten();
610611 }
611612
lib/std/zig/Ast.zig+77-80
......@@ -199,27 +199,24 @@ pub fn parse(gpa: Allocator, source: [:0]const u8, mode: Mode) Allocator.Error!A
199199
200200/// `gpa` is used for allocating the resulting formatted source code.
201201/// Caller owns the returned slice of bytes, allocated with `gpa`.
202pub fn render(tree: Ast, gpa: Allocator) RenderError![]u8 {
203 var buffer = std.ArrayList(u8).init(gpa);
204 defer buffer.deinit();
202pub fn renderAlloc(tree: Ast, gpa: Allocator) RenderError![]u8 {
203 var aw: std.io.AllocatingWriter = undefined;
204 const bw = aw.init(gpa);
205 errdefer aw.deinit();
206 render(tree, gpa, bw, .{}) catch |err| return @errorCast(err); // TODO try @errorCast(...)
207 return aw.toOwnedSlice();
208}
205209
206 try tree.renderToArrayList(&buffer, .{});
207 return buffer.toOwnedSlice();
210pub fn render(tree: Ast, gpa: Allocator, bw: *std.io.BufferedWriter, fixups: Fixups) anyerror!void {
211 return @import("./render.zig").renderTree(gpa, bw, tree, fixups);
208212}
209213
210214pub const Fixups = private_render.Fixups;
211215
212pub fn renderToArrayList(tree: Ast, buffer: *std.ArrayList(u8), fixups: Fixups) RenderError!void {
213 return @import("./render.zig").renderTree(buffer, tree, fixups);
214}
215
216216/// Returns an extra offset for column and byte offset of errors that
217217/// should point after the token in the error message.
218218pub fn errorOffset(tree: Ast, parse_error: Error) u32 {
219 return if (parse_error.token_is_prev)
220 @as(u32, @intCast(tree.tokenSlice(parse_error.token).len))
221 else
222 0;
219 return if (parse_error.token_is_prev) @intCast(tree.tokenSlice(parse_error.token).len) else 0;
223220}
224221
225222pub fn tokenLocation(self: Ast, start_offset: ByteOffset, token_index: TokenIndex) Location {
......@@ -318,254 +315,254 @@ pub fn rootDecls(tree: Ast) []const Node.Index {
318315 }
319316}
320317
321pub fn renderError(tree: Ast, parse_error: Error, stream: anytype) !void {
318pub fn renderError(tree: Ast, parse_error: Error, bw: *std.io.BufferedWriter) anyerror!void {
322319 switch (parse_error.tag) {
323320 .asterisk_after_ptr_deref => {
324321 // Note that the token will point at the `.*` but ideally the source
325322 // location would point to the `*` after the `.*`.
326 return stream.writeAll("'.*' cannot be followed by '*'; are you missing a space?");
323 return bw.writeAll("'.*' cannot be followed by '*'; are you missing a space?");
327324 },
328325 .chained_comparison_operators => {
329 return stream.writeAll("comparison operators cannot be chained");
326 return bw.writeAll("comparison operators cannot be chained");
330327 },
331328 .decl_between_fields => {
332 return stream.writeAll("declarations are not allowed between container fields");
329 return bw.writeAll("declarations are not allowed between container fields");
333330 },
334331 .expected_block => {
335 return stream.print("expected block, found '{s}'", .{
332 return bw.print("expected block, found '{s}'", .{
336333 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
337334 });
338335 },
339336 .expected_block_or_assignment => {
340 return stream.print("expected block or assignment, found '{s}'", .{
337 return bw.print("expected block or assignment, found '{s}'", .{
341338 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
342339 });
343340 },
344341 .expected_block_or_expr => {
345 return stream.print("expected block or expression, found '{s}'", .{
342 return bw.print("expected block or expression, found '{s}'", .{
346343 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
347344 });
348345 },
349346 .expected_block_or_field => {
350 return stream.print("expected block or field, found '{s}'", .{
347 return bw.print("expected block or field, found '{s}'", .{
351348 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
352349 });
353350 },
354351 .expected_container_members => {
355 return stream.print("expected test, comptime, var decl, or container field, found '{s}'", .{
352 return bw.print("expected test, comptime, var decl, or container field, found '{s}'", .{
356353 tree.tokenTag(parse_error.token).symbol(),
357354 });
358355 },
359356 .expected_expr => {
360 return stream.print("expected expression, found '{s}'", .{
357 return bw.print("expected expression, found '{s}'", .{
361358 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
362359 });
363360 },
364361 .expected_expr_or_assignment => {
365 return stream.print("expected expression or assignment, found '{s}'", .{
362 return bw.print("expected expression or assignment, found '{s}'", .{
366363 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
367364 });
368365 },
369366 .expected_expr_or_var_decl => {
370 return stream.print("expected expression or var decl, found '{s}'", .{
367 return bw.print("expected expression or var decl, found '{s}'", .{
371368 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
372369 });
373370 },
374371 .expected_fn => {
375 return stream.print("expected function, found '{s}'", .{
372 return bw.print("expected function, found '{s}'", .{
376373 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
377374 });
378375 },
379376 .expected_inlinable => {
380 return stream.print("expected 'while' or 'for', found '{s}'", .{
377 return bw.print("expected 'while' or 'for', found '{s}'", .{
381378 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
382379 });
383380 },
384381 .expected_labelable => {
385 return stream.print("expected 'while', 'for', 'inline', or '{{', found '{s}'", .{
382 return bw.print("expected 'while', 'for', 'inline', or '{{', found '{s}'", .{
386383 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
387384 });
388385 },
389386 .expected_param_list => {
390 return stream.print("expected parameter list, found '{s}'", .{
387 return bw.print("expected parameter list, found '{s}'", .{
391388 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
392389 });
393390 },
394391 .expected_prefix_expr => {
395 return stream.print("expected prefix expression, found '{s}'", .{
392 return bw.print("expected prefix expression, found '{s}'", .{
396393 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
397394 });
398395 },
399396 .expected_primary_type_expr => {
400 return stream.print("expected primary type expression, found '{s}'", .{
397 return bw.print("expected primary type expression, found '{s}'", .{
401398 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
402399 });
403400 },
404401 .expected_pub_item => {
405 return stream.writeAll("expected function or variable declaration after pub");
402 return bw.writeAll("expected function or variable declaration after pub");
406403 },
407404 .expected_return_type => {
408 return stream.print("expected return type expression, found '{s}'", .{
405 return bw.print("expected return type expression, found '{s}'", .{
409406 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
410407 });
411408 },
412409 .expected_semi_or_else => {
413 return stream.writeAll("expected ';' or 'else' after statement");
410 return bw.writeAll("expected ';' or 'else' after statement");
414411 },
415412 .expected_semi_or_lbrace => {
416 return stream.writeAll("expected ';' or block after function prototype");
413 return bw.writeAll("expected ';' or block after function prototype");
417414 },
418415 .expected_statement => {
419 return stream.print("expected statement, found '{s}'", .{
416 return bw.print("expected statement, found '{s}'", .{
420417 tree.tokenTag(parse_error.token).symbol(),
421418 });
422419 },
423420 .expected_suffix_op => {
424 return stream.print("expected pointer dereference, optional unwrap, or field access, found '{s}'", .{
421 return bw.print("expected pointer dereference, optional unwrap, or field access, found '{s}'", .{
425422 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
426423 });
427424 },
428425 .expected_type_expr => {
429 return stream.print("expected type expression, found '{s}'", .{
426 return bw.print("expected type expression, found '{s}'", .{
430427 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
431428 });
432429 },
433430 .expected_var_decl => {
434 return stream.print("expected variable declaration, found '{s}'", .{
431 return bw.print("expected variable declaration, found '{s}'", .{
435432 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
436433 });
437434 },
438435 .expected_var_decl_or_fn => {
439 return stream.print("expected variable declaration or function, found '{s}'", .{
436 return bw.print("expected variable declaration or function, found '{s}'", .{
440437 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
441438 });
442439 },
443440 .expected_loop_payload => {
444 return stream.print("expected loop payload, found '{s}'", .{
441 return bw.print("expected loop payload, found '{s}'", .{
445442 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
446443 });
447444 },
448445 .expected_container => {
449 return stream.print("expected a struct, enum or union, found '{s}'", .{
446 return bw.print("expected a struct, enum or union, found '{s}'", .{
450447 tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev)).symbol(),
451448 });
452449 },
453450 .extern_fn_body => {
454 return stream.writeAll("extern functions have no body");
451 return bw.writeAll("extern functions have no body");
455452 },
456453 .extra_addrspace_qualifier => {
457 return stream.writeAll("extra addrspace qualifier");
454 return bw.writeAll("extra addrspace qualifier");
458455 },
459456 .extra_align_qualifier => {
460 return stream.writeAll("extra align qualifier");
457 return bw.writeAll("extra align qualifier");
461458 },
462459 .extra_allowzero_qualifier => {
463 return stream.writeAll("extra allowzero qualifier");
460 return bw.writeAll("extra allowzero qualifier");
464461 },
465462 .extra_const_qualifier => {
466 return stream.writeAll("extra const qualifier");
463 return bw.writeAll("extra const qualifier");
467464 },
468465 .extra_volatile_qualifier => {
469 return stream.writeAll("extra volatile qualifier");
466 return bw.writeAll("extra volatile qualifier");
470467 },
471468 .ptr_mod_on_array_child_type => {
472 return stream.print("pointer modifier '{s}' not allowed on array child type", .{
469 return bw.print("pointer modifier '{s}' not allowed on array child type", .{
473470 tree.tokenTag(parse_error.token).symbol(),
474471 });
475472 },
476473 .invalid_bit_range => {
477 return stream.writeAll("bit range not allowed on slices and arrays");
474 return bw.writeAll("bit range not allowed on slices and arrays");
478475 },
479476 .same_line_doc_comment => {
480 return stream.writeAll("same line documentation comment");
477 return bw.writeAll("same line documentation comment");
481478 },
482479 .unattached_doc_comment => {
483 return stream.writeAll("unattached documentation comment");
480 return bw.writeAll("unattached documentation comment");
484481 },
485482 .test_doc_comment => {
486 return stream.writeAll("documentation comments cannot be attached to tests");
483 return bw.writeAll("documentation comments cannot be attached to tests");
487484 },
488485 .comptime_doc_comment => {
489 return stream.writeAll("documentation comments cannot be attached to comptime blocks");
486 return bw.writeAll("documentation comments cannot be attached to comptime blocks");
490487 },
491488 .varargs_nonfinal => {
492 return stream.writeAll("function prototype has parameter after varargs");
489 return bw.writeAll("function prototype has parameter after varargs");
493490 },
494491 .expected_continue_expr => {
495 return stream.writeAll("expected ':' before while continue expression");
492 return bw.writeAll("expected ':' before while continue expression");
496493 },
497494
498495 .expected_semi_after_decl => {
499 return stream.writeAll("expected ';' after declaration");
496 return bw.writeAll("expected ';' after declaration");
500497 },
501498 .expected_semi_after_stmt => {
502 return stream.writeAll("expected ';' after statement");
499 return bw.writeAll("expected ';' after statement");
503500 },
504501 .expected_comma_after_field => {
505 return stream.writeAll("expected ',' after field");
502 return bw.writeAll("expected ',' after field");
506503 },
507504 .expected_comma_after_arg => {
508 return stream.writeAll("expected ',' after argument");
505 return bw.writeAll("expected ',' after argument");
509506 },
510507 .expected_comma_after_param => {
511 return stream.writeAll("expected ',' after parameter");
508 return bw.writeAll("expected ',' after parameter");
512509 },
513510 .expected_comma_after_initializer => {
514 return stream.writeAll("expected ',' after initializer");
511 return bw.writeAll("expected ',' after initializer");
515512 },
516513 .expected_comma_after_switch_prong => {
517 return stream.writeAll("expected ',' after switch prong");
514 return bw.writeAll("expected ',' after switch prong");
518515 },
519516 .expected_comma_after_for_operand => {
520 return stream.writeAll("expected ',' after for operand");
517 return bw.writeAll("expected ',' after for operand");
521518 },
522519 .expected_comma_after_capture => {
523 return stream.writeAll("expected ',' after for capture");
520 return bw.writeAll("expected ',' after for capture");
524521 },
525522 .expected_initializer => {
526 return stream.writeAll("expected field initializer");
523 return bw.writeAll("expected field initializer");
527524 },
528525 .mismatched_binary_op_whitespace => {
529 return stream.print("binary operator '{s}' has whitespace on one side, but not the other", .{tree.tokenTag(parse_error.token).lexeme().?});
526 return bw.print("binary operator '{s}' has whitespace on one side, but not the other", .{tree.tokenTag(parse_error.token).lexeme().?});
530527 },
531528 .invalid_ampersand_ampersand => {
532 return stream.writeAll("ambiguous use of '&&'; use 'and' for logical AND, or change whitespace to ' & &' for bitwise AND");
529 return bw.writeAll("ambiguous use of '&&'; use 'and' for logical AND, or change whitespace to ' & &' for bitwise AND");
533530 },
534531 .c_style_container => {
535 return stream.print("'{s} {s}' is invalid", .{
532 return bw.print("'{s} {s}' is invalid", .{
536533 parse_error.extra.expected_tag.symbol(), tree.tokenSlice(parse_error.token),
537534 });
538535 },
539536 .zig_style_container => {
540 return stream.print("to declare a container do 'const {s} = {s}'", .{
537 return bw.print("to declare a container do 'const {s} = {s}'", .{
541538 tree.tokenSlice(parse_error.token), parse_error.extra.expected_tag.symbol(),
542539 });
543540 },
544541 .previous_field => {
545 return stream.writeAll("field before declarations here");
542 return bw.writeAll("field before declarations here");
546543 },
547544 .next_field => {
548 return stream.writeAll("field after declarations here");
545 return bw.writeAll("field after declarations here");
549546 },
550547 .expected_var_const => {
551 return stream.writeAll("expected 'var' or 'const' before variable declaration");
548 return bw.writeAll("expected 'var' or 'const' before variable declaration");
552549 },
553550 .wrong_equal_var_decl => {
554 return stream.writeAll("variable initialized with '==' instead of '='");
551 return bw.writeAll("variable initialized with '==' instead of '='");
555552 },
556553 .var_const_decl => {
557 return stream.writeAll("use 'var' or 'const' to declare variable");
554 return bw.writeAll("use 'var' or 'const' to declare variable");
558555 },
559556 .extra_for_capture => {
560 return stream.writeAll("extra capture in for loop");
557 return bw.writeAll("extra capture in for loop");
561558 },
562559 .for_input_not_captured => {
563 return stream.writeAll("for input is not captured");
560 return bw.writeAll("for input is not captured");
564561 },
565562
566563 .invalid_byte => {
567564 const tok_slice = tree.source[tree.tokens.items(.start)[parse_error.token]..];
568 return stream.print("{s} contains invalid byte: '{'}'", .{
565 return bw.print("{s} contains invalid byte: '{'}'", .{
569566 switch (tok_slice[0]) {
570567 '\'' => "character literal",
571568 '"', '\\' => "string literal",
......@@ -580,10 +577,10 @@ pub fn renderError(tree: Ast, parse_error: Error, stream: anytype) !void {
580577 const found_tag = tree.tokenTag(parse_error.token + @intFromBool(parse_error.token_is_prev));
581578 const expected_symbol = parse_error.extra.expected_tag.symbol();
582579 switch (found_tag) {
583 .invalid => return stream.print("expected '{s}', found invalid bytes", .{
580 .invalid => return bw.print("expected '{s}', found invalid bytes", .{
584581 expected_symbol,
585582 }),
586 else => return stream.print("expected '{s}', found '{s}'", .{
583 else => return bw.print("expected '{s}', found '{s}'", .{
587584 expected_symbol, found_tag.symbol(),
588585 }),
589586 }
lib/std/zig/AstGen.zig+26-21
......@@ -11441,10 +11441,13 @@ fn parseStrLit(
1144111441 offset: u32,
1144211442) InnerError!void {
1144311443 const raw_string = bytes[offset..];
11444 var buf_managed = buf.toManaged(astgen.gpa);
11445 const result = std.zig.string_literal.parseWrite(buf_managed.writer(), raw_string);
11446 buf.* = buf_managed.moveToUnmanaged();
11447 switch (try result) {
11444 const result = r: {
11445 var aw: std.io.AllocatingWriter = undefined;
11446 const bw = aw.fromArrayList(astgen.gpa, buf);
11447 defer buf.* = aw.toArrayList();
11448 break :r std.zig.string_literal.parseWrite(bw, raw_string) catch |err| return @errorCast(err);
11449 };
11450 switch (result) {
1144811451 .success => return,
1144911452 .failure => |err| return astgen.failWithStrLitError(err, token, bytes, offset),
1145011453 }
......@@ -11493,17 +11496,18 @@ fn appendErrorNodeNotes(
1149311496 notes: []const u32,
1149411497) Allocator.Error!void {
1149511498 @branchHint(.cold);
11499 const gpa = astgen.gpa;
1149611500 const string_bytes = &astgen.string_bytes;
1149711501 const msg: Zir.NullTerminatedString = @enumFromInt(string_bytes.items.len);
11498 try string_bytes.writer(astgen.gpa).print(format ++ "\x00", args);
11502 try string_bytes.print(gpa, format ++ "\x00", args);
1149911503 const notes_index: u32 = if (notes.len != 0) blk: {
1150011504 const notes_start = astgen.extra.items.len;
11501 try astgen.extra.ensureTotalCapacity(astgen.gpa, notes_start + 1 + notes.len);
11505 try astgen.extra.ensureTotalCapacity(gpa, notes_start + 1 + notes.len);
1150211506 astgen.extra.appendAssumeCapacity(@intCast(notes.len));
1150311507 astgen.extra.appendSliceAssumeCapacity(notes);
1150411508 break :blk @intCast(notes_start);
1150511509 } else 0;
11506 try astgen.compile_errors.append(astgen.gpa, .{
11510 try astgen.compile_errors.append(gpa, .{
1150711511 .msg = msg,
1150811512 .node = node.toOptional(),
1150911513 .token = .none,
......@@ -11587,7 +11591,7 @@ fn appendErrorTokNotesOff(
1158711591 const gpa = astgen.gpa;
1158811592 const string_bytes = &astgen.string_bytes;
1158911593 const msg: Zir.NullTerminatedString = @enumFromInt(string_bytes.items.len);
11590 try string_bytes.writer(gpa).print(format ++ "\x00", args);
11594 try string_bytes.print(gpa, format ++ "\x00", args);
1159111595 const notes_index: u32 = if (notes.len != 0) blk: {
1159211596 const notes_start = astgen.extra.items.len;
1159311597 try astgen.extra.ensureTotalCapacity(gpa, notes_start + 1 + notes.len);
......@@ -11623,7 +11627,7 @@ fn errNoteTokOff(
1162311627 @branchHint(.cold);
1162411628 const string_bytes = &astgen.string_bytes;
1162511629 const msg: Zir.NullTerminatedString = @enumFromInt(string_bytes.items.len);
11626 try string_bytes.writer(astgen.gpa).print(format ++ "\x00", args);
11630 try string_bytes.print(astgen.gpa, format ++ "\x00", args);
1162711631 return astgen.addExtra(Zir.Inst.CompileErrors.Item{
1162811632 .msg = msg,
1162911633 .node = .none,
......@@ -11642,7 +11646,7 @@ fn errNoteNode(
1164211646 @branchHint(.cold);
1164311647 const string_bytes = &astgen.string_bytes;
1164411648 const msg: Zir.NullTerminatedString = @enumFromInt(string_bytes.items.len);
11645 try string_bytes.writer(astgen.gpa).print(format ++ "\x00", args);
11649 try string_bytes.print(astgen.gpa, format ++ "\x00", args);
1164611650 return astgen.addExtra(Zir.Inst.CompileErrors.Item{
1164711651 .msg = msg,
1164811652 .node = node.toOptional(),
......@@ -13888,13 +13892,14 @@ fn emitDbgStmtForceCurrentIndex(gz: *GenZir, lc: LineColumn) !void {
1388813892 } });
1388913893}
1389013894
13891fn lowerAstErrors(astgen: *AstGen) !void {
13895fn lowerAstErrors(astgen: *AstGen) error{OutOfMemory}!void {
1389213896 const gpa = astgen.gpa;
1389313897 const tree = astgen.tree;
1389413898 assert(tree.errors.len > 0);
1389513899
13896 var msg: std.ArrayListUnmanaged(u8) = .empty;
13897 defer msg.deinit(gpa);
13900 var msg: std.io.AllocatingWriter = undefined;
13901 const msg_writer = msg.init(gpa);
13902 defer msg.deinit();
1389813903
1389913904 var notes: std.ArrayListUnmanaged(u32) = .empty;
1390013905 defer notes.deinit(gpa);
......@@ -13928,20 +13933,20 @@ fn lowerAstErrors(astgen: *AstGen) !void {
1392813933 .extra = .{ .offset = bad_off },
1392913934 };
1393013935 msg.clearRetainingCapacity();
13931 try tree.renderError(err, msg.writer(gpa));
13932 return try astgen.appendErrorTokNotesOff(tok, bad_off, "{s}", .{msg.items}, notes.items);
13936 tree.renderError(err, msg_writer) catch |e| return @errorCast(e); // TODO try @errorCast(...)
13937 return try astgen.appendErrorTokNotesOff(tok, bad_off, "{s}", .{msg.getWritten()}, notes.items);
1393313938 }
1393413939
1393513940 var cur_err = tree.errors[0];
1393613941 for (tree.errors[1..]) |err| {
1393713942 if (err.is_note) {
13938 try tree.renderError(err, msg.writer(gpa));
13939 try notes.append(gpa, try astgen.errNoteTok(err.token, "{s}", .{msg.items}));
13943 tree.renderError(err, msg_writer) catch |e| return @errorCast(e); // TODO try @errorCast(...)
13944 try notes.append(gpa, try astgen.errNoteTok(err.token, "{s}", .{msg.getWritten()}));
1394013945 } else {
1394113946 // Flush error
1394213947 const extra_offset = tree.errorOffset(cur_err);
13943 try tree.renderError(cur_err, msg.writer(gpa));
13944 try astgen.appendErrorTokNotesOff(cur_err.token, extra_offset, "{s}", .{msg.items}, notes.items);
13948 tree.renderError(cur_err, msg_writer) catch |e| return @errorCast(e); // TODO try @errorCast(...)
13949 try astgen.appendErrorTokNotesOff(cur_err.token, extra_offset, "{s}", .{msg.getWritten()}, notes.items);
1394513950 notes.clearRetainingCapacity();
1394613951 cur_err = err;
1394713952
......@@ -13954,8 +13959,8 @@ fn lowerAstErrors(astgen: *AstGen) !void {
1395413959
1395513960 // Flush error
1395613961 const extra_offset = tree.errorOffset(cur_err);
13957 try tree.renderError(cur_err, msg.writer(gpa));
13958 try astgen.appendErrorTokNotesOff(cur_err.token, extra_offset, "{s}", .{msg.items}, notes.items);
13962 tree.renderError(cur_err, msg_writer) catch |e| return @errorCast(e); // TODO try @errorCast(...)
13963 try astgen.appendErrorTokNotesOff(cur_err.token, extra_offset, "{s}", .{msg.getWritten()}, notes.items);
1395913964}
1396013965
1396113966const DeclarationName = union(enum) {
lib/std/zig/ZonGen.zig+56-49
......@@ -452,37 +452,43 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator
452452 }
453453}
454454
455fn appendIdentStr(zg: *ZonGen, ident_token: Ast.TokenIndex) !u32 {
455fn appendIdentStr(zg: *ZonGen, ident_token: Ast.TokenIndex) error{ OutOfMemory, BadString }!u32 {
456 const gpa = zg.gpa;
456457 const tree = zg.tree;
457458 assert(tree.tokenTag(ident_token) == .identifier);
458459 const ident_name = tree.tokenSlice(ident_token);
459460 if (!mem.startsWith(u8, ident_name, "@")) {
460461 const start = zg.string_bytes.items.len;
461 try zg.string_bytes.appendSlice(zg.gpa, ident_name);
462 try zg.string_bytes.appendSlice(gpa, ident_name);
462463 return @intCast(start);
463 } else {
464 const offset = 1;
465 const start: u32 = @intCast(zg.string_bytes.items.len);
466 const raw_string = zg.tree.tokenSlice(ident_token)[offset..];
467 try zg.string_bytes.ensureUnusedCapacity(zg.gpa, raw_string.len);
468 switch (try std.zig.string_literal.parseWrite(zg.string_bytes.writer(zg.gpa), raw_string)) {
469 .success => {},
470 .failure => |err| {
471 try zg.lowerStrLitError(err, ident_token, raw_string, offset);
472 return error.BadString;
473 },
474 }
475
476 const slice = zg.string_bytes.items[start..];
477 if (mem.indexOfScalar(u8, slice, 0) != null) {
478 try zg.addErrorTok(ident_token, "identifier cannot contain null bytes", .{});
479 return error.BadString;
480 } else if (slice.len == 0) {
481 try zg.addErrorTok(ident_token, "identifier cannot be empty", .{});
464 }
465 const offset = 1;
466 const start: u32 = @intCast(zg.string_bytes.items.len);
467 const raw_string = zg.tree.tokenSlice(ident_token)[offset..];
468 try zg.string_bytes.ensureUnusedCapacity(gpa, raw_string.len);
469 const result = r: {
470 var aw: std.io.AllocatingWriter = undefined;
471 const bw = aw.fromArrayList(gpa, &zg.string_bytes);
472 defer zg.string_bytes = aw.toArrayList();
473 break :r std.zig.string_literal.parseWrite(bw, raw_string) catch |err| return @errorCast(err);
474 };
475 switch (result) {
476 .success => {},
477 .failure => |err| {
478 try zg.lowerStrLitError(err, ident_token, raw_string, offset);
482479 return error.BadString;
483 }
484 return start;
480 },
481 }
482
483 const slice = zg.string_bytes.items[start..];
484 if (mem.indexOfScalar(u8, slice, 0) != null) {
485 try zg.addErrorTok(ident_token, "identifier cannot contain null bytes", .{});
486 return error.BadString;
487 } else if (slice.len == 0) {
488 try zg.addErrorTok(ident_token, "identifier cannot be empty", .{});
489 return error.BadString;
485490 }
491 return start;
486492}
487493
488494/// Estimates the size of a string node without parsing it.
......@@ -513,8 +519,8 @@ pub fn strLitSizeHint(tree: Ast, node: Ast.Node.Index) usize {
513519pub fn parseStrLit(
514520 tree: Ast,
515521 node: Ast.Node.Index,
516 writer: anytype,
517) error{OutOfMemory}!std.zig.string_literal.Result {
522 writer: *std.io.BufferedWriter,
523) anyerror!std.zig.string_literal.Result {
518524 switch (tree.nodeTag(node)) {
519525 .string_literal => {
520526 const token = tree.nodeMainToken(node);
......@@ -549,15 +555,21 @@ const StringLiteralResult = union(enum) {
549555 slice: struct { start: u32, len: u32 },
550556};
551557
552fn strLitAsString(zg: *ZonGen, str_node: Ast.Node.Index) !StringLiteralResult {
558fn strLitAsString(zg: *ZonGen, str_node: Ast.Node.Index) error{ OutOfMemory, BadString }!StringLiteralResult {
553559 if (!zg.options.parse_str_lits) return .{ .slice = .{ .start = 0, .len = 0 } };
554560
555561 const gpa = zg.gpa;
556562 const string_bytes = &zg.string_bytes;
557563 const str_index: u32 = @intCast(zg.string_bytes.items.len);
558564 const size_hint = strLitSizeHint(zg.tree, str_node);
559 try string_bytes.ensureUnusedCapacity(zg.gpa, size_hint);
560 switch (try parseStrLit(zg.tree, str_node, zg.string_bytes.writer(zg.gpa))) {
565 try string_bytes.ensureUnusedCapacity(gpa, size_hint);
566 const result = r: {
567 var aw: std.io.AllocatingWriter = undefined;
568 const bw = aw.fromArrayList(gpa, &zg.string_bytes);
569 defer zg.string_bytes = aw.toArrayList();
570 break :r parseStrLit(zg.tree, str_node, bw) catch |err| return @errorCast(err);
571 };
572 switch (result) {
561573 .success => {},
562574 .failure => |err| {
563575 const token = zg.tree.nodeMainToken(str_node);
......@@ -805,10 +817,7 @@ fn lowerNumberError(zg: *ZonGen, err: std.zig.number_literal.Error, token: Ast.T
805817
806818fn errNoteNode(zg: *ZonGen, node: Ast.Node.Index, comptime format: []const u8, args: anytype) Allocator.Error!Zoir.CompileError.Note {
807819 const message_idx: u32 = @intCast(zg.string_bytes.items.len);
808 const writer = zg.string_bytes.writer(zg.gpa);
809 try writer.print(format, args);
810 try writer.writeByte(0);
811
820 try zg.string_bytes.print(zg.gpa, format ++ "\x00", args);
812821 return .{
813822 .msg = @enumFromInt(message_idx),
814823 .token = .none,
......@@ -818,10 +827,7 @@ fn errNoteNode(zg: *ZonGen, node: Ast.Node.Index, comptime format: []const u8, a
818827
819828fn errNoteTok(zg: *ZonGen, tok: Ast.TokenIndex, comptime format: []const u8, args: anytype) Allocator.Error!Zoir.CompileError.Note {
820829 const message_idx: u32 = @intCast(zg.string_bytes.items.len);
821 const writer = zg.string_bytes.writer(zg.gpa);
822 try writer.print(format, args);
823 try writer.writeByte(0);
824
830 try zg.string_bytes.print(zg.gpa, format ++ "\x00", args);
825831 return .{
826832 .msg = @enumFromInt(message_idx),
827833 .token = .fromToken(tok),
......@@ -862,9 +868,7 @@ fn addErrorInner(
862868 try zg.error_notes.appendSlice(gpa, notes);
863869
864870 const message_idx: u32 = @intCast(zg.string_bytes.items.len);
865 const writer = zg.string_bytes.writer(zg.gpa);
866 try writer.print(format, args);
867 try writer.writeByte(0);
871 try zg.string_bytes.print(gpa, format ++ "\x00", args);
868872
869873 try zg.compile_errors.append(gpa, .{
870874 .msg = @enumFromInt(message_idx),
......@@ -880,8 +884,9 @@ fn lowerAstErrors(zg: *ZonGen) Allocator.Error!void {
880884 const tree = zg.tree;
881885 assert(tree.errors.len > 0);
882886
883 var msg: std.ArrayListUnmanaged(u8) = .empty;
884 defer msg.deinit(gpa);
887 var msg: std.io.AllocatingWriter = undefined;
888 const msg_bw = msg.init(gpa);
889 defer msg.deinit();
885890
886891 var notes: std.ArrayListUnmanaged(Zoir.CompileError.Note) = .empty;
887892 defer notes.deinit(gpa);
......@@ -889,18 +894,20 @@ fn lowerAstErrors(zg: *ZonGen) Allocator.Error!void {
889894 var cur_err = tree.errors[0];
890895 for (tree.errors[1..]) |err| {
891896 if (err.is_note) {
892 try tree.renderError(err, msg.writer(gpa));
893 try notes.append(gpa, try zg.errNoteTok(err.token, "{s}", .{msg.items}));
897 tree.renderError(err, msg_bw) catch |e| return @errorCast(e); // TODO: try @errorCast(...)
898 try notes.append(gpa, try zg.errNoteTok(err.token, "{s}", .{msg.getWritten()}));
894899 } else {
895900 // Flush error
896 try tree.renderError(cur_err, msg.writer(gpa));
901 tree.renderError(cur_err, msg_bw) catch |e| return @errorCast(e); // TODO try @errorCast(...)
897902 const extra_offset = tree.errorOffset(cur_err);
898 try zg.addErrorTokNotesOff(cur_err.token, extra_offset, "{s}", .{msg.items}, notes.items);
903 try zg.addErrorTokNotesOff(cur_err.token, extra_offset, "{s}", .{msg.getWritten()}, notes.items);
899904 notes.clearRetainingCapacity();
900905 cur_err = err;
901906
902 // TODO: `Parse` currently does not have good error recovery mechanisms, so the remaining errors could be bogus.
903 // As such, we'll ignore all remaining errors for now. We should improve `Parse` so that we can report all the errors.
907 // TODO: `Parse` currently does not have good error recovery
908 // mechanisms, so the remaining errors could be bogus. As such,
909 // we'll ignore all remaining errors for now. We should improve
910 // `Parse` so that we can report all the errors.
904911 return;
905912 }
906913 msg.clearRetainingCapacity();
......@@ -908,8 +915,8 @@ fn lowerAstErrors(zg: *ZonGen) Allocator.Error!void {
908915
909916 // Flush error
910917 const extra_offset = tree.errorOffset(cur_err);
911 try tree.renderError(cur_err, msg.writer(gpa));
912 try zg.addErrorTokNotesOff(cur_err.token, extra_offset, "{s}", .{msg.items}, notes.items);
918 tree.renderError(cur_err, msg_bw) catch |e| return @errorCast(e); // TODO try @errorCast(...)
919 try zg.addErrorTokNotesOff(cur_err.token, extra_offset, "{s}", .{msg.getWritten()}, notes.items);
913920}
914921
915922const std = @import("std");
lib/std/zig/render.zig+297-291
......@@ -10,10 +10,6 @@ const primitives = std.zig.primitives;
1010const indent_delta = 4;
1111const asm_indent_delta = 2;
1212
13pub const Error = Ast.RenderError;
14
15const Ais = AutoIndentingStream(std.ArrayList(u8).Writer);
16
1713pub const Fixups = struct {
1814 /// The key is the mut token (`var`/`const`) of the variable declaration
1915 /// that should have a `_ = foo;` inserted afterwards.
......@@ -74,17 +70,17 @@ pub const Fixups = struct {
7470
7571const Render = struct {
7672 gpa: Allocator,
77 ais: *Ais,
73 ais: *AutoIndentingStream,
7874 tree: Ast,
7975 fixups: Fixups,
8076};
8177
82pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast, fixups: Fixups) Error!void {
78pub fn renderTree(gpa: Allocator, bw: *std.io.BufferedWriter, tree: Ast, fixups: Fixups) anyerror!void {
8379 assert(tree.errors.len == 0); // Cannot render an invalid tree.
84 var auto_indenting_stream = Ais.init(buffer, indent_delta);
80 var auto_indenting_stream: AutoIndentingStream = .init(bw, indent_delta);
8581 defer auto_indenting_stream.deinit();
8682 var r: Render = .{
87 .gpa = buffer.allocator,
83 .gpa = gpa,
8884 .ais = &auto_indenting_stream,
8985 .tree = tree,
9086 .fixups = fixups,
......@@ -115,7 +111,7 @@ pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast, fixups: Fixups) Error!v
115111}
116112
117113/// Render all members in the given slice, keeping empty lines where appropriate
118fn renderMembers(r: *Render, members: []const Ast.Node.Index) Error!void {
114fn renderMembers(r: *Render, members: []const Ast.Node.Index) anyerror!void {
119115 const tree = r.tree;
120116 if (members.len == 0) return;
121117 const container: Container = for (members) |member| {
......@@ -139,7 +135,7 @@ fn renderMember(
139135 container: Container,
140136 decl: Ast.Node.Index,
141137 space: Space,
142) Error!void {
138) anyerror!void {
143139 const tree = r.tree;
144140 const ais = r.ais;
145141 if (r.fixups.omit_nodes.contains(decl)) return;
......@@ -186,7 +182,7 @@ fn renderMember(
186182 if (opt_callconv_expr.unwrap()) |callconv_expr| {
187183 if (tree.nodeTag(callconv_expr) == .enum_literal) {
188184 if (mem.eql(u8, "@\"inline\"", tree.tokenSlice(tree.nodeMainToken(callconv_expr)))) {
189 try ais.writer().writeAll("inline ");
185 try ais.underlying_writer.writeAll("inline ");
190186 }
191187 }
192188 }
......@@ -200,7 +196,7 @@ fn renderMember(
200196 const lbrace = tree.nodeMainToken(body_node);
201197 try renderToken(r, lbrace, .newline);
202198 try discardAllParams(r, fn_proto);
203 try ais.writer().writeAll("@trap();");
199 try ais.writeAll("@trap();");
204200 ais.popIndent();
205201 try ais.insertNewline();
206202 try renderToken(r, tree.lastToken(body_node), space); // rbrace
......@@ -216,10 +212,9 @@ fn renderMember(
216212 const name_ident = param.name_token.?;
217213 assert(tree.tokenTag(name_ident) == .identifier);
218214 if (r.fixups.unused_var_decls.contains(name_ident)) {
219 const w = ais.writer();
220 try w.writeAll("_ = ");
221 try w.writeAll(tokenSliceForRender(r.tree, name_ident));
222 try w.writeAll(";\n");
215 try ais.writeAll("_ = ");
216 try ais.writeAll(tokenSliceForRender(r.tree, name_ident));
217 try ais.writeAll(";\n");
223218 }
224219 }
225220 var statements_buf: [2]Ast.Node.Index = undefined;
......@@ -310,7 +305,7 @@ fn renderMember(
310305}
311306
312307/// Render all expressions in the slice, keeping empty lines where appropriate
313fn renderExpressions(r: *Render, expressions: []const Ast.Node.Index, space: Space) Error!void {
308fn renderExpressions(r: *Render, expressions: []const Ast.Node.Index, space: Space) anyerror!void {
314309 if (expressions.len == 0) return;
315310 try renderExpression(r, expressions[0], space);
316311 for (expressions[1..]) |expression| {
......@@ -319,11 +314,11 @@ fn renderExpressions(r: *Render, expressions: []const Ast.Node.Index, space: Spa
319314 }
320315}
321316
322fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
317fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) anyerror!void {
323318 const tree = r.tree;
324319 const ais = r.ais;
325320 if (r.fixups.replace_nodes_with_string.get(node)) |replacement| {
326 try ais.writer().writeAll(replacement);
321 try ais.writeAll(replacement);
327322 try renderOnlySpace(r, space);
328323 return;
329324 } else if (r.fixups.replace_nodes_with_node.get(node)) |replacement| {
......@@ -891,11 +886,11 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
891886
892887/// Same as `renderExpression`, but afterwards looks for any
893888/// append_string_after_node fixups to apply
894fn renderExpressionFixup(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
889fn renderExpressionFixup(r: *Render, node: Ast.Node.Index, space: Space) anyerror!void {
895890 const ais = r.ais;
896891 try renderExpression(r, node, space);
897892 if (r.fixups.append_string_after_node.get(node)) |bytes| {
898 try ais.writer().writeAll(bytes);
893 try ais.writeAll(bytes);
899894 }
900895}
901896
......@@ -903,7 +898,7 @@ fn renderArrayType(
903898 r: *Render,
904899 array_type: Ast.full.ArrayType,
905900 space: Space,
906) Error!void {
901) anyerror!void {
907902 const tree = r.tree;
908903 const ais = r.ais;
909904 const rbracket = tree.firstToken(array_type.ast.elem_type) - 1;
......@@ -921,7 +916,7 @@ fn renderArrayType(
921916 return renderExpression(r, array_type.ast.elem_type, space);
922917}
923918
924fn renderPtrType(r: *Render, ptr_type: Ast.full.PtrType, space: Space) Error!void {
919fn renderPtrType(r: *Render, ptr_type: Ast.full.PtrType, space: Space) anyerror!void {
925920 const tree = r.tree;
926921 const main_token = ptr_type.ast.main_token;
927922 switch (ptr_type.size) {
......@@ -1015,7 +1010,7 @@ fn renderSlice(
10151010 slice_node: Ast.Node.Index,
10161011 slice: Ast.full.Slice,
10171012 space: Space,
1018) Error!void {
1013) anyerror!void {
10191014 const tree = r.tree;
10201015 const after_start_space_bool = nodeCausesSliceOpSpace(tree.nodeTag(slice.ast.start)) or
10211016 if (slice.ast.end.unwrap()) |end| nodeCausesSliceOpSpace(tree.nodeTag(end)) else false;
......@@ -1048,7 +1043,7 @@ fn renderAsmOutput(
10481043 r: *Render,
10491044 asm_output: Ast.Node.Index,
10501045 space: Space,
1051) Error!void {
1046) anyerror!void {
10521047 const tree = r.tree;
10531048 assert(tree.nodeTag(asm_output) == .asm_output);
10541049 const symbolic_name = tree.nodeMainToken(asm_output);
......@@ -1074,7 +1069,7 @@ fn renderAsmInput(
10741069 r: *Render,
10751070 asm_input: Ast.Node.Index,
10761071 space: Space,
1077) Error!void {
1072) anyerror!void {
10781073 const tree = r.tree;
10791074 assert(tree.nodeTag(asm_input) == .asm_input);
10801075 const symbolic_name = tree.nodeMainToken(asm_input);
......@@ -1096,14 +1091,14 @@ fn renderVarDecl(
10961091 ignore_comptime_token: bool,
10971092 /// `comma_space` and `space` are used for destructure LHS decls.
10981093 space: Space,
1099) Error!void {
1094) anyerror!void {
11001095 try renderVarDeclWithoutFixups(r, var_decl, ignore_comptime_token, space);
11011096 if (r.fixups.unused_var_decls.contains(var_decl.ast.mut_token + 1)) {
11021097 // Discard the variable like this: `_ = foo;`
1103 const w = r.ais.writer();
1104 try w.writeAll("_ = ");
1105 try w.writeAll(tokenSliceForRender(r.tree, var_decl.ast.mut_token + 1));
1106 try w.writeAll(";\n");
1098 const ais = r.ais;
1099 try ais.writeAll("_ = ");
1100 try ais.writeAll(tokenSliceForRender(r.tree, var_decl.ast.mut_token + 1));
1101 try ais.writeAll(";\n");
11071102 }
11081103}
11091104
......@@ -1114,7 +1109,7 @@ fn renderVarDeclWithoutFixups(
11141109 ignore_comptime_token: bool,
11151110 /// `comma_space` and `space` are used for destructure LHS decls.
11161111 space: Space,
1117) Error!void {
1112) anyerror!void {
11181113 const tree = r.tree;
11191114 const ais = r.ais;
11201115
......@@ -1226,7 +1221,7 @@ fn renderVarDeclWithoutFixups(
12261221 ais.popIndent();
12271222}
12281223
1229fn renderIf(r: *Render, if_node: Ast.full.If, space: Space) Error!void {
1224fn renderIf(r: *Render, if_node: Ast.full.If, space: Space) anyerror!void {
12301225 return renderWhile(r, .{
12311226 .ast = .{
12321227 .while_token = if_node.ast.if_token,
......@@ -1245,7 +1240,7 @@ fn renderIf(r: *Render, if_node: Ast.full.If, space: Space) Error!void {
12451240
12461241/// Note that this function is additionally used to render if expressions, with
12471242/// respective values set to null.
1248fn renderWhile(r: *Render, while_node: Ast.full.While, space: Space) Error!void {
1243fn renderWhile(r: *Render, while_node: Ast.full.While, space: Space) anyerror!void {
12491244 const tree = r.tree;
12501245
12511246 if (while_node.label_token) |label| {
......@@ -1315,7 +1310,7 @@ fn renderThenElse(
13151310 maybe_error_token: ?Ast.TokenIndex,
13161311 opt_else_expr: Ast.Node.OptionalIndex,
13171312 space: Space,
1318) Error!void {
1313) anyerror!void {
13191314 const tree = r.tree;
13201315 const ais = r.ais;
13211316 const then_expr_is_block = nodeIsBlock(tree.nodeTag(then_expr));
......@@ -1370,7 +1365,7 @@ fn renderThenElse(
13701365 }
13711366}
13721367
1373fn renderFor(r: *Render, for_node: Ast.full.For, space: Space) Error!void {
1368fn renderFor(r: *Render, for_node: Ast.full.For, space: Space) anyerror!void {
13741369 const tree = r.tree;
13751370 const ais = r.ais;
13761371 const token_tags = tree.tokens.items(.tag);
......@@ -1445,7 +1440,7 @@ fn renderContainerField(
14451440 container: Container,
14461441 field_param: Ast.full.ContainerField,
14471442 space: Space,
1448) Error!void {
1443) anyerror!void {
14491444 const tree = r.tree;
14501445 const ais = r.ais;
14511446 var field = field_param;
......@@ -1554,7 +1549,7 @@ fn renderBuiltinCall(
15541549 builtin_token: Ast.TokenIndex,
15551550 params: []const Ast.Node.Index,
15561551 space: Space,
1557) Error!void {
1552) anyerror!void {
15581553 const tree = r.tree;
15591554 const ais = r.ais;
15601555
......@@ -1581,7 +1576,7 @@ fn renderBuiltinCall(
15811576 defer r.gpa.free(new_string);
15821577
15831578 try renderToken(r, builtin_token + 1, .none); // (
1584 try ais.writer().print("\"{}\"", .{std.zig.fmtEscapes(new_string)});
1579 try ais.print("\"{}\"", .{std.zig.fmtEscapes(new_string)});
15851580 return renderToken(r, str_lit_token + 1, space); // )
15861581 }
15871582 }
......@@ -1627,7 +1622,7 @@ fn renderBuiltinCall(
16271622 }
16281623}
16291624
1630fn renderFnProto(r: *Render, fn_proto: Ast.full.FnProto, space: Space) Error!void {
1625fn renderFnProto(r: *Render, fn_proto: Ast.full.FnProto, space: Space) anyerror!void {
16311626 const tree = r.tree;
16321627 const ais = r.ais;
16331628
......@@ -1852,7 +1847,7 @@ fn renderSwitchCase(
18521847 r: *Render,
18531848 switch_case: Ast.full.SwitchCase,
18541849 space: Space,
1855) Error!void {
1850) anyerror!void {
18561851 const ais = r.ais;
18571852 const tree = r.tree;
18581853 const trailing_comma = tree.tokenTag(switch_case.ast.arrow_token - 1) == .comma;
......@@ -1914,7 +1909,7 @@ fn renderBlock(
19141909 block_node: Ast.Node.Index,
19151910 statements: []const Ast.Node.Index,
19161911 space: Space,
1917) Error!void {
1912) anyerror!void {
19181913 const tree = r.tree;
19191914 const ais = r.ais;
19201915 const lbrace = tree.nodeMainToken(block_node);
......@@ -1939,7 +1934,7 @@ fn finishRenderBlock(
19391934 block_node: Ast.Node.Index,
19401935 statements: []const Ast.Node.Index,
19411936 space: Space,
1942) Error!void {
1937) anyerror!void {
19431938 const tree = r.tree;
19441939 const ais = r.ais;
19451940 for (statements, 0..) |stmt, i| {
......@@ -1967,7 +1962,7 @@ fn renderStructInit(
19671962 struct_node: Ast.Node.Index,
19681963 struct_init: Ast.full.StructInit,
19691964 space: Space,
1970) Error!void {
1965) anyerror!void {
19711966 const tree = r.tree;
19721967 const ais = r.ais;
19731968
......@@ -2038,7 +2033,7 @@ fn renderArrayInit(
20382033 r: *Render,
20392034 array_init: Ast.full.ArrayInit,
20402035 space: Space,
2041) Error!void {
2036) anyerror!void {
20422037 const tree = r.tree;
20432038 const ais = r.ais;
20442039 const gpa = r.gpa;
......@@ -2139,13 +2134,14 @@ fn renderArrayInit(
21392134
21402135 const section_exprs = row_exprs[0..section_end];
21412136
2142 var sub_expr_buffer = std.ArrayList(u8).init(gpa);
2137 var sub_expr_buffer: std.io.AllocatingWriter = undefined;
2138 const sub_expr_buffer_writer = sub_expr_buffer.init(gpa);
21432139 defer sub_expr_buffer.deinit();
21442140
21452141 const sub_expr_buffer_starts = try gpa.alloc(usize, section_exprs.len + 1);
21462142 defer gpa.free(sub_expr_buffer_starts);
21472143
2148 var auto_indenting_stream = Ais.init(&sub_expr_buffer, indent_delta);
2144 var auto_indenting_stream: AutoIndentingStream = .init(sub_expr_buffer_writer, indent_delta);
21492145 defer auto_indenting_stream.deinit();
21502146 var sub_render: Render = .{
21512147 .gpa = r.gpa,
......@@ -2159,13 +2155,13 @@ fn renderArrayInit(
21592155 var single_line = true;
21602156 var contains_newline = false;
21612157 for (section_exprs, 0..) |expr, i| {
2162 const start = sub_expr_buffer.items.len;
2158 const start = sub_expr_buffer.getWritten().len;
21632159 sub_expr_buffer_starts[i] = start;
21642160
21652161 if (i + 1 < section_exprs.len) {
21662162 try renderExpression(&sub_render, expr, .none);
2167 const width = sub_expr_buffer.items.len - start;
2168 const this_contains_newline = mem.indexOfScalar(u8, sub_expr_buffer.items[start..], '\n') != null;
2163 const width = sub_expr_buffer.getWritten().len - start;
2164 const this_contains_newline = mem.indexOfScalar(u8, sub_expr_buffer.getWritten()[start..], '\n') != null;
21692165 contains_newline = contains_newline or this_contains_newline;
21702166 expr_widths[i] = width;
21712167 expr_newlines[i] = this_contains_newline;
......@@ -2188,7 +2184,7 @@ fn renderArrayInit(
21882184 ais.popSpace();
21892185
21902186 const width = sub_expr_buffer.items.len - start - 2;
2191 const this_contains_newline = mem.indexOfScalar(u8, sub_expr_buffer.items[start .. sub_expr_buffer.items.len - 1], '\n') != null;
2187 const this_contains_newline = mem.indexOfScalar(u8, sub_expr_buffer.getWritten()[start .. sub_expr_buffer.items.len - 1], '\n') != null;
21922188 contains_newline = contains_newline or this_contains_newline;
21932189 expr_widths[i] = width;
21942190 expr_newlines[i] = contains_newline;
......@@ -2199,20 +2195,20 @@ fn renderArrayInit(
21992195 }
22002196 }
22012197 }
2202 sub_expr_buffer_starts[section_exprs.len] = sub_expr_buffer.items.len;
2198 sub_expr_buffer_starts[section_exprs.len] = sub_expr_buffer.getWritten().len;
22032199
22042200 // Render exprs in current section.
22052201 column_counter = 0;
22062202 for (section_exprs, 0..) |expr, i| {
22072203 const start = sub_expr_buffer_starts[i];
22082204 const end = sub_expr_buffer_starts[i + 1];
2209 const expr_text = sub_expr_buffer.items[start..end];
2205 const expr_text = sub_expr_buffer.getWritten()[start..end];
22102206 if (!expr_newlines[i]) {
2211 try ais.writer().writeAll(expr_text);
2207 try ais.writeAll(expr_text);
22122208 } else {
22132209 var by_line = std.mem.splitScalar(u8, expr_text, '\n');
22142210 var last_line_was_empty = false;
2215 try ais.writer().writeAll(by_line.first());
2211 try ais.writeAll(by_line.first());
22162212 while (by_line.next()) |line| {
22172213 if (std.mem.startsWith(u8, line, "//") and last_line_was_empty) {
22182214 try ais.insertNewline();
......@@ -2220,7 +2216,7 @@ fn renderArrayInit(
22202216 try ais.maybeInsertNewline();
22212217 }
22222218 last_line_was_empty = (line.len == 0);
2223 try ais.writer().writeAll(line);
2219 try ais.writeAll(line);
22242220 }
22252221 }
22262222
......@@ -2234,7 +2230,7 @@ fn renderArrayInit(
22342230 try renderToken(r, comma, .space); // ,
22352231 assert(column_widths[column_counter % row_size] >= expr_widths[i]);
22362232 const padding = column_widths[column_counter % row_size] - expr_widths[i];
2237 try ais.writer().writeByteNTimes(' ', padding);
2233 try ais.splatByteAll(' ', padding);
22382234
22392235 column_counter += 1;
22402236 continue;
......@@ -2265,7 +2261,7 @@ fn renderContainerDecl(
22652261 container_decl_node: Ast.Node.Index,
22662262 container_decl: Ast.full.ContainerDecl,
22672263 space: Space,
2268) Error!void {
2264) anyerror!void {
22692265 const tree = r.tree;
22702266 const ais = r.ais;
22712267
......@@ -2384,7 +2380,7 @@ fn renderAsm(
23842380 r: *Render,
23852381 asm_node: Ast.full.Asm,
23862382 space: Space,
2387) Error!void {
2383) anyerror!void {
23882384 const tree = r.tree;
23892385 const ais = r.ais;
23902386
......@@ -2550,7 +2546,7 @@ fn renderCall(
25502546 r: *Render,
25512547 call: Ast.full.Call,
25522548 space: Space,
2553) Error!void {
2549) anyerror!void {
25542550 if (call.async_token) |async_token| {
25552551 try renderToken(r, async_token, .space);
25562552 }
......@@ -2563,7 +2559,7 @@ fn renderParamList(
25632559 lparen: Ast.TokenIndex,
25642560 params: []const Ast.Node.Index,
25652561 space: Space,
2566) Error!void {
2562) anyerror!void {
25672563 const tree = r.tree;
25682564 const ais = r.ais;
25692565
......@@ -2616,7 +2612,7 @@ fn renderParamList(
26162612
26172613/// Render an expression, and the comma that follows it, if it is present in the source.
26182614/// If a comma is present, and `space` is `Space.comma`, render only a single comma.
2619fn renderExpressionComma(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
2615fn renderExpressionComma(r: *Render, node: Ast.Node.Index, space: Space) anyerror!void {
26202616 const tree = r.tree;
26212617 const maybe_comma = tree.lastToken(node) + 1;
26222618 if (tree.tokenTag(maybe_comma) == .comma and space != .comma) {
......@@ -2629,7 +2625,7 @@ fn renderExpressionComma(r: *Render, node: Ast.Node.Index, space: Space) Error!v
26292625
26302626/// Render a token, and the comma that follows it, if it is present in the source.
26312627/// If a comma is present, and `space` is `Space.comma`, render only a single comma.
2632fn renderTokenComma(r: *Render, token: Ast.TokenIndex, space: Space) Error!void {
2628fn renderTokenComma(r: *Render, token: Ast.TokenIndex, space: Space) anyerror!void {
26332629 const tree = r.tree;
26342630 const maybe_comma = token + 1;
26352631 if (tree.tokenTag(maybe_comma) == .comma and space != .comma) {
......@@ -2642,7 +2638,7 @@ fn renderTokenComma(r: *Render, token: Ast.TokenIndex, space: Space) Error!void
26422638
26432639/// Render an identifier, and the comma that follows it, if it is present in the source.
26442640/// If a comma is present, and `space` is `Space.comma`, render only a single comma.
2645fn renderIdentifierComma(r: *Render, token: Ast.TokenIndex, space: Space, quote: QuoteBehavior) Error!void {
2641fn renderIdentifierComma(r: *Render, token: Ast.TokenIndex, space: Space, quote: QuoteBehavior) anyerror!void {
26462642 const tree = r.tree;
26472643 const maybe_comma = token + 1;
26482644 if (tree.tokenTag(maybe_comma) == .comma and space != .comma) {
......@@ -2674,15 +2670,15 @@ const Space = enum {
26742670 skip,
26752671};
26762672
2677fn renderToken(r: *Render, token_index: Ast.TokenIndex, space: Space) Error!void {
2673fn renderToken(r: *Render, token_index: Ast.TokenIndex, space: Space) anyerror!void {
26782674 const tree = r.tree;
26792675 const ais = r.ais;
26802676 const lexeme = tokenSliceForRender(tree, token_index);
2681 try ais.writer().writeAll(lexeme);
2677 try ais.writeAll(lexeme);
26822678 try renderSpace(r, token_index, lexeme.len, space);
26832679}
26842680
2685fn renderTokenOverrideSpaceMode(r: *Render, token_index: Ast.TokenIndex, space: Space, override_space: Space) Error!void {
2681fn renderTokenOverrideSpaceMode(r: *Render, token_index: Ast.TokenIndex, space: Space, override_space: Space) anyerror!void {
26862682 const tree = r.tree;
26872683 const ais = r.ais;
26882684 const lexeme = tokenSliceForRender(tree, token_index);
......@@ -2692,7 +2688,7 @@ fn renderTokenOverrideSpaceMode(r: *Render, token_index: Ast.TokenIndex, space:
26922688 try renderSpace(r, token_index, lexeme.len, space);
26932689}
26942690
2695fn renderSpace(r: *Render, token_index: Ast.TokenIndex, lexeme_len: usize, space: Space) Error!void {
2691fn renderSpace(r: *Render, token_index: Ast.TokenIndex, lexeme_len: usize, space: Space) anyerror!void {
26962692 const tree = r.tree;
26972693 const ais = r.ais;
26982694
......@@ -2701,7 +2697,7 @@ fn renderSpace(r: *Render, token_index: Ast.TokenIndex, lexeme_len: usize, space
27012697 if (space == .skip) return;
27022698
27032699 if (space == .comma and next_token_tag != .comma) {
2704 try ais.writer().writeByte(',');
2700 try ais.underlying_writer.writeByte(',');
27052701 }
27062702 if (space == .semicolon or space == .comma) ais.enableSpaceMode(space);
27072703 defer ais.disableSpaceMode();
......@@ -2712,7 +2708,7 @@ fn renderSpace(r: *Render, token_index: Ast.TokenIndex, lexeme_len: usize, space
27122708 );
27132709 switch (space) {
27142710 .none => {},
2715 .space => if (!comment) try ais.writer().writeByte(' '),
2711 .space => if (!comment) try ais.writeByte(' '),
27162712 .newline => if (!comment) try ais.insertNewline(),
27172713
27182714 .comma => if (next_token_tag == .comma) {
......@@ -2724,7 +2720,7 @@ fn renderSpace(r: *Render, token_index: Ast.TokenIndex, lexeme_len: usize, space
27242720 .comma_space => if (next_token_tag == .comma) {
27252721 try renderToken(r, token_index + 1, .space);
27262722 } else if (!comment) {
2727 try ais.writer().writeByte(' ');
2723 try ais.writeByte(' ');
27282724 },
27292725
27302726 .semicolon => if (next_token_tag == .semicolon) {
......@@ -2737,15 +2733,15 @@ fn renderSpace(r: *Render, token_index: Ast.TokenIndex, lexeme_len: usize, space
27372733 }
27382734}
27392735
2740fn renderOnlySpace(r: *Render, space: Space) Error!void {
2736fn renderOnlySpace(r: *Render, space: Space) anyerror!void {
27412737 const ais = r.ais;
27422738 switch (space) {
27432739 .none => {},
2744 .space => try ais.writer().writeByte(' '),
2740 .space => try ais.writeByte(' '),
27452741 .newline => try ais.insertNewline(),
2746 .comma => try ais.writer().writeAll(",\n"),
2747 .comma_space => try ais.writer().writeAll(", "),
2748 .semicolon => try ais.writer().writeAll(";\n"),
2742 .comma => try ais.writeAll(",\n"),
2743 .comma_space => try ais.writeAll(", "),
2744 .semicolon => try ais.writeAll(";\n"),
27492745 .skip => unreachable,
27502746 }
27512747}
......@@ -2756,13 +2752,13 @@ const QuoteBehavior = enum {
27562752 eagerly_unquote_except_underscore,
27572753};
27582754
2759fn renderIdentifier(r: *Render, token_index: Ast.TokenIndex, space: Space, quote: QuoteBehavior) Error!void {
2755fn renderIdentifier(r: *Render, token_index: Ast.TokenIndex, space: Space, quote: QuoteBehavior) anyerror!void {
27602756 const tree = r.tree;
27612757 assert(tree.tokenTag(token_index) == .identifier);
27622758 const lexeme = tokenSliceForRender(tree, token_index);
27632759
27642760 if (r.fixups.rename_identifiers.get(lexeme)) |mangled| {
2765 try r.ais.writer().writeAll(mangled);
2761 try r.ais.writeAll(mangled);
27662762 try renderSpace(r, token_index, lexeme.len, space);
27672763 return;
27682764 }
......@@ -2871,15 +2867,15 @@ fn renderQuotedIdentifier(r: *Render, token_index: Ast.TokenIndex, space: Space,
28712867 const lexeme = tokenSliceForRender(tree, token_index);
28722868 assert(lexeme.len >= 3 and lexeme[0] == '@');
28732869
2874 if (!unquote) try ais.writer().writeAll("@\"");
2870 if (!unquote) try ais.writeAll("@\"");
28752871 const contents = lexeme[2 .. lexeme.len - 1];
2876 try renderIdentifierContents(ais.writer(), contents);
2877 if (!unquote) try ais.writer().writeByte('\"');
2872 try renderIdentifierContents(ais, contents);
2873 if (!unquote) try ais.writeByte('\"');
28782874
28792875 try renderSpace(r, token_index, lexeme.len, space);
28802876}
28812877
2882fn renderIdentifierContents(writer: anytype, bytes: []const u8) !void {
2878fn renderIdentifierContents(ais: *AutoIndentingStream, bytes: []const u8) !void {
28832879 var pos: usize = 0;
28842880 while (pos < bytes.len) {
28852881 const byte = bytes[pos];
......@@ -2892,23 +2888,23 @@ fn renderIdentifierContents(writer: anytype, bytes: []const u8) !void {
28922888 .success => |codepoint| {
28932889 if (codepoint <= 0x7f) {
28942890 const buf = [1]u8{@as(u8, @intCast(codepoint))};
2895 try std.fmt.format(writer, "{}", .{std.zig.fmtEscapes(&buf)});
2891 try ais.print("{}", .{std.zig.fmtEscapes(&buf)});
28962892 } else {
2897 try writer.writeAll(escape_sequence);
2893 try ais.writeAll(escape_sequence);
28982894 }
28992895 },
29002896 .failure => {
2901 try writer.writeAll(escape_sequence);
2897 try ais.writeAll(escape_sequence);
29022898 },
29032899 }
29042900 },
29052901 0x00...('\\' - 1), ('\\' + 1)...0x7f => {
29062902 const buf = [1]u8{byte};
2907 try std.fmt.format(writer, "{}", .{std.zig.fmtEscapes(&buf)});
2903 try ais.print("{}", .{std.zig.fmtEscapes(&buf)});
29082904 pos += 1;
29092905 },
29102906 0x80...0xff => {
2911 try writer.writeByte(byte);
2907 try ais.writeByte(byte);
29122908 pos += 1;
29132909 },
29142910 }
......@@ -2942,7 +2938,7 @@ fn hasMultilineString(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.Tok
29422938
29432939/// Assumes that start is the first byte past the previous token and
29442940/// that end is the last byte before the next token.
2945fn renderComments(r: *Render, start: usize, end: usize) Error!bool {
2941fn renderComments(r: *Render, start: usize, end: usize) anyerror!bool {
29462942 const tree = r.tree;
29472943 const ais = r.ais;
29482944
......@@ -2970,7 +2966,7 @@ fn renderComments(r: *Render, start: usize, end: usize) Error!bool {
29702966 } else if (index == start) {
29712967 // Otherwise if the first comment is on the same line as
29722968 // the token before it, prefix it with a single space.
2973 try ais.writer().writeByte(' ');
2969 try ais.writeByte(' ');
29742970 }
29752971 }
29762972
......@@ -2987,11 +2983,11 @@ fn renderComments(r: *Render, start: usize, end: usize) Error!bool {
29872983 ais.disabled_offset = null;
29882984 } else if (ais.disabled_offset == null and mem.eql(u8, comment_content, "zig fmt: off")) {
29892985 // Write with the canonical single space.
2990 try ais.writer().writeAll("// zig fmt: off\n");
2986 try ais.writeAll("// zig fmt: off\n");
29912987 ais.disabled_offset = index;
29922988 } else {
29932989 // Write the comment minus trailing whitespace.
2994 try ais.writer().print("{s}\n", .{trimmed_comment});
2990 try ais.print("{s}\n", .{trimmed_comment});
29952991 }
29962992 }
29972993
......@@ -3005,12 +3001,12 @@ fn renderComments(r: *Render, start: usize, end: usize) Error!bool {
30053001 return index != start;
30063002}
30073003
3008fn renderExtraNewline(r: *Render, node: Ast.Node.Index) Error!void {
3004fn renderExtraNewline(r: *Render, node: Ast.Node.Index) anyerror!void {
30093005 return renderExtraNewlineToken(r, r.tree.firstToken(node));
30103006}
30113007
30123008/// Check if there is an empty line immediately before the given token. If so, render it.
3013fn renderExtraNewlineToken(r: *Render, token_index: Ast.TokenIndex) Error!void {
3009fn renderExtraNewlineToken(r: *Render, token_index: Ast.TokenIndex) anyerror!void {
30143010 const tree = r.tree;
30153011 const ais = r.ais;
30163012 const token_start = tree.tokenStart(token_index);
......@@ -3038,7 +3034,7 @@ fn renderExtraNewlineToken(r: *Render, token_index: Ast.TokenIndex) Error!void {
30383034
30393035/// end_token is the token one past the last doc comment token. This function
30403036/// searches backwards from there.
3041fn renderDocComments(r: *Render, end_token: Ast.TokenIndex) Error!void {
3037fn renderDocComments(r: *Render, end_token: Ast.TokenIndex) anyerror!void {
30423038 const tree = r.tree;
30433039 // Search backwards for the first doc comment.
30443040 if (end_token == 0) return;
......@@ -3069,7 +3065,7 @@ fn renderDocComments(r: *Render, end_token: Ast.TokenIndex) Error!void {
30693065}
30703066
30713067/// start_token is first container doc comment token.
3072fn renderContainerDocComments(r: *Render, start_token: Ast.TokenIndex) Error!void {
3068fn renderContainerDocComments(r: *Render, start_token: Ast.TokenIndex) anyerror!void {
30733069 const tree = r.tree;
30743070 var tok = start_token;
30753071 while (tree.tokenTag(tok) == .container_doc_comment) : (tok += 1) {
......@@ -3083,7 +3079,7 @@ fn renderContainerDocComments(r: *Render, start_token: Ast.TokenIndex) Error!voi
30833079 }
30843080}
30853081
3086fn discardAllParams(r: *Render, fn_proto_node: Ast.Node.Index) Error!void {
3082fn discardAllParams(r: *Render, fn_proto_node: Ast.Node.Index) anyerror!void {
30873083 const tree = &r.tree;
30883084 const ais = r.ais;
30893085 var buf: [1]Ast.Node.Index = undefined;
......@@ -3092,10 +3088,9 @@ fn discardAllParams(r: *Render, fn_proto_node: Ast.Node.Index) Error!void {
30923088 while (it.next()) |param| {
30933089 const name_ident = param.name_token.?;
30943090 assert(tree.tokenTag(name_ident) == .identifier);
3095 const w = ais.writer();
3096 try w.writeAll("_ = ");
3097 try w.writeAll(tokenSliceForRender(r.tree, name_ident));
3098 try w.writeAll(";\n");
3091 try ais.writeAll("_ = ");
3092 try ais.writeAll(tokenSliceForRender(r.tree, name_ident));
3093 try ais.writeAll(";\n");
30993094 }
31003095}
31013096
......@@ -3132,11 +3127,11 @@ fn anythingBetween(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.TokenI
31323127 return false;
31333128}
31343129
3135fn writeFixingWhitespace(writer: std.ArrayList(u8).Writer, slice: []const u8) Error!void {
3130fn writeFixingWhitespace(bw: *std.io.BufferedWriter, slice: []const u8) anyerror!void {
31363131 for (slice) |byte| switch (byte) {
3137 '\t' => try writer.writeAll(" " ** indent_delta),
3132 '\t' => try bw.splatByteAll(' ', indent_delta),
31383133 '\r' => {},
3139 else => try writer.writeByte(byte),
3134 else => try bw.writeByte(byte),
31403135 };
31413136}
31423137
......@@ -3261,224 +3256,235 @@ fn rowSize(tree: Ast, exprs: []const Ast.Node.Index, rtoken: Ast.TokenIndex) usi
32613256/// of the appropriate indentation level for them with pushSpace/popSpace.
32623257/// This should be done whenever a scope that ends in a .semicolon or a
32633258/// .comma is introduced.
3264fn AutoIndentingStream(comptime UnderlyingWriter: type) type {
3265 return struct {
3266 const Self = @This();
3267 pub const WriteError = UnderlyingWriter.Error;
3268 pub const Writer = std.io.Writer(*Self, WriteError, write);
3269
3270 pub const IndentType = enum {
3271 normal,
3272 after_equals,
3273 binop,
3274 field_access,
3275 };
3276 const StackElem = struct {
3277 indent_type: IndentType,
3278 realized: bool,
3279 };
3280 const SpaceElem = struct {
3281 space: Space,
3282 indent_count: usize,
3259const AutoIndentingStream = struct {
3260 underlying_writer: *std.io.BufferedWriter,
3261
3262 indent_count: usize = 0,
3263 indent_delta: usize,
3264 indent_stack: std.ArrayList(StackElem),
3265 space_stack: std.ArrayList(SpaceElem),
3266 space_mode: ?usize = null,
3267 disable_indent_committing: usize = 0,
3268 current_line_empty: bool = true,
3269 /// the most recently applied indent
3270 applied_indent: usize = 0,
3271
3272 pub const IndentType = enum {
3273 normal,
3274 after_equals,
3275 binop,
3276 field_access,
3277 };
3278 const StackElem = struct {
3279 indent_type: IndentType,
3280 realized: bool,
3281 };
3282 const SpaceElem = struct {
3283 space: Space,
3284 indent_count: usize,
3285 };
3286
3287 pub fn init(buffer: *std.ArrayList(u8), indent_delta_: usize) AutoIndentingStream {
3288 return .{
3289 .underlying_writer = buffer.writer(),
3290 .indent_delta = indent_delta_,
3291 .indent_stack = std.ArrayList(StackElem).init(buffer.allocator),
3292 .space_stack = std.ArrayList(SpaceElem).init(buffer.allocator),
32833293 };
3294 }
32843295
3285 underlying_writer: UnderlyingWriter,
3286
3287 /// Offset into the source at which formatting has been disabled with
3288 /// a `zig fmt: off` comment.
3289 ///
3290 /// If non-null, the AutoIndentingStream will not write any bytes
3291 /// to the underlying writer. It will however continue to track the
3292 /// indentation level.
3293 disabled_offset: ?usize = null,
3294
3295 indent_count: usize = 0,
3296 indent_delta: usize,
3297 indent_stack: std.ArrayList(StackElem),
3298 space_stack: std.ArrayList(SpaceElem),
3299 space_mode: ?usize = null,
3300 disable_indent_committing: usize = 0,
3301 current_line_empty: bool = true,
3302 /// the most recently applied indent
3303 applied_indent: usize = 0,
3304
3305 pub fn init(buffer: *std.ArrayList(u8), indent_delta_: usize) Self {
3306 return .{
3307 .underlying_writer = buffer.writer(),
3308 .indent_delta = indent_delta_,
3309 .indent_stack = std.ArrayList(StackElem).init(buffer.allocator),
3310 .space_stack = std.ArrayList(SpaceElem).init(buffer.allocator),
3311 };
3312 }
3296 pub fn deinit(self: *AutoIndentingStream) void {
3297 self.indent_stack.deinit();
3298 self.space_stack.deinit();
3299 }
33133300
3314 pub fn deinit(self: *Self) void {
3315 self.indent_stack.deinit();
3316 self.space_stack.deinit();
3317 }
3301 pub fn writeAll(ais: *AutoIndentingStream, bytes: []const u8) anyerror!void {
3302 if (bytes.len == 0) return;
3303 try ais.applyIndent();
3304 if (ais.disabled_offset == null) try ais.underlying_writer.writeAll(bytes);
3305 if (bytes[bytes.len - 1] == '\n') ais.resetLine();
3306 }
33183307
3319 pub fn writer(self: *Self) Writer {
3320 return .{ .context = self };
3321 }
3308 pub fn print(ais: *AutoIndentingStream, comptime format: []const u8, args: anytype) anyerror!void {
3309 comptime assert(format[format.len - 1] != '}');
3310 try ais.applyIndent();
3311 if (ais.disabled_offset == null) try ais.underlying_writer.print(format, args);
3312 if (format[format.len - 1] == '\n') ais.resetLine();
3313 }
33223314
3323 pub fn write(self: *Self, bytes: []const u8) WriteError!usize {
3324 if (bytes.len == 0)
3325 return @as(usize, 0);
3315 pub fn writeByte(ais: *AutoIndentingStream, byte: u8) anyerror!void {
3316 try ais.applyIndent();
3317 if (ais.disabled_offset == null) try ais.underlying_writer.writeByte(byte);
3318 assert(byte != '\n');
3319 }
33263320
3327 try self.applyIndent();
3328 return self.writeNoIndent(bytes);
3329 }
3321 pub fn splatByteAll(ais: *AutoIndentingStream, byte: u8, n: usize) anyerror!void {
3322 assert(byte != '\n');
3323 try ais.applyIndent();
3324 if (ais.disabled_offset == null) try ais.underlying_writer.splatByteAll(byte, n);
3325 }
33303326
3331 // Change the indent delta without changing the final indentation level
3332 pub fn setIndentDelta(self: *Self, new_indent_delta: usize) void {
3333 if (self.indent_delta == new_indent_delta) {
3334 return;
3335 } else if (self.indent_delta > new_indent_delta) {
3336 assert(self.indent_delta % new_indent_delta == 0);
3337 self.indent_count = self.indent_count * (self.indent_delta / new_indent_delta);
3338 } else {
3339 // assert that the current indentation (in spaces) in a multiple of the new delta
3340 assert((self.indent_count * self.indent_delta) % new_indent_delta == 0);
3341 self.indent_count = self.indent_count / (new_indent_delta / self.indent_delta);
3342 }
3343 self.indent_delta = new_indent_delta;
3327 // Change the indent delta without changing the final indentation level
3328 pub fn setIndentDelta(ais: *AutoIndentingStream, new_indent_delta: usize) void {
3329 if (ais.indent_delta == new_indent_delta) {
3330 return;
3331 } else if (ais.indent_delta > new_indent_delta) {
3332 assert(ais.indent_delta % new_indent_delta == 0);
3333 ais.indent_count = ais.indent_count * (ais.indent_delta / new_indent_delta);
3334 } else {
3335 // assert that the current indentation (in spaces) in a multiple of the new delta
3336 assert((ais.indent_count * ais.indent_delta) % new_indent_delta == 0);
3337 ais.indent_count = ais.indent_count / (new_indent_delta / ais.indent_delta);
33443338 }
3339 ais.indent_delta = new_indent_delta;
3340 }
33453341
3346 fn writeNoIndent(self: *Self, bytes: []const u8) WriteError!usize {
3347 if (bytes.len == 0)
3348 return @as(usize, 0);
3342 pub fn insertNewline(ais: *AutoIndentingStream) anyerror!void {
3343 if (ais.disabled_offset == null) try ais.underlying_writer.writeByte('\n');
3344 ais.resetLine();
3345 }
33493346
3350 if (self.disabled_offset == null) try self.underlying_writer.writeAll(bytes);
3351 if (bytes[bytes.len - 1] == '\n')
3352 self.resetLine();
3353 return bytes.len;
3354 }
3347 /// Insert a newline unless the current line is blank
3348 pub fn maybeInsertNewline(ais: *AutoIndentingStream) anyerror!void {
3349 if (!ais.current_line_empty)
3350 try ais.insertNewline();
3351 }
33553352
3356 pub fn insertNewline(self: *Self) WriteError!void {
3357 _ = try self.writeNoIndent("\n");
3358 }
3353 /// Push an indent that is automatically popped after being applied
3354 pub fn pushIndentOneShot(ais: *AutoIndentingStream) void {
3355 ais.indent_one_shot_count += 1;
3356 ais.pushIndent();
3357 }
33593358
3360 fn resetLine(self: *Self) void {
3361 self.current_line_empty = true;
3362
3363 if (self.disable_indent_committing > 0) return;
3364
3365 if (self.indent_stack.items.len > 0) {
3366 // By default, we realize the most recent indentation scope.
3367 var to_realize = self.indent_stack.items.len - 1;
3368
3369 if (self.indent_stack.items.len >= 2 and
3370 self.indent_stack.items[to_realize - 1].indent_type == .after_equals and
3371 self.indent_stack.items[to_realize - 1].realized and
3372 self.indent_stack.items[to_realize].indent_type == .binop)
3373 {
3374 // If we are in a .binop scope and our direct parent is .after_equals, don't indent.
3375 // This ensures correct indentation in the below example:
3376 //
3377 // const foo =
3378 // (x >= 'a' and x <= 'z') or //<-- we are here
3379 // (x >= 'A' and x <= 'Z');
3380 //
3381 return;
3382 }
3359 /// Turns all one-shot indents into regular indents
3360 /// Returns number of indents that must now be manually popped
3361 pub fn lockOneShotIndent(ais: *AutoIndentingStream) usize {
3362 const locked_count = ais.indent_one_shot_count;
3363 ais.indent_one_shot_count = 0;
3364 return locked_count;
3365 }
33833366
3384 if (self.indent_stack.items[to_realize].indent_type == .field_access) {
3385 // Only realize the top-most field_access in a chain.
3386 while (to_realize > 0 and self.indent_stack.items[to_realize - 1].indent_type == .field_access)
3387 to_realize -= 1;
3388 }
3367 /// Push an indent that should not take effect until the next line
3368 pub fn pushIndentNextLine(ais: *AutoIndentingStream) void {
3369 ais.indent_next_line += 1;
3370 ais.pushIndent();
3371 }
3372
3373 /// Checks to see if the most recent indentation exceeds the currently pushed indents
3374 pub fn isLineOverIndented(ais: *AutoIndentingStream) bool {
3375 if (ais.current_line_empty) return false;
3376 return ais.applied_indent > ais.currentIndent();
3377 }
3378
3379 fn resetLine(ais: *AutoIndentingStream) void {
3380 ais.current_line_empty = true;
3381
3382 if (ais.disable_indent_committing > 0) return;
33893383
3390 if (self.indent_stack.items[to_realize].realized) return;
3391 self.indent_stack.items[to_realize].realized = true;
3392 self.indent_count += 1;
3384 if (ais.indent_stack.items.len > 0) {
3385 // By default, we realize the most recent indentation scope.
3386 var to_realize = ais.indent_stack.items.len - 1;
3387
3388 if (ais.indent_stack.items.len >= 2 and
3389 ais.indent_stack.items[to_realize - 1].indent_type == .after_equals and
3390 ais.indent_stack.items[to_realize - 1].realized and
3391 ais.indent_stack.items[to_realize].indent_type == .binop)
3392 {
3393 // If we are in a .binop scope and our direct parent is .after_equals, don't indent.
3394 // This ensures correct indentation in the below example:
3395 //
3396 // const foo =
3397 // (x >= 'a' and x <= 'z') or //<-- we are here
3398 // (x >= 'A' and x <= 'Z');
3399 //
3400 return;
33933401 }
3394 }
33953402
3396 /// Disables indentation level changes during the next newlines until re-enabled.
3397 pub fn disableIndentCommitting(self: *Self) void {
3398 self.disable_indent_committing += 1;
3399 }
3403 if (ais.indent_stack.items[to_realize].indent_type == .field_access) {
3404 // Only realize the top-most field_access in a chain.
3405 while (to_realize > 0 and ais.indent_stack.items[to_realize - 1].indent_type == .field_access)
3406 to_realize -= 1;
3407 }
34003408
3401 pub fn enableIndentCommitting(self: *Self) void {
3402 assert(self.disable_indent_committing > 0);
3403 self.disable_indent_committing -= 1;
3409 if (ais.indent_stack.items[to_realize].realized) return;
3410 ais.indent_stack.items[to_realize].realized = true;
3411 ais.indent_count += 1;
34043412 }
3413 }
34053414
3406 pub fn pushSpace(self: *Self, space: Space) !void {
3407 try self.space_stack.append(.{ .space = space, .indent_count = self.indent_count });
3408 }
3415 /// Disables indentation level changes during the next newlines until re-enabled.
3416 pub fn disableIndentCommitting(ais: *AutoIndentingStream) void {
3417 ais.disable_indent_committing += 1;
3418 }
34093419
3410 pub fn popSpace(self: *Self) void {
3411 _ = self.space_stack.pop();
3412 }
3420 pub fn enableIndentCommitting(ais: *AutoIndentingStream) void {
3421 assert(ais.disable_indent_committing > 0);
3422 ais.disable_indent_committing -= 1;
3423 }
34133424
3414 /// Sets current indentation level to be the same as that of the last pushSpace.
3415 pub fn enableSpaceMode(self: *Self, space: Space) void {
3416 if (self.space_stack.items.len == 0) return;
3417 const curr = self.space_stack.getLast();
3418 if (curr.space != space) return;
3419 self.space_mode = curr.indent_count;
3420 }
3425 pub fn pushSpace(ais: *AutoIndentingStream, space: Space) !void {
3426 try ais.space_stack.append(.{ .space = space, .indent_count = ais.indent_count });
3427 }
34213428
3422 pub fn disableSpaceMode(self: *Self) void {
3423 self.space_mode = null;
3424 }
3429 pub fn popSpace(ais: *AutoIndentingStream) void {
3430 _ = ais.space_stack.pop();
3431 }
34253432
3426 pub fn lastSpaceModeIndent(self: *Self) usize {
3427 if (self.space_stack.items.len == 0) return 0;
3428 return self.space_stack.getLast().indent_count * self.indent_delta;
3429 }
3433 /// Sets current indentation level to be the same as that of the last pushSpace.
3434 pub fn enableSpaceMode(ais: *AutoIndentingStream, space: Space) void {
3435 if (ais.space_stack.items.len == 0) return;
3436 const curr = ais.space_stack.getLast();
3437 if (curr.space != space) return;
3438 ais.space_mode = curr.indent_count;
3439 }
34303440
3431 /// Insert a newline unless the current line is blank
3432 pub fn maybeInsertNewline(self: *Self) WriteError!void {
3433 if (!self.current_line_empty)
3434 try self.insertNewline();
3435 }
3441 pub fn disableSpaceMode(ais: *AutoIndentingStream) void {
3442 ais.space_mode = null;
3443 }
34363444
3437 /// Push default indentation
3438 /// Doesn't actually write any indentation.
3439 /// Just primes the stream to be able to write the correct indentation if it needs to.
3440 pub fn pushIndent(self: *Self, indent_type: IndentType) !void {
3441 try self.indent_stack.append(.{ .indent_type = indent_type, .realized = false });
3442 }
3445 pub fn lastSpaceModeIndent(ais: *AutoIndentingStream) usize {
3446 if (ais.space_stack.items.len == 0) return 0;
3447 return ais.space_stack.getLast().indent_count * ais.indent_delta;
3448 }
34433449
3444 /// Forces an indentation level to be realized.
3445 pub fn forcePushIndent(self: *Self, indent_type: IndentType) !void {
3446 try self.indent_stack.append(.{ .indent_type = indent_type, .realized = true });
3447 self.indent_count += 1;
3448 }
3450 /// Push default indentation
3451 /// Doesn't actually write any indentation.
3452 /// Just primes the stream to be able to write the correct indentation if it needs to.
3453 pub fn pushIndent(ais: *AutoIndentingStream, indent_type: IndentType) !void {
3454 try ais.indent_stack.append(.{ .indent_type = indent_type, .realized = false });
3455 }
34493456
3450 pub fn popIndent(self: *Self) void {
3451 if (self.indent_stack.pop().?.realized) {
3452 assert(self.indent_count > 0);
3453 self.indent_count -= 1;
3454 }
3455 }
3457 /// Forces an indentation level to be realized.
3458 pub fn forcePushIndent(ais: *AutoIndentingStream, indent_type: IndentType) !void {
3459 try ais.indent_stack.append(.{ .indent_type = indent_type, .realized = true });
3460 ais.indent_count += 1;
3461 }
34563462
3457 pub fn indentStackEmpty(self: *Self) bool {
3458 return self.indent_stack.items.len == 0;
3463 pub fn popIndent(ais: *AutoIndentingStream) void {
3464 if (ais.indent_stack.pop().?.realized) {
3465 assert(ais.indent_count > 0);
3466 ais.indent_count -= 1;
34593467 }
3468 }
34603469
3461 /// Writes ' ' bytes if the current line is empty
3462 fn applyIndent(self: *Self) WriteError!void {
3463 const current_indent = self.currentIndent();
3464 if (self.current_line_empty and current_indent > 0) {
3465 if (self.disabled_offset == null) {
3466 try self.underlying_writer.writeByteNTimes(' ', current_indent);
3467 }
3468 self.applied_indent = current_indent;
3469 }
3470 self.current_line_empty = false;
3471 }
3470 pub fn indentStackEmpty(ais: *AutoIndentingStream) bool {
3471 return ais.indent_stack.items.len == 0;
3472 }
34723473
3473 /// Checks to see if the most recent indentation exceeds the currently pushed indents
3474 pub fn isLineOverIndented(self: *Self) bool {
3475 if (self.current_line_empty) return false;
3476 return self.applied_indent > self.currentIndent();
3474 /// Writes ' ' bytes if the current line is empty
3475 fn applyIndent(ais: *AutoIndentingStream) anyerror!void {
3476 const current_indent = ais.currentIndent();
3477 if (ais.current_line_empty and current_indent > 0) {
3478 if (ais.disabled_offset == null) {
3479 try ais.underlying_writer.writeByteNTimes(' ', current_indent);
3480 }
3481 ais.applied_indent = current_indent;
34773482 }
3483 ais.current_line_empty = false;
3484 }
34783485
3479 fn currentIndent(self: *Self) usize {
3480 const indent_count = self.space_mode orelse self.indent_count;
3481 return indent_count * self.indent_delta;
3482 }
3483 };
3484}
3486 fn currentIndent(ais: *AutoIndentingStream) usize {
3487 const indent_count = ais.space_mode orelse ais.indent_count;
3488 return indent_count * ais.indent_delta;
3489 }
3490};
lib/std/zig/string_literal.zig+11-9
......@@ -322,9 +322,9 @@ test parseCharLiteral {
322322 );
323323}
324324
325/// Parses `bytes` as a Zig string literal and writes the result to the std.io.Writer type.
325/// Parses `bytes` as a Zig string literal and writes the result to the `std.io.Writer` type.
326326/// Asserts `bytes` has '"' at beginning and end.
327pub fn parseWrite(writer: anytype, bytes: []const u8) error{OutOfMemory}!Result {
327pub fn parseWrite(writer: *std.io.BufferedWriter, bytes: []const u8) anyerror!Result {
328328 assert(bytes.len >= 2 and bytes[0] == '"' and bytes[bytes.len - 1] == '"');
329329
330330 var index: usize = 1;
......@@ -340,18 +340,18 @@ pub fn parseWrite(writer: anytype, bytes: []const u8) error{OutOfMemory}!Result
340340 if (bytes[escape_char_index] == 'u') {
341341 var buf: [4]u8 = undefined;
342342 const len = utf8Encode(codepoint, &buf) catch {
343 return Result{ .failure = .{ .invalid_unicode_codepoint = escape_char_index + 1 } };
343 return .{ .failure = .{ .invalid_unicode_codepoint = escape_char_index + 1 } };
344344 };
345345 try writer.writeAll(buf[0..len]);
346346 } else {
347347 try writer.writeByte(@as(u8, @intCast(codepoint)));
348348 }
349349 },
350 .failure => |err| return Result{ .failure = err },
350 .failure => |err| return .{ .failure = err },
351351 }
352352 },
353 '\n' => return Result{ .failure = .{ .invalid_character = index } },
354 '"' => return Result.success,
353 '\n' => return .{ .failure = .{ .invalid_character = index } },
354 '"' => return .success,
355355 else => {
356356 try writer.writeByte(b);
357357 index += 1;
......@@ -363,10 +363,12 @@ pub fn parseWrite(writer: anytype, bytes: []const u8) error{OutOfMemory}!Result
363363/// Higher level API. Does not return extra info about parse errors.
364364/// Caller owns returned memory.
365365pub fn parseAlloc(allocator: std.mem.Allocator, bytes: []const u8) ParseError![]u8 {
366 var buf = std.ArrayList(u8).init(allocator);
366 var buf: std.io.AllocatingWriter = undefined;
367 const bw = buf.init(allocator);
367368 defer buf.deinit();
368
369 switch (try parseWrite(buf.writer(), bytes)) {
369 // TODO try @errorCast(...)
370 const result = parseWrite(bw, bytes) catch |err| return @errorCast(err);
371 switch (result) {
370372 .success => return buf.toOwnedSlice(),
371373 .failure => return error.InvalidLiteral,
372374 }
src/Air/print.zig+12-13
......@@ -1,6 +1,5 @@
11const std = @import("std");
22const Allocator = std.mem.Allocator;
3const fmtIntSizeBin = std.fmt.fmtIntSizeBin;
43
54const build_options = @import("build_options");
65const Zcu = @import("../Zcu.zig");
......@@ -25,20 +24,20 @@ pub fn write(air: Air, stream: anytype, pt: Zcu.PerThread, liveness: ?Air.Livene
2524
2625 // zig fmt: off
2726 stream.print(
28 \\# Total AIR+Liveness bytes: {}
29 \\# AIR Instructions: {d} ({})
30 \\# AIR Extra Data: {d} ({})
31 \\# Liveness tomb_bits: {}
32 \\# Liveness Extra Data: {d} ({})
33 \\# Liveness special table: {d} ({})
27 \\# Total AIR+Liveness bytes: {Bi}
28 \\# AIR Instructions: {d} ({Bi})
29 \\# AIR Extra Data: {d} ({Bi})
30 \\# Liveness tomb_bits: {Bi}
31 \\# Liveness Extra Data: {d} ({Bi})
32 \\# Liveness special table: {d} ({Bi})
3433 \\
3534 , .{
36 fmtIntSizeBin(total_bytes),
37 air.instructions.len, fmtIntSizeBin(instruction_bytes),
38 air.extra.items.len, fmtIntSizeBin(extra_bytes),
39 fmtIntSizeBin(tomb_bytes),
40 if (liveness) |l| l.extra.len else 0, fmtIntSizeBin(liveness_extra_bytes),
41 if (liveness) |l| l.special.count() else 0, fmtIntSizeBin(liveness_special_bytes),
35 total_bytes,
36 air.instructions.len, instruction_bytes,
37 air.extra.items.len, extra_bytes,
38 tomb_bytes,
39 if (liveness) |l| l.extra.len else 0, liveness_extra_bytes,
40 if (liveness) |l| l.special.count() else 0, liveness_special_bytes,
4241 }) catch return;
4342 // zig fmt: on
4443
src/Builtin.zig+10-10
......@@ -51,7 +51,7 @@ pub fn append(opts: @This(), buffer: *std.ArrayList(u8)) Allocator.Error!void {
5151 const zig_backend = opts.zig_backend;
5252
5353 @setEvalBranchQuota(4000);
54 try buffer.writer().print(
54 try buffer.print(
5555 \\const std = @import("std");
5656 \\/// Zig version. When writing code that supports multiple versions of Zig, prefer
5757 \\/// feature detection (i.e. with `@hasDecl` or `@hasField`) over version checks.
......@@ -89,10 +89,10 @@ pub fn append(opts: @This(), buffer: *std.ArrayList(u8)) Allocator.Error!void {
8989 const index = @as(std.Target.Cpu.Feature.Set.Index, @intCast(index_usize));
9090 const is_enabled = target.cpu.features.isEnabled(index);
9191 if (is_enabled) {
92 try buffer.writer().print(" .{p_},\n", .{std.zig.fmtId(feature.name)});
92 try buffer.print(" .{p_},\n", .{std.zig.fmtId(feature.name)});
9393 }
9494 }
95 try buffer.writer().print(
95 try buffer.print(
9696 \\ }}),
9797 \\}};
9898 \\pub const os: std.Target.Os = .{{
......@@ -104,7 +104,7 @@ pub fn append(opts: @This(), buffer: *std.ArrayList(u8)) Allocator.Error!void {
104104
105105 switch (target.os.versionRange()) {
106106 .none => try buffer.appendSlice(" .none = {} },\n"),
107 .semver => |semver| try buffer.writer().print(
107 .semver => |semver| try buffer.print(
108108 \\ .semver = .{{
109109 \\ .min = .{{
110110 \\ .major = {},
......@@ -127,7 +127,7 @@ pub fn append(opts: @This(), buffer: *std.ArrayList(u8)) Allocator.Error!void {
127127 semver.max.minor,
128128 semver.max.patch,
129129 }),
130 .linux => |linux| try buffer.writer().print(
130 .linux => |linux| try buffer.print(
131131 \\ .linux = .{{
132132 \\ .range = .{{
133133 \\ .min = .{{
......@@ -164,7 +164,7 @@ pub fn append(opts: @This(), buffer: *std.ArrayList(u8)) Allocator.Error!void {
164164
165165 linux.android,
166166 }),
167 .hurd => |hurd| try buffer.writer().print(
167 .hurd => |hurd| try buffer.print(
168168 \\ .hurd = .{{
169169 \\ .range = .{{
170170 \\ .min = .{{
......@@ -198,7 +198,7 @@ pub fn append(opts: @This(), buffer: *std.ArrayList(u8)) Allocator.Error!void {
198198 hurd.glibc.minor,
199199 hurd.glibc.patch,
200200 }),
201 .windows => |windows| try buffer.writer().print(
201 .windows => |windows| try buffer.print(
202202 \\ .windows = .{{
203203 \\ .min = {c},
204204 \\ .max = {c},
......@@ -217,7 +217,7 @@ pub fn append(opts: @This(), buffer: *std.ArrayList(u8)) Allocator.Error!void {
217217 );
218218
219219 if (target.dynamic_linker.get()) |dl| {
220 try buffer.writer().print(
220 try buffer.print(
221221 \\ .dynamic_linker = .init("{s}"),
222222 \\}};
223223 \\
......@@ -237,7 +237,7 @@ pub fn append(opts: @This(), buffer: *std.ArrayList(u8)) Allocator.Error!void {
237237 // knows libc will provide it, and likewise c.zig will not export memcpy.
238238 const link_libc = opts.link_libc;
239239
240 try buffer.writer().print(
240 try buffer.print(
241241 \\pub const object_format: std.Target.ObjectFormat = .{p_};
242242 \\pub const mode: std.builtin.OptimizeMode = .{p_};
243243 \\pub const link_libc = {};
......@@ -269,7 +269,7 @@ pub fn append(opts: @This(), buffer: *std.ArrayList(u8)) Allocator.Error!void {
269269 });
270270
271271 if (target.os.tag == .wasi) {
272 try buffer.writer().print(
272 try buffer.print(
273273 \\pub const wasi_exec_model: std.builtin.WasiExecModel = .{p_};
274274 \\
275275 , .{std.zig.fmtId(@tagName(opts.wasi_exec_model))});
src/Package/Fetch.zig+2-4
......@@ -1643,10 +1643,8 @@ fn dumpHashInfo(all_files: []const *const HashedFile) !void {
16431643 const w = bw.writer();
16441644
16451645 for (all_files) |hashed_file| {
1646 try w.print("{s}: {s}: {s}\n", .{
1647 @tagName(hashed_file.kind),
1648 std.fmt.fmtSliceHexLower(&hashed_file.hash),
1649 hashed_file.normalized_path,
1646 try w.print("{s}: {x}: {s}\n", .{
1647 @tagName(hashed_file.kind), &hashed_file.hash, hashed_file.normalized_path,
16501648 });
16511649 }
16521650
src/Package/Fetch/git.zig+1-1
......@@ -127,7 +127,7 @@ pub const Oid = union(Format) {
127127 ) @TypeOf(writer).Error!void {
128128 _ = fmt;
129129 _ = options;
130 try writer.print("{}", .{std.fmt.fmtSliceHexLower(oid.slice())});
130 try writer.print("{x}", .{oid.slice()});
131131 }
132132
133133 pub fn slice(oid: *const Oid) []const u8 {
src/Zcu/PerThread.zig+2-5
......@@ -477,11 +477,8 @@ pub fn updateZirRefs(pt: Zcu.PerThread) Allocator.Error!void {
477477 if (std.zig.srcHashEql(old_hash, new_hash)) {
478478 break :hash_changed;
479479 }
480 log.debug("hash for (%{d} -> %{d}) changed: {} -> {}", .{
481 old_inst,
482 new_inst,
483 std.fmt.fmtSliceHexLower(&old_hash),
484 std.fmt.fmtSliceHexLower(&new_hash),
480 log.debug("hash for (%{d} -> %{d}) changed: {x} -> {x}", .{
481 old_inst, new_inst, &old_hash, &new_hash,
485482 });
486483 }
487484 // The source hash associated with this instruction changed - invalidate relevant dependencies.
src/arch/x86_64/encoder.zig+2-2
......@@ -1205,9 +1205,9 @@ pub const Vex = struct {
12051205fn expectEqualHexStrings(expected: []const u8, given: []const u8, assembly: []const u8) !void {
12061206 assert(expected.len > 0);
12071207 if (std.mem.eql(u8, expected, given)) return;
1208 const expected_fmt = try std.fmt.allocPrint(testing.allocator, "{x}", .{std.fmt.fmtSliceHexLower(expected)});
1208 const expected_fmt = try std.fmt.allocPrint(testing.allocator, "{x}", .{expected});
12091209 defer testing.allocator.free(expected_fmt);
1210 const given_fmt = try std.fmt.allocPrint(testing.allocator, "{x}", .{std.fmt.fmtSliceHexLower(given)});
1210 const given_fmt = try std.fmt.allocPrint(testing.allocator, "{x}", .{given});
12111211 defer testing.allocator.free(given_fmt);
12121212 const idx = std.mem.indexOfDiff(u8, expected_fmt, given_fmt).?;
12131213 const padding = try testing.allocator.alloc(u8, idx + 5);
src/fmt.zig+3-37
......@@ -190,41 +190,7 @@ pub fn run(
190190 }
191191}
192192
193const FmtError = error{
194 SystemResources,
195 OperationAborted,
196 IoPending,
197 BrokenPipe,
198 Unexpected,
199 WouldBlock,
200 Canceled,
201 FileClosed,
202 DestinationAddressRequired,
203 DiskQuota,
204 FileTooBig,
205 MessageTooBig,
206 InputOutput,
207 NoSpaceLeft,
208 AccessDenied,
209 OutOfMemory,
210 RenameAcrossMountPoints,
211 ReadOnlyFileSystem,
212 LinkQuotaExceeded,
213 FileBusy,
214 EndOfStream,
215 Unseekable,
216 NotOpenForWriting,
217 UnsupportedEncoding,
218 InvalidEncoding,
219 ConnectionResetByPeer,
220 SocketNotConnected,
221 LockViolation,
222 NetNameDeleted,
223 InvalidArgument,
224 ProcessNotFound,
225} || fs.File.OpenError;
226
227fn fmtPath(fmt: *Fmt, file_path: []const u8, check_mode: bool, dir: fs.Dir, sub_path: []const u8) FmtError!void {
193fn fmtPath(fmt: *Fmt, file_path: []const u8, check_mode: bool, dir: fs.Dir, sub_path: []const u8) anyerror!void {
228194 fmtPathFile(fmt, file_path, check_mode, dir, sub_path) catch |err| switch (err) {
229195 error.IsDir, error.AccessDenied => return fmtPathDir(fmt, file_path, check_mode, dir, sub_path),
230196 else => {
......@@ -241,7 +207,7 @@ fn fmtPathDir(
241207 check_mode: bool,
242208 parent_dir: fs.Dir,
243209 parent_sub_path: []const u8,
244) FmtError!void {
210) anyerror!void {
245211 var dir = try parent_dir.openDir(parent_sub_path, .{ .iterate = true });
246212 defer dir.close();
247213
......@@ -277,7 +243,7 @@ fn fmtPathFile(
277243 check_mode: bool,
278244 dir: fs.Dir,
279245 sub_path: []const u8,
280) FmtError!void {
246) anyerror!void {
281247 const source_file = try dir.openFile(sub_path, .{});
282248 var file_closed = false;
283249 errdefer if (!file_closed) source_file.close();
src/libs/mingw.zig+14-13
......@@ -388,7 +388,7 @@ pub fn libExists(
388388/// This function body is verbose but all it does is test 3 different paths and
389389/// see if a .def file exists.
390390fn findDef(
391 allocator: Allocator,
391 gpa: Allocator,
392392 target: *const std.Target,
393393 zig_lib_directory: Cache.Directory,
394394 lib_name: []const u8,
......@@ -401,7 +401,8 @@ fn findDef(
401401 else => unreachable,
402402 };
403403
404 var override_path = std.ArrayList(u8).init(allocator);
404 var override_path: std.io.AllocatingWriter = undefined;
405 const override_path_writer = override_path.init(gpa);
405406 defer override_path.deinit();
406407
407408 const s = path.sep_str;
......@@ -410,11 +411,11 @@ fn findDef(
410411 // Try the archtecture-specific path first.
411412 const fmt_path = "libc" ++ s ++ "mingw" ++ s ++ "{s}" ++ s ++ "{s}.def";
412413 if (zig_lib_directory.path) |p| {
413 try override_path.writer().print("{s}" ++ s ++ fmt_path, .{ p, lib_path, lib_name });
414 try override_path_writer.print("{s}" ++ s ++ fmt_path, .{ p, lib_path, lib_name });
414415 } else {
415 try override_path.writer().print(fmt_path, .{ lib_path, lib_name });
416 try override_path_writer.print(fmt_path, .{ lib_path, lib_name });
416417 }
417 if (std.fs.cwd().access(override_path.items, .{})) |_| {
418 if (std.fs.cwd().access(override_path.getWritten(), .{})) |_| {
418419 return override_path.toOwnedSlice();
419420 } else |err| switch (err) {
420421 error.FileNotFound => {},
......@@ -424,14 +425,14 @@ fn findDef(
424425
425426 {
426427 // Try the generic version.
427 override_path.shrinkRetainingCapacity(0);
428 override_path.clearRetainingCapacity();
428429 const fmt_path = "libc" ++ s ++ "mingw" ++ s ++ "lib-common" ++ s ++ "{s}.def";
429430 if (zig_lib_directory.path) |p| {
430 try override_path.writer().print("{s}" ++ s ++ fmt_path, .{ p, lib_name });
431 try override_path_writer.print("{s}" ++ s ++ fmt_path, .{ p, lib_name });
431432 } else {
432 try override_path.writer().print(fmt_path, .{lib_name});
433 try override_path_writer.print(fmt_path, .{lib_name});
433434 }
434 if (std.fs.cwd().access(override_path.items, .{})) |_| {
435 if (std.fs.cwd().access(override_path.getWritten(), .{})) |_| {
435436 return override_path.toOwnedSlice();
436437 } else |err| switch (err) {
437438 error.FileNotFound => {},
......@@ -441,14 +442,14 @@ fn findDef(
441442
442443 {
443444 // Try the generic version and preprocess it.
444 override_path.shrinkRetainingCapacity(0);
445 override_path.clearRetainingCapacity();
445446 const fmt_path = "libc" ++ s ++ "mingw" ++ s ++ "lib-common" ++ s ++ "{s}.def.in";
446447 if (zig_lib_directory.path) |p| {
447 try override_path.writer().print("{s}" ++ s ++ fmt_path, .{ p, lib_name });
448 try override_path_writer.print("{s}" ++ s ++ fmt_path, .{ p, lib_name });
448449 } else {
449 try override_path.writer().print(fmt_path, .{lib_name});
450 try override_path_writer.print(fmt_path, .{lib_name});
450451 }
451 if (std.fs.cwd().access(override_path.items, .{})) |_| {
452 if (std.fs.cwd().access(override_path.getWritten(), .{})) |_| {
452453 return override_path.toOwnedSlice();
453454 } else |err| switch (err) {
454455 error.FileNotFound => {},
src/link/Coff.zig+2-2
......@@ -830,8 +830,8 @@ fn debugMem(allocator: Allocator, handle: std.process.Child.Id, pvaddr: std.os.w
830830 const buffer = try allocator.alloc(u8, code.len);
831831 defer allocator.free(buffer);
832832 const memread = try std.os.windows.ReadProcessMemory(handle, pvaddr, buffer);
833 log.debug("to write: {x}", .{std.fmt.fmtSliceHexLower(code)});
834 log.debug("in memory: {x}", .{std.fmt.fmtSliceHexLower(memread)});
833 log.debug("to write: {x}", .{code});
834 log.debug("in memory: {x}", .{memread});
835835}
836836
837837fn writeMemProtected(handle: std.process.Child.Id, pvaddr: std.os.windows.LPVOID, code: []const u8) !void {
src/link/MachO/dyld_info/Trie.zig+2-2
......@@ -336,9 +336,9 @@ const Edge = struct {
336336fn expectEqualHexStrings(expected: []const u8, given: []const u8) !void {
337337 assert(expected.len > 0);
338338 if (mem.eql(u8, expected, given)) return;
339 const expected_fmt = try std.fmt.allocPrint(testing.allocator, "{x}", .{std.fmt.fmtSliceHexLower(expected)});
339 const expected_fmt = try std.fmt.allocPrint(testing.allocator, "{x}", .{expected});
340340 defer testing.allocator.free(expected_fmt);
341 const given_fmt = try std.fmt.allocPrint(testing.allocator, "{x}", .{std.fmt.fmtSliceHexLower(given)});
341 const given_fmt = try std.fmt.allocPrint(testing.allocator, "{x}", .{given});
342342 defer testing.allocator.free(given_fmt);
343343 const idx = mem.indexOfDiff(u8, expected_fmt, given_fmt).?;
344344 const padding = try testing.allocator.alloc(u8, idx + 5);
src/link/Wasm/Flush.zig+3-9
......@@ -1035,20 +1035,14 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
10351035 var id: [16]u8 = undefined;
10361036 std.crypto.hash.sha3.TurboShake128(null).hash(binary_bytes.items, &id, .{});
10371037 var uuid: [36]u8 = undefined;
1038 _ = try std.fmt.bufPrint(&uuid, "{s}-{s}-{s}-{s}-{s}", .{
1039 std.fmt.fmtSliceHexLower(id[0..4]),
1040 std.fmt.fmtSliceHexLower(id[4..6]),
1041 std.fmt.fmtSliceHexLower(id[6..8]),
1042 std.fmt.fmtSliceHexLower(id[8..10]),
1043 std.fmt.fmtSliceHexLower(id[10..]),
1038 _ = try std.fmt.bufPrint(&uuid, "{x}-{x}-{x}-{x}-{x}", .{
1039 id[0..4], id[4..6], id[6..8], id[8..10], id[10..],
10441040 });
10451041 try emitBuildIdSection(gpa, binary_bytes, &uuid);
10461042 },
10471043 .hexstring => |hs| {
10481044 var buffer: [32 * 2]u8 = undefined;
1049 const str = std.fmt.bufPrint(&buffer, "{s}", .{
1050 std.fmt.fmtSliceHexLower(hs.toSlice()),
1051 }) catch unreachable;
1045 const str = std.fmt.bufPrint(&buffer, "{x}", .{hs.toSlice()}) catch unreachable;
10521046 try emitBuildIdSection(gpa, binary_bytes, str);
10531047 },
10541048 else => |mode| {
src/main.zig+73-58
......@@ -65,6 +65,9 @@ pub fn wasi_cwd() std.os.wasi.fd_t {
6565
6666const fatal = std.process.fatal;
6767
68/// This can be global since stdout is a singleton.
69var stdout_buffer: [4096]u8 = undefined;
70
6871/// Shaming all the locations that inappropriately use an O(N) search algorithm.
6972/// Please delete this and fix the compilation errors!
7073pub const @"bad O(N)" = void;
......@@ -338,9 +341,7 @@ fn mainArgs(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
338341 return cmdInit(gpa, arena, cmd_args);
339342 } else if (mem.eql(u8, cmd, "targets")) {
340343 dev.check(.targets_command);
341 const host = std.zig.resolveTargetQueryOrFatal(.{});
342 const stdout = io.getStdOut().writer();
343 return @import("print_targets.zig").cmdTargets(arena, cmd_args, stdout, &host);
344 return @import("print_targets.zig").cmdTargets(arena, cmd_args);
344345 } else if (mem.eql(u8, cmd, "version")) {
345346 dev.check(.version_command);
346347 try std.io.getStdOut().writeAll(build_options.version ++ "\n");
......@@ -351,7 +352,7 @@ fn mainArgs(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
351352 } else if (mem.eql(u8, cmd, "env")) {
352353 dev.check(.env_command);
353354 verifyLibcxxCorrectlyLinked();
354 return @import("print_env.zig").cmdEnv(arena, cmd_args, io.getStdOut().writer());
355 return @import("print_env.zig").cmdEnv(arena, cmd_args);
355356 } else if (mem.eql(u8, cmd, "reduce")) {
356357 return jitCmd(gpa, arena, cmd_args, .{
357358 .cmd_name = "reduce",
......@@ -3334,9 +3335,8 @@ fn buildOutputType(
33343335 var bin_digest: Cache.BinDigest = undefined;
33353336 hasher.final(&bin_digest);
33363337
3337 const sub_path = try std.fmt.allocPrint(arena, "tmp" ++ sep ++ "{s}-stdin{s}", .{
3338 std.fmt.fmtSliceHexLower(&bin_digest),
3339 ext.canonicalName(target),
3338 const sub_path = try std.fmt.allocPrint(arena, "tmp" ++ sep ++ "{x}-stdin{s}", .{
3339 &bin_digest, ext.canonicalName(target),
33403340 });
33413341 try dirs.local_cache.handle.rename(dump_path, sub_path);
33423342
......@@ -6061,6 +6061,11 @@ fn cmdAstCheck(
60616061
60626062 const tree = try Ast.parse(arena, source, mode);
60636063
6064 var bw: std.io.BufferedWriter = .{
6065 .unbuffered_writer = io.getStdOut().writer(),
6066 .buffer = &stdout_buffer,
6067 };
6068
60646069 switch (mode) {
60656070 .zig => {
60666071 const zir = try AstGen.generate(arena, tree);
......@@ -6103,31 +6108,30 @@ fn cmdAstCheck(
61036108 const extra_bytes = zir.extra.len * @sizeOf(u32);
61046109 const total_bytes = @sizeOf(Zir) + instruction_bytes + extra_bytes +
61056110 zir.string_bytes.len * @sizeOf(u8);
6106 const stdout = io.getStdOut();
6107 const fmtIntSizeBin = std.fmt.fmtIntSizeBin;
61086111 // zig fmt: off
6109 try stdout.writer().print(
6110 \\# Source bytes: {}
6111 \\# Tokens: {} ({})
6112 \\# AST Nodes: {} ({})
6113 \\# Total ZIR bytes: {}
6114 \\# Instructions: {d} ({})
6112 try bw.print(
6113 \\# Source bytes: {Bi}
6114 \\# Tokens: {} ({Bi})
6115 \\# AST Nodes: {} ({Bi})
6116 \\# Total ZIR bytes: {Bi}
6117 \\# Instructions: {d} ({Bi})
61156118 \\# String Table Bytes: {}
6116 \\# Extra Data Items: {d} ({})
6119 \\# Extra Data Items: {d} ({Bi})
61176120 \\
61186121 , .{
6119 fmtIntSizeBin(source.len),
6120 tree.tokens.len, fmtIntSizeBin(token_bytes),
6121 tree.nodes.len, fmtIntSizeBin(tree_bytes),
6122 fmtIntSizeBin(total_bytes),
6123 zir.instructions.len, fmtIntSizeBin(instruction_bytes),
6124 fmtIntSizeBin(zir.string_bytes.len),
6125 zir.extra.len, fmtIntSizeBin(extra_bytes),
6122 source.len,
6123 tree.tokens.len, token_bytes,
6124 tree.nodes.len, tree_bytes,
6125 total_bytes,
6126 zir.instructions.len, instruction_bytes,
6127 zir.string_bytes.len,
6128 zir.extra.len, extra_bytes,
61266129 });
61276130 // zig fmt: on
61286131 }
61296132
6130 try @import("print_zir.zig").renderAsTextToFile(arena, tree, zir, io.getStdOut());
6133 try @import("print_zir.zig").renderAsText(arena, tree, zir, &bw);
6134 try bw.flush();
61316135
61326136 if (zir.hasCompileErrors()) {
61336137 process.exit(1);
......@@ -6154,7 +6158,8 @@ fn cmdAstCheck(
61546158 fatal("-t option only available in builds of zig with debug extensions", .{});
61556159 }
61566160
6157 try @import("print_zoir.zig").renderToFile(zoir, arena, io.getStdOut());
6161 try @import("print_zoir.zig").renderToWriter(zoir, arena, &bw);
6162 try bw.flush();
61586163 return cleanExit();
61596164 },
61606165 }
......@@ -6275,11 +6280,13 @@ fn detectNativeCpuWithLLVM(
62756280}
62766281
62776282fn printCpu(cpu: std.Target.Cpu) !void {
6278 var bw = io.bufferedWriter(io.getStdOut().writer());
6279 const stdout = bw.writer();
6283 var bw: std.io.BufferedWriter = .{
6284 .unbuffered_writer = io.getStdOut().writer(),
6285 .buffer = &stdout_buffer,
6286 };
62806287
62816288 if (cpu.model.llvm_name) |llvm_name| {
6282 try stdout.print("{s}\n", .{llvm_name});
6289 try bw.print("{s}\n", .{llvm_name});
62836290 }
62846291
62856292 const all_features = cpu.arch.allFeaturesList();
......@@ -6288,7 +6295,7 @@ fn printCpu(cpu: std.Target.Cpu) !void {
62886295 const index: std.Target.Cpu.Feature.Set.Index = @intCast(index_usize);
62896296 const is_enabled = cpu.features.isEnabled(index);
62906297 const plus_or_minus = "-+"[@intFromBool(is_enabled)];
6291 try stdout.print("{c}{s}\n", .{ plus_or_minus, llvm_name });
6298 try bw.print("{c}{s}\n", .{ plus_or_minus, llvm_name });
62926299 }
62936300
62946301 try bw.flush();
......@@ -6356,6 +6363,11 @@ fn cmdDumpZir(
63566363
63576364 const zir = try Zcu.loadZirCache(arena, f);
63586365
6366 var bw: std.io.BufferedWriter = .{
6367 .unbuffered_writer = io.getStdOut().writer(),
6368 .buffer = &stdout_buffer,
6369 };
6370
63596371 {
63606372 const instruction_bytes = zir.instructions.len *
63616373 // Here we don't use @sizeOf(Zir.Inst.Data) because it would include
......@@ -6364,25 +6376,24 @@ fn cmdDumpZir(
63646376 const extra_bytes = zir.extra.len * @sizeOf(u32);
63656377 const total_bytes = @sizeOf(Zir) + instruction_bytes + extra_bytes +
63666378 zir.string_bytes.len * @sizeOf(u8);
6367 const stdout = io.getStdOut();
6368 const fmtIntSizeBin = std.fmt.fmtIntSizeBin;
63696379 // zig fmt: off
6370 try stdout.writer().print(
6371 \\# Total ZIR bytes: {}
6372 \\# Instructions: {d} ({})
6373 \\# String Table Bytes: {}
6374 \\# Extra Data Items: {d} ({})
6380 try bw.print(
6381 \\# Total ZIR bytes: {Bi}
6382 \\# Instructions: {d} ({Bi})
6383 \\# String Table Bytes: {Bi}
6384 \\# Extra Data Items: {d} ({Bi})
63756385 \\
63766386 , .{
6377 fmtIntSizeBin(total_bytes),
6378 zir.instructions.len, fmtIntSizeBin(instruction_bytes),
6379 fmtIntSizeBin(zir.string_bytes.len),
6380 zir.extra.len, fmtIntSizeBin(extra_bytes),
6387 total_bytes,
6388 zir.instructions.len, instruction_bytes,
6389 zir.string_bytes.len,
6390 zir.extra.len, extra_bytes,
63816391 });
63826392 // zig fmt: on
63836393 }
63846394
6385 return @import("print_zir.zig").renderAsTextToFile(arena, null, zir, io.getStdOut());
6395 try @import("print_zir.zig").renderAsText(arena, null, zir, &bw);
6396 try bw.flush();
63866397}
63876398
63886399/// This is only enabled for debug builds.
......@@ -6440,13 +6451,15 @@ fn cmdChangelist(
64406451 var inst_map: std.AutoHashMapUnmanaged(Zir.Inst.Index, Zir.Inst.Index) = .empty;
64416452 try Zcu.mapOldZirToNew(arena, old_zir, new_zir, &inst_map);
64426453
6443 var bw = io.bufferedWriter(io.getStdOut().writer());
6444 const stdout = bw.writer();
6454 var bw: std.io.BufferedWriter = .{
6455 .unbuffered_writer = io.getStdOut().writer(),
6456 .buffer = &stdout_buffer,
6457 };
64456458 {
6446 try stdout.print("Instruction mappings:\n", .{});
6459 try bw.print("Instruction mappings:\n", .{});
64476460 var it = inst_map.iterator();
64486461 while (it.next()) |entry| {
6449 try stdout.print(" %{d} => %{d}\n", .{
6462 try bw.print(" %{d} => %{d}\n", .{
64506463 @intFromEnum(entry.key_ptr.*),
64516464 @intFromEnum(entry.value_ptr.*),
64526465 });
......@@ -6714,13 +6727,10 @@ fn accessFrameworkPath(
67146727
67156728 for (&[_][]const u8{ ".tbd", ".dylib", "" }) |ext| {
67166729 test_path.clearRetainingCapacity();
6717 try test_path.writer().print("{s}" ++ sep ++ "{s}.framework" ++ sep ++ "{s}{s}", .{
6718 framework_dir_path,
6719 framework_name,
6720 framework_name,
6721 ext,
6730 try test_path.print("{s}" ++ sep ++ "{s}.framework" ++ sep ++ "{s}{s}", .{
6731 framework_dir_path, framework_name, framework_name, ext,
67226732 });
6723 try checked_paths.writer().print("\n {s}", .{test_path.items});
6733 try checked_paths.print("\n {s}", .{test_path.items});
67246734 fs.cwd().access(test_path.items, .{}) catch |err| switch (err) {
67256735 error.FileNotFound => continue,
67266736 else => |e| fatal("unable to search for {s} framework '{s}': {s}", .{
......@@ -7033,14 +7043,19 @@ fn cmdFetch(
70337043 try fixups.append_string_after_node.put(gpa, manifest.version_node, dependencies_text);
70347044 }
70357045
7036 var rendered = std.ArrayList(u8).init(gpa);
7037 defer rendered.deinit();
7038 try ast.renderToArrayList(&rendered, fixups);
7039
7040 build_root.directory.handle.writeFile(.{ .sub_path = Package.Manifest.basename, .data = rendered.items }) catch |err| {
7041 fatal("unable to write {s} file: {s}", .{ Package.Manifest.basename, @errorName(err) });
7046 var file = build_root.directory.handle.createFile(Package.Manifest.basename, .{}) catch |err| {
7047 fatal("unable to create {s} file: {s}", .{ Package.Manifest.basename, err });
70427048 };
7043
7049 defer file.close();
7050 var buffer: [4096]u8 = undefined;
7051 var bw: std.io.BufferedWriter = .{
7052 .unbuffered_writer = file.writer(),
7053 .buffer = &buffer,
7054 };
7055 ast.render(gpa, &bw, fixups) catch |err| fatal("failed to render AST to {s}: {s}", .{
7056 Package.Manifest.basename, err,
7057 });
7058 bw.flush() catch |err| fatal("failed to flush {s}: {s}", .{ Package.Manifest.basename, err });
70447059 return cleanExit();
70457060}
70467061
src/print_env.zig+8-6
......@@ -4,7 +4,7 @@ const introspect = @import("introspect.zig");
44const Allocator = std.mem.Allocator;
55const fatal = std.process.fatal;
66
7pub fn cmdEnv(arena: Allocator, args: []const []const u8, stdout: std.fs.File.Writer) !void {
7pub fn cmdEnv(arena: Allocator, args: []const []const u8) !void {
88 _ = args;
99 const cwd_path = try introspect.getResolvedCwd(arena);
1010 const self_exe_path = try std.fs.selfExePathAlloc(arena);
......@@ -21,10 +21,12 @@ pub fn cmdEnv(arena: Allocator, args: []const []const u8, stdout: std.fs.File.Wr
2121 const host = try std.zig.system.resolveTargetQuery(.{});
2222 const triple = try host.zigTriple(arena);
2323
24 var bw = std.io.bufferedWriter(stdout);
25 const w = bw.writer();
26
27 var jws = std.json.writeStream(w, .{ .whitespace = .indent_1 });
24 var buffer: [1024]u8 = undefined;
25 var bw: std.io.BufferedWriter = .{
26 .buffer = &buffer,
27 .unbuffered_writer = std.io.getStdOut().writer(),
28 };
29 var jws = std.json.writeStream(bw, .{ .whitespace = .indent_1 });
2830
2931 try jws.beginObject();
3032
......@@ -55,7 +57,7 @@ pub fn cmdEnv(arena: Allocator, args: []const []const u8, stdout: std.fs.File.Wr
5557 try jws.endObject();
5658
5759 try jws.endObject();
58 try w.writeByte('\n');
60 try bw.writeByte('\n');
5961
6062 try bw.flush();
6163}
src/print_targets.zig+26-30
......@@ -11,36 +11,36 @@ const assert = std.debug.assert;
1111const glibc = @import("libs/glibc.zig");
1212const introspect = @import("introspect.zig");
1313
14pub fn cmdTargets(
15 allocator: Allocator,
16 args: []const []const u8,
17 /// Output stream
18 stdout: anytype,
19 native_target: *const Target,
20) !void {
14pub fn cmdTargets(arena: Allocator, args: []const []const u8) anyerror!void {
2115 _ = args;
22 var zig_lib_directory = introspect.findZigLibDir(allocator) catch |err| {
16 const host = std.zig.resolveTargetQueryOrFatal(.{});
17 var buffer: [1024]u8 = undefined;
18 var bw: std.io.BufferedWriter = .{
19 .unbuffered_writer = io.getStdOut().writer(),
20 .buffer = &buffer,
21 };
22 try print(arena, &bw, host);
23 try bw.flush();
24}
25
26fn print(arena: Allocator, output: *std.io.BufferedWriter, host: *const Target) anyerror!void {
27 var zig_lib_directory = introspect.findZigLibDir(arena) catch |err| {
2328 fatal("unable to find zig installation directory: {s}\n", .{@errorName(err)});
2429 };
2530 defer zig_lib_directory.handle.close();
26 defer allocator.free(zig_lib_directory.path.?);
2731
2832 const abilists_contents = zig_lib_directory.handle.readFileAlloc(
29 allocator,
33 arena,
3034 glibc.abilists_path,
3135 glibc.abilists_max_size,
3236 ) catch |err| switch (err) {
3337 error.OutOfMemory => return error.OutOfMemory,
3438 else => fatal("unable to read " ++ glibc.abilists_path ++ ": {s}", .{@errorName(err)}),
3539 };
36 defer allocator.free(abilists_contents);
3740
38 const glibc_abi = try glibc.loadMetaData(allocator, abilists_contents);
39 defer glibc_abi.destroy(allocator);
41 const glibc_abi = try glibc.loadMetaData(arena, abilists_contents);
4042
41 var bw = io.bufferedWriter(stdout);
42 const w = bw.writer();
43 var sz = std.zon.stringify.serializer(w, .{});
43 var sz = std.zon.stringify.serializer(output, .{});
4444
4545 {
4646 var root_obj = try sz.beginStruct(.{});
......@@ -52,10 +52,9 @@ pub fn cmdTargets(
5252 {
5353 var libc_obj = try root_obj.beginTupleField("libc", .{});
5454 for (std.zig.target.available_libcs) |libc| {
55 const tmp = try std.fmt.allocPrint(allocator, "{s}-{s}-{s}", .{
55 const tmp = try std.fmt.allocPrint(arena, "{s}-{s}-{s}", .{
5656 @tagName(libc.arch), @tagName(libc.os), @tagName(libc.abi),
5757 });
58 defer allocator.free(tmp);
5958 try libc_obj.field(tmp, .{});
6059 }
6160 try libc_obj.end();
......@@ -64,8 +63,7 @@ pub fn cmdTargets(
6463 {
6564 var glibc_obj = try root_obj.beginTupleField("glibc", .{});
6665 for (glibc_abi.all_versions) |ver| {
67 const tmp = try std.fmt.allocPrint(allocator, "{}", .{ver});
68 defer allocator.free(tmp);
66 const tmp = try std.fmt.allocPrint(arena, "{}", .{ver});
6967 try glibc_obj.field(tmp, .{});
7068 }
7169 try glibc_obj.end();
......@@ -105,21 +103,20 @@ pub fn cmdTargets(
105103 {
106104 var native_obj = try root_obj.beginStructField("native", .{});
107105 {
108 const triple = try native_target.zigTriple(allocator);
109 defer allocator.free(triple);
106 const triple = try host.zigTriple(arena);
110107 try native_obj.field("triple", triple, .{});
111108 }
112109 {
113110 var cpu_obj = try native_obj.beginStructField("cpu", .{});
114 try cpu_obj.field("arch", @tagName(native_target.cpu.arch), .{});
111 try cpu_obj.field("arch", @tagName(host.cpu.arch), .{});
115112
116 try cpu_obj.field("name", native_target.cpu.model.name, .{});
113 try cpu_obj.field("name", host.cpu.model.name, .{});
117114
118115 {
119116 var features = try native_obj.beginTupleField("features", .{});
120 for (native_target.cpu.arch.allFeaturesList(), 0..) |feature, i_usize| {
117 for (host.cpu.arch.allFeaturesList(), 0..) |feature, i_usize| {
121118 const index = @as(Target.Cpu.Feature.Set.Index, @intCast(i_usize));
122 if (native_target.cpu.features.isEnabled(index)) {
119 if (host.cpu.features.isEnabled(index)) {
123120 try features.field(feature.name, .{});
124121 }
125122 }
......@@ -128,14 +125,13 @@ pub fn cmdTargets(
128125 try cpu_obj.end();
129126 }
130127
131 try native_obj.field("os", @tagName(native_target.os.tag), .{});
132 try native_obj.field("abi", @tagName(native_target.abi), .{});
128 try native_obj.field("os", @tagName(host.os.tag), .{});
129 try native_obj.field("abi", @tagName(host.abi), .{});
133130 try native_obj.end();
134131 }
135132
136133 try root_obj.end();
137134 }
138135
139 try w.writeByte('\n');
140 return bw.flush();
136 try output.writeByte('\n');
141137}
src/print_zir.zig+161-173
......@@ -9,13 +9,8 @@ const Zir = std.zig.Zir;
99const Zcu = @import("Zcu.zig");
1010const LazySrcLoc = Zcu.LazySrcLoc;
1111
12/// Write human-readable, debug formatted ZIR code to a file.
13pub fn renderAsTextToFile(
14 gpa: Allocator,
15 tree: ?Ast,
16 zir: Zir,
17 fs_file: std.fs.File,
18) !void {
12/// Write human-readable, debug formatted ZIR code.
13pub fn renderAsText(gpa: Allocator, tree: ?Ast, zir: Zir, bw: *std.io.BufferedWriter) anyerror!void {
1914 var arena = std.heap.ArenaAllocator.init(gpa);
2015 defer arena.deinit();
2116
......@@ -30,16 +25,13 @@ pub fn renderAsTextToFile(
3025 .recurse_blocks = true,
3126 };
3227
33 var raw_stream = std.io.bufferedWriter(fs_file.writer());
34 const stream = raw_stream.writer();
35
3628 const main_struct_inst: Zir.Inst.Index = .main_struct_inst;
37 try stream.print("%{d} ", .{@intFromEnum(main_struct_inst)});
38 try writer.writeInstToStream(stream, main_struct_inst);
39 try stream.writeAll("\n");
29 try bw.print("%{d} ", .{@intFromEnum(main_struct_inst)});
30 try writer.writeInstToStream(bw, main_struct_inst);
31 try bw.writeAll("\n");
4032 const imports_index = zir.extra[@intFromEnum(Zir.ExtraIndex.imports)];
4133 if (imports_index != 0) {
42 try stream.writeAll("Imports:\n");
34 try bw.writeAll("Imports:\n");
4335
4436 const extra = zir.extraData(Zir.Inst.Imports, imports_index);
4537 var extra_index = extra.end;
......@@ -49,15 +41,13 @@ pub fn renderAsTextToFile(
4941 extra_index = item.end;
5042
5143 const import_path = zir.nullTerminatedString(item.data.name);
52 try stream.print(" @import(\"{}\") ", .{
44 try bw.print(" @import(\"{}\") ", .{
5345 std.zig.fmtEscapes(import_path),
5446 });
55 try writer.writeSrcTokAbs(stream, item.data.token);
56 try stream.writeAll("\n");
47 try writer.writeSrcTokAbs(bw, item.data.token);
48 try bw.writeAll("\n");
5749 }
5850 }
59
60 try raw_stream.flush();
6151}
6252
6353pub fn renderInstructionContext(
......@@ -67,7 +57,7 @@ pub fn renderInstructionContext(
6757 scope_file: *Zcu.File,
6858 parent_decl_node: Ast.Node.Index,
6959 indent: u32,
70 stream: anytype,
60 bw: *std.io.BufferedWriter,
7161) !void {
7262 var arena = std.heap.ArenaAllocator.init(gpa);
7363 defer arena.deinit();
......@@ -83,13 +73,13 @@ pub fn renderInstructionContext(
8373 .recurse_blocks = true,
8474 };
8575
86 try writer.writeBody(stream, block[0..block_index]);
87 try stream.writeByteNTimes(' ', writer.indent - 2);
88 try stream.print("> %{d} ", .{@intFromEnum(block[block_index])});
89 try writer.writeInstToStream(stream, block[block_index]);
90 try stream.writeByte('\n');
76 try writer.writeBody(bw, block[0..block_index]);
77 try bw.splatByteAll(' ', writer.indent - 2);
78 try bw.print("> %{d} ", .{@intFromEnum(block[block_index])});
79 try writer.writeInstToStream(bw, block[block_index]);
80 try bw.writeByte('\n');
9181 if (block_index + 1 < block.len) {
92 try writer.writeBody(stream, block[block_index + 1 ..]);
82 try writer.writeBody(bw, block[block_index + 1 ..]);
9383 }
9484}
9585
......@@ -99,7 +89,7 @@ pub fn renderSingleInstruction(
9989 scope_file: *Zcu.File,
10090 parent_decl_node: Ast.Node.Index,
10191 indent: u32,
102 stream: anytype,
92 bw: *std.io.BufferedWriter,
10393) !void {
10494 var arena = std.heap.ArenaAllocator.init(gpa);
10595 defer arena.deinit();
......@@ -115,8 +105,8 @@ pub fn renderSingleInstruction(
115105 .recurse_blocks = false,
116106 };
117107
118 try stream.print("%{d} ", .{@intFromEnum(inst)});
119 try writer.writeInstToStream(stream, inst);
108 try bw.print("%{d} ", .{@intFromEnum(inst)});
109 try writer.writeInstToStream(bw, inst);
120110}
121111
122112const Writer = struct {
......@@ -188,9 +178,9 @@ const Writer = struct {
188178
189179 fn writeInstToStream(
190180 self: *Writer,
191 stream: anytype,
181 stream: *std.io.BufferedWriter,
192182 inst: Zir.Inst.Index,
193 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
183 ) anyerror!void {
194184 const tags = self.code.instructions.items(.tag);
195185 const tag = tags[@intFromEnum(inst)];
196186 try stream.print("= {s}(", .{@tagName(tags[@intFromEnum(inst)])});
......@@ -518,7 +508,7 @@ const Writer = struct {
518508 }
519509 }
520510
521 fn writeExtended(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
511 fn writeExtended(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
522512 const extended = self.code.instructions.items(.data)[@intFromEnum(inst)].extended;
523513 try stream.print("{s}(", .{@tagName(extended.opcode)});
524514 switch (extended.opcode) {
......@@ -627,13 +617,13 @@ const Writer = struct {
627617 }
628618 }
629619
630 fn writeExtNode(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
620 fn writeExtNode(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
631621 try stream.writeAll(")) ");
632622 const src_node: Ast.Node.Offset = @enumFromInt(@as(i32, @bitCast(extended.operand)));
633623 try self.writeSrcNode(stream, src_node);
634624 }
635625
636 fn writeArrayInitElemType(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
626 fn writeArrayInitElemType(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
637627 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].bin;
638628 try self.writeInstRef(stream, inst_data.lhs);
639629 try stream.print(", {d})", .{@intFromEnum(inst_data.rhs)});
......@@ -641,9 +631,9 @@ const Writer = struct {
641631
642632 fn writeUnNode(
643633 self: *Writer,
644 stream: anytype,
634 stream: *std.io.BufferedWriter,
645635 inst: Zir.Inst.Index,
646 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
636 ) anyerror!void {
647637 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].un_node;
648638 try self.writeInstRef(stream, inst_data.operand);
649639 try stream.writeAll(") ");
......@@ -652,9 +642,9 @@ const Writer = struct {
652642
653643 fn writeUnTok(
654644 self: *Writer,
655 stream: anytype,
645 stream: *std.io.BufferedWriter,
656646 inst: Zir.Inst.Index,
657 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
647 ) anyerror!void {
658648 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].un_tok;
659649 try self.writeInstRef(stream, inst_data.operand);
660650 try stream.writeAll(") ");
......@@ -663,9 +653,9 @@ const Writer = struct {
663653
664654 fn writeValidateDestructure(
665655 self: *Writer,
666 stream: anytype,
656 stream: *std.io.BufferedWriter,
667657 inst: Zir.Inst.Index,
668 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
658 ) anyerror!void {
669659 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
670660 const extra = self.code.extraData(Zir.Inst.ValidateDestructure, inst_data.payload_index).data;
671661 try self.writeInstRef(stream, extra.operand);
......@@ -677,9 +667,9 @@ const Writer = struct {
677667
678668 fn writeValidateArrayInitTy(
679669 self: *Writer,
680 stream: anytype,
670 stream: *std.io.BufferedWriter,
681671 inst: Zir.Inst.Index,
682 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
672 ) anyerror!void {
683673 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
684674 const extra = self.code.extraData(Zir.Inst.ArrayInit, inst_data.payload_index).data;
685675 try self.writeInstRef(stream, extra.ty);
......@@ -689,9 +679,9 @@ const Writer = struct {
689679
690680 fn writeArrayTypeSentinel(
691681 self: *Writer,
692 stream: anytype,
682 stream: *std.io.BufferedWriter,
693683 inst: Zir.Inst.Index,
694 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
684 ) anyerror!void {
695685 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
696686 const extra = self.code.extraData(Zir.Inst.ArrayTypeSentinel, inst_data.payload_index).data;
697687 try self.writeInstRef(stream, extra.len);
......@@ -705,9 +695,9 @@ const Writer = struct {
705695
706696 fn writePtrType(
707697 self: *Writer,
708 stream: anytype,
698 stream: *std.io.BufferedWriter,
709699 inst: Zir.Inst.Index,
710 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
700 ) anyerror!void {
711701 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].ptr_type;
712702 const str_allowzero = if (inst_data.flags.is_allowzero) "allowzero, " else "";
713703 const str_const = if (!inst_data.flags.is_mutable) "const, " else "";
......@@ -748,12 +738,12 @@ const Writer = struct {
748738 try self.writeSrcNode(stream, extra.data.src_node);
749739 }
750740
751 fn writeInt(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
741 fn writeInt(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
752742 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].int;
753743 try stream.print("{d})", .{inst_data});
754744 }
755745
756 fn writeIntBig(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
746 fn writeIntBig(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
757747 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].str;
758748 const byte_count = inst_data.len * @sizeOf(std.math.big.Limb);
759749 const limb_bytes = self.code.string_bytes[@intFromEnum(inst_data.start)..][0..byte_count];
......@@ -772,12 +762,12 @@ const Writer = struct {
772762 try stream.print("{s})", .{as_string});
773763 }
774764
775 fn writeFloat(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
765 fn writeFloat(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
776766 const number = self.code.instructions.items(.data)[@intFromEnum(inst)].float;
777767 try stream.print("{d})", .{number});
778768 }
779769
780 fn writeFloat128(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
770 fn writeFloat128(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
781771 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
782772 const extra = self.code.extraData(Zir.Inst.Float128, inst_data.payload_index).data;
783773 const number = extra.get();
......@@ -788,15 +778,15 @@ const Writer = struct {
788778
789779 fn writeStr(
790780 self: *Writer,
791 stream: anytype,
781 stream: *std.io.BufferedWriter,
792782 inst: Zir.Inst.Index,
793 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
783 ) anyerror!void {
794784 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].str;
795785 const str = inst_data.get(self.code);
796786 try stream.print("\"{}\")", .{std.zig.fmtEscapes(str)});
797787 }
798788
799 fn writeSliceStart(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
789 fn writeSliceStart(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
800790 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
801791 const extra = self.code.extraData(Zir.Inst.SliceStart, inst_data.payload_index).data;
802792 try self.writeInstRef(stream, extra.lhs);
......@@ -806,7 +796,7 @@ const Writer = struct {
806796 try self.writeSrcNode(stream, inst_data.src_node);
807797 }
808798
809 fn writeSliceEnd(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
799 fn writeSliceEnd(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
810800 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
811801 const extra = self.code.extraData(Zir.Inst.SliceEnd, inst_data.payload_index).data;
812802 try self.writeInstRef(stream, extra.lhs);
......@@ -818,7 +808,7 @@ const Writer = struct {
818808 try self.writeSrcNode(stream, inst_data.src_node);
819809 }
820810
821 fn writeSliceSentinel(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
811 fn writeSliceSentinel(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
822812 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
823813 const extra = self.code.extraData(Zir.Inst.SliceSentinel, inst_data.payload_index).data;
824814 try self.writeInstRef(stream, extra.lhs);
......@@ -832,7 +822,7 @@ const Writer = struct {
832822 try self.writeSrcNode(stream, inst_data.src_node);
833823 }
834824
835 fn writeSliceLength(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
825 fn writeSliceLength(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
836826 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
837827 const extra = self.code.extraData(Zir.Inst.SliceLength, inst_data.payload_index).data;
838828 try self.writeInstRef(stream, extra.lhs);
......@@ -848,7 +838,7 @@ const Writer = struct {
848838 try self.writeSrcNode(stream, inst_data.src_node);
849839 }
850840
851 fn writeUnionInit(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
841 fn writeUnionInit(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
852842 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
853843 const extra = self.code.extraData(Zir.Inst.UnionInit, inst_data.payload_index).data;
854844 try self.writeInstRef(stream, extra.union_type);
......@@ -860,7 +850,7 @@ const Writer = struct {
860850 try self.writeSrcNode(stream, inst_data.src_node);
861851 }
862852
863 fn writeShuffle(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
853 fn writeShuffle(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
864854 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
865855 const extra = self.code.extraData(Zir.Inst.Shuffle, inst_data.payload_index).data;
866856 try self.writeInstRef(stream, extra.elem_type);
......@@ -874,7 +864,7 @@ const Writer = struct {
874864 try self.writeSrcNode(stream, inst_data.src_node);
875865 }
876866
877 fn writeSelect(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
867 fn writeSelect(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
878868 const extra = self.code.extraData(Zir.Inst.Select, extended.operand).data;
879869 try self.writeInstRef(stream, extra.elem_type);
880870 try stream.writeAll(", ");
......@@ -887,7 +877,7 @@ const Writer = struct {
887877 try self.writeSrcNode(stream, extra.node);
888878 }
889879
890 fn writeMulAdd(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
880 fn writeMulAdd(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
891881 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
892882 const extra = self.code.extraData(Zir.Inst.MulAdd, inst_data.payload_index).data;
893883 try self.writeInstRef(stream, extra.mulend1);
......@@ -899,7 +889,7 @@ const Writer = struct {
899889 try self.writeSrcNode(stream, inst_data.src_node);
900890 }
901891
902 fn writeBuiltinCall(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
892 fn writeBuiltinCall(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
903893 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
904894 const extra = self.code.extraData(Zir.Inst.BuiltinCall, inst_data.payload_index).data;
905895
......@@ -915,7 +905,7 @@ const Writer = struct {
915905 try self.writeSrcNode(stream, inst_data.src_node);
916906 }
917907
918 fn writeFieldParentPtr(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
908 fn writeFieldParentPtr(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
919909 const extra = self.code.extraData(Zir.Inst.FieldParentPtr, extended.operand).data;
920910 const FlagsInt = @typeInfo(Zir.Inst.FullPtrCastFlags).@"struct".backing_integer.?;
921911 const flags: Zir.Inst.FullPtrCastFlags = @bitCast(@as(FlagsInt, @truncate(extended.small)));
......@@ -932,7 +922,7 @@ const Writer = struct {
932922 try self.writeSrcNode(stream, extra.src_node);
933923 }
934924
935 fn writeBuiltinAsyncCall(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
925 fn writeBuiltinAsyncCall(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
936926 const extra = self.code.extraData(Zir.Inst.AsyncCall, extended.operand).data;
937927 try self.writeInstRef(stream, extra.frame_buffer);
938928 try stream.writeAll(", ");
......@@ -945,7 +935,7 @@ const Writer = struct {
945935 try self.writeSrcNode(stream, extra.node);
946936 }
947937
948 fn writeParam(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
938 fn writeParam(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
949939 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_tok;
950940 const extra = self.code.extraData(Zir.Inst.Param, inst_data.payload_index);
951941 const body = self.code.bodySlice(extra.end, extra.data.type.body_len);
......@@ -960,7 +950,7 @@ const Writer = struct {
960950 try self.writeSrcTok(stream, inst_data.src_tok);
961951 }
962952
963 fn writePlNodeBin(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
953 fn writePlNodeBin(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
964954 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
965955 const extra = self.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
966956 try self.writeInstRef(stream, extra.lhs);
......@@ -970,7 +960,7 @@ const Writer = struct {
970960 try self.writeSrcNode(stream, inst_data.src_node);
971961 }
972962
973 fn writePlNodeMultiOp(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
963 fn writePlNodeMultiOp(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
974964 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
975965 const extra = self.code.extraData(Zir.Inst.MultiOp, inst_data.payload_index);
976966 const args = self.code.refSlice(extra.end, extra.data.operands_len);
......@@ -983,7 +973,7 @@ const Writer = struct {
983973 try self.writeSrcNode(stream, inst_data.src_node);
984974 }
985975
986 fn writeArrayMul(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
976 fn writeArrayMul(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
987977 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
988978 const extra = self.code.extraData(Zir.Inst.ArrayMul, inst_data.payload_index).data;
989979 try self.writeInstRef(stream, extra.res_ty);
......@@ -995,13 +985,13 @@ const Writer = struct {
995985 try self.writeSrcNode(stream, inst_data.src_node);
996986 }
997987
998 fn writeElemValImm(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
988 fn writeElemValImm(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
999989 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].elem_val_imm;
1000990 try self.writeInstRef(stream, inst_data.operand);
1001991 try stream.print(", {d})", .{inst_data.idx});
1002992 }
1003993
1004 fn writeArrayInitElemPtr(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
994 fn writeArrayInitElemPtr(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
1005995 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
1006996 const extra = self.code.extraData(Zir.Inst.ElemPtrImm, inst_data.payload_index).data;
1007997
......@@ -1010,7 +1000,7 @@ const Writer = struct {
10101000 try self.writeSrcNode(stream, inst_data.src_node);
10111001 }
10121002
1013 fn writePlNodeExport(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1003 fn writePlNodeExport(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
10141004 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
10151005 const extra = self.code.extraData(Zir.Inst.Export, inst_data.payload_index).data;
10161006
......@@ -1021,7 +1011,7 @@ const Writer = struct {
10211011 try self.writeSrcNode(stream, inst_data.src_node);
10221012 }
10231013
1024 fn writeValidateArrayInitRefTy(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1014 fn writeValidateArrayInitRefTy(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
10251015 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
10261016 const extra = self.code.extraData(Zir.Inst.ArrayInitRefTy, inst_data.payload_index).data;
10271017
......@@ -1031,7 +1021,7 @@ const Writer = struct {
10311021 try self.writeSrcNode(stream, inst_data.src_node);
10321022 }
10331023
1034 fn writeStructInit(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1024 fn writeStructInit(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
10351025 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
10361026 const extra = self.code.extraData(Zir.Inst.StructInit, inst_data.payload_index);
10371027 var field_i: u32 = 0;
......@@ -1055,7 +1045,7 @@ const Writer = struct {
10551045 try self.writeSrcNode(stream, inst_data.src_node);
10561046 }
10571047
1058 fn writeCmpxchg(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
1048 fn writeCmpxchg(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
10591049 const extra = self.code.extraData(Zir.Inst.Cmpxchg, extended.operand).data;
10601050
10611051 try self.writeInstRef(stream, extra.ptr);
......@@ -1071,7 +1061,7 @@ const Writer = struct {
10711061 try self.writeSrcNode(stream, extra.node);
10721062 }
10731063
1074 fn writePtrCastFull(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
1064 fn writePtrCastFull(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
10751065 const FlagsInt = @typeInfo(Zir.Inst.FullPtrCastFlags).@"struct".backing_integer.?;
10761066 const flags: Zir.Inst.FullPtrCastFlags = @bitCast(@as(FlagsInt, @truncate(extended.small)));
10771067 const extra = self.code.extraData(Zir.Inst.BinNode, extended.operand).data;
......@@ -1087,7 +1077,7 @@ const Writer = struct {
10871077 try self.writeSrcNode(stream, extra.node);
10881078 }
10891079
1090 fn writePtrCastNoDest(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
1080 fn writePtrCastNoDest(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
10911081 const FlagsInt = @typeInfo(Zir.Inst.FullPtrCastFlags).@"struct".backing_integer.?;
10921082 const flags: Zir.Inst.FullPtrCastFlags = @bitCast(@as(FlagsInt, @truncate(extended.small)));
10931083 const extra = self.code.extraData(Zir.Inst.UnNode, extended.operand).data;
......@@ -1098,7 +1088,7 @@ const Writer = struct {
10981088 try self.writeSrcNode(stream, extra.node);
10991089 }
11001090
1101 fn writeAtomicLoad(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1091 fn writeAtomicLoad(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
11021092 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
11031093 const extra = self.code.extraData(Zir.Inst.AtomicLoad, inst_data.payload_index).data;
11041094
......@@ -1111,7 +1101,7 @@ const Writer = struct {
11111101 try self.writeSrcNode(stream, inst_data.src_node);
11121102 }
11131103
1114 fn writeAtomicStore(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1104 fn writeAtomicStore(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
11151105 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
11161106 const extra = self.code.extraData(Zir.Inst.AtomicStore, inst_data.payload_index).data;
11171107
......@@ -1124,7 +1114,7 @@ const Writer = struct {
11241114 try self.writeSrcNode(stream, inst_data.src_node);
11251115 }
11261116
1127 fn writeAtomicRmw(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1117 fn writeAtomicRmw(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
11281118 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
11291119 const extra = self.code.extraData(Zir.Inst.AtomicRmw, inst_data.payload_index).data;
11301120
......@@ -1139,7 +1129,7 @@ const Writer = struct {
11391129 try self.writeSrcNode(stream, inst_data.src_node);
11401130 }
11411131
1142 fn writeStructInitAnon(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1132 fn writeStructInitAnon(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
11431133 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
11441134 const extra = self.code.extraData(Zir.Inst.StructInitAnon, inst_data.payload_index);
11451135 var field_i: u32 = 0;
......@@ -1160,7 +1150,7 @@ const Writer = struct {
11601150 try self.writeSrcNode(stream, inst_data.src_node);
11611151 }
11621152
1163 fn writeStructInitFieldType(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1153 fn writeStructInitFieldType(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
11641154 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
11651155 const extra = self.code.extraData(Zir.Inst.FieldType, inst_data.payload_index).data;
11661156 try self.writeInstRef(stream, extra.container_type);
......@@ -1169,7 +1159,7 @@ const Writer = struct {
11691159 try self.writeSrcNode(stream, inst_data.src_node);
11701160 }
11711161
1172 fn writeFieldTypeRef(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1162 fn writeFieldTypeRef(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
11731163 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
11741164 const extra = self.code.extraData(Zir.Inst.FieldTypeRef, inst_data.payload_index).data;
11751165 try self.writeInstRef(stream, extra.container_type);
......@@ -1179,7 +1169,7 @@ const Writer = struct {
11791169 try self.writeSrcNode(stream, inst_data.src_node);
11801170 }
11811171
1182 fn writeNodeMultiOp(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
1172 fn writeNodeMultiOp(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
11831173 const extra = self.code.extraData(Zir.Inst.NodeMultiOp, extended.operand);
11841174 const operands = self.code.refSlice(extra.end, extended.small);
11851175
......@@ -1193,9 +1183,9 @@ const Writer = struct {
11931183
11941184 fn writeInstNode(
11951185 self: *Writer,
1196 stream: anytype,
1186 stream: *std.io.BufferedWriter,
11971187 inst: Zir.Inst.Index,
1198 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
1188 ) anyerror!void {
11991189 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].inst_node;
12001190 try self.writeInstIndex(stream, inst_data.inst);
12011191 try stream.writeAll(") ");
......@@ -1204,7 +1194,7 @@ const Writer = struct {
12041194
12051195 fn writeAsm(
12061196 self: *Writer,
1207 stream: anytype,
1197 stream: *std.io.BufferedWriter,
12081198 extended: Zir.Inst.Extended.InstData,
12091199 tmpl_is_expr: bool,
12101200 ) !void {
......@@ -1282,7 +1272,7 @@ const Writer = struct {
12821272 try self.writeSrcNode(stream, extra.data.src_node);
12831273 }
12841274
1285 fn writeOverflowArithmetic(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
1275 fn writeOverflowArithmetic(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
12861276 const extra = self.code.extraData(Zir.Inst.BinNode, extended.operand).data;
12871277
12881278 try self.writeInstRef(stream, extra.lhs);
......@@ -1294,7 +1284,7 @@ const Writer = struct {
12941284
12951285 fn writeCall(
12961286 self: *Writer,
1297 stream: anytype,
1287 stream: *std.io.BufferedWriter,
12981288 inst: Zir.Inst.Index,
12991289 comptime kind: enum { direct, field },
13001290 ) !void {
......@@ -1328,7 +1318,7 @@ const Writer = struct {
13281318 var i: usize = 0;
13291319 var arg_start: u32 = args_len;
13301320 while (i < args_len) : (i += 1) {
1331 try stream.writeByteNTimes(' ', self.indent);
1321 try stream.splatByteAll(' ', self.indent);
13321322 const arg_end = self.code.extra[extra.end + i];
13331323 defer arg_start = arg_end;
13341324 const arg_body = body[arg_start..arg_end];
......@@ -1338,14 +1328,14 @@ const Writer = struct {
13381328 }
13391329 self.indent -= 2;
13401330 if (args_len != 0) {
1341 try stream.writeByteNTimes(' ', self.indent);
1331 try stream.splatByteAll(' ', self.indent);
13421332 }
13431333
13441334 try stream.writeAll("]) ");
13451335 try self.writeSrcNode(stream, inst_data.src_node);
13461336 }
13471337
1348 fn writeBlock(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1338 fn writeBlock(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
13491339 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
13501340 const extra = self.code.extraData(Zir.Inst.Block, inst_data.payload_index);
13511341 const body = self.code.bodySlice(extra.end, extra.data.body_len);
......@@ -1354,7 +1344,7 @@ const Writer = struct {
13541344 try self.writeSrcNode(stream, inst_data.src_node);
13551345 }
13561346
1357 fn writeBlockComptime(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1347 fn writeBlockComptime(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
13581348 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
13591349 const extra = self.code.extraData(Zir.Inst.BlockComptime, inst_data.payload_index);
13601350 const body = self.code.bodySlice(extra.end, extra.data.body_len);
......@@ -1364,7 +1354,7 @@ const Writer = struct {
13641354 try self.writeSrcNode(stream, inst_data.src_node);
13651355 }
13661356
1367 fn writeCondBr(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1357 fn writeCondBr(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
13681358 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
13691359 const extra = self.code.extraData(Zir.Inst.CondBr, inst_data.payload_index);
13701360 const then_body = self.code.bodySlice(extra.end, extra.data.then_body_len);
......@@ -1378,7 +1368,7 @@ const Writer = struct {
13781368 try self.writeSrcNode(stream, inst_data.src_node);
13791369 }
13801370
1381 fn writeTry(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1371 fn writeTry(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
13821372 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
13831373 const extra = self.code.extraData(Zir.Inst.Try, inst_data.payload_index);
13841374 const body = self.code.bodySlice(extra.end, extra.data.body_len);
......@@ -1389,7 +1379,7 @@ const Writer = struct {
13891379 try self.writeSrcNode(stream, inst_data.src_node);
13901380 }
13911381
1392 fn writeStructDecl(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
1382 fn writeStructDecl(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
13931383 const small: Zir.Inst.StructDecl.Small = @bitCast(extended.small);
13941384
13951385 const extra = self.code.extraData(Zir.Inst.StructDecl, extended.operand);
......@@ -1405,7 +1395,7 @@ const Writer = struct {
14051395 extra.data.fields_hash_3,
14061396 });
14071397
1408 try stream.print("hash({}) ", .{std.fmt.fmtSliceHexLower(&fields_hash)});
1398 try stream.print("hash({x}) ", .{&fields_hash});
14091399
14101400 var extra_index: usize = extra.end;
14111401
......@@ -1463,7 +1453,7 @@ const Writer = struct {
14631453 try self.writeBody(stream, self.code.bodySlice(extra_index, decls_len));
14641454 self.indent -= 2;
14651455 extra_index += decls_len;
1466 try stream.writeByteNTimes(' ', self.indent);
1456 try stream.splatByteAll(' ', self.indent);
14671457 try stream.writeAll("}, ");
14681458 }
14691459
......@@ -1532,7 +1522,7 @@ const Writer = struct {
15321522 self.indent += 2;
15331523
15341524 for (fields, 0..) |field, i| {
1535 try stream.writeByteNTimes(' ', self.indent);
1525 try stream.splatByteAll(' ', self.indent);
15361526 try self.writeFlag(stream, "comptime ", field.is_comptime);
15371527 if (field.name != .empty) {
15381528 const field_name = self.code.nullTerminatedString(field.name);
......@@ -1575,13 +1565,13 @@ const Writer = struct {
15751565 }
15761566
15771567 self.indent -= 2;
1578 try stream.writeByteNTimes(' ', self.indent);
1568 try stream.splatByteAll(' ', self.indent);
15791569 try stream.writeAll("}) ");
15801570 }
15811571 try self.writeSrcNode(stream, .zero);
15821572 }
15831573
1584 fn writeUnionDecl(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
1574 fn writeUnionDecl(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
15851575 const small = @as(Zir.Inst.UnionDecl.Small, @bitCast(extended.small));
15861576
15871577 const extra = self.code.extraData(Zir.Inst.UnionDecl, extended.operand);
......@@ -1597,7 +1587,7 @@ const Writer = struct {
15971587 extra.data.fields_hash_3,
15981588 });
15991589
1600 try stream.print("hash({}) ", .{std.fmt.fmtSliceHexLower(&fields_hash)});
1590 try stream.print("hash({x}) ", .{&fields_hash});
16011591
16021592 var extra_index: usize = extra.end;
16031593
......@@ -1647,7 +1637,7 @@ const Writer = struct {
16471637 try self.writeBody(stream, self.code.bodySlice(extra_index, decls_len));
16481638 self.indent -= 2;
16491639 extra_index += decls_len;
1650 try stream.writeByteNTimes(' ', self.indent);
1640 try stream.splatByteAll(' ', self.indent);
16511641 try stream.writeAll("}");
16521642 }
16531643
......@@ -1698,7 +1688,7 @@ const Writer = struct {
16981688 const field_name = self.code.nullTerminatedString(field_name_index);
16991689 extra_index += 1;
17001690
1701 try stream.writeByteNTimes(' ', self.indent);
1691 try stream.splatByteAll(' ', self.indent);
17021692 try stream.print("{p}", .{std.zig.fmtId(field_name)});
17031693
17041694 if (has_type) {
......@@ -1727,12 +1717,12 @@ const Writer = struct {
17271717 }
17281718
17291719 self.indent -= 2;
1730 try stream.writeByteNTimes(' ', self.indent);
1720 try stream.splatByteAll(' ', self.indent);
17311721 try stream.writeAll("}) ");
17321722 try self.writeSrcNode(stream, .zero);
17331723 }
17341724
1735 fn writeEnumDecl(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
1725 fn writeEnumDecl(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
17361726 const small = @as(Zir.Inst.EnumDecl.Small, @bitCast(extended.small));
17371727
17381728 const extra = self.code.extraData(Zir.Inst.EnumDecl, extended.operand);
......@@ -1748,7 +1738,7 @@ const Writer = struct {
17481738 extra.data.fields_hash_3,
17491739 });
17501740
1751 try stream.print("hash({}) ", .{std.fmt.fmtSliceHexLower(&fields_hash)});
1741 try stream.print("hash({x}) ", .{&fields_hash});
17521742
17531743 var extra_index: usize = extra.end;
17541744
......@@ -1796,7 +1786,7 @@ const Writer = struct {
17961786 try self.writeBody(stream, self.code.bodySlice(extra_index, decls_len));
17971787 self.indent -= 2;
17981788 extra_index += decls_len;
1799 try stream.writeByteNTimes(' ', self.indent);
1789 try stream.splatByteAll(' ', self.indent);
18001790 try stream.writeAll("}, ");
18011791 }
18021792
......@@ -1832,7 +1822,7 @@ const Writer = struct {
18321822 const field_name = self.code.nullTerminatedString(@enumFromInt(self.code.extra[extra_index]));
18331823 extra_index += 1;
18341824
1835 try stream.writeByteNTimes(' ', self.indent);
1825 try stream.splatByteAll(' ', self.indent);
18361826 try stream.print("{p}", .{std.zig.fmtId(field_name)});
18371827
18381828 if (has_tag_value) {
......@@ -1845,7 +1835,7 @@ const Writer = struct {
18451835 try stream.writeAll(",\n");
18461836 }
18471837 self.indent -= 2;
1848 try stream.writeByteNTimes(' ', self.indent);
1838 try stream.splatByteAll(' ', self.indent);
18491839 try stream.writeAll("}) ");
18501840 }
18511841 try self.writeSrcNode(stream, .zero);
......@@ -1853,7 +1843,7 @@ const Writer = struct {
18531843
18541844 fn writeOpaqueDecl(
18551845 self: *Writer,
1856 stream: anytype,
1846 stream: *std.io.BufferedWriter,
18571847 extended: Zir.Inst.Extended.InstData,
18581848 ) !void {
18591849 const small = @as(Zir.Inst.OpaqueDecl.Small, @bitCast(extended.small));
......@@ -1889,13 +1879,13 @@ const Writer = struct {
18891879 self.indent += 2;
18901880 try self.writeBody(stream, self.code.bodySlice(extra_index, decls_len));
18911881 self.indent -= 2;
1892 try stream.writeByteNTimes(' ', self.indent);
1882 try stream.splatByteAll(' ', self.indent);
18931883 try stream.writeAll("}) ");
18941884 }
18951885 try self.writeSrcNode(stream, .zero);
18961886 }
18971887
1898 fn writeTupleDecl(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
1888 fn writeTupleDecl(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
18991889 const fields_len = extended.small;
19001890 assert(fields_len != 0);
19011891 const extra = self.code.extraData(Zir.Inst.TupleDecl, extended.operand);
......@@ -1923,7 +1913,7 @@ const Writer = struct {
19231913
19241914 fn writeErrorSetDecl(
19251915 self: *Writer,
1926 stream: anytype,
1916 stream: *std.io.BufferedWriter,
19271917 inst: Zir.Inst.Index,
19281918 ) !void {
19291919 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
......@@ -1937,18 +1927,18 @@ const Writer = struct {
19371927 while (extra_index < extra_index_end) : (extra_index += 1) {
19381928 const name_index: Zir.NullTerminatedString = @enumFromInt(self.code.extra[extra_index]);
19391929 const name = self.code.nullTerminatedString(name_index);
1940 try stream.writeByteNTimes(' ', self.indent);
1930 try stream.splatByteAll(' ', self.indent);
19411931 try stream.print("{p},\n", .{std.zig.fmtId(name)});
19421932 }
19431933
19441934 self.indent -= 2;
1945 try stream.writeByteNTimes(' ', self.indent);
1935 try stream.splatByteAll(' ', self.indent);
19461936 try stream.writeAll("}) ");
19471937
19481938 try self.writeSrcNode(stream, inst_data.src_node);
19491939 }
19501940
1951 fn writeSwitchBlockErrUnion(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
1941 fn writeSwitchBlockErrUnion(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
19521942 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
19531943 const extra = self.code.extraData(Zir.Inst.SwitchBlockErrUnion, inst_data.payload_index);
19541944
......@@ -1984,7 +1974,7 @@ const Writer = struct {
19841974 extra_index += body.len;
19851975
19861976 try stream.writeAll(",\n");
1987 try stream.writeByteNTimes(' ', self.indent);
1977 try stream.splatByteAll(' ', self.indent);
19881978 try stream.writeAll("non_err => ");
19891979 try self.writeBracedBody(stream, body);
19901980 }
......@@ -2002,7 +1992,7 @@ const Writer = struct {
20021992 extra_index += body.len;
20031993
20041994 try stream.writeAll(",\n");
2005 try stream.writeByteNTimes(' ', self.indent);
1995 try stream.splatByteAll(' ', self.indent);
20061996 try stream.print("{s}{s}else => ", .{ capture_text, inline_text });
20071997 try self.writeBracedBody(stream, body);
20081998 }
......@@ -2019,7 +2009,7 @@ const Writer = struct {
20192009 extra_index += info.body_len;
20202010
20212011 try stream.writeAll(",\n");
2022 try stream.writeByteNTimes(' ', self.indent);
2012 try stream.splatByteAll(' ', self.indent);
20232013 switch (info.capture) {
20242014 .none => {},
20252015 .by_val => try stream.writeAll("by_val "),
......@@ -2044,7 +2034,7 @@ const Writer = struct {
20442034 extra_index += items_len;
20452035
20462036 try stream.writeAll(",\n");
2047 try stream.writeByteNTimes(' ', self.indent);
2037 try stream.splatByteAll(' ', self.indent);
20482038 switch (info.capture) {
20492039 .none => {},
20502040 .by_val => try stream.writeAll("by_val "),
......@@ -2085,7 +2075,7 @@ const Writer = struct {
20852075 try self.writeSrcNode(stream, inst_data.src_node);
20862076 }
20872077
2088 fn writeSwitchBlock(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2078 fn writeSwitchBlock(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
20892079 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
20902080 const extra = self.code.extraData(Zir.Inst.SwitchBlock, inst_data.payload_index);
20912081
......@@ -2132,7 +2122,7 @@ const Writer = struct {
21322122 extra_index += body.len;
21332123
21342124 try stream.writeAll(",\n");
2135 try stream.writeByteNTimes(' ', self.indent);
2125 try stream.splatByteAll(' ', self.indent);
21362126 try stream.print("{s}{s}{s} => ", .{ capture_text, inline_text, prong_name });
21372127 try self.writeBracedBody(stream, body);
21382128 }
......@@ -2149,7 +2139,7 @@ const Writer = struct {
21492139 extra_index += info.body_len;
21502140
21512141 try stream.writeAll(",\n");
2152 try stream.writeByteNTimes(' ', self.indent);
2142 try stream.splatByteAll(' ', self.indent);
21532143 switch (info.capture) {
21542144 .none => {},
21552145 .by_val => try stream.writeAll("by_val "),
......@@ -2174,7 +2164,7 @@ const Writer = struct {
21742164 extra_index += items_len;
21752165
21762166 try stream.writeAll(",\n");
2177 try stream.writeByteNTimes(' ', self.indent);
2167 try stream.splatByteAll(' ', self.indent);
21782168 switch (info.capture) {
21792169 .none => {},
21802170 .by_val => try stream.writeAll("by_val "),
......@@ -2215,7 +2205,7 @@ const Writer = struct {
22152205 try self.writeSrcNode(stream, inst_data.src_node);
22162206 }
22172207
2218 fn writePlNodeField(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2208 fn writePlNodeField(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
22192209 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
22202210 const extra = self.code.extraData(Zir.Inst.Field, inst_data.payload_index).data;
22212211 const name = self.code.nullTerminatedString(extra.field_name_start);
......@@ -2224,7 +2214,7 @@ const Writer = struct {
22242214 try self.writeSrcNode(stream, inst_data.src_node);
22252215 }
22262216
2227 fn writePlNodeFieldNamed(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2217 fn writePlNodeFieldNamed(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
22282218 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
22292219 const extra = self.code.extraData(Zir.Inst.FieldNamed, inst_data.payload_index).data;
22302220 try self.writeInstRef(stream, extra.lhs);
......@@ -2234,7 +2224,7 @@ const Writer = struct {
22342224 try self.writeSrcNode(stream, inst_data.src_node);
22352225 }
22362226
2237 fn writeAs(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2227 fn writeAs(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
22382228 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
22392229 const extra = self.code.extraData(Zir.Inst.As, inst_data.payload_index).data;
22402230 try self.writeInstRef(stream, extra.dest_type);
......@@ -2246,9 +2236,9 @@ const Writer = struct {
22462236
22472237 fn writeNode(
22482238 self: *Writer,
2249 stream: anytype,
2239 stream: *std.io.BufferedWriter,
22502240 inst: Zir.Inst.Index,
2251 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
2241 ) anyerror!void {
22522242 const src_node = self.code.instructions.items(.data)[@intFromEnum(inst)].node;
22532243 try stream.writeAll(") ");
22542244 try self.writeSrcNode(stream, src_node);
......@@ -2256,16 +2246,16 @@ const Writer = struct {
22562246
22572247 fn writeStrTok(
22582248 self: *Writer,
2259 stream: anytype,
2249 stream: *std.io.BufferedWriter,
22602250 inst: Zir.Inst.Index,
2261 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
2251 ) anyerror!void {
22622252 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].str_tok;
22632253 const str = inst_data.get(self.code);
22642254 try stream.print("\"{}\") ", .{std.zig.fmtEscapes(str)});
22652255 try self.writeSrcTok(stream, inst_data.src_tok);
22662256 }
22672257
2268 fn writeStrOp(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2258 fn writeStrOp(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
22692259 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].str_op;
22702260 const str = inst_data.getStr(self.code);
22712261 try self.writeInstRef(stream, inst_data.operand);
......@@ -2274,7 +2264,7 @@ const Writer = struct {
22742264
22752265 fn writeFunc(
22762266 self: *Writer,
2277 stream: anytype,
2267 stream: *std.io.BufferedWriter,
22782268 inst: Zir.Inst.Index,
22792269 inferred_error_set: bool,
22802270 ) !void {
......@@ -2325,7 +2315,7 @@ const Writer = struct {
23252315 );
23262316 }
23272317
2328 fn writeFuncFancy(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2318 fn writeFuncFancy(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
23292319 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
23302320 const extra = self.code.extraData(Zir.Inst.FuncFancy, inst_data.payload_index);
23312321
......@@ -2384,7 +2374,7 @@ const Writer = struct {
23842374 );
23852375 }
23862376
2387 fn writeAllocExtended(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
2377 fn writeAllocExtended(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
23882378 const extra = self.code.extraData(Zir.Inst.AllocExtended, extended.operand);
23892379 const small = @as(Zir.Inst.AllocExtended.Small, @bitCast(extended.small));
23902380
......@@ -2407,7 +2397,7 @@ const Writer = struct {
24072397 try self.writeSrcNode(stream, extra.data.src_node);
24082398 }
24092399
2410 fn writeTypeofPeer(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
2400 fn writeTypeofPeer(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
24112401 const extra = self.code.extraData(Zir.Inst.TypeOfPeer, extended.operand);
24122402 const body = self.code.bodySlice(extra.data.body_index, extra.data.body_len);
24132403 try self.writeBracedBody(stream, body);
......@@ -2420,7 +2410,7 @@ const Writer = struct {
24202410 try stream.writeAll("])");
24212411 }
24222412
2423 fn writeBoolBr(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2413 fn writeBoolBr(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
24242414 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
24252415 const extra = self.code.extraData(Zir.Inst.BoolBr, inst_data.payload_index);
24262416 const body = self.code.bodySlice(extra.end, extra.data.body_len);
......@@ -2431,7 +2421,7 @@ const Writer = struct {
24312421 try self.writeSrcNode(stream, inst_data.src_node);
24322422 }
24332423
2434 fn writeIntType(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2424 fn writeIntType(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
24352425 const int_type = self.code.instructions.items(.data)[@intFromEnum(inst)].int_type;
24362426 const prefix: u8 = switch (int_type.signedness) {
24372427 .signed => 'i',
......@@ -2441,7 +2431,7 @@ const Writer = struct {
24412431 try self.writeSrcNode(stream, int_type.src_node);
24422432 }
24432433
2444 fn writeSaveErrRetIndex(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2434 fn writeSaveErrRetIndex(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
24452435 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].save_err_ret_index;
24462436
24472437 try self.writeInstRef(stream, inst_data.operand);
......@@ -2449,7 +2439,7 @@ const Writer = struct {
24492439 try stream.writeAll(")");
24502440 }
24512441
2452 fn writeRestoreErrRetIndex(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
2442 fn writeRestoreErrRetIndex(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
24532443 const extra = self.code.extraData(Zir.Inst.RestoreErrRetIndex, extended.operand).data;
24542444
24552445 try self.writeInstRef(stream, extra.block);
......@@ -2459,7 +2449,7 @@ const Writer = struct {
24592449 try self.writeSrcNode(stream, extra.src_node);
24602450 }
24612451
2462 fn writeBreak(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2452 fn writeBreak(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
24632453 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].@"break";
24642454 const extra = self.code.extraData(Zir.Inst.Break, inst_data.payload_index).data;
24652455
......@@ -2469,7 +2459,7 @@ const Writer = struct {
24692459 try stream.writeAll(")");
24702460 }
24712461
2472 fn writeArrayInit(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2462 fn writeArrayInit(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
24732463 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
24742464
24752465 const extra = self.code.extraData(Zir.Inst.MultiOp, inst_data.payload_index);
......@@ -2485,7 +2475,7 @@ const Writer = struct {
24852475 try self.writeSrcNode(stream, inst_data.src_node);
24862476 }
24872477
2488 fn writeArrayInitAnon(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2478 fn writeArrayInitAnon(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
24892479 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
24902480
24912481 const extra = self.code.extraData(Zir.Inst.MultiOp, inst_data.payload_index);
......@@ -2500,7 +2490,7 @@ const Writer = struct {
25002490 try self.writeSrcNode(stream, inst_data.src_node);
25012491 }
25022492
2503 fn writeArrayInitSent(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2493 fn writeArrayInitSent(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
25042494 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
25052495
25062496 const extra = self.code.extraData(Zir.Inst.MultiOp, inst_data.payload_index);
......@@ -2520,7 +2510,7 @@ const Writer = struct {
25202510 try self.writeSrcNode(stream, inst_data.src_node);
25212511 }
25222512
2523 fn writeUnreachable(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2513 fn writeUnreachable(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
25242514 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].@"unreachable";
25252515 try stream.writeAll(") ");
25262516 try self.writeSrcNode(stream, inst_data.src_node);
......@@ -2528,7 +2518,7 @@ const Writer = struct {
25282518
25292519 fn writeFuncCommon(
25302520 self: *Writer,
2531 stream: anytype,
2521 stream: *std.io.BufferedWriter,
25322522 inferred_error_set: bool,
25332523 var_args: bool,
25342524 is_noinline: bool,
......@@ -2565,19 +2555,19 @@ const Writer = struct {
25652555 try self.writeSrcNode(stream, src_node);
25662556 }
25672557
2568 fn writeDbgStmt(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2558 fn writeDbgStmt(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
25692559 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].dbg_stmt;
25702560 try stream.print("{d}, {d})", .{ inst_data.line + 1, inst_data.column + 1 });
25712561 }
25722562
2573 fn writeDefer(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2563 fn writeDefer(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
25742564 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].@"defer";
25752565 const body = self.code.bodySlice(inst_data.index, inst_data.len);
25762566 try self.writeBracedBody(stream, body);
25772567 try stream.writeByte(')');
25782568 }
25792569
2580 fn writeDeferErrCode(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2570 fn writeDeferErrCode(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
25812571 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].defer_err_code;
25822572 const extra = self.code.extraData(Zir.Inst.DeferErrCode, inst_data.payload_index).data;
25832573
......@@ -2590,7 +2580,7 @@ const Writer = struct {
25902580 try stream.writeByte(')');
25912581 }
25922582
2593 fn writeDeclaration(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2583 fn writeDeclaration(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
25942584 const decl = self.code.getDeclaration(inst);
25952585
25962586 const prev_parent_decl_node = self.parent_decl_node;
......@@ -2612,10 +2602,8 @@ const Writer = struct {
26122602 },
26132603 }
26142604 const src_hash = self.code.getAssociatedSrcHash(inst).?;
2615 try stream.print(" line({d}) column({d}) hash({})", .{
2616 decl.src_line,
2617 decl.src_column,
2618 std.fmt.fmtSliceHexLower(&src_hash),
2605 try stream.print(" line({d}) column({d}) hash({x})", .{
2606 decl.src_line, decl.src_column, &src_hash,
26192607 });
26202608
26212609 {
......@@ -2649,26 +2637,26 @@ const Writer = struct {
26492637 try self.writeSrcNode(stream, .zero);
26502638 }
26512639
2652 fn writeClosureGet(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
2640 fn writeClosureGet(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
26532641 try stream.print("{d})) ", .{extended.small});
26542642 const src_node: Ast.Node.Offset = @enumFromInt(@as(i32, @bitCast(extended.operand)));
26552643 try self.writeSrcNode(stream, src_node);
26562644 }
26572645
2658 fn writeBuiltinValue(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
2646 fn writeBuiltinValue(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
26592647 const val: Zir.Inst.BuiltinValue = @enumFromInt(extended.small);
26602648 try stream.print("{s})) ", .{@tagName(val)});
26612649 const src_node: Ast.Node.Offset = @enumFromInt(@as(i32, @bitCast(extended.operand)));
26622650 try self.writeSrcNode(stream, src_node);
26632651 }
26642652
2665 fn writeInplaceArithResultTy(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
2653 fn writeInplaceArithResultTy(self: *Writer, stream: *std.io.BufferedWriter, extended: Zir.Inst.Extended.InstData) !void {
26662654 const op: Zir.Inst.InplaceOp = @enumFromInt(extended.small);
26672655 try self.writeInstRef(stream, @enumFromInt(extended.operand));
26682656 try stream.print(", {s}))", .{@tagName(op)});
26692657 }
26702658
2671 fn writeInstRef(self: *Writer, stream: anytype, ref: Zir.Inst.Ref) !void {
2659 fn writeInstRef(self: *Writer, stream: *std.io.BufferedWriter, ref: Zir.Inst.Ref) !void {
26722660 if (ref == .none) {
26732661 return stream.writeAll(".none");
26742662 } else if (ref.toIndex()) |i| {
......@@ -2679,12 +2667,12 @@ const Writer = struct {
26792667 }
26802668 }
26812669
2682 fn writeInstIndex(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2670 fn writeInstIndex(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
26832671 _ = self;
26842672 return stream.print("%{d}", .{@intFromEnum(inst)});
26852673 }
26862674
2687 fn writeCaptures(self: *Writer, stream: anytype, extra_index: usize, captures_len: u32) !usize {
2675 fn writeCaptures(self: *Writer, stream: *std.io.BufferedWriter, extra_index: usize, captures_len: u32) !usize {
26882676 if (captures_len == 0) {
26892677 try stream.writeAll("{}");
26902678 return extra_index;
......@@ -2704,7 +2692,7 @@ const Writer = struct {
27042692 return extra_index + 2 * captures_len;
27052693 }
27062694
2707 fn writeCapture(self: *Writer, stream: anytype, capture: Zir.Inst.Capture) !void {
2695 fn writeCapture(self: *Writer, stream: *std.io.BufferedWriter, capture: Zir.Inst.Capture) !void {
27082696 switch (capture.unwrap()) {
27092697 .nested => |i| return stream.print("[{d}]", .{i}),
27102698 .instruction => |inst| return self.writeInstIndex(stream, inst),
......@@ -2723,7 +2711,7 @@ const Writer = struct {
27232711
27242712 fn writeOptionalInstRef(
27252713 self: *Writer,
2726 stream: anytype,
2714 stream: *std.io.BufferedWriter,
27272715 prefix: []const u8,
27282716 inst: Zir.Inst.Ref,
27292717 ) !void {
......@@ -2734,7 +2722,7 @@ const Writer = struct {
27342722
27352723 fn writeOptionalInstRefOrBody(
27362724 self: *Writer,
2737 stream: anytype,
2725 stream: *std.io.BufferedWriter,
27382726 prefix: []const u8,
27392727 ref: Zir.Inst.Ref,
27402728 body: []const Zir.Inst.Index,
......@@ -2752,7 +2740,7 @@ const Writer = struct {
27522740
27532741 fn writeFlag(
27542742 self: *Writer,
2755 stream: anytype,
2743 stream: *std.io.BufferedWriter,
27562744 name: []const u8,
27572745 flag: bool,
27582746 ) !void {
......@@ -2761,7 +2749,7 @@ const Writer = struct {
27612749 try stream.writeAll(name);
27622750 }
27632751
2764 fn writeSrcNode(self: *Writer, stream: anytype, src_node: Ast.Node.Offset) !void {
2752 fn writeSrcNode(self: *Writer, stream: *std.io.BufferedWriter, src_node: Ast.Node.Offset) !void {
27652753 const tree = self.tree orelse return;
27662754 const abs_node = src_node.toAbsolute(self.parent_decl_node);
27672755 const src_span = tree.nodeToSpan(abs_node);
......@@ -2773,7 +2761,7 @@ const Writer = struct {
27732761 });
27742762 }
27752763
2776 fn writeSrcTok(self: *Writer, stream: anytype, src_tok: Ast.TokenOffset) !void {
2764 fn writeSrcTok(self: *Writer, stream: *std.io.BufferedWriter, src_tok: Ast.TokenOffset) !void {
27772765 const tree = self.tree orelse return;
27782766 const abs_tok = src_tok.toAbsolute(tree.firstToken(self.parent_decl_node));
27792767 const span_start = tree.tokenStart(abs_tok);
......@@ -2786,7 +2774,7 @@ const Writer = struct {
27862774 });
27872775 }
27882776
2789 fn writeSrcTokAbs(self: *Writer, stream: anytype, src_tok: Ast.TokenIndex) !void {
2777 fn writeSrcTokAbs(self: *Writer, stream: *std.io.BufferedWriter, src_tok: Ast.TokenIndex) !void {
27902778 const tree = self.tree orelse return;
27912779 const span_start = tree.tokenStart(src_tok);
27922780 const span_end = span_start + @as(u32, @intCast(tree.tokenSlice(src_tok).len));
......@@ -2798,15 +2786,15 @@ const Writer = struct {
27982786 });
27992787 }
28002788
2801 fn writeBracedDecl(self: *Writer, stream: anytype, body: []const Zir.Inst.Index) !void {
2789 fn writeBracedDecl(self: *Writer, stream: *std.io.BufferedWriter, body: []const Zir.Inst.Index) !void {
28022790 try self.writeBracedBodyConditional(stream, body, self.recurse_decls);
28032791 }
28042792
2805 fn writeBracedBody(self: *Writer, stream: anytype, body: []const Zir.Inst.Index) !void {
2793 fn writeBracedBody(self: *Writer, stream: *std.io.BufferedWriter, body: []const Zir.Inst.Index) !void {
28062794 try self.writeBracedBodyConditional(stream, body, self.recurse_blocks);
28072795 }
28082796
2809 fn writeBracedBodyConditional(self: *Writer, stream: anytype, body: []const Zir.Inst.Index, enabled: bool) !void {
2797 fn writeBracedBodyConditional(self: *Writer, stream: *std.io.BufferedWriter, body: []const Zir.Inst.Index, enabled: bool) !void {
28102798 if (body.len == 0) {
28112799 try stream.writeAll("{}");
28122800 } else if (enabled) {
......@@ -2814,7 +2802,7 @@ const Writer = struct {
28142802 self.indent += 2;
28152803 try self.writeBody(stream, body);
28162804 self.indent -= 2;
2817 try stream.writeByteNTimes(' ', self.indent);
2805 try stream.splatByteAll(' ', self.indent);
28182806 try stream.writeAll("}");
28192807 } else if (body.len == 1) {
28202808 try stream.writeByte('{');
......@@ -2835,16 +2823,16 @@ const Writer = struct {
28352823 }
28362824 }
28372825
2838 fn writeBody(self: *Writer, stream: anytype, body: []const Zir.Inst.Index) !void {
2826 fn writeBody(self: *Writer, stream: *std.io.BufferedWriter, body: []const Zir.Inst.Index) !void {
28392827 for (body) |inst| {
2840 try stream.writeByteNTimes(' ', self.indent);
2828 try stream.splatByteAll(' ', self.indent);
28412829 try stream.print("%{d} ", .{@intFromEnum(inst)});
28422830 try self.writeInstToStream(stream, inst);
28432831 try stream.writeByte('\n');
28442832 }
28452833 }
28462834
2847 fn writeImport(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
2835 fn writeImport(self: *Writer, stream: *std.io.BufferedWriter, inst: Zir.Inst.Index) !void {
28482836 const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_tok;
28492837 const extra = self.code.extraData(Zir.Inst.Import, inst_data.payload_index).data;
28502838 try self.writeInstRef(stream, extra.res_ty);
src/print_zoir.zig+13-20
......@@ -1,13 +1,6 @@
1pub fn renderToFile(zoir: Zoir, arena: Allocator, f: std.fs.File) (std.fs.File.WriteError || Allocator.Error)!void {
2 var bw = std.io.bufferedWriter(f.writer());
3 try renderToWriter(zoir, arena, bw.writer());
4 try bw.flush();
5}
6
7pub fn renderToWriter(zoir: Zoir, arena: Allocator, w: anytype) (@TypeOf(w).Error || Allocator.Error)!void {
1pub fn renderToWriter(zoir: Zoir, arena: Allocator, w: *std.io.BufferedWriter) anyerror!void {
82 assert(!zoir.hasCompileErrors());
93
10 const fmtIntSizeBin = std.fmt.fmtIntSizeBin;
114 const bytes_per_node = comptime n: {
125 var n: usize = 0;
136 for (@typeInfo(Zoir.Node.Repr).@"struct".fields) |f| {
......@@ -23,22 +16,22 @@ pub fn renderToWriter(zoir: Zoir, arena: Allocator, w: anytype) (@TypeOf(w).Erro
2316
2417 // zig fmt: off
2518 try w.print(
26 \\# Nodes: {} ({})
27 \\# Extra Data Items: {} ({})
28 \\# BigInt Limbs: {} ({})
29 \\# String Table Bytes: {}
30 \\# Total ZON Bytes: {}
19 \\# Nodes: {} ({Bi})
20 \\# Extra Data Items: {} ({Bi})
21 \\# BigInt Limbs: {} ({Bi})
22 \\# String Table Bytes: {Bi}
23 \\# Total ZON Bytes: {Bi}
3124 \\
3225 , .{
33 zoir.nodes.len, fmtIntSizeBin(node_bytes),
34 zoir.extra.len, fmtIntSizeBin(extra_bytes),
35 zoir.limbs.len, fmtIntSizeBin(limb_bytes),
36 fmtIntSizeBin(string_bytes),
37 fmtIntSizeBin(node_bytes + extra_bytes + limb_bytes + string_bytes),
26 zoir.nodes.len, node_bytes,
27 zoir.extra.len, extra_bytes,
28 zoir.limbs.len, limb_bytes,
29 string_bytes,
30 node_bytes + extra_bytes + limb_bytes + string_bytes,
3831 });
3932 // zig fmt: on
4033 var pz: PrintZon = .{
41 .w = w.any(),
34 .w = w,
4235 .arena = arena,
4336 .zoir = zoir,
4437 .indent = 0,
......@@ -48,7 +41,7 @@ pub fn renderToWriter(zoir: Zoir, arena: Allocator, w: anytype) (@TypeOf(w).Erro
4841}
4942
5043const PrintZon = struct {
51 w: std.io.AnyWriter,
44 w: *std.io.BufferedWriter,
5245 arena: Allocator,
5346 zoir: Zoir,
5447 indent: u32,
src/translate_c.zig+1-1
......@@ -5905,7 +5905,7 @@ fn parseCPrimaryExpr(c: *Context, m: *MacroCtx, scope: *Scope) ParseError!Node {
59055905 if (slice[0] != '\'' or slice[1] == '\\' or slice.len == 3) {
59065906 return Tag.char_literal.create(c.arena, try escapeUnprintables(c, m));
59075907 } else {
5908 const str = try std.fmt.allocPrint(c.arena, "0x{s}", .{std.fmt.fmtSliceHexLower(slice[1 .. slice.len - 1])});
5908 const str = try std.fmt.allocPrint(c.arena, "0x{x}", .{slice[1 .. slice.len - 1]});
59095909 return Tag.integer_literal.create(c.arena, str);
59105910 }
59115911 },