feat: formatting strings at runtime

This commit is contained in:
Brett Broadhurst 2026-04-05 14:45:10 -06:00
parent 6924e929d8
commit d2cd7fa888
Failed to generate hash of commit
10 changed files with 211 additions and 34 deletions

View file

@ -425,6 +425,30 @@ fn irStr(sema: *Sema, inst: Ir.Inst.Index) InnerError!ValueInfo {
return .{ .value = ip_index };
}
fn irStrFormat(
sema: *Sema,
builder: *Builder,
_: *Block,
inst: Ir.Inst.Index,
) InnerError!ValueInfo {
const data = sema.ir.instructions[@intFromEnum(inst)].data.payload;
const extra = sema.ir.extraData(Ir.Inst.MultiOp, data.extra_index);
const args_slice = sema.ir.refSlice(extra.end, extra.data.operands_len);
try builder.addByteOp(.string_builder);
var index: usize = 0;
while (index < args_slice.len) : (index += 1) {
const arg = args_slice[index];
const arg_inst = sema.resolveInst(arg);
try builder.ensureLoad(arg_inst);
try builder.addByteOp(.string_append);
}
try builder.addByteOp(.string_freeze);
return .stack;
}
fn irUnaryOp(
sema: *Sema,
builder: *Builder,
@ -1081,6 +1105,7 @@ fn analyzeBodyInner(
.int => try irInt(sema, inst),
.float => try irFloat(sema, inst),
.str => try irStr(sema, inst),
.str_format => try irStrFormat(sema, builder, block, inst),
.add => try irBinaryOp(sema, builder, inst, .add),
.sub => try irBinaryOp(sema, builder, inst, .sub),
.mul => try irBinaryOp(sema, builder, inst, .mul),