| ... | ... | @@ -412,6 +412,10 @@ const DocData = struct { |
| 412 | 412 | size: std.builtin.TypeInfo.Pointer.Size, |
| 413 | 413 | child: Expr, |
| 414 | 414 | sentinel: ?Expr = null, |
| 415 | @"align": ?Expr = null, |
| 416 | address_space: ?Expr = null, |
| 417 | bit_start: ?Expr = null, |
| 418 | host_size: ?Expr = null, |
| 415 | 419 | is_allowzero: bool = false, |
| 416 | 420 | is_mutable: bool = false, |
| 417 | 421 | is_volatile: bool = false, |
| ... | ... | @@ -537,6 +541,38 @@ const DocData = struct { |
| 537 | 541 | try sentinel.jsonStringify(options, w); |
| 538 | 542 | try w.print(",", .{}); |
| 539 | 543 | } |
| 544 | if (v.@"align") |@"align"| { |
| 545 | try w.print( |
| 546 | \\"align": |
| 547 | , .{}); |
| 548 | if (options.whitespace) |*ws| ws.indent_level += 1; |
| 549 | try @"align".jsonStringify(options, w); |
| 550 | try w.print(",", .{}); |
| 551 | } |
| 552 | if (v.address_space) |address_space| { |
| 553 | try w.print( |
| 554 | \\"address_space": |
| 555 | , .{}); |
| 556 | if (options.whitespace) |*ws| ws.indent_level += 1; |
| 557 | try address_space.jsonStringify(options, w); |
| 558 | try w.print(",", .{}); |
| 559 | } |
| 560 | if (v.bit_start) |bit_start| { |
| 561 | try w.print( |
| 562 | \\"bit_start": |
| 563 | , .{}); |
| 564 | if (options.whitespace) |*ws| ws.indent_level += 1; |
| 565 | try bit_start.jsonStringify(options, w); |
| 566 | try w.print(",", .{}); |
| 567 | } |
| 568 | if (v.host_size) |host_size| { |
| 569 | try w.print( |
| 570 | \\"host_size": |
| 571 | , .{}); |
| 572 | if (options.whitespace) |*ws| ws.indent_level += 1; |
| 573 | try host_size.jsonStringify(options, w); |
| 574 | try w.print(",", .{}); |
| 575 | } |
| 540 | 576 | if (options.whitespace) |ws| try ws.outputIndent(w); |
| 541 | 577 | try w.print( |
| 542 | 578 | \\"is_allowzero": {}, |
| ... | ... | @@ -951,6 +987,7 @@ fn walkInstruction( |
| 951 | 987 | .ptr_type => { |
| 952 | 988 | const ptr = data[inst_index].ptr_type; |
| 953 | 989 | const extra = file.zir.extraData(Zir.Inst.PtrType, ptr.payload_index); |
| 990 | var extra_index = extra.end; |
| 954 | 991 | |
| 955 | 992 | const type_slot_index = self.types.items.len; |
| 956 | 993 | const elem_type_ref = try self.walkRef( |
| ... | ... | @@ -960,9 +997,61 @@ fn walkInstruction( |
| 960 | 997 | false, |
| 961 | 998 | ); |
| 962 | 999 | |
| 963 | | const sentinel: ?DocData.Expr = if (ptr.flags.has_sentinel) DocData.Expr{ .int = .{ .value = 0, .negated = false } } else null; |
| 1000 | // @check if `addrspace`, `bit_start` and `host_size` really need to be |
| 1001 | // present in json |
| 1002 | var sentinel: ?DocData.Expr = null; |
| 1003 | if (ptr.flags.has_sentinel) { |
| 1004 | const ref = @intToEnum(Zir.Inst.Ref, file.zir.extra[extra_index]); |
| 1005 | const ref_result = try self.walkRef(file, parent_scope, ref, false); |
| 1006 | sentinel = ref_result.expr; |
| 1007 | extra_index += 1; |
| 1008 | } |
| 1009 | |
| 1010 | var @"align": ?DocData.Expr = null; |
| 1011 | if (ptr.flags.has_align) { |
| 1012 | const ref = @intToEnum(Zir.Inst.Ref, file.zir.extra[extra_index]); |
| 1013 | const ref_result = try self.walkRef(file, parent_scope, ref, false); |
| 1014 | @"align" = ref_result.expr; |
| 1015 | extra_index += 1; |
| 1016 | } |
| 1017 | var address_space: ?DocData.Expr = null; |
| 1018 | if (ptr.flags.has_addrspace) { |
| 1019 | const ref = @intToEnum(Zir.Inst.Ref, file.zir.extra[extra_index]); |
| 1020 | const ref_result = try self.walkRef(file, parent_scope, ref, false); |
| 1021 | address_space = ref_result.expr; |
| 1022 | extra_index += 1; |
| 1023 | } |
| 1024 | var bit_start: ?DocData.Expr = null; |
| 1025 | if (ptr.flags.has_bit_range) { |
| 1026 | const ref = @intToEnum(Zir.Inst.Ref, file.zir.extra[extra_index]); |
| 1027 | const ref_result = try self.walkRef(file, parent_scope, ref, false); |
| 1028 | address_space = ref_result.expr; |
| 1029 | extra_index += 1; |
| 1030 | } |
| 1031 | |
| 1032 | var host_size: ?DocData.Expr = null; |
| 1033 | if (ptr.flags.has_bit_range) { |
| 1034 | const ref = @intToEnum(Zir.Inst.Ref, file.zir.extra[extra_index]); |
| 1035 | const ref_result = try self.walkRef(file, parent_scope, ref, false); |
| 1036 | host_size = ref_result.expr; |
| 1037 | } |
| 1038 | |
| 964 | 1039 | try self.types.append(self.arena, .{ |
| 965 | | .Pointer = .{ .size = ptr.size, .child = elem_type_ref.expr, .sentinel = sentinel, .is_mutable = ptr.flags.is_mutable, .has_align = ptr.flags.has_align, .has_sentinel = ptr.flags.has_sentinel, .is_volatile = ptr.flags.is_volatile, .has_addrspace = ptr.flags.has_addrspace, .has_bit_range = ptr.flags.has_bit_range }, |
| 1040 | .Pointer = .{ |
| 1041 | .size = ptr.size, |
| 1042 | .child = elem_type_ref.expr, |
| 1043 | .has_align = ptr.flags.has_align, |
| 1044 | .@"align" = @"align", |
| 1045 | .has_addrspace = ptr.flags.has_addrspace, |
| 1046 | .address_space = address_space, |
| 1047 | .has_sentinel = ptr.flags.has_sentinel, |
| 1048 | .sentinel = sentinel, |
| 1049 | .is_mutable = ptr.flags.is_mutable, |
| 1050 | .is_volatile = ptr.flags.is_volatile, |
| 1051 | .has_bit_range = ptr.flags.has_bit_range, |
| 1052 | .bit_start = bit_start, |
| 1053 | .host_size = host_size, |
| 1054 | }, |
| 966 | 1055 | }); |
| 967 | 1056 | return DocData.WalkResult{ |
| 968 | 1057 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |