mirror of
https://github.com/ziglang/zig.git
synced 2026-02-14 05:20:34 +00:00
Removed anytype_args field from Fn
anytype_args field was replaced with isAnytypeParam function.
This commit is contained in:
parent
cd8070f94f
commit
ab3b614a33
@ -1464,12 +1464,8 @@ pub const Fn = struct {
|
||||
/// These never have .generic_poison for the Type
|
||||
/// because the Type is needed to pass to `Type.eql` and for inserting comptime arguments
|
||||
/// into the inst_map when analyzing the body of a generic function instantiation.
|
||||
/// Instead, the is_anytype knowledge is communicated via `anytype_args`.
|
||||
/// Instead, the is_anytype knowledge is communicated via `isAnytypeParam`.
|
||||
comptime_args: ?[*]TypedValue,
|
||||
/// When comptime_args is null, this is undefined. Otherwise, this flags each
|
||||
/// parameter and tells whether it is anytype.
|
||||
/// TODO apply the same enhancement for param_names below to this field.
|
||||
anytype_args: [*]bool,
|
||||
|
||||
/// Precomputed hash for monomorphed_funcs.
|
||||
/// This is important because it may be accessed when resizing monomorphed_funcs
|
||||
@ -1584,6 +1580,21 @@ pub const Fn = struct {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn isAnytypeParam(func: Fn, mod: *Module, index: u32) bool {
|
||||
const file = mod.declPtr(func.owner_decl).getFileScope();
|
||||
|
||||
const tags = file.zir.instructions.items(.tag);
|
||||
|
||||
const param_body = file.zir.getParamBody(func.zir_body_inst);
|
||||
const param = param_body[index];
|
||||
|
||||
return switch (tags[param]) {
|
||||
.param, .param_comptime => false,
|
||||
.param_anytype, .param_anytype_comptime => true,
|
||||
else => unreachable,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn getParamName(func: Fn, mod: *Module, index: u32) [:0]const u8 {
|
||||
const file = mod.declPtr(func.owner_decl).getFileScope();
|
||||
|
||||
|
||||
11
src/Sema.zig
11
src/Sema.zig
@ -5498,7 +5498,7 @@ const GenericCallAdapter = struct {
|
||||
const this_is_comptime = this_arg.val.tag() != .generic_poison;
|
||||
const other_is_comptime = other_arg.val.tag() != .generic_poison;
|
||||
const this_is_anytype = this_arg.ty.tag() != .generic_poison;
|
||||
const other_is_anytype = other_key.anytype_args[i];
|
||||
const other_is_anytype = other_key.isAnytypeParam(ctx.module, @intCast(u32, i));
|
||||
|
||||
if (other_is_anytype != this_is_anytype) return false;
|
||||
if (other_is_comptime != this_is_comptime) return false;
|
||||
@ -6379,12 +6379,9 @@ fn instantiateGenericCall(
|
||||
errdefer new_func.deinit(gpa);
|
||||
assert(new_func == new_module_func);
|
||||
|
||||
const anytype_args = try new_decl_arena_allocator.alloc(bool, func_ty_info.param_types.len);
|
||||
new_func.anytype_args = anytype_args.ptr;
|
||||
arg_i = 0;
|
||||
for (fn_info.param_body) |inst| {
|
||||
var is_comptime = false;
|
||||
var is_anytype = false;
|
||||
switch (zir_tags[inst]) {
|
||||
.param => {
|
||||
is_comptime = func_ty_info.paramIsComptime(arg_i);
|
||||
@ -6393,11 +6390,9 @@ fn instantiateGenericCall(
|
||||
is_comptime = true;
|
||||
},
|
||||
.param_anytype => {
|
||||
is_anytype = true;
|
||||
is_comptime = func_ty_info.paramIsComptime(arg_i);
|
||||
},
|
||||
.param_anytype_comptime => {
|
||||
is_anytype = true;
|
||||
is_comptime = true;
|
||||
},
|
||||
else => continue,
|
||||
@ -6405,10 +6400,9 @@ fn instantiateGenericCall(
|
||||
|
||||
// We populate the Type here regardless because it is needed by
|
||||
// `GenericCallAdapter.eql` as well as function body analysis.
|
||||
// Whether it is anytype is communicated by `anytype_args`.
|
||||
// Whether it is anytype is communicated by `isAnytypeParam`.
|
||||
const arg = child_sema.inst_map.get(inst).?;
|
||||
const copied_arg_ty = try child_sema.typeOf(arg).copy(new_decl_arena_allocator);
|
||||
anytype_args[arg_i] = is_anytype;
|
||||
|
||||
if (try sema.typeRequiresComptime(block, .unneeded, copied_arg_ty)) {
|
||||
is_comptime = true;
|
||||
@ -7760,7 +7754,6 @@ fn funcCommon(
|
||||
.zir_body_inst = func_inst,
|
||||
.owner_decl = sema.owner_decl_index,
|
||||
.comptime_args = comptime_args,
|
||||
.anytype_args = undefined,
|
||||
.hash = hash,
|
||||
.lbrace_line = src_locs.lbrace_line,
|
||||
.rbrace_line = src_locs.rbrace_line,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user