Commit 104ae419e4

Andrew Kelley <andrew@ziglang.org>
2020-04-19 09:19:32
ir: parse export instruction
1 parent f020999
Changed files (1)
src-self-hosted
src-self-hosted/ir.zig
@@ -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}),
     };