authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-07-21 17:42:46+00:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-07-21 17:42:46+00:00
log1cfe43d563bd1418706d64733474b43c823d677b
tree2c25188204fd34c4b2aee9613d4736d0936f0813
parent094223d634dec0026a646a129fe62a676008b8a5
parent86922b8d0812977df667c0872c54c7f9c44493d7
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #5888 from pfgithub/stage-2-testing-Copy

stage2: period and suffixop

1 files changed, 59 insertions(+), 4 deletions(-)

src-self-hosted/astgen.zig+59-4
...@@ -33,6 +33,8 @@ pub fn expr(mod: *Module, scope: *Scope, node: *ast.Node) InnerError!*zir.Inst {...@@ -33,6 +33,8 @@ pub fn expr(mod: *Module, scope: *Scope, node: *ast.Node) InnerError!*zir.Inst {
33 .GreaterOrEqual => return cmp(mod, scope, node.castTag(.GreaterOrEqual).?, .gte),33 .GreaterOrEqual => return cmp(mod, scope, node.castTag(.GreaterOrEqual).?, .gte),
34 .LessThan => return cmp(mod, scope, node.castTag(.LessThan).?, .lt),34 .LessThan => return cmp(mod, scope, node.castTag(.LessThan).?, .lt),
35 .LessOrEqual => return cmp(mod, scope, node.castTag(.LessOrEqual).?, .lte),35 .LessOrEqual => return cmp(mod, scope, node.castTag(.LessOrEqual).?, .lte),
36 .Period => return field(mod, scope, node.castTag(.Period).?),
37 .SuffixOp => return suffixOp(mod, scope, node.castTag(.SuffixOp).?),
36 .BoolNot => return boolNot(mod, scope, node.castTag(.BoolNot).?),38 .BoolNot => return boolNot(mod, scope, node.castTag(.BoolNot).?),
37 else => return mod.failNode(scope, node, "TODO implement astgen.Expr for {}", .{@tagName(node.tag)}),39 else => return mod.failNode(scope, node, "TODO implement astgen.Expr for {}", .{@tagName(node.tag)}),
38 }40 }
...@@ -90,7 +92,7 @@ fn varDecl(mod: *Module, scope: *Scope, node: *ast.Node.VarDecl) InnerError!Scop...@@ -90,7 +92,7 @@ fn varDecl(mod: *Module, scope: *Scope, node: *ast.Node.VarDecl) InnerError!Scop
90 return mod.failNode(scope, init_node, "TODO implement result locations", .{});92 return mod.failNode(scope, init_node, "TODO implement result locations", .{});
91 }93 }
92 const init_inst = try expr(mod, scope, init_node);94 const init_inst = try expr(mod, scope, init_node);
93 const ident_name = tree.tokenSlice(node.name_token); // TODO support @"aoeu" identifiers95 const ident_name = try identifierTokenString(mod, scope, node.name_token);
94 return Scope.LocalVar{96 return Scope.LocalVar{
95 .parent = scope,97 .parent = scope,
96 .gen_zir = scope.getGenZIR(),98 .gen_zir = scope.getGenZIR(),
...@@ -110,7 +112,7 @@ fn assign(mod: *Module, scope: *Scope, infix_node: *ast.Node.SimpleInfixOp) Inne...@@ -110,7 +112,7 @@ fn assign(mod: *Module, scope: *Scope, infix_node: *ast.Node.SimpleInfixOp) Inne
110 if (infix_node.lhs.tag == .Identifier) {112 if (infix_node.lhs.tag == .Identifier) {
111 const ident = @fieldParentPtr(ast.Node.Identifier, "base", infix_node.lhs);113 const ident = @fieldParentPtr(ast.Node.Identifier, "base", infix_node.lhs);
112 const tree = scope.tree();114 const tree = scope.tree();
113 const ident_name = tree.tokenSlice(ident.token);115 const ident_name = try identifierTokenString(mod, scope, ident.token);
114 if (std.mem.eql(u8, ident_name, "_")) {116 if (std.mem.eql(u8, ident_name, "_")) {
115 return expr(mod, scope, infix_node.rhs);117 return expr(mod, scope, infix_node.rhs);
116 } else {118 } else {
...@@ -121,6 +123,60 @@ fn assign(mod: *Module, scope: *Scope, infix_node: *ast.Node.SimpleInfixOp) Inne...@@ -121,6 +123,60 @@ fn assign(mod: *Module, scope: *Scope, infix_node: *ast.Node.SimpleInfixOp) Inne
121 }123 }
122}124}
123125
126/// Identifier token -> String (allocated in scope.arena())
127pub fn identifierTokenString(mod: *Module, scope: *Scope, token: ast.TokenIndex) InnerError![]const u8 {
128 const tree = scope.tree();
129
130 const ident_name = tree.tokenSlice(token);
131 if (std.mem.startsWith(u8, ident_name, "@")) {
132 const raw_string = ident_name[1..];
133 var bad_index: usize = undefined;
134 return std.zig.parseStringLiteral(scope.arena(), raw_string, &bad_index) catch |err| switch (err) {
135 error.InvalidCharacter => {
136 const bad_byte = raw_string[bad_index];
137 const src = tree.token_locs[token].start;
138 return mod.fail(scope, src + 1 + bad_index, "invalid string literal character: '{c}'\n", .{bad_byte});
139 },
140 else => |e| return e,
141 };
142 }
143 return ident_name;
144}
145
146pub fn identifierStringInst(mod: *Module, scope: *Scope, node: *ast.Node.Identifier) InnerError!*zir.Inst {
147 const tree = scope.tree();
148 const src = tree.token_locs[node.token].start;
149
150 const ident_name = try identifierTokenString(mod, scope, node.token);
151
152 return mod.addZIRInst(scope, src, zir.Inst.Str, .{ .bytes = ident_name }, .{});
153}
154
155fn field(mod: *Module, scope: *Scope, node: *ast.Node.SimpleInfixOp) InnerError!*zir.Inst {
156 const tree = scope.tree();
157 const src = tree.token_locs[node.op_token].start;
158
159 const lhs = try expr(mod, scope, node.lhs);
160 const field_name = try identifierStringInst(mod, scope, node.rhs.castTag(.Identifier).?);
161
162 const pointer = try mod.addZIRInst(scope, src, zir.Inst.FieldPtr, .{ .object_ptr = lhs, .field_name = field_name }, .{});
163 return mod.addZIRInst(scope, src, zir.Inst.Deref, .{ .ptr = pointer }, .{});
164}
165
166fn suffixOp(mod: *Module, scope: *Scope, node: *ast.Node.SuffixOp) InnerError!*zir.Inst {
167 switch (node.op) {
168 .Deref => {
169 const tree = scope.tree();
170 const src = tree.token_locs[node.rtoken].start;
171
172 const lhs = try expr(mod, scope, node.lhs);
173
174 return mod.addZIRInst(scope, src, zir.Inst.Deref, .{ .ptr = lhs }, .{});
175 },
176 else => return mod.failNode(scope, &node.base, "TODO implement astGenExpr for suffixOp {}", .{node.op}),
177 }
178}
179
124fn add(mod: *Module, scope: *Scope, infix_node: *ast.Node.SimpleInfixOp) InnerError!*zir.Inst {180fn add(mod: *Module, scope: *Scope, infix_node: *ast.Node.SimpleInfixOp) InnerError!*zir.Inst {
125 const lhs = try expr(mod, scope, infix_node.lhs);181 const lhs = try expr(mod, scope, infix_node.lhs);
126 const rhs = try expr(mod, scope, infix_node.rhs);182 const rhs = try expr(mod, scope, infix_node.rhs);
...@@ -257,8 +313,7 @@ fn identifier(mod: *Module, scope: *Scope, ident: *ast.Node.Identifier) InnerErr...@@ -257,8 +313,7 @@ fn identifier(mod: *Module, scope: *Scope, ident: *ast.Node.Identifier) InnerErr
257 defer tracy.end();313 defer tracy.end();
258314
259 const tree = scope.tree();315 const tree = scope.tree();
260 // TODO implement @"aoeu" identifiers316 const ident_name = try identifierTokenString(mod, scope, ident.token);
261 const ident_name = tree.tokenSlice(ident.token);
262 const src = tree.token_locs[ident.token].start;317 const src = tree.token_locs[ident.token].start;
263 if (mem.eql(u8, ident_name, "_")) {318 if (mem.eql(u8, ident_name, "_")) {
264 return mod.failNode(scope, &ident.base, "TODO implement '_' identifier", .{});319 return mod.failNode(scope, &ident.base, "TODO implement '_' identifier", .{});