authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-06 11:23:53+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-07 10:50:06+03:00
log89cef9f5f731f8f33dc935aac3c21bd57c92900d
tree57c37405ea1c0ccb118d94eb2d0bc4a0f49a0b14
parent226994cd7e33f2b5812e7bf5e894d9685431af8c

stage2: make line field of `@src` runtime known


4 files changed, 27 insertions(+), 3 deletions(-)

src/Sema.zig+4-3
...@@ -1686,7 +1686,9 @@ fn resolveMaybeUndefValAllowVariables(...@@ -1686,7 +1686,9 @@ fn resolveMaybeUndefValAllowVariables(
1686 switch (air_tags[i]) {1686 switch (air_tags[i]) {
1687 .constant => {1687 .constant => {
1688 const ty_pl = sema.air_instructions.items(.data)[i].ty_pl;1688 const ty_pl = sema.air_instructions.items(.data)[i].ty_pl;
1689 return sema.air_values.items[ty_pl.payload];1689 const val = sema.air_values.items[ty_pl.payload];
1690 if (val.tag() == .runtime_int) return null;
1691 return val;
1690 },1692 },
1691 .const_ty => {1693 .const_ty => {
1692 return try sema.air_instructions.items(.data)[i].ty.toValue(sema.arena);1694 return try sema.air_instructions.items(.data)[i].ty.toValue(sema.arena);
...@@ -12151,9 +12153,8 @@ fn zirBuiltinSrc(...@@ -12151,9 +12153,8 @@ fn zirBuiltinSrc(
12151 field_values[0] = file_name_val;12153 field_values[0] = file_name_val;
12152 // fn_name: [:0]const u8,12154 // fn_name: [:0]const u8,
12153 field_values[1] = func_name_val;12155 field_values[1] = func_name_val;
12154 // TODO these should be runtime only!
12155 // line: u3212156 // line: u32
12156 field_values[2] = try Value.Tag.int_u64.create(sema.arena, extra.line + 1);12157 field_values[2] = try Value.Tag.runtime_int.create(sema.arena, extra.line + 1);
12157 // column: u32,12158 // column: u32,
12158 field_values[3] = try Value.Tag.int_u64.create(sema.arena, extra.column + 1);12159 field_values[3] = try Value.Tag.int_u64.create(sema.arena, extra.column + 1);
1215912160
src/TypedValue.zig+1
...@@ -495,5 +495,6 @@ pub fn print(...@@ -495,5 +495,6 @@ pub fn print(
495 },495 },
496 .generic_poison_type => return writer.writeAll("(generic poison type)"),496 .generic_poison_type => return writer.writeAll("(generic poison type)"),
497 .generic_poison => return writer.writeAll("(generic poison)"),497 .generic_poison => return writer.writeAll("(generic poison)"),
498 .runtime_int => return writer.writeAll("[runtime value]"),
498 };499 };
499}500}
src/value.zig+8
...@@ -111,6 +111,7 @@ pub const Value = extern union {...@@ -111,6 +111,7 @@ pub const Value = extern union {
111 int_i64,111 int_i64,
112 int_big_positive,112 int_big_positive,
113 int_big_negative,113 int_big_negative,
114 runtime_int,
114 function,115 function,
115 extern_fn,116 extern_fn,
116 variable,117 variable,
...@@ -304,6 +305,7 @@ pub const Value = extern union {...@@ -304,6 +305,7 @@ pub const Value = extern union {
304 .int_type => Payload.IntType,305 .int_type => Payload.IntType,
305 .int_u64 => Payload.U64,306 .int_u64 => Payload.U64,
306 .int_i64 => Payload.I64,307 .int_i64 => Payload.I64,
308 .runtime_int => Payload.U64,
307 .function => Payload.Function,309 .function => Payload.Function,
308 .variable => Payload.Variable,310 .variable => Payload.Variable,
309 .decl_ref_mut => Payload.DeclRefMut,311 .decl_ref_mut => Payload.DeclRefMut,
...@@ -483,6 +485,7 @@ pub const Value = extern union {...@@ -483,6 +485,7 @@ pub const Value = extern union {
483 },485 },
484 .int_type => return self.copyPayloadShallow(arena, Payload.IntType),486 .int_type => return self.copyPayloadShallow(arena, Payload.IntType),
485 .int_u64 => return self.copyPayloadShallow(arena, Payload.U64),487 .int_u64 => return self.copyPayloadShallow(arena, Payload.U64),
488 .runtime_int => return self.copyPayloadShallow(arena, Payload.U64),
486 .int_i64 => return self.copyPayloadShallow(arena, Payload.I64),489 .int_i64 => return self.copyPayloadShallow(arena, Payload.I64),
487 .int_big_positive, .int_big_negative => {490 .int_big_positive, .int_big_negative => {
488 const old_payload = self.cast(Payload.BigInt).?;491 const old_payload = self.cast(Payload.BigInt).?;
...@@ -762,6 +765,7 @@ pub const Value = extern union {...@@ -762,6 +765,7 @@ pub const Value = extern union {
762 .int_i64 => return std.fmt.formatIntValue(val.castTag(.int_i64).?.data, "", options, out_stream),765 .int_i64 => return std.fmt.formatIntValue(val.castTag(.int_i64).?.data, "", options, out_stream),
763 .int_big_positive => return out_stream.print("{}", .{val.castTag(.int_big_positive).?.asBigInt()}),766 .int_big_positive => return out_stream.print("{}", .{val.castTag(.int_big_positive).?.asBigInt()}),
764 .int_big_negative => return out_stream.print("{}", .{val.castTag(.int_big_negative).?.asBigInt()}),767 .int_big_negative => return out_stream.print("{}", .{val.castTag(.int_big_negative).?.asBigInt()}),
768 .runtime_int => return out_stream.writeAll("[runtime value]"),
765 .function => return out_stream.print("(function decl={d})", .{val.castTag(.function).?.data.owner_decl}),769 .function => return out_stream.print("(function decl={d})", .{val.castTag(.function).?.data.owner_decl}),
766 .extern_fn => return out_stream.writeAll("(extern function)"),770 .extern_fn => return out_stream.writeAll("(extern function)"),
767 .variable => return out_stream.writeAll("(variable)"),771 .variable => return out_stream.writeAll("(variable)"),
...@@ -1077,6 +1081,8 @@ pub const Value = extern union {...@@ -1077,6 +1081,8 @@ pub const Value = extern union {
1077 .int_big_positive => return val.castTag(.int_big_positive).?.asBigInt(),1081 .int_big_positive => return val.castTag(.int_big_positive).?.asBigInt(),
1078 .int_big_negative => return val.castTag(.int_big_negative).?.asBigInt(),1082 .int_big_negative => return val.castTag(.int_big_negative).?.asBigInt(),
10791083
1084 .runtime_int => return BigIntMutable.init(&space.limbs, val.castTag(.runtime_int).?.data).toConst(),
1085
1080 .undef => unreachable,1086 .undef => unreachable,
10811087
1082 .lazy_align => {1088 .lazy_align => {
...@@ -1132,6 +1138,8 @@ pub const Value = extern union {...@@ -1132,6 +1138,8 @@ pub const Value = extern union {
1132 .int_big_positive => return val.castTag(.int_big_positive).?.asBigInt().to(u64) catch null,1138 .int_big_positive => return val.castTag(.int_big_positive).?.asBigInt().to(u64) catch null,
1133 .int_big_negative => return val.castTag(.int_big_negative).?.asBigInt().to(u64) catch null,1139 .int_big_negative => return val.castTag(.int_big_negative).?.asBigInt().to(u64) catch null,
11341140
1141 .runtime_int => return val.castTag(.runtime_int).?.data,
1142
1135 .undef => unreachable,1143 .undef => unreachable,
11361144
1137 .lazy_align => {1145 .lazy_align => {
test/cases/compile_errors/src_fields_runtime.zig created+14
...@@ -0,0 +1,14 @@
1pub export fn entry1() void {
2 const s = @src();
3 comptime var a: []const u8 = s.file;
4 comptime var b: []const u8 = s.fn_name;
5 comptime var c: u32 = s.column;
6 comptime var d: u32 = s.line;
7 _ = a; _ = b; _ = c; _ = d;
8}
9
10// error
11// backend=stage2
12// target=native
13//
14// :6:28: error: cannot store runtime value in compile time variable