| ... | ... | @@ -187,9 +187,36 @@ const Analyze = struct { |
| 187 | 187 | }); |
| 188 | 188 | } |
| 189 | 189 | |
| 190 | fn constStr(self: *Analyze, src_offset: usize, str: []const u8) !*Inst { |
| 191 | const array_payload = try self.arena.allocator.create(Type.Payload.Array_u8_Sentinel0); |
| 192 | array_payload.* = .{ .len = str.len }; |
| 193 | |
| 194 | const ty_payload = try self.arena.allocator.create(Type.Payload.SingleConstPointer); |
| 195 | ty_payload.* = .{ .pointee_type = Type.initPayload(&array_payload.base) }; |
| 196 | |
| 197 | const bytes_payload = try self.arena.allocator.create(Value.Payload.Bytes); |
| 198 | bytes_payload.* = .{ .data = str }; |
| 199 | |
| 200 | const const_inst = try self.arena.allocator.create(Inst.Constant); |
| 201 | const_inst.* = .{ |
| 202 | .base = .{ |
| 203 | .tag = Inst.Constant.base_tag, |
| 204 | .ty = Type.initPayload(&ty_payload.base), |
| 205 | .src_offset = src_offset, |
| 206 | }, |
| 207 | .val = Value.initPayload(&bytes_payload.base), |
| 208 | }; |
| 209 | return &const_inst.base; |
| 210 | } |
| 211 | |
| 190 | 212 | fn analyzeDecl(self: *Analyze, old_inst: *text.Inst) !*Inst { |
| 191 | 213 | switch (old_inst.tag) { |
| 192 | | .str => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), |
| 214 | .str => { |
| 215 | // We can use this reference because Inst.Const's Value is arena-allocated. |
| 216 | // The value would get copied to a MemoryCell before the `text.Inst.Str` lifetime ends. |
| 217 | const bytes = old_inst.cast(text.Inst.Str).?.positionals.bytes; |
| 218 | return self.constStr(old_inst.src_offset, bytes); |
| 219 | }, |
| 193 | 220 | .int => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), |
| 194 | 221 | .ptrtoint => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), |
| 195 | 222 | .fieldptr => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), |