InternPool: add more helper functions and debug formatting (#1043)
This commit is contained in:
parent
333fcb5633
commit
ff467f9878
@ -487,6 +487,20 @@ pub const Key = union(enum) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn isSinglePointer(ty: Key) bool {
|
||||||
|
return switch (ty) {
|
||||||
|
.pointer_type => |pointer_info| pointer_info.size == .One,
|
||||||
|
else => false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn isCPtr(ty: Key) bool {
|
||||||
|
return switch (ty) {
|
||||||
|
.pointer_type => |pointer_info| pointer_info.size == .C,
|
||||||
|
else => false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
pub fn isConstPtr(ty: Key) bool {
|
pub fn isConstPtr(ty: Key) bool {
|
||||||
return switch (ty) {
|
return switch (ty) {
|
||||||
.pointer_type => |pointer_info| pointer_info.is_const,
|
.pointer_type => |pointer_info| pointer_info.is_const,
|
||||||
@ -520,6 +534,23 @@ pub const Key = union(enum) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn isPtrAtRuntime(ty: Key, ip: *const InternPool) bool {
|
||||||
|
return switch (ty) {
|
||||||
|
.pointer_type => |pointer_info| pointer_info.size != .Slice,
|
||||||
|
.optional_type => |optional_info| {
|
||||||
|
const child_type = ip.indexToKey(optional_info.payload_type);
|
||||||
|
switch (child_type) {
|
||||||
|
.pointer_type => |pointer_info| switch (pointer_info.size) {
|
||||||
|
.Slice, .C => return false,
|
||||||
|
.Many, .One => return !pointer_info.is_allowzero,
|
||||||
|
},
|
||||||
|
else => return false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
else => false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
pub fn elemType2(ty: Key) Index {
|
pub fn elemType2(ty: Key) Index {
|
||||||
return switch (ty) {
|
return switch (ty) {
|
||||||
.simple_type => |simple| switch (simple) {
|
.simple_type => |simple| switch (simple) {
|
||||||
@ -681,6 +712,26 @@ pub const Key = union(enum) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn isNull(val: Key) bool {
|
||||||
|
return switch (val) {
|
||||||
|
.simple_value => |simple| switch (simple) {
|
||||||
|
.null_value => true,
|
||||||
|
.bool_true => false,
|
||||||
|
.bool_false => true,
|
||||||
|
.the_only_possible_value => true,
|
||||||
|
else => unreachable,
|
||||||
|
},
|
||||||
|
.int_u64_value => |int_value| int_value.int == 0,
|
||||||
|
.int_i64_value => |int_value| int_value.int == 0,
|
||||||
|
.int_big_value => |int_value| int_value.int.orderAgainstScalar(0).compare(.eq),
|
||||||
|
|
||||||
|
.optional_value => false,
|
||||||
|
.unknown_value => unreachable,
|
||||||
|
|
||||||
|
else => unreachable,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
pub const FormatContext = struct {
|
pub const FormatContext = struct {
|
||||||
key: Key,
|
key: Key,
|
||||||
options: FormatOptions = .{},
|
options: FormatOptions = .{},
|
||||||
@ -1067,6 +1118,34 @@ pub const Index = enum(u32) {
|
|||||||
.ip = ip,
|
.ip = ip,
|
||||||
} };
|
} };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn fmtDebug(index: Index, ip: InternPool) std.fmt.Formatter(formatDebug) {
|
||||||
|
return .{ .data = .{
|
||||||
|
.index = index,
|
||||||
|
.ip = ip,
|
||||||
|
} };
|
||||||
|
}
|
||||||
|
|
||||||
|
const FormatContext = struct {
|
||||||
|
index: Index,
|
||||||
|
ip: InternPool,
|
||||||
|
};
|
||||||
|
|
||||||
|
fn formatDebug(
|
||||||
|
ctx: FormatContext,
|
||||||
|
comptime fmt_str: []const u8,
|
||||||
|
options: std.fmt.FormatOptions,
|
||||||
|
writer: anytype,
|
||||||
|
) @TypeOf(writer).Error!void {
|
||||||
|
if (ctx.index == .none) {
|
||||||
|
return writer.writeAll(".none");
|
||||||
|
} else {
|
||||||
|
return Key.format(.{
|
||||||
|
.key = ctx.ip.indexToKey(ctx.index),
|
||||||
|
.ip = ctx.ip,
|
||||||
|
}, fmt_str, options, writer);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const NamespaceIndex = enum(u32) {
|
pub const NamespaceIndex = enum(u32) {
|
||||||
@ -2180,6 +2259,7 @@ const InMemoryCoercionResult = union(enum) {
|
|||||||
ptr_allowzero: Pair,
|
ptr_allowzero: Pair,
|
||||||
ptr_bit_range: BitRange,
|
ptr_bit_range: BitRange,
|
||||||
ptr_alignment: IntPair,
|
ptr_alignment: IntPair,
|
||||||
|
double_ptr_to_anyopaque: Pair,
|
||||||
|
|
||||||
const Pair = struct {
|
const Pair = struct {
|
||||||
actual: Index, // type
|
actual: Index, // type
|
||||||
@ -2275,9 +2355,12 @@ fn coerceInMemoryAllowed(
|
|||||||
target: std.Target,
|
target: std.Target,
|
||||||
) Allocator.Error!InMemoryCoercionResult {
|
) Allocator.Error!InMemoryCoercionResult {
|
||||||
if (dest_ty == src_ty) return .ok;
|
if (dest_ty == src_ty) return .ok;
|
||||||
|
if (dest_ty == .unknown_type or src_ty == .unknown_type) return .ok;
|
||||||
|
|
||||||
const dest_key = ip.indexToKey(dest_ty);
|
const dest_key = ip.indexToKey(dest_ty);
|
||||||
const src_key = ip.indexToKey(src_ty);
|
const src_key = ip.indexToKey(src_ty);
|
||||||
|
assert(dest_key.typeOf() == .type_type);
|
||||||
|
assert(src_key.typeOf() == .type_type);
|
||||||
|
|
||||||
const dest_tag = dest_key.zigTypeTag();
|
const dest_tag = dest_key.zigTypeTag();
|
||||||
const src_tag = src_key.zigTypeTag();
|
const src_tag = src_key.zigTypeTag();
|
||||||
|
Loading…
Reference in New Issue
Block a user