Implement '#size'

This commit is contained in:
David Gonzalez Martin 2024-06-06 21:04:31 -06:00
parent f6bb34a354
commit 42659314ea
2 changed files with 46 additions and 3 deletions

View File

@ -193,7 +193,7 @@ const Parser = struct{
} }
} }
fn parse_intrinsic(parser: *Parser, analyzer: *Analyzer, thread: *Thread, file: *File) void { fn parse_intrinsic(parser: *Parser, analyzer: *Analyzer, thread: *Thread, file: *File, ty: ?*Type) ?*Value {
const src = file.source_code; const src = file.source_code;
parser.expect_character(src, '#'); parser.expect_character(src, '#');
@ -219,6 +219,28 @@ const Parser = struct{
analyzer.current_basic_block = assert_false_block; analyzer.current_basic_block = assert_false_block;
emit_unreachable(analyzer, thread); emit_unreachable(analyzer, thread);
analyzer.current_basic_block = assert_true_block; analyzer.current_basic_block = assert_true_block;
return null;
},
.size => {
parser.skip_space(src);
parser.expect_character(src, '(');
parser.skip_space(src);
const size_type = parser.parse_type_expression(thread, src);
parser.skip_space(src);
parser.expect_character(src, ')');
const constant_int = thread.constant_ints.append(.{
.value = .{
.sema = .{
.thread = thread.get_index(),
.resolved = size_type.sema.resolved,
.id = .constant_int,
},
},
.n = size_type.size,
.type = ty orelse unreachable,
});
return &constant_int.value;
}, },
else => |t| @panic(@tagName(t)), else => |t| @panic(@tagName(t)),
} }
@ -512,7 +534,6 @@ const Parser = struct{
} }
fn parse_single_expression(parser: *Parser, analyzer: *Analyzer, thread: *Thread, file: *File, maybe_type: ?*Type, side: Side) *Value { fn parse_single_expression(parser: *Parser, analyzer: *Analyzer, thread: *Thread, file: *File, maybe_type: ?*Type, side: Side) *Value {
const src = file.source_code; const src = file.source_code;
const Unary = enum{ const Unary = enum{
none, none,
@ -525,6 +546,11 @@ const Parser = struct{
parser.i += 1; parser.i += 1;
break :block .one_complement; break :block .one_complement;
}, },
'#' => {
// parse intrinsic
const value = parser.parse_intrinsic(analyzer, thread, file, maybe_type) orelse unreachable;
return value;
},
else => unreachable, else => unreachable,
}; };
_ = side; // autofix _ = side; // autofix
@ -1556,6 +1582,7 @@ const Keyword = enum{
const Intrinsic = enum{ const Intrinsic = enum{
assert, assert,
size,
trap, trap,
@"unreachable", @"unreachable",
}; };
@ -1982,6 +2009,15 @@ const Thread = struct{
} }
break :blk integers; break :blk integers;
}, },
void: Type = .{
.sema = .{
.thread = undefined,
.id = .void,
.resolved = true,
},
.size = 0,
.alignment = 0,
},
handle: std.Thread = undefined, handle: std.Thread = undefined,
fn add_thread_work(thread: *Thread, job: Job) void { fn add_thread_work(thread: *Thread, job: Job) void {
@ -3900,7 +3936,8 @@ pub fn analyze_local_block(thread: *Thread, analyzer: *Analyzer, parser: *Parser
} }
}, },
'#' => { '#' => {
parser.parse_intrinsic(analyzer, thread, file); const intrinsic = parser.parse_intrinsic(analyzer, thread, file, &thread.void);
assert(intrinsic == null);
parser.skip_space(src); parser.skip_space(src);
parser.expect_character(src, ';'); parser.expect_character(src, ';');
}, },

View File

@ -0,0 +1,6 @@
fn[cc(.c)] main[export]() s32 {
>sizeofu32: s32 = #size(u32);
>sizeofu16: s32 = #size(u16);
return sizeofu32 - (2 * sizeofu16);
}