| ... | @@ -187,9 +187,36 @@ const Analyze = struct { | ... | @@ -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 | fn analyzeDecl(self: *Analyze, old_inst: *text.Inst) !*Inst { | 212 | fn analyzeDecl(self: *Analyze, old_inst: *text.Inst) !*Inst { |
| 191 | switch (old_inst.tag) { | 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 | .int => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), | 220 | .int => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), |
| 194 | .ptrtoint => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), | 221 | .ptrtoint => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), |
| 195 | .fieldptr => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), | 222 | .fieldptr => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), |