more closely match Zir.Inst.Ref to InternPool.Index
This commit is contained in:
parent
57fc10eec0
commit
d98060b3d6
@ -241,7 +241,7 @@ pub fn interpret(
|
|||||||
else
|
else
|
||||||
(try (try interpreter.interpret(container_field.ast.value_expr, container_namespace, .{})).getValue()).val; // TODO check ty
|
(try (try interpreter.interpret(container_field.ast.value_expr, container_namespace, .{})).getValue()).val; // TODO check ty
|
||||||
|
|
||||||
if (init_type_value.ty != Index.type) {
|
if (init_type_value.ty != Index.type_type) {
|
||||||
try interpreter.recordError(
|
try interpreter.recordError(
|
||||||
container_field.ast.type_expr,
|
container_field.ast.type_expr,
|
||||||
"expected_type",
|
"expected_type",
|
||||||
@ -267,7 +267,7 @@ pub fn interpret(
|
|||||||
return InterpretResult{ .value = Value{
|
return InterpretResult{ .value = Value{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.node_idx = node_idx,
|
.node_idx = node_idx,
|
||||||
.ty = Index.type,
|
.ty = Index.type_type,
|
||||||
.val = struct_type,
|
.val = struct_type,
|
||||||
} };
|
} };
|
||||||
},
|
},
|
||||||
@ -314,7 +314,7 @@ pub fn interpret(
|
|||||||
if (type_value == null and init_value == null) return InterpretResult{ .nothing = {} };
|
if (type_value == null and init_value == null) return InterpretResult{ .nothing = {} };
|
||||||
|
|
||||||
if (type_value) |v| {
|
if (type_value) |v| {
|
||||||
if (v.ty != Index.type) return InterpretResult{ .nothing = {} };
|
if (v.ty != Index.type_type) return InterpretResult{ .nothing = {} };
|
||||||
}
|
}
|
||||||
|
|
||||||
const decl = interpreter.ip.getDecl(decl_index);
|
const decl = interpreter.ip.getDecl(decl_index);
|
||||||
@ -383,46 +383,46 @@ pub fn interpret(
|
|||||||
const identifier = offsets.nodeToSlice(tree, node_idx);
|
const identifier = offsets.nodeToSlice(tree, node_idx);
|
||||||
|
|
||||||
const simples = std.ComptimeStringMap(Index, .{
|
const simples = std.ComptimeStringMap(Index, .{
|
||||||
.{ "anyerror", Index.anyerror },
|
.{ "anyerror", Index.anyerror_type },
|
||||||
.{ "anyframe", Index.@"anyframe" },
|
.{ "anyframe", Index.anyframe_type },
|
||||||
.{ "anyopaque", Index.anyopaque },
|
.{ "anyopaque", Index.anyopaque_type },
|
||||||
.{ "bool", Index.bool },
|
.{ "bool", Index.bool_type },
|
||||||
.{ "c_int", Index.c_int },
|
.{ "c_int", Index.c_int_type },
|
||||||
.{ "c_long", Index.c_long },
|
.{ "c_long", Index.c_long_type },
|
||||||
.{ "c_longdouble", Index.c_longdouble },
|
.{ "c_longdouble", Index.c_longdouble_type },
|
||||||
.{ "c_longlong", Index.c_longlong },
|
.{ "c_longlong", Index.c_longlong_type },
|
||||||
.{ "c_short", Index.c_short },
|
.{ "c_short", Index.c_short_type },
|
||||||
.{ "c_uint", Index.c_uint },
|
.{ "c_uint", Index.c_uint_type },
|
||||||
.{ "c_ulong", Index.c_ulong },
|
.{ "c_ulong", Index.c_ulong_type },
|
||||||
.{ "c_ulonglong", Index.c_ulonglong },
|
.{ "c_ulonglong", Index.c_ulonglong_type },
|
||||||
.{ "c_ushort", Index.c_ushort },
|
.{ "c_ushort", Index.c_ushort_type },
|
||||||
.{ "comptime_float", Index.comptime_float },
|
.{ "comptime_float", Index.comptime_float_type },
|
||||||
.{ "comptime_int", Index.comptime_int },
|
.{ "comptime_int", Index.comptime_int_type },
|
||||||
.{ "f128", Index.f128 },
|
.{ "f128", Index.f128_type },
|
||||||
.{ "f16", Index.f16 },
|
.{ "f16", Index.f16_type },
|
||||||
.{ "f32", Index.f32 },
|
.{ "f32", Index.f32_type },
|
||||||
.{ "f64", Index.f64 },
|
.{ "f64", Index.f64_type },
|
||||||
.{ "f80", Index.f80 },
|
.{ "f80", Index.f80_type },
|
||||||
.{ "false", Index.bool_false },
|
.{ "false", Index.bool_false },
|
||||||
.{ "isize", Index.isize },
|
.{ "isize", Index.isize_type },
|
||||||
.{ "noreturn", Index.noreturn },
|
.{ "noreturn", Index.noreturn_type },
|
||||||
.{ "null", Index.null_value },
|
.{ "null", Index.null_value },
|
||||||
.{ "true", Index.bool_true },
|
.{ "true", Index.bool_true },
|
||||||
.{ "type", Index.type },
|
.{ "type", Index.type_type },
|
||||||
.{ "undefined", Index.undefined_value },
|
.{ "undefined", Index.undefined_value },
|
||||||
.{ "usize", Index.usize },
|
.{ "usize", Index.usize_type },
|
||||||
.{ "void", Index.void },
|
.{ "void", Index.void_type },
|
||||||
});
|
});
|
||||||
|
|
||||||
if (simples.get(identifier)) |index| {
|
if (simples.get(identifier)) |index| {
|
||||||
const ty: Index = switch (index) {
|
const ty: Index = switch (index) {
|
||||||
.undefined_value => .undefined_type,
|
.undefined_value => .undefined_type,
|
||||||
.void_value => .void,
|
.void_value => .void_type,
|
||||||
.unreachable_value => .noreturn,
|
.unreachable_value => .noreturn_type,
|
||||||
.null_value => .null_type,
|
.null_value => .null_type,
|
||||||
.bool_true => .bool,
|
.bool_true => .bool_type,
|
||||||
.bool_false => .bool,
|
.bool_false => .bool_type,
|
||||||
else => .type,
|
else => .type_type,
|
||||||
};
|
};
|
||||||
return InterpretResult{ .value = Value{
|
return InterpretResult{ .value = Value{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
@ -436,7 +436,7 @@ pub fn interpret(
|
|||||||
return InterpretResult{ .value = Value{
|
return InterpretResult{ .value = Value{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.node_idx = node_idx,
|
.node_idx = node_idx,
|
||||||
.ty = Index.type,
|
.ty = Index.type_type,
|
||||||
.val = try interpreter.ip.get(interpreter.allocator, Key{ .int_type = .{
|
.val = try interpreter.ip.get(interpreter.allocator, Key{ .int_type = .{
|
||||||
.signedness = if (identifier[0] == 'u') .unsigned else .signed,
|
.signedness = if (identifier[0] == 'u') .unsigned else .signed,
|
||||||
.bits = std.fmt.parseInt(u16, identifier[1..], 10) catch break :blk,
|
.bits = std.fmt.parseInt(u16, identifier[1..], 10) catch break :blk,
|
||||||
@ -537,7 +537,7 @@ pub fn interpret(
|
|||||||
.value = Value{
|
.value = Value{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.node_idx = data[node_idx].rhs,
|
.node_idx = data[node_idx].rhs,
|
||||||
.ty = Index.usize,
|
.ty = Index.usize_type,
|
||||||
.val = .none, // TODO resolve length of Slice
|
.val = .none, // TODO resolve length of Slice
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -548,7 +548,7 @@ pub fn interpret(
|
|||||||
.value = Value{
|
.value = Value{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.node_idx = data[node_idx].rhs,
|
.node_idx = data[node_idx].rhs,
|
||||||
.ty = Index.usize,
|
.ty = Index.usize_type,
|
||||||
.val = .none, // TODO resolve length of Slice
|
.val = .none, // TODO resolve length of Slice
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -563,7 +563,7 @@ pub fn interpret(
|
|||||||
return InterpretResult{ .value = Value{
|
return InterpretResult{ .value = Value{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.node_idx = data[node_idx].rhs,
|
.node_idx = data[node_idx].rhs,
|
||||||
.ty = Index.comptime_int,
|
.ty = Index.comptime_int_type,
|
||||||
.val = len_value,
|
.val = len_value,
|
||||||
} };
|
} };
|
||||||
}
|
}
|
||||||
@ -682,7 +682,7 @@ pub fn interpret(
|
|||||||
.value = Value{
|
.value = Value{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.node_idx = node_idx,
|
.node_idx = node_idx,
|
||||||
.ty = Index.bool,
|
.ty = Index.bool_type,
|
||||||
.val = if (a_value.val == b_value.val) Index.bool_true else Index.bool_false, // TODO eql function required?
|
.val = if (a_value.val == b_value.val) Index.bool_true else Index.bool_false, // TODO eql function required?
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -693,7 +693,7 @@ pub fn interpret(
|
|||||||
|
|
||||||
if (nl == .failure) return error.CriticalAstFailure;
|
if (nl == .failure) return error.CriticalAstFailure;
|
||||||
|
|
||||||
const number_type = if (nl == .float) Index.comptime_float else Index.comptime_int;
|
const number_type = if (nl == .float) Index.comptime_float_type else Index.comptime_int_type;
|
||||||
|
|
||||||
const value = try interpreter.ip.get(
|
const value = try interpreter.ip.get(
|
||||||
interpreter.allocator,
|
interpreter.allocator,
|
||||||
@ -841,7 +841,7 @@ pub fn interpret(
|
|||||||
.value = Value{
|
.value = Value{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.node_idx = node_idx,
|
.node_idx = node_idx,
|
||||||
.ty = Index.type,
|
.ty = Index.type_type,
|
||||||
.val = .none, // TODO
|
.val = .none, // TODO
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -854,7 +854,7 @@ pub fn interpret(
|
|||||||
return InterpretResult{ .value = Value{
|
return InterpretResult{ .value = Value{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.node_idx = node_idx,
|
.node_idx = node_idx,
|
||||||
.ty = Index.type,
|
.ty = Index.type_type,
|
||||||
.val = value.ty,
|
.val = value.ty,
|
||||||
} };
|
} };
|
||||||
}
|
}
|
||||||
@ -865,7 +865,7 @@ pub fn interpret(
|
|||||||
const value = try (try interpreter.interpret(params[0], namespace, options)).getValue();
|
const value = try (try interpreter.interpret(params[0], namespace, options)).getValue();
|
||||||
const field_name = try (try interpreter.interpret(params[1], namespace, options)).getValue();
|
const field_name = try (try interpreter.interpret(params[1], namespace, options)).getValue();
|
||||||
|
|
||||||
if (value.ty != Index.type or value.ty == .none) return error.InvalidBuiltin;
|
if (value.ty != Index.type_type or value.ty == .none) return error.InvalidBuiltin;
|
||||||
if (interpreter.ip.indexToKey(field_name.ty) != .pointer_type) return error.InvalidBuiltin; // Check if it's a []const u8
|
if (interpreter.ip.indexToKey(field_name.ty) != .pointer_type) return error.InvalidBuiltin; // Check if it's a []const u8
|
||||||
if (value.val == .none) return error.InvalidBuiltin;
|
if (value.val == .none) return error.InvalidBuiltin;
|
||||||
|
|
||||||
@ -880,7 +880,7 @@ pub fn interpret(
|
|||||||
return InterpretResult{ .value = Value{
|
return InterpretResult{ .value = Value{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.node_idx = node_idx,
|
.node_idx = node_idx,
|
||||||
.ty = Index.bool,
|
.ty = Index.bool_type,
|
||||||
.val = if (has_decl) Index.bool_true else Index.bool_false,
|
.val = if (has_decl) Index.bool_true else Index.bool_false,
|
||||||
} };
|
} };
|
||||||
}
|
}
|
||||||
@ -891,7 +891,7 @@ pub fn interpret(
|
|||||||
const as_type = try (try interpreter.interpret(params[0], namespace, options)).getValue();
|
const as_type = try (try interpreter.interpret(params[0], namespace, options)).getValue();
|
||||||
const value = try (try interpreter.interpret(params[1], namespace, options)).getValue();
|
const value = try (try interpreter.interpret(params[1], namespace, options)).getValue();
|
||||||
|
|
||||||
if (as_type.ty != Index.type) return error.InvalidBuiltin;
|
if (as_type.ty != Index.type_type) return error.InvalidBuiltin;
|
||||||
|
|
||||||
return InterpretResult{
|
return InterpretResult{
|
||||||
.value = Value{
|
.value = Value{
|
||||||
@ -911,10 +911,7 @@ pub fn interpret(
|
|||||||
|
|
||||||
const string_literal_type = try interpreter.ip.get(interpreter.allocator, Key{ .pointer_type = .{
|
const string_literal_type = try interpreter.ip.get(interpreter.allocator, Key{ .pointer_type = .{
|
||||||
.elem_type = try interpreter.ip.get(interpreter.allocator, Key{ .array_type = .{
|
.elem_type = try interpreter.ip.get(interpreter.allocator, Key{ .array_type = .{
|
||||||
.child = try interpreter.ip.get(interpreter.allocator, Key{ .int_type = .{
|
.child = Index.u8_type,
|
||||||
.signedness = .unsigned,
|
|
||||||
.bits = 8,
|
|
||||||
} }),
|
|
||||||
.len = @intCast(u64, str.len),
|
.len = @intCast(u64, str.len),
|
||||||
.sentinel = try interpreter.ip.get(interpreter.allocator, Key{ .int_u64_value = 0 }),
|
.sentinel = try interpreter.ip.get(interpreter.allocator, Key{ .int_u64_value = 0 }),
|
||||||
} }),
|
} }),
|
||||||
@ -990,7 +987,7 @@ pub fn interpret(
|
|||||||
|
|
||||||
const decl_index = try interpreter.ip.createDecl(interpreter.allocator, .{
|
const decl_index = try interpreter.ip.createDecl(interpreter.allocator, .{
|
||||||
.name = name,
|
.name = name,
|
||||||
.ty = Index.type,
|
.ty = Index.type_type,
|
||||||
.val = function_type,
|
.val = function_type,
|
||||||
.alignment = 0, // TODO
|
.alignment = 0, // TODO
|
||||||
.address_space = .generic, // TODO
|
.address_space = .generic, // TODO
|
||||||
@ -1037,7 +1034,7 @@ pub fn interpret(
|
|||||||
const result = try interpreter.interpret(data[node_idx].lhs, namespace, .{});
|
const result = try interpreter.interpret(data[node_idx].lhs, namespace, .{});
|
||||||
const value = try result.getValue();
|
const value = try result.getValue();
|
||||||
|
|
||||||
if (value.ty != Index.bool) {
|
if (value.ty != Index.bool_type) {
|
||||||
try interpreter.recordError(
|
try interpreter.recordError(
|
||||||
node_idx,
|
node_idx,
|
||||||
"invalid_deref",
|
"invalid_deref",
|
||||||
@ -1051,7 +1048,7 @@ pub fn interpret(
|
|||||||
return InterpretResult{ .value = .{
|
return InterpretResult{ .value = .{
|
||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.node_idx = node_idx,
|
.node_idx = node_idx,
|
||||||
.ty = Index.bool,
|
.ty = Index.bool_type,
|
||||||
.val = if (value.val == Index.bool_false) Index.bool_true else Index.bool_false,
|
.val = if (value.val == Index.bool_false) Index.bool_true else Index.bool_false,
|
||||||
} };
|
} };
|
||||||
},
|
},
|
||||||
@ -1142,7 +1139,7 @@ pub fn call(
|
|||||||
while (ast.nextFnParam(&arg_it)) |param| {
|
while (ast.nextFnParam(&arg_it)) |param| {
|
||||||
if (arg_index >= arguments.len) return error.MissingArguments;
|
if (arg_index >= arguments.len) return error.MissingArguments;
|
||||||
var tex = try (try interpreter.interpret(param.type_expr, fn_namespace, options)).getValue();
|
var tex = try (try interpreter.interpret(param.type_expr, fn_namespace, options)).getValue();
|
||||||
if (tex.ty != Index.type) {
|
if (tex.ty != Index.type_type) {
|
||||||
try interpreter.recordError(
|
try interpreter.recordError(
|
||||||
param.type_expr,
|
param.type_expr,
|
||||||
"expected_type",
|
"expected_type",
|
||||||
|
@ -277,10 +277,24 @@ pub const Key = union(enum) {
|
|||||||
.type => .Type,
|
.type => .Type,
|
||||||
.anyerror => .ErrorSet,
|
.anyerror => .ErrorSet,
|
||||||
.noreturn => .NoReturn,
|
.noreturn => .NoReturn,
|
||||||
.@"anyframe" => .AnyFrame,
|
.anyframe_type => .AnyFrame,
|
||||||
.null_type => .Null,
|
.null_type => .Null,
|
||||||
.undefined_type => .Undefined,
|
.undefined_type => .Undefined,
|
||||||
.enum_literal_type => .EnumLiteral,
|
.enum_literal_type => .EnumLiteral,
|
||||||
|
|
||||||
|
.atomic_order => .Enum,
|
||||||
|
.atomic_rmw_op => .Enum,
|
||||||
|
.calling_convention => .Enum,
|
||||||
|
.address_space => .Enum,
|
||||||
|
.float_mode => .Enum,
|
||||||
|
.reduce_op => .Enum,
|
||||||
|
.modifier => .Enum,
|
||||||
|
.prefetch_options => .Struct,
|
||||||
|
.export_options => .Struct,
|
||||||
|
.extern_options => .Struct,
|
||||||
|
.type_info => .Union,
|
||||||
|
|
||||||
|
.generic_poison => unreachable,
|
||||||
},
|
},
|
||||||
|
|
||||||
.int_type => .Int,
|
.int_type => .Int,
|
||||||
@ -293,7 +307,7 @@ pub const Key = union(enum) {
|
|||||||
.enum_type => .Enum,
|
.enum_type => .Enum,
|
||||||
.function_type => .Fn,
|
.function_type => .Fn,
|
||||||
.union_type => .Union,
|
.union_type => .Union,
|
||||||
.tuple_type => .Struct, // TODO this correct?
|
.tuple_type => .Struct,
|
||||||
.vector_type => .Vector,
|
.vector_type => .Vector,
|
||||||
.anyframe_type => .AnyFrame,
|
.anyframe_type => .AnyFrame,
|
||||||
|
|
||||||
@ -447,7 +461,7 @@ pub const Key = union(enum) {
|
|||||||
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) {
|
||||||
.@"anyframe" => Index.void,
|
.anyframe_type => Index.void_type,
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
},
|
},
|
||||||
.pointer_type => |pointer_info| pointer_info.elem_type,
|
.pointer_type => |pointer_info| pointer_info.elem_type,
|
||||||
@ -503,7 +517,7 @@ pub const Key = union(enum) {
|
|||||||
.anyerror,
|
.anyerror,
|
||||||
.comptime_int,
|
.comptime_int,
|
||||||
.comptime_float,
|
.comptime_float,
|
||||||
.@"anyframe",
|
.anyframe_type,
|
||||||
.enum_literal_type,
|
.enum_literal_type,
|
||||||
=> Index.none,
|
=> Index.none,
|
||||||
|
|
||||||
@ -511,6 +525,21 @@ pub const Key = union(enum) {
|
|||||||
.noreturn => Index.unreachable_value,
|
.noreturn => Index.unreachable_value,
|
||||||
.null_type => Index.null_value,
|
.null_type => Index.null_value,
|
||||||
.undefined_type => Index.undefined_value,
|
.undefined_type => Index.undefined_value,
|
||||||
|
|
||||||
|
.atomic_order,
|
||||||
|
.atomic_rmw_op,
|
||||||
|
.calling_convention,
|
||||||
|
.address_space,
|
||||||
|
.float_mode,
|
||||||
|
.reduce_op,
|
||||||
|
.modifier,
|
||||||
|
.prefetch_options,
|
||||||
|
.export_options,
|
||||||
|
.extern_options,
|
||||||
|
.type_info,
|
||||||
|
=> Index.none,
|
||||||
|
|
||||||
|
.generic_poison => unreachable,
|
||||||
},
|
},
|
||||||
.int_type => |int_info| {
|
.int_type => |int_info| {
|
||||||
if (int_info.bits == 0) {
|
if (int_info.bits == 0) {
|
||||||
@ -536,10 +565,10 @@ pub const Key = union(enum) {
|
|||||||
if (ip.indexToKey(entry.value_ptr.ty).onePossibleValue(ip) != Index.none) continue;
|
if (ip.indexToKey(entry.value_ptr.ty).onePossibleValue(ip) != Index.none) continue;
|
||||||
return Index.none;
|
return Index.none;
|
||||||
}
|
}
|
||||||
return panicOrElse("TODO return empty struct value", Index.none);
|
return Index.empty_struct;
|
||||||
},
|
},
|
||||||
.optional_type => |optional_info| {
|
.optional_type => |optional_info| {
|
||||||
if (optional_info.payload_type == Index.noreturn) {
|
if (optional_info.payload_type == Index.noreturn_type) {
|
||||||
return Index.null_value;
|
return Index.null_value;
|
||||||
}
|
}
|
||||||
return Index.none;
|
return Index.none;
|
||||||
@ -648,12 +677,25 @@ pub const Key = union(enum) {
|
|||||||
.comptime_int,
|
.comptime_int,
|
||||||
.comptime_float,
|
.comptime_float,
|
||||||
.noreturn,
|
.noreturn,
|
||||||
.@"anyframe",
|
.anyframe_type,
|
||||||
=> try writer.writeAll(@tagName(simple)),
|
=> try writer.writeAll(@tagName(simple)),
|
||||||
|
|
||||||
.null_type => try writer.writeAll("@TypeOf(null)"),
|
.null_type => try writer.writeAll("@TypeOf(null)"),
|
||||||
.undefined_type => try writer.writeAll("@TypeOf(undefined)"),
|
.undefined_type => try writer.writeAll("@TypeOf(undefined)"),
|
||||||
.enum_literal_type => try writer.writeAll("@TypeOf(.enum_literal)"),
|
.enum_literal_type => try writer.writeAll("@TypeOf(.enum_literal)"),
|
||||||
|
|
||||||
|
.atomic_order => try writer.writeAll("std.builtin.AtomicOrder"),
|
||||||
|
.atomic_rmw_op => try writer.writeAll("std.builtin.AtomicRmwOp"),
|
||||||
|
.calling_convention => try writer.writeAll("std.builtin.CallingConvention"),
|
||||||
|
.address_space => try writer.writeAll("std.builtin.AddressSpace"),
|
||||||
|
.float_mode => try writer.writeAll("std.builtin.FloatMode"),
|
||||||
|
.reduce_op => try writer.writeAll("std.builtin.ReduceOp"),
|
||||||
|
.modifier => try writer.writeAll("std.builtin.CallModifier"),
|
||||||
|
.prefetch_options => try writer.writeAll("std.builtin.PrefetchOptions"),
|
||||||
|
.export_options => try writer.writeAll("std.builtin.ExportOptions"),
|
||||||
|
.extern_options => try writer.writeAll("std.builtin.ExternOptions"),
|
||||||
|
.type_info => try writer.writeAll("std.builtin.Type"),
|
||||||
|
.generic_poison => unreachable,
|
||||||
},
|
},
|
||||||
.int_type => |int_info| switch (int_info.signedness) {
|
.int_type => |int_info| switch (int_info.signedness) {
|
||||||
.signed => try writer.print("i{}", .{int_info.bits}),
|
.signed => try writer.print("i{}", .{int_info.bits}),
|
||||||
@ -821,45 +863,15 @@ pub const Key = union(enum) {
|
|||||||
writer: anytype,
|
writer: anytype,
|
||||||
) @TypeOf(writer).Error!void {
|
) @TypeOf(writer).Error!void {
|
||||||
switch (value) {
|
switch (value) {
|
||||||
.simple_type => |simple| switch (simple) {
|
.simple_type => try printType(ty, ip, writer),
|
||||||
.f16,
|
|
||||||
.f32,
|
|
||||||
.f64,
|
|
||||||
.f80,
|
|
||||||
.f128,
|
|
||||||
.usize,
|
|
||||||
.isize,
|
|
||||||
.c_short,
|
|
||||||
.c_ushort,
|
|
||||||
.c_int,
|
|
||||||
.c_uint,
|
|
||||||
.c_long,
|
|
||||||
.c_ulong,
|
|
||||||
.c_longlong,
|
|
||||||
.c_ulonglong,
|
|
||||||
.c_longdouble,
|
|
||||||
.anyopaque,
|
|
||||||
.bool,
|
|
||||||
.void,
|
|
||||||
.type,
|
|
||||||
.anyerror,
|
|
||||||
.comptime_int,
|
|
||||||
.comptime_float,
|
|
||||||
.noreturn,
|
|
||||||
.@"anyframe",
|
|
||||||
=> try writer.writeAll(@tagName(simple)),
|
|
||||||
|
|
||||||
.null_type => try writer.writeAll("@TypeOf(null)"),
|
|
||||||
.undefined_type => try writer.writeAll("@TypeOf(undefined)"),
|
|
||||||
.enum_literal_type => try writer.writeAll("@TypeOf(.enum_literal)"),
|
|
||||||
},
|
|
||||||
.simple_value => |simple| switch (simple) {
|
.simple_value => |simple| switch (simple) {
|
||||||
.undefined_value => try writer.writeAll("@Type(.Undefined)"),
|
.undefined_value => try writer.writeAll("undefined"),
|
||||||
.void_value => try writer.writeAll("void"),
|
.void_value => try writer.writeAll("{}"),
|
||||||
.unreachable_value => try writer.writeAll("unreachable"),
|
.unreachable_value => try writer.writeAll("unreachable"),
|
||||||
.null_value => try writer.writeAll("null"),
|
.null_value => try writer.writeAll("null"),
|
||||||
.bool_true => try writer.writeAll("true"),
|
.bool_true => try writer.writeAll("true"),
|
||||||
.bool_false => try writer.writeAll("false"),
|
.bool_false => try writer.writeAll("false"),
|
||||||
|
.generic_poison => unreachable,
|
||||||
},
|
},
|
||||||
|
|
||||||
.int_type,
|
.int_type,
|
||||||
@ -943,44 +955,89 @@ pub const Item = struct {
|
|||||||
/// the same `InternPool`.
|
/// the same `InternPool`.
|
||||||
/// TODO split this into an Optional and non-Optional Index
|
/// TODO split this into an Optional and non-Optional Index
|
||||||
pub const Index = enum(u32) {
|
pub const Index = enum(u32) {
|
||||||
f16,
|
u1_type,
|
||||||
f32,
|
u8_type,
|
||||||
f64,
|
i8_type,
|
||||||
f80,
|
u16_type,
|
||||||
f128,
|
i16_type,
|
||||||
usize,
|
u29_type,
|
||||||
isize,
|
u32_type,
|
||||||
c_short,
|
i32_type,
|
||||||
c_ushort,
|
u64_type,
|
||||||
c_int,
|
i64_type,
|
||||||
c_uint,
|
u128_type,
|
||||||
c_long,
|
i128_type,
|
||||||
c_ulong,
|
usize_type,
|
||||||
c_longlong,
|
isize_type,
|
||||||
c_ulonglong,
|
c_short_type,
|
||||||
c_longdouble,
|
c_ushort_type,
|
||||||
anyopaque,
|
c_int_type,
|
||||||
bool,
|
c_uint_type,
|
||||||
void,
|
c_long_type,
|
||||||
type,
|
c_ulong_type,
|
||||||
anyerror,
|
c_longlong_type,
|
||||||
comptime_int,
|
c_ulonglong_type,
|
||||||
comptime_float,
|
c_longdouble_type,
|
||||||
noreturn,
|
f16_type,
|
||||||
@"anyframe",
|
f32_type,
|
||||||
|
f64_type,
|
||||||
|
f80_type,
|
||||||
|
f128_type,
|
||||||
|
anyopaque_type,
|
||||||
|
bool_type,
|
||||||
|
void_type,
|
||||||
|
type_type,
|
||||||
|
anyerror_type,
|
||||||
|
comptime_int_type,
|
||||||
|
comptime_float_type,
|
||||||
|
noreturn_type,
|
||||||
|
anyframe_type,
|
||||||
null_type,
|
null_type,
|
||||||
undefined_type,
|
undefined_type,
|
||||||
enum_literal_type,
|
enum_literal_type,
|
||||||
|
atomic_order_type,
|
||||||
|
atomic_rmw_op_type,
|
||||||
|
calling_convention_type,
|
||||||
|
address_space_type,
|
||||||
|
float_mode_type,
|
||||||
|
reduce_op_type,
|
||||||
|
modifier_type,
|
||||||
|
prefetch_options_type,
|
||||||
|
export_options_type,
|
||||||
|
extern_options_type,
|
||||||
|
type_info_type,
|
||||||
|
manyptr_u8_type,
|
||||||
|
manyptr_const_u8_type,
|
||||||
|
fn_noreturn_no_args_type,
|
||||||
|
fn_void_no_args_type,
|
||||||
|
fn_naked_noreturn_no_args_type,
|
||||||
|
fn_ccc_void_no_args_type,
|
||||||
|
single_const_pointer_to_comptime_int_type,
|
||||||
|
const_slice_u8_type,
|
||||||
|
anyerror_void_error_union_type,
|
||||||
|
generic_poison_type,
|
||||||
|
|
||||||
|
/// `undefined` (untyped)
|
||||||
undefined_value,
|
undefined_value,
|
||||||
void_value,
|
/// `0` (comptime_int)
|
||||||
unreachable_value,
|
|
||||||
null_value,
|
|
||||||
bool_true,
|
|
||||||
bool_false,
|
|
||||||
|
|
||||||
zero,
|
zero,
|
||||||
|
/// `1` (comptime_int)
|
||||||
|
one,
|
||||||
|
/// `{}`
|
||||||
|
void_value,
|
||||||
|
/// `unreachable` (noreturn type)
|
||||||
|
unreachable_value,
|
||||||
|
/// `null` (untyped)
|
||||||
|
null_value,
|
||||||
|
/// `true`
|
||||||
|
bool_true,
|
||||||
|
/// `false`
|
||||||
|
bool_false,
|
||||||
|
/// `.{}` (untyped)
|
||||||
|
empty_struct,
|
||||||
|
generic_poison,
|
||||||
|
|
||||||
|
unknown = std.math.maxInt(u32) - 1,
|
||||||
none = std.math.maxInt(u32),
|
none = std.math.maxInt(u32),
|
||||||
_,
|
_,
|
||||||
|
|
||||||
@ -1126,10 +1183,24 @@ pub const SimpleType = enum(u32) {
|
|||||||
comptime_int,
|
comptime_int,
|
||||||
comptime_float,
|
comptime_float,
|
||||||
noreturn,
|
noreturn,
|
||||||
@"anyframe",
|
anyframe_type,
|
||||||
null_type,
|
null_type,
|
||||||
undefined_type,
|
undefined_type,
|
||||||
enum_literal_type,
|
enum_literal_type,
|
||||||
|
|
||||||
|
atomic_order,
|
||||||
|
atomic_rmw_op,
|
||||||
|
calling_convention,
|
||||||
|
address_space,
|
||||||
|
float_mode,
|
||||||
|
reduce_op,
|
||||||
|
modifier,
|
||||||
|
prefetch_options,
|
||||||
|
export_options,
|
||||||
|
extern_options,
|
||||||
|
type_info,
|
||||||
|
|
||||||
|
generic_poison,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const SimpleValue = enum(u32) {
|
pub const SimpleValue = enum(u32) {
|
||||||
@ -1139,6 +1210,7 @@ pub const SimpleValue = enum(u32) {
|
|||||||
null_value,
|
null_value,
|
||||||
bool_true,
|
bool_true,
|
||||||
bool_false,
|
bool_false,
|
||||||
|
generic_poison,
|
||||||
};
|
};
|
||||||
|
|
||||||
comptime {
|
comptime {
|
||||||
@ -1148,51 +1220,98 @@ comptime {
|
|||||||
pub fn init(gpa: Allocator) Allocator.Error!InternPool {
|
pub fn init(gpa: Allocator) Allocator.Error!InternPool {
|
||||||
var ip: InternPool = .{};
|
var ip: InternPool = .{};
|
||||||
|
|
||||||
const simple_count = std.meta.fields(SimpleType).len + std.meta.fields(SimpleValue).len;
|
const items = [_]struct { index: Index, key: Key }{
|
||||||
const count = simple_count + 1;
|
.{ .index = .u1_type, .key = .{ .int_type = .{ .signedness = .unsigned, .bits = 1 } } },
|
||||||
const extra_count = @sizeOf(u64);
|
.{ .index = .u8_type, .key = .{ .int_type = .{ .signedness = .unsigned, .bits = 8 } } },
|
||||||
|
.{ .index = .i8_type, .key = .{ .int_type = .{ .signedness = .signed, .bits = 8 } } },
|
||||||
|
.{ .index = .u16_type, .key = .{ .int_type = .{ .signedness = .unsigned, .bits = 16 } } },
|
||||||
|
.{ .index = .i16_type, .key = .{ .int_type = .{ .signedness = .signed, .bits = 16 } } },
|
||||||
|
.{ .index = .u29_type, .key = .{ .int_type = .{ .signedness = .unsigned, .bits = 29 } } },
|
||||||
|
.{ .index = .u32_type, .key = .{ .int_type = .{ .signedness = .unsigned, .bits = 32 } } },
|
||||||
|
.{ .index = .i32_type, .key = .{ .int_type = .{ .signedness = .signed, .bits = 32 } } },
|
||||||
|
.{ .index = .u64_type, .key = .{ .int_type = .{ .signedness = .unsigned, .bits = 64 } } },
|
||||||
|
.{ .index = .i64_type, .key = .{ .int_type = .{ .signedness = .signed, .bits = 64 } } },
|
||||||
|
.{ .index = .u128_type, .key = .{ .int_type = .{ .signedness = .unsigned, .bits = 128 } } },
|
||||||
|
.{ .index = .i128_type, .key = .{ .int_type = .{ .signedness = .signed, .bits = 128 } } },
|
||||||
|
|
||||||
try ip.map.ensureTotalCapacity(gpa, count);
|
.{ .index = .usize_type, .key = .{ .simple_type = .usize } },
|
||||||
try ip.items.ensureTotalCapacity(gpa, count);
|
.{ .index = .isize_type, .key = .{ .simple_type = .isize } },
|
||||||
|
.{ .index = .c_short_type, .key = .{ .simple_type = .c_short } },
|
||||||
|
.{ .index = .c_ushort_type, .key = .{ .simple_type = .c_ushort } },
|
||||||
|
.{ .index = .c_int_type, .key = .{ .simple_type = .c_int } },
|
||||||
|
.{ .index = .c_uint_type, .key = .{ .simple_type = .c_uint } },
|
||||||
|
.{ .index = .c_long_type, .key = .{ .simple_type = .c_long } },
|
||||||
|
.{ .index = .c_ulong_type, .key = .{ .simple_type = .c_ulong } },
|
||||||
|
.{ .index = .c_longlong_type, .key = .{ .simple_type = .c_longlong } },
|
||||||
|
.{ .index = .c_ulonglong_type, .key = .{ .simple_type = .c_ulonglong } },
|
||||||
|
.{ .index = .c_longdouble_type, .key = .{ .simple_type = .c_longdouble } },
|
||||||
|
.{ .index = .f16_type, .key = .{ .simple_type = .f16 } },
|
||||||
|
.{ .index = .f32_type, .key = .{ .simple_type = .f32 } },
|
||||||
|
.{ .index = .f64_type, .key = .{ .simple_type = .f64 } },
|
||||||
|
.{ .index = .f80_type, .key = .{ .simple_type = .f80 } },
|
||||||
|
.{ .index = .f128_type, .key = .{ .simple_type = .f128 } },
|
||||||
|
.{ .index = .anyopaque_type, .key = .{ .simple_type = .anyopaque } },
|
||||||
|
.{ .index = .bool_type, .key = .{ .simple_type = .bool } },
|
||||||
|
.{ .index = .void_type, .key = .{ .simple_type = .void } },
|
||||||
|
.{ .index = .type_type, .key = .{ .simple_type = .type } },
|
||||||
|
.{ .index = .anyerror_type, .key = .{ .simple_type = .anyerror } },
|
||||||
|
.{ .index = .comptime_int_type, .key = .{ .simple_type = .comptime_int } },
|
||||||
|
.{ .index = .comptime_float_type, .key = .{ .simple_type = .comptime_float } },
|
||||||
|
.{ .index = .noreturn_type, .key = .{ .simple_type = .noreturn } },
|
||||||
|
.{ .index = .anyframe_type, .key = .{ .simple_type = .anyframe_type } },
|
||||||
|
.{ .index = .null_type, .key = .{ .simple_type = .null_type } },
|
||||||
|
.{ .index = .undefined_type, .key = .{ .simple_type = .undefined_type } },
|
||||||
|
.{ .index = .enum_literal_type, .key = .{ .simple_type = .enum_literal_type } },
|
||||||
|
|
||||||
|
.{ .index = .atomic_order_type, .key = .{ .simple_type = .atomic_order } },
|
||||||
|
.{ .index = .atomic_rmw_op_type, .key = .{ .simple_type = .atomic_rmw_op } },
|
||||||
|
.{ .index = .calling_convention_type, .key = .{ .simple_type = .calling_convention } },
|
||||||
|
.{ .index = .address_space_type, .key = .{ .simple_type = .address_space } },
|
||||||
|
.{ .index = .float_mode_type, .key = .{ .simple_type = .float_mode } },
|
||||||
|
.{ .index = .reduce_op_type, .key = .{ .simple_type = .reduce_op } },
|
||||||
|
.{ .index = .modifier_type, .key = .{ .simple_type = .modifier } },
|
||||||
|
.{ .index = .prefetch_options_type, .key = .{ .simple_type = .prefetch_options } },
|
||||||
|
.{ .index = .export_options_type, .key = .{ .simple_type = .export_options } },
|
||||||
|
.{ .index = .extern_options_type, .key = .{ .simple_type = .extern_options } },
|
||||||
|
.{ .index = .type_info_type, .key = .{ .simple_type = .type_info } },
|
||||||
|
.{ .index = .manyptr_u8_type, .key = .{ .pointer_type = .{ .elem_type = .u8_type, .size = .Many } } },
|
||||||
|
.{ .index = .manyptr_const_u8_type, .key = .{ .pointer_type = .{ .elem_type = .u8_type, .size = .Many, .is_const = true } } },
|
||||||
|
.{ .index = .fn_noreturn_no_args_type, .key = .{ .function_type = .{ .args = &.{}, .return_type = .noreturn_type } } },
|
||||||
|
.{ .index = .fn_void_no_args_type, .key = .{ .function_type = .{ .args = &.{}, .return_type = .void_type } } },
|
||||||
|
.{ .index = .fn_naked_noreturn_no_args_type, .key = .{ .function_type = .{ .args = &.{}, .return_type = .void_type, .calling_convention = .Naked } } },
|
||||||
|
.{ .index = .fn_ccc_void_no_args_type, .key = .{ .function_type = .{ .args = &.{}, .return_type = .void_type, .calling_convention = .C } } },
|
||||||
|
.{ .index = .single_const_pointer_to_comptime_int_type, .key = .{ .pointer_type = .{ .elem_type = .comptime_int_type, .size = .One, .is_const = true } } },
|
||||||
|
.{ .index = .const_slice_u8_type, .key = .{ .pointer_type = .{ .elem_type = .u8_type, .size = .Slice, .is_const = true } } },
|
||||||
|
.{ .index = .anyerror_void_error_union_type, .key = .{ .error_union_type = .{ .error_set_type = .anyerror_type, .payload_type = .void_type } } },
|
||||||
|
.{ .index = .generic_poison_type, .key = .{ .simple_type = .generic_poison } },
|
||||||
|
|
||||||
|
.{ .index = .undefined_value, .key = .{ .simple_value = .undefined_value } },
|
||||||
|
.{ .index = .zero, .key = .{ .int_u64_value = 0 } },
|
||||||
|
.{ .index = .one, .key = .{ .int_u64_value = 1 } },
|
||||||
|
.{ .index = .void_value, .key = .{ .simple_value = .void_value } },
|
||||||
|
.{ .index = .unreachable_value, .key = .{ .simple_value = .unreachable_value } },
|
||||||
|
.{ .index = .null_value, .key = .{ .simple_value = .null_value } },
|
||||||
|
.{ .index = .bool_true, .key = .{ .simple_value = .bool_true } },
|
||||||
|
.{ .index = .bool_false, .key = .{ .simple_value = .bool_false } },
|
||||||
|
|
||||||
|
.{ .index = .empty_struct, .key = .{ .aggregate = &.{} } },
|
||||||
|
.{ .index = .generic_poison, .key = .{ .simple_value = .generic_poison } },
|
||||||
|
};
|
||||||
|
|
||||||
|
const extra_count = 4 * @sizeOf(Pointer) + @sizeOf(ErrorUnion) + 4 * @sizeOf(Function);
|
||||||
|
|
||||||
|
try ip.map.ensureTotalCapacity(gpa, items.len);
|
||||||
|
try ip.items.ensureTotalCapacity(gpa, items.len);
|
||||||
try ip.extra.ensureTotalCapacity(gpa, extra_count);
|
try ip.extra.ensureTotalCapacity(gpa, extra_count);
|
||||||
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .f16 }) catch unreachable;
|
for (items) |item| {
|
||||||
_ = ip.get(undefined, .{ .simple_type = .f32 }) catch unreachable;
|
if (builtin.is_test or builtin.mode == .Debug) {
|
||||||
_ = ip.get(undefined, .{ .simple_type = .f64 }) catch unreachable;
|
var failing_allocator = std.testing.FailingAllocator.init(undefined, 0);
|
||||||
_ = ip.get(undefined, .{ .simple_type = .f80 }) catch unreachable;
|
std.testing.expectEqual(item.index, ip.get(failing_allocator.allocator(), item.key) catch unreachable) catch unreachable;
|
||||||
_ = ip.get(undefined, .{ .simple_type = .f128 }) catch unreachable;
|
} else {
|
||||||
_ = ip.get(undefined, .{ .simple_type = .usize }) catch unreachable;
|
std.debug.assert(item.index == ip.get(undefined, item.key) catch unreachable);
|
||||||
_ = ip.get(undefined, .{ .simple_type = .isize }) catch unreachable;
|
}
|
||||||
_ = ip.get(undefined, .{ .simple_type = .c_short }) catch unreachable;
|
}
|
||||||
_ = ip.get(undefined, .{ .simple_type = .c_ushort }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .c_int }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .c_uint }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .c_long }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .c_ulong }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .c_longlong }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .c_ulonglong }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .c_longdouble }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .anyopaque }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .bool }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .void }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .type }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .anyerror }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .comptime_int }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .comptime_float }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .noreturn }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .@"anyframe" }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .null_type }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .undefined_type }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_type = .enum_literal_type }) catch unreachable;
|
|
||||||
|
|
||||||
_ = ip.get(undefined, .{ .simple_value = .undefined_value }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_value = .void_value }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_value = .unreachable_value }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_value = .null_value }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_value = .bool_true }) catch unreachable;
|
|
||||||
_ = ip.get(undefined, .{ .simple_value = .bool_false }) catch unreachable;
|
|
||||||
|
|
||||||
_ = ip.get(undefined, .{ .int_u64_value = 0 }) catch unreachable;
|
|
||||||
|
|
||||||
return ip;
|
return ip;
|
||||||
}
|
}
|
||||||
@ -1222,6 +1341,8 @@ pub fn deinit(ip: *InternPool, gpa: Allocator) void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn indexToKey(ip: InternPool, index: Index) Key {
|
pub fn indexToKey(ip: InternPool, index: Index) Key {
|
||||||
|
std.debug.assert(index != .none);
|
||||||
|
std.debug.assert(index != .unknown);
|
||||||
const item = ip.items.get(@enumToInt(index));
|
const item = ip.items.get(@enumToInt(index));
|
||||||
const data = item.data;
|
const data = item.data;
|
||||||
return switch (item.tag) {
|
return switch (item.tag) {
|
||||||
@ -1554,7 +1675,7 @@ pub fn cast(ip: *InternPool, gpa: Allocator, destination_ty: Index, source_ty: I
|
|||||||
|
|
||||||
pub fn resolvePeerTypes(ip: *InternPool, gpa: Allocator, types: []const Index, target: std.Target) Allocator.Error!Index {
|
pub fn resolvePeerTypes(ip: *InternPool, gpa: Allocator, types: []const Index, target: std.Target) Allocator.Error!Index {
|
||||||
switch (types.len) {
|
switch (types.len) {
|
||||||
0 => return Index.noreturn,
|
0 => return Index.noreturn_type,
|
||||||
1 => return types[0],
|
1 => return types[0],
|
||||||
else => {},
|
else => {},
|
||||||
}
|
}
|
||||||
@ -2504,7 +2625,7 @@ fn coerceInMemoryAllowedFns(
|
|||||||
} };
|
} };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src_info.return_type != Index.noreturn) {
|
if (src_info.return_type != Index.noreturn_type) {
|
||||||
const rt = try ip.coerceInMemoryAllowed(gpa, arena, dest_info.return_type, src_info.return_type, true, target);
|
const rt = try ip.coerceInMemoryAllowed(gpa, arena, dest_info.return_type, src_info.return_type, true, target);
|
||||||
if (rt != .ok) {
|
if (rt != .ok) {
|
||||||
return InMemoryCoercionResult{ .fn_return_type = .{
|
return InMemoryCoercionResult{ .fn_return_type = .{
|
||||||
@ -2749,8 +2870,8 @@ test "simple types" {
|
|||||||
try testExpectFmtType(ip, undefined_type, "@TypeOf(undefined)");
|
try testExpectFmtType(ip, undefined_type, "@TypeOf(undefined)");
|
||||||
try testExpectFmtType(ip, enum_literal_type, "@TypeOf(.enum_literal)");
|
try testExpectFmtType(ip, enum_literal_type, "@TypeOf(.enum_literal)");
|
||||||
|
|
||||||
try testExpectFmtValue(ip, undefined_value, Index.none, "@Type(.Undefined)");
|
try testExpectFmtValue(ip, undefined_value, Index.none, "undefined");
|
||||||
try testExpectFmtValue(ip, void_value, Index.none, "void");
|
try testExpectFmtValue(ip, void_value, Index.none, "{}");
|
||||||
try testExpectFmtValue(ip, unreachable_value, Index.none, "unreachable");
|
try testExpectFmtValue(ip, unreachable_value, Index.none, "unreachable");
|
||||||
try testExpectFmtValue(ip, null_value, Index.none, "null");
|
try testExpectFmtValue(ip, null_value, Index.none, "null");
|
||||||
try testExpectFmtValue(ip, bool_true, Index.none, "true");
|
try testExpectFmtValue(ip, bool_true, Index.none, "true");
|
||||||
|
@ -798,7 +798,7 @@ pub fn resolveTypeOfNodeInternal(store: *DocumentStore, arena: *std.heap.ArenaAl
|
|||||||
.interpreter = interpreter,
|
.interpreter = interpreter,
|
||||||
.value = value,
|
.value = value,
|
||||||
} },
|
} },
|
||||||
.is_type_val = value.ty == InternPool.Index.type,
|
.is_type_val = value.ty == InternPool.Index.type_type,
|
||||||
},
|
},
|
||||||
.handle = node_handle.handle,
|
.handle = node_handle.handle,
|
||||||
};
|
};
|
||||||
|
@ -231,7 +231,7 @@ test "ComptimeInterpreter - call return struct" {
|
|||||||
|
|
||||||
try std.testing.expectEqual(@as(usize, 1), struct_info.fields.count());
|
try std.testing.expectEqual(@as(usize, 1), struct_info.fields.count());
|
||||||
try std.testing.expectEqualStrings("slay", struct_info.fields.keys()[0]);
|
try std.testing.expectEqualStrings("slay", struct_info.fields.keys()[0]);
|
||||||
try std.testing.expect(struct_info.fields.values()[0].ty == Index.bool);
|
try std.testing.expect(struct_info.fields.values()[0].ty == Index.bool_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
test "ComptimeInterpreter - call comptime argument" {
|
test "ComptimeInterpreter - call comptime argument" {
|
||||||
|
Loading…
Reference in New Issue
Block a user