| ... | @@ -1878,6 +1878,11 @@ const EmitZIR = struct { | ... | @@ -1878,6 +1878,11 @@ const EmitZIR = struct { |
| 1878 | if (typed_value.val.cast(Value.Payload.DeclRef)) |decl_ref| { | 1878 | if (typed_value.val.cast(Value.Payload.DeclRef)) |decl_ref| { |
| 1879 | const decl = decl_ref.decl; | 1879 | const decl = decl_ref.decl; |
| 1880 | return try self.emitUnnamedDecl(try self.emitDeclRef(src, decl)); | 1880 | return try self.emitUnnamedDecl(try self.emitDeclRef(src, decl)); |
| | 1881 | } else if (typed_value.val.cast(Value.Payload.Variable)) |variable| { |
| | 1882 | return self.emitTypedValue(src, .{ |
| | 1883 | .ty = typed_value.ty, |
| | 1884 | .val = variable.variable.value.?, |
| | 1885 | }); |
| 1881 | } | 1886 | } |
| 1882 | if (typed_value.val.isUndef()) { | 1887 | if (typed_value.val.isUndef()) { |
| 1883 | const as_inst = try self.arena.allocator.create(Inst.BinOp); | 1888 | const as_inst = try self.arena.allocator.create(Inst.BinOp); |
| ... | @@ -1967,6 +1972,21 @@ const EmitZIR = struct { | ... | @@ -1967,6 +1972,21 @@ const EmitZIR = struct { |
| 1967 | return self.emitPrimitive(src, .@"true") | 1972 | return self.emitPrimitive(src, .@"true") |
| 1968 | else | 1973 | else |
| 1969 | return self.emitPrimitive(src, .@"false"), | 1974 | return self.emitPrimitive(src, .@"false"), |
| | 1975 | .EnumLiteral => { |
| | 1976 | const enum_literal = @fieldParentPtr(Value.Payload.Bytes, "base", typed_value.val.ptr_otherwise); |
| | 1977 | const inst = try self.arena.allocator.create(Inst.Str); |
| | 1978 | inst.* = .{ |
| | 1979 | .base = .{ |
| | 1980 | .src = src, |
| | 1981 | .tag = .enum_literal, |
| | 1982 | }, |
| | 1983 | .positionals = .{ |
| | 1984 | .bytes = enum_literal.data, |
| | 1985 | }, |
| | 1986 | .kw_args = .{}, |
| | 1987 | }; |
| | 1988 | return self.emitUnnamedDecl(&inst.base); |
| | 1989 | }, |
| 1970 | else => |t| std.debug.panic("TODO implement emitTypedValue for {}", .{@tagName(t)}), | 1990 | else => |t| std.debug.panic("TODO implement emitTypedValue for {}", .{@tagName(t)}), |
| 1971 | } | 1991 | } |
| 1972 | } | 1992 | } |
| ... | @@ -2437,6 +2457,51 @@ const EmitZIR = struct { | ... | @@ -2437,6 +2457,51 @@ const EmitZIR = struct { |
| 2437 | }; | 2457 | }; |
| 2438 | return self.emitUnnamedDecl(&inst.base); | 2458 | return self.emitUnnamedDecl(&inst.base); |
| 2439 | }, | 2459 | }, |
| | 2460 | .Array => { |
| | 2461 | var len_pl = Value.Payload.Int_u64{ .int = ty.arrayLen() }; |
| | 2462 | const len = Value.initPayload(&len_pl.base); |
| | 2463 | |
| | 2464 | const inst = if (ty.arraySentinel()) |sentinel| blk: { |
| | 2465 | const inst = try self.arena.allocator.create(Inst.ArrayTypeSentinel); |
| | 2466 | inst.* = .{ |
| | 2467 | .base = .{ |
| | 2468 | .src = src, |
| | 2469 | .tag = .array_type, |
| | 2470 | }, |
| | 2471 | .positionals = .{ |
| | 2472 | .len = (try self.emitTypedValue(src, .{ |
| | 2473 | .ty = Type.initTag(.usize), |
| | 2474 | .val = len, |
| | 2475 | })).inst, |
| | 2476 | .sentinel = (try self.emitTypedValue(src, .{ |
| | 2477 | .ty = ty.elemType(), |
| | 2478 | .val = sentinel, |
| | 2479 | })).inst, |
| | 2480 | .elem_type = (try self.emitType(src, ty.elemType())).inst, |
| | 2481 | }, |
| | 2482 | .kw_args = .{}, |
| | 2483 | }; |
| | 2484 | break :blk &inst.base; |
| | 2485 | } else blk: { |
| | 2486 | const inst = try self.arena.allocator.create(Inst.BinOp); |
| | 2487 | inst.* = .{ |
| | 2488 | .base = .{ |
| | 2489 | .src = src, |
| | 2490 | .tag = .array_type, |
| | 2491 | }, |
| | 2492 | .positionals = .{ |
| | 2493 | .lhs = (try self.emitTypedValue(src, .{ |
| | 2494 | .ty = Type.initTag(.usize), |
| | 2495 | .val = len, |
| | 2496 | })).inst, |
| | 2497 | .rhs = (try self.emitType(src, ty.elemType())).inst, |
| | 2498 | }, |
| | 2499 | .kw_args = .{}, |
| | 2500 | }; |
| | 2501 | break :blk &inst.base; |
| | 2502 | }; |
| | 2503 | return self.emitUnnamedDecl(inst); |
| | 2504 | }, |
| 2440 | else => std.debug.panic("TODO implement emitType for {}", .{ty}), | 2505 | else => std.debug.panic("TODO implement emitType for {}", .{ty}), |
| 2441 | }, | 2506 | }, |
| 2442 | } | 2507 | } |