| ... | ... | @@ -33,7 +33,7 @@ pub fn copy(self: TypedValue, arena: Allocator) error{OutOfMemory}!TypedValue { |
| 33 | 33 | } |
| 34 | 34 | |
| 35 | 35 | pub fn eql(a: TypedValue, b: TypedValue, mod: *Module) bool { |
| 36 | | if (a.ty.ip_index != b.ty.ip_index) return false; |
| 36 | if (a.ty.toIntern() != b.ty.toIntern()) return false; |
| 37 | 37 | return a.val.eql(b.val, a.ty, mod); |
| 38 | 38 | } |
| 39 | 39 | |
| ... | ... | @@ -76,11 +76,7 @@ pub fn print( |
| 76 | 76 | ) (@TypeOf(writer).Error || Allocator.Error)!void { |
| 77 | 77 | var val = tv.val; |
| 78 | 78 | var ty = tv.ty; |
| 79 | | if (val.isVariable(mod)) |
| 80 | | return writer.writeAll("(variable)"); |
| 81 | | |
| 82 | 79 | while (true) switch (val.ip_index) { |
| 83 | | .empty_struct => return printAggregate(ty, val, writer, level, mod), |
| 84 | 80 | .none => switch (val.tag()) { |
| 85 | 81 | .aggregate => return printAggregate(ty, val, writer, level, mod), |
| 86 | 82 | .@"union" => { |
| ... | ... | @@ -91,7 +87,7 @@ pub fn print( |
| 91 | 87 | try writer.writeAll(".{ "); |
| 92 | 88 | |
| 93 | 89 | try print(.{ |
| 94 | | .ty = mod.unionPtr(mod.intern_pool.indexToKey(ty.ip_index).union_type.index).tag_ty, |
| 90 | .ty = mod.unionPtr(mod.intern_pool.indexToKey(ty.toIntern()).union_type.index).tag_ty, |
| 95 | 91 | .val = union_val.tag, |
| 96 | 92 | }, writer, level - 1, mod); |
| 97 | 93 | try writer.writeAll(" = "); |
| ... | ... | @@ -176,47 +172,112 @@ pub fn print( |
| 176 | 172 | .opt_payload => { |
| 177 | 173 | val = val.castTag(.opt_payload).?.data; |
| 178 | 174 | ty = ty.optionalChild(mod); |
| 179 | | return print(.{ .ty = ty, .val = val }, writer, level, mod); |
| 180 | 175 | }, |
| 181 | 176 | }, |
| 182 | | else => { |
| 183 | | const key = mod.intern_pool.indexToKey(val.ip_index); |
| 184 | | if (key.typeOf() == .type_type) { |
| 185 | | return Type.print(val.toType(), writer, mod); |
| 186 | | } |
| 187 | | switch (key) { |
| 188 | | .int => |int| switch (int.storage) { |
| 189 | | inline .u64, .i64, .big_int => |x| return writer.print("{}", .{x}), |
| 190 | | .lazy_align => |lazy_ty| return writer.print("{d}", .{ |
| 191 | | lazy_ty.toType().abiAlignment(mod), |
| 192 | | }), |
| 193 | | .lazy_size => |lazy_ty| return writer.print("{d}", .{ |
| 194 | | lazy_ty.toType().abiSize(mod), |
| 195 | | }), |
| 177 | else => switch (mod.intern_pool.indexToKey(val.toIntern())) { |
| 178 | .int_type, |
| 179 | .ptr_type, |
| 180 | .array_type, |
| 181 | .vector_type, |
| 182 | .opt_type, |
| 183 | .anyframe_type, |
| 184 | .error_union_type, |
| 185 | .simple_type, |
| 186 | .struct_type, |
| 187 | .anon_struct_type, |
| 188 | .union_type, |
| 189 | .opaque_type, |
| 190 | .enum_type, |
| 191 | .func_type, |
| 192 | .error_set_type, |
| 193 | .inferred_error_set_type, |
| 194 | => return Type.print(val.toType(), writer, mod), |
| 195 | .undef => return writer.writeAll("undefined"), |
| 196 | .runtime_value => return writer.writeAll("(runtime value)"), |
| 197 | .simple_value => |simple_value| switch (simple_value) { |
| 198 | .empty_struct => return printAggregate(ty, val, writer, level, mod), |
| 199 | .generic_poison => return writer.writeAll("(generic poison)"), |
| 200 | else => return writer.writeAll(@tagName(simple_value)), |
| 201 | }, |
| 202 | .variable => return writer.writeAll("(variable)"), |
| 203 | .extern_func => |extern_func| return writer.print("(extern function '{s}')", .{ |
| 204 | mod.declPtr(extern_func.decl).name, |
| 205 | }), |
| 206 | .func => |func| return writer.print("(function '{s}')", .{ |
| 207 | mod.declPtr(mod.funcPtr(func.index).owner_decl).name, |
| 208 | }), |
| 209 | .int => |int| switch (int.storage) { |
| 210 | inline .u64, .i64, .big_int => |x| return writer.print("{}", .{x}), |
| 211 | .lazy_align => |lazy_ty| return writer.print("{d}", .{ |
| 212 | lazy_ty.toType().abiAlignment(mod), |
| 213 | }), |
| 214 | .lazy_size => |lazy_ty| return writer.print("{d}", .{ |
| 215 | lazy_ty.toType().abiSize(mod), |
| 216 | }), |
| 217 | }, |
| 218 | .err => |err| return writer.print("error.{s}", .{ |
| 219 | mod.intern_pool.stringToSlice(err.name), |
| 220 | }), |
| 221 | .error_union => |error_union| switch (error_union.val) { |
| 222 | .err_name => |err_name| return writer.print("error.{s}", .{ |
| 223 | mod.intern_pool.stringToSlice(err_name), |
| 224 | }), |
| 225 | .payload => |payload| { |
| 226 | val = payload.toValue(); |
| 227 | ty = ty.errorUnionPayload(mod); |
| 196 | 228 | }, |
| 197 | | .enum_tag => |enum_tag| { |
| 198 | | if (level == 0) { |
| 199 | | return writer.writeAll("(enum)"); |
| 200 | | } |
| 229 | }, |
| 230 | .enum_literal => |enum_literal| return writer.print(".{s}", .{ |
| 231 | mod.intern_pool.stringToSlice(enum_literal), |
| 232 | }), |
| 233 | .enum_tag => |enum_tag| { |
| 234 | if (level == 0) { |
| 235 | return writer.writeAll("(enum)"); |
| 236 | } |
| 201 | 237 | |
| 202 | | try writer.writeAll("@intToEnum("); |
| 238 | try writer.writeAll("@intToEnum("); |
| 239 | try print(.{ |
| 240 | .ty = Type.type, |
| 241 | .val = enum_tag.ty.toValue(), |
| 242 | }, writer, level - 1, mod); |
| 243 | try writer.writeAll(", "); |
| 244 | try print(.{ |
| 245 | .ty = mod.intern_pool.typeOf(enum_tag.int).toType(), |
| 246 | .val = enum_tag.int.toValue(), |
| 247 | }, writer, level - 1, mod); |
| 248 | try writer.writeAll(")"); |
| 249 | return; |
| 250 | }, |
| 251 | .float => |float| switch (float.storage) { |
| 252 | inline else => |x| return writer.print("{}", .{x}), |
| 253 | }, |
| 254 | .ptr => return writer.writeAll("(ptr)"), |
| 255 | .opt => |opt| switch (opt.val) { |
| 256 | .none => return writer.writeAll("null"), |
| 257 | else => { |
| 258 | val = opt.val.toValue(); |
| 259 | ty = ty.optionalChild(mod); |
| 260 | }, |
| 261 | }, |
| 262 | .aggregate => |aggregate| switch (aggregate.storage) { |
| 263 | .bytes => |bytes| return writer.print("\"{}\"", .{std.zig.fmtEscapes(bytes)}), |
| 264 | .elems, .repeated_elem => return printAggregate(ty, val, writer, level, mod), |
| 265 | }, |
| 266 | .un => |un| { |
| 267 | try writer.writeAll(".{ "); |
| 268 | if (level > 0) { |
| 203 | 269 | try print(.{ |
| 204 | | .ty = Type.type, |
| 205 | | .val = enum_tag.ty.toValue(), |
| 270 | .ty = ty.unionTagTypeHypothetical(mod), |
| 271 | .val = un.tag.toValue(), |
| 206 | 272 | }, writer, level - 1, mod); |
| 207 | | try writer.writeAll(", "); |
| 273 | try writer.writeAll(" = "); |
| 208 | 274 | try print(.{ |
| 209 | | .ty = mod.intern_pool.typeOf(enum_tag.int).toType(), |
| 210 | | .val = enum_tag.int.toValue(), |
| 275 | .ty = ty.unionFieldType(un.tag.toValue(), mod), |
| 276 | .val = un.val.toValue(), |
| 211 | 277 | }, writer, level - 1, mod); |
| 212 | | try writer.writeAll(")"); |
| 213 | | return; |
| 214 | | }, |
| 215 | | .float => |float| switch (float.storage) { |
| 216 | | inline else => |x| return writer.print("{}", .{x}), |
| 217 | | }, |
| 218 | | else => return writer.print("{}", .{val.ip_index}), |
| 219 | | } |
| 278 | } else try writer.writeAll("..."); |
| 279 | return writer.writeAll(" }"); |
| 280 | }, |
| 220 | 281 | }, |
| 221 | 282 | }; |
| 222 | 283 | } |
| ... | ... | @@ -238,12 +299,9 @@ fn printAggregate( |
| 238 | 299 | var i: u32 = 0; |
| 239 | 300 | while (i < max_len) : (i += 1) { |
| 240 | 301 | if (i != 0) try writer.writeAll(", "); |
| 241 | | switch (ty.ip_index) { |
| 242 | | .none => {}, // TODO make this unreachable after finishing InternPool migration |
| 243 | | else => switch (mod.intern_pool.indexToKey(ty.ip_index)) { |
| 244 | | .struct_type, .anon_struct_type => try writer.print(".{s} = ", .{ty.structFieldName(i, mod)}), |
| 245 | | else => {}, |
| 246 | | }, |
| 302 | switch (mod.intern_pool.indexToKey(ty.toIntern())) { |
| 303 | .struct_type, .anon_struct_type => try writer.print(".{s} = ", .{ty.structFieldName(i, mod)}), |
| 304 | else => {}, |
| 247 | 305 | } |
| 248 | 306 | try print(.{ |
| 249 | 307 | .ty = ty.structFieldType(i, mod), |