ir: parse export instruction

This commit is contained in:
Andrew Kelley
2020-04-19 03:19:32 -04:00
parent f020999ca3
commit 104ae419e4

View File

@@ -17,6 +17,7 @@ pub const Inst = struct {
@"asm",
@"unreachable",
@"fn",
@"export",
};
pub fn TagToType(tag: Tag) type {
@@ -26,8 +27,9 @@ pub const Inst = struct {
.fieldptr => FieldPtr,
.deref => Deref,
.@"asm" => Assembly,
.@"unreachable" => Unreach,
.@"unreachable" => Unreachable,
.@"fn" => Fn,
.@"export" => Export,
};
}
@@ -87,8 +89,8 @@ pub const Inst = struct {
},
};
pub const Unreach = struct {
base: Inst = Inst{ .tag = .unreach },
pub const Unreachable = struct {
base: Inst = Inst{ .tag = .@"unreachable" },
positionals: struct {},
kw_args: struct {},
@@ -108,6 +110,16 @@ pub const Inst = struct {
instructions: []*Inst,
};
};
pub const Export = struct {
base: Inst = Inst{ .tag = .@"export" },
positionals: struct {
symbol_name: *Inst,
value: *Inst,
},
kw_args: struct {},
};
};
pub const ErrorMsg = struct {
@@ -319,7 +331,6 @@ fn parseParameterGeneric(ctx: *ParseContext, comptime T: type, body_ctx: ?*BodyC
while (ctx.i < ctx.source.len) : (ctx.i += 1) switch (ctx.source[ctx.i]) {
' ', '\n', ',', ')' => {
const enum_name = ctx.source[start..ctx.i];
ctx.i += 1;
return std.meta.stringToEnum(T, enum_name) orelse {
return parseError(ctx, "tag '{}' not a member of enum '{}'", .{ enum_name, @typeName(T) });
};
@@ -427,6 +438,10 @@ fn parseBody(ctx: *ParseContext) !Inst.Fn.Body {
continue;
},
' ', '\n' => continue,
'}' => {
ctx.i += 1;
break;
},
else => |byte| return parseError(ctx, "unexpected byte: '{c}'", .{byte}),
};