feat: formatting strings at runtime
This commit is contained in:
parent
6924e929d8
commit
d2cd7fa888
10 changed files with 211 additions and 34 deletions
25
src/Sema.zig
25
src/Sema.zig
|
|
@ -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),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue