Function declIterator [src]

Prototype

pub fn declIterator(zir: Zir, decl_inst: Zir.Inst.Index) DeclIterator

Parameters

zir: Zirdecl_inst: Zir.Inst.Index

Source

pub fn declIterator(zir: Zir, decl_inst: Zir.Inst.Index) DeclIterator { const inst = zir.instructions.get(@intFromEnum(decl_inst)); assert(inst.tag == .extended); const extended = inst.data.extended; switch (extended.opcode) { .struct_decl => { const small: Inst.StructDecl.Small = @bitCast(extended.small); var extra_index: u32 = @intCast(extended.operand + @typeInfo(Inst.StructDecl).@"struct".fields.len); const captures_len = if (small.has_captures_len) captures_len: { const captures_len = zir.extra[extra_index]; extra_index += 1; break :captures_len captures_len; } else 0; extra_index += @intFromBool(small.has_fields_len); const decls_len = if (small.has_decls_len) decls_len: { const decls_len = zir.extra[extra_index]; extra_index += 1; break :decls_len decls_len; } else 0; extra_index += captures_len * 2; if (small.has_backing_int) { const backing_int_body_len = zir.extra[extra_index]; extra_index += 1; // backing_int_body_len if (backing_int_body_len == 0) { extra_index += 1; // backing_int_ref } else { extra_index += backing_int_body_len; // backing_int_body_inst } } return .{ .extra_index = extra_index, .decls_remaining = decls_len, .zir = zir, }; }, .enum_decl => { const small: Inst.EnumDecl.Small = @bitCast(extended.small); var extra_index: u32 = @intCast(extended.operand + @typeInfo(Inst.EnumDecl).@"struct".fields.len); extra_index += @intFromBool(small.has_tag_type); const captures_len = if (small.has_captures_len) captures_len: { const captures_len = zir.extra[extra_index]; extra_index += 1; break :captures_len captures_len; } else 0; extra_index += @intFromBool(small.has_body_len); extra_index += @intFromBool(small.has_fields_len); const decls_len = if (small.has_decls_len) decls_len: { const decls_len = zir.extra[extra_index]; extra_index += 1; break :decls_len decls_len; } else 0; extra_index += captures_len * 2; return .{ .extra_index = extra_index, .decls_remaining = decls_len, .zir = zir, }; }, .union_decl => { const small: Inst.UnionDecl.Small = @bitCast(extended.small); var extra_index: u32 = @intCast(extended.operand + @typeInfo(Inst.UnionDecl).@"struct".fields.len); extra_index += @intFromBool(small.has_tag_type); const captures_len = if (small.has_captures_len) captures_len: { const captures_len = zir.extra[extra_index]; extra_index += 1; break :captures_len captures_len; } else 0; extra_index += @intFromBool(small.has_body_len); extra_index += @intFromBool(small.has_fields_len); const decls_len = if (small.has_decls_len) decls_len: { const decls_len = zir.extra[extra_index]; extra_index += 1; break :decls_len decls_len; } else 0; extra_index += captures_len * 2; return .{ .extra_index = extra_index, .decls_remaining = decls_len, .zir = zir, }; }, .opaque_decl => { const small: Inst.OpaqueDecl.Small = @bitCast(extended.small); var extra_index: u32 = @intCast(extended.operand + @typeInfo(Inst.OpaqueDecl).@"struct".fields.len); const decls_len = if (small.has_decls_len) decls_len: { const decls_len = zir.extra[extra_index]; extra_index += 1; break :decls_len decls_len; } else 0; const captures_len = if (small.has_captures_len) captures_len: { const captures_len = zir.extra[extra_index]; extra_index += 1; break :captures_len captures_len; } else 0; extra_index += captures_len * 2; return .{ .extra_index = extra_index, .decls_remaining = decls_len, .zir = zir, }; }, else => unreachable, } }