diff options
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/zig/AstGen.zig | 37 | ||||
| -rw-r--r-- | lib/std/zig/Zir.zig | 37 |
2 files changed, 51 insertions, 23 deletions
diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index f02dcaa2db..b356789bfd 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -4011,7 +4011,7 @@ fn fnDecl( // We insert this at the beginning so that its instruction index marks the // start of the top level declaration. - const decl_inst = try gz.makeBlockInst(.declaration, fn_proto.ast.proto_node); + const decl_inst = try gz.makeDeclaration(fn_proto.ast.proto_node); astgen.advanceSourceCursorToNode(decl_node); var decl_gz: GenZir = .{ @@ -4393,7 +4393,7 @@ fn globalVarDecl( const is_mutable = token_tags[var_decl.ast.mut_token] == .keyword_var; // We do this at the beginning so that the instruction index marks the range start // of the top level declaration. - const decl_inst = try gz.makeBlockInst(.declaration, node); + const decl_inst = try gz.makeDeclaration(node); const name_token = var_decl.ast.mut_token + 1; astgen.advanceSourceCursorToNode(node); @@ -4555,7 +4555,7 @@ fn comptimeDecl( // Up top so the ZIR instruction index marks the start range of this // top-level declaration. - const decl_inst = try gz.makeBlockInst(.declaration, node); + const decl_inst = try gz.makeDeclaration(node); wip_members.nextDecl(decl_inst); astgen.advanceSourceCursorToNode(node); @@ -4607,7 +4607,7 @@ fn usingnamespaceDecl( }; // Up top so the ZIR instruction index marks the start range of this // top-level declaration. - const decl_inst = try gz.makeBlockInst(.declaration, node); + const decl_inst = try gz.makeDeclaration(node); wip_members.nextDecl(decl_inst); astgen.advanceSourceCursorToNode(node); @@ -4651,7 +4651,7 @@ fn testDecl( // Up top so the ZIR instruction index marks the start range of this // top-level declaration. - const decl_inst = try gz.makeBlockInst(.declaration, node); + const decl_inst = try gz.makeDeclaration(node); wip_members.nextDecl(decl_inst); astgen.advanceSourceCursorToNode(node); @@ -13072,6 +13072,21 @@ const GenZir = struct { } /// Note that this returns a `Zir.Inst.Index` not a ref. + /// Does *not* append the block instruction to the scope. + /// Leaves the `payload_index` field undefined. Use `setDeclaration` to finalize. + fn makeDeclaration(gz: *GenZir, node: Ast.Node.Index) !Zir.Inst.Index { + const new_index: Zir.Inst.Index = @enumFromInt(gz.astgen.instructions.len); + try gz.astgen.instructions.append(gz.astgen.gpa, .{ + .tag = .declaration, + .data = .{ .declaration = .{ + .src_node = node, + .payload_index = undefined, + } }, + }); + return new_index; + } + + /// Note that this returns a `Zir.Inst.Index` not a ref. /// Leaves the `payload_index` field undefined. fn addCondBr(gz: *GenZir, tag: Zir.Inst.Tag, node: Ast.Node.Index) !Zir.Inst.Index { const gpa = gz.astgen.gpa; @@ -13117,7 +13132,7 @@ const GenZir = struct { .fields_hash_1 = fields_hash_arr[1], .fields_hash_2 = fields_hash_arr[2], .fields_hash_3 = fields_hash_arr[3], - .src_node = gz.nodeIndexToRelative(args.src_node), + .src_node = args.src_node, }); if (args.captures_len != 0) { @@ -13177,7 +13192,7 @@ const GenZir = struct { .fields_hash_1 = fields_hash_arr[1], .fields_hash_2 = fields_hash_arr[2], .fields_hash_3 = fields_hash_arr[3], - .src_node = gz.nodeIndexToRelative(args.src_node), + .src_node = args.src_node, }); if (args.tag_type != .none) { @@ -13238,7 +13253,7 @@ const GenZir = struct { .fields_hash_1 = fields_hash_arr[1], .fields_hash_2 = fields_hash_arr[2], .fields_hash_3 = fields_hash_arr[3], - .src_node = gz.nodeIndexToRelative(args.src_node), + .src_node = args.src_node, }); if (args.tag_type != .none) { @@ -13285,9 +13300,7 @@ const GenZir = struct { assert(args.src_node != 0); try astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.OpaqueDecl).Struct.fields.len + 2); - const payload_index = astgen.addExtraAssumeCapacity(Zir.Inst.OpaqueDecl{ - .src_node = gz.nodeIndexToRelative(args.src_node), - }); + const payload_index = astgen.addExtraAssumeCapacity(Zir.Inst.OpaqueDecl{ .src_node = args.src_node }); if (args.captures_len != 0) { astgen.extra.appendAssumeCapacity(args.captures_len); @@ -13897,7 +13910,7 @@ fn setDeclaration( .has_align_linksection_addrspace = align_len != 0 or linksection_len != 0 or addrspace_len != 0, }, }; - astgen.instructions.items(.data)[@intFromEnum(decl_inst)].pl_node.payload_index = try astgen.addExtra(extra); + astgen.instructions.items(.data)[@intFromEnum(decl_inst)].declaration.payload_index = try astgen.addExtra(extra); if (extra.flags.has_doc_comment) { try astgen.extra.append(gpa, @intFromEnum(true_doc_comment)); } diff --git a/lib/std/zig/Zir.zig b/lib/std/zig/Zir.zig index a79e965fe9..1ab7e94842 100644 --- a/lib/std/zig/Zir.zig +++ b/lib/std/zig/Zir.zig @@ -287,7 +287,7 @@ pub const Inst = struct { /// namespace type, e.g. within a `struct_decl` instruction. It represents a /// single source declaration (`const`/`var`/`fn`), containing the name, /// attributes, type, and value of the declaration. - /// Uses the `pl_node` union field. Payload is `Declaration`. + /// Uses the `declaration` union field. Payload is `Declaration`. declaration, /// Implements `suspend {...}`. /// Uses the `pl_node` union field. Payload is `Block`. @@ -1596,7 +1596,7 @@ pub const Inst = struct { .block = .pl_node, .block_comptime = .pl_node, .block_inline = .pl_node, - .declaration = .pl_node, + .declaration = .declaration, .suspend_block = .pl_node, .bool_not = .un_node, .bool_br_and = .pl_node, @@ -2370,6 +2370,16 @@ pub const Inst = struct { /// The index being accessed. idx: u32, }, + declaration: struct { + /// This node provides a new absolute baseline node for all instructions within this struct. + src_node: Ast.Node.Index, + /// index into extra to a `Declaration` payload. + payload_index: u32, + + pub fn src(self: @This()) LazySrcLoc { + return .{ .node_abs = self.src_node }; + } + }, // Make sure we don't accidentally add a field to make this union // bigger than expected. Note that in Debug builds, Zig is allowed @@ -2408,6 +2418,7 @@ pub const Inst = struct { defer_err_code, save_err_ret_index, elem_val_imm, + declaration, }; }; @@ -3018,10 +3029,11 @@ pub const Inst = struct { fields_hash_1: u32, fields_hash_2: u32, fields_hash_3: u32, - src_node: i32, + /// This node provides a new absolute baseline node for all instructions within this struct. + src_node: Ast.Node.Index, pub fn src(self: StructDecl) LazySrcLoc { - return LazySrcLoc.nodeOffset(self.src_node); + return .{ .node_abs = self.src_node }; } pub const Small = packed struct { @@ -3150,10 +3162,11 @@ pub const Inst = struct { fields_hash_1: u32, fields_hash_2: u32, fields_hash_3: u32, - src_node: i32, + /// This node provides a new absolute baseline node for all instructions within this struct. + src_node: Ast.Node.Index, pub fn src(self: EnumDecl) LazySrcLoc { - return LazySrcLoc.nodeOffset(self.src_node); + return .{ .node_abs = self.src_node }; } pub const Small = packed struct { @@ -3198,10 +3211,11 @@ pub const Inst = struct { fields_hash_1: u32, fields_hash_2: u32, fields_hash_3: u32, - src_node: i32, + /// This node provides a new absolute baseline node for all instructions within this struct. + src_node: Ast.Node.Index, pub fn src(self: UnionDecl) LazySrcLoc { - return LazySrcLoc.nodeOffset(self.src_node); + return .{ .node_abs = self.src_node }; } pub const Small = packed struct { @@ -3230,10 +3244,11 @@ pub const Inst = struct { /// 2. capture: Capture, // for every captures_len /// 3. decl: Index, // for every decls_len; points to a `declaration` instruction pub const OpaqueDecl = struct { - src_node: i32, + /// This node provides a new absolute baseline node for all instructions within this struct. + src_node: Ast.Node.Index, pub fn src(self: OpaqueDecl) LazySrcLoc { - return LazySrcLoc.nodeOffset(self.src_node); + return .{ .node_abs = self.src_node }; } pub const Small = packed struct { @@ -4046,7 +4061,7 @@ pub fn getFnInfo(zir: Zir, fn_inst: Inst.Index) FnInfo { pub fn getDeclaration(zir: Zir, inst: Zir.Inst.Index) struct { Inst.Declaration, u32 } { assert(zir.instructions.items(.tag)[@intFromEnum(inst)] == .declaration); - const pl_node = zir.instructions.items(.data)[@intFromEnum(inst)].pl_node; + const pl_node = zir.instructions.items(.data)[@intFromEnum(inst)].declaration; const extra = zir.extraData(Inst.Declaration, pl_node.payload_index); return .{ extra.data, |
