add helper functions to intern pool
This commit is contained in:
parent
d10837dca0
commit
9dbae69288
@ -31,6 +31,7 @@ pub const Pointer = packed struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
pub const Array = packed struct {
|
pub const Array = packed struct {
|
||||||
|
// TODO change to Index
|
||||||
len: u32,
|
len: u32,
|
||||||
child: Index,
|
child: Index,
|
||||||
sentinel: Index = .none,
|
sentinel: Index = .none,
|
||||||
@ -275,17 +276,91 @@ pub const Key = union(enum) {
|
|||||||
.float_64_value,
|
.float_64_value,
|
||||||
.float_80_value,
|
.float_80_value,
|
||||||
.float_128_value,
|
.float_128_value,
|
||||||
// .type_value,
|
|
||||||
=> unreachable,
|
=> unreachable,
|
||||||
|
|
||||||
.bytes,
|
.bytes,
|
||||||
// .one_pointer,
|
|
||||||
.aggregate,
|
.aggregate,
|
||||||
.union_value,
|
.union_value,
|
||||||
=> unreachable,
|
=> unreachable,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn isType(key: Key) bool {
|
||||||
|
return switch (key) {
|
||||||
|
.simple => |simple| switch (simple) {
|
||||||
|
.f16,
|
||||||
|
.f32,
|
||||||
|
.f64,
|
||||||
|
.f80,
|
||||||
|
.f128,
|
||||||
|
.c_longdouble,
|
||||||
|
.usize,
|
||||||
|
.isize,
|
||||||
|
.c_short,
|
||||||
|
.c_ushort,
|
||||||
|
.c_int,
|
||||||
|
.c_uint,
|
||||||
|
.c_long,
|
||||||
|
.c_ulong,
|
||||||
|
.c_longlong,
|
||||||
|
.c_ulonglong,
|
||||||
|
.comptime_int,
|
||||||
|
.comptime_float,
|
||||||
|
.anyopaque,
|
||||||
|
.bool,
|
||||||
|
.void,
|
||||||
|
.type,
|
||||||
|
.anyerror,
|
||||||
|
.noreturn,
|
||||||
|
.@"anyframe",
|
||||||
|
.null_type,
|
||||||
|
.undefined_type,
|
||||||
|
.enum_literal_type, => true,
|
||||||
|
|
||||||
|
.undefined_value,
|
||||||
|
.void_value,
|
||||||
|
.unreachable_value,
|
||||||
|
.null_value,
|
||||||
|
.bool_true,
|
||||||
|
.bool_false,
|
||||||
|
=> false,
|
||||||
|
},
|
||||||
|
|
||||||
|
.int_type,
|
||||||
|
.pointer_type,
|
||||||
|
.array_type,
|
||||||
|
.struct_type,
|
||||||
|
.optional_type,
|
||||||
|
.error_union_type,
|
||||||
|
.error_set_type,
|
||||||
|
.enum_type,
|
||||||
|
.function_type,
|
||||||
|
.union_type,
|
||||||
|
.tuple_type,
|
||||||
|
.vector_type,
|
||||||
|
.anyframe_type, => true,
|
||||||
|
|
||||||
|
.int_u64_value,
|
||||||
|
.int_i64_value,
|
||||||
|
.int_big_value,
|
||||||
|
.float_16_value,
|
||||||
|
.float_32_value,
|
||||||
|
.float_64_value,
|
||||||
|
.float_80_value,
|
||||||
|
.float_128_value,
|
||||||
|
=> false,
|
||||||
|
|
||||||
|
.bytes,
|
||||||
|
.aggregate,
|
||||||
|
.union_value,
|
||||||
|
=> false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn isValue(key: Key) bool {
|
||||||
|
return !key.isValue();
|
||||||
|
}
|
||||||
|
|
||||||
/// Asserts the type is an integer, enum, error set, packed struct, or vector of one of them.
|
/// Asserts the type is an integer, enum, error set, packed struct, or vector of one of them.
|
||||||
pub fn intInfo(ty: Key, target: std.Target, ip: *const InternPool) Int {
|
pub fn intInfo(ty: Key, target: std.Target, ip: *const InternPool) Int {
|
||||||
var key: Key = ty;
|
var key: Key = ty;
|
||||||
@ -657,7 +732,7 @@ pub const Key = union(enum) {
|
|||||||
|
|
||||||
return array_info.child;
|
return array_info.child;
|
||||||
},
|
},
|
||||||
.struct_type => panicOrElse("TODO", null),
|
.struct_type => return panicOrElse("TODO", null),
|
||||||
.optional_type => |optional_info| {
|
.optional_type => |optional_info| {
|
||||||
try writer.writeByte('?');
|
try writer.writeByte('?');
|
||||||
return optional_info.payload_type;
|
return optional_info.payload_type;
|
||||||
@ -676,7 +751,7 @@ pub const Key = union(enum) {
|
|||||||
}
|
}
|
||||||
try writer.writeByte('}');
|
try writer.writeByte('}');
|
||||||
},
|
},
|
||||||
.enum_type => panicOrElse("TODO", null),
|
.enum_type => return panicOrElse("TODO", null),
|
||||||
.function_type => |function_info| {
|
.function_type => |function_info| {
|
||||||
try writer.writeAll("fn(");
|
try writer.writeAll("fn(");
|
||||||
|
|
||||||
@ -712,7 +787,7 @@ pub const Key = union(enum) {
|
|||||||
|
|
||||||
return function_info.return_type;
|
return function_info.return_type;
|
||||||
},
|
},
|
||||||
.union_type => panicOrElse("TODO", null),
|
.union_type => return panicOrElse("TODO", null),
|
||||||
.tuple_type => |tuple_info| {
|
.tuple_type => |tuple_info| {
|
||||||
try writer.writeAll("tuple{");
|
try writer.writeAll("tuple{");
|
||||||
for (tuple_info.types) |field_ty, i| {
|
for (tuple_info.types) |field_ty, i| {
|
||||||
@ -1179,6 +1254,12 @@ pub fn get(ip: *InternPool, gpa: Allocator, key: Key) Allocator.Error!Index {
|
|||||||
return @intToEnum(Index, ip.items.len - 1);
|
return @intToEnum(Index, ip.items.len - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn contains(ip: InternPool, key: Key) ?Index {
|
||||||
|
const adapter: KeyAdapter = .{ .ip = &ip };
|
||||||
|
const index = ip.map.getIndexAdapted(key, adapter) orelse return null;
|
||||||
|
return @intToEnum(Index, index);
|
||||||
|
}
|
||||||
|
|
||||||
fn addExtra(ip: *InternPool, gpa: Allocator, extra: anytype) Allocator.Error!u32 {
|
fn addExtra(ip: *InternPool, gpa: Allocator, extra: anytype) Allocator.Error!u32 {
|
||||||
const T = @TypeOf(extra);
|
const T = @TypeOf(extra);
|
||||||
comptime if (@sizeOf(T) <= 4) {
|
comptime if (@sizeOf(T) <= 4) {
|
||||||
@ -2501,7 +2582,7 @@ inline fn panicOrElse(message: []const u8, value: anytype) @TypeOf(value) {
|
|||||||
if (builtin.is_test or builtin.mode == .Debug) {
|
if (builtin.is_test or builtin.mode == .Debug) {
|
||||||
@panic(message);
|
@panic(message);
|
||||||
}
|
}
|
||||||
return null;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user