authorgravatar for timonkruiper@gmail.comTimon Kruiper <timonkruiper@gmail.com> 2021-03-23 12:19:14+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-03-23 11:56:06-07:00
log7194baed66c57484e5369ab023ee9a030a7478c5
tree57d299ebc0197f54192d053090c7529885924f15
parent99cf9f8bf17755cb910e13c744dee03a8a72c91b

astgen: implement typeof


1 files changed, 13 insertions(+), 3 deletions(-)

src/astgen.zig+13-3
......@@ -3283,18 +3283,28 @@ fn typeOf(
32833283 node: ast.Node.Index,
32843284 params: []const ast.Node.Index,
32853285) InnerError!zir.Inst.Ref {
3286 if (true) @panic("TODO update for zir-memory-layout");
32873286 if (params.len < 1) {
32883287 return mod.failTok(scope, builtin_token, "expected at least 1 argument, found 0", .{});
32893288 }
3289 const gz = scope.getGenZir();
32903290 if (params.len == 1) {
3291 return rvalue(mod, scope, rl, try addZIRUnOp(mod, scope, src, .typeof, try expr(mod, scope, .none, params[0])));
3291 return rvalue(
3292 mod,
3293 scope,
3294 rl,
3295 try gz.addUnTok(.typeof, try expr(mod, scope, .none, params[0]), node),
3296 node,
3297 );
32923298 }
32933299 const arena = scope.arena();
32943300 var items = try arena.alloc(zir.Inst.Ref, params.len);
32953301 for (params) |param, param_i|
32963302 items[param_i] = try expr(mod, scope, .none, param);
3297 return rvalue(mod, scope, rl, try addZIRInst(mod, scope, src, zir.Inst.TypeOfPeer, .{ .items = items }, .{}));
3303
3304 const result = try gz.addPlNode(.typeof_peer, node, zir.Inst.MultiOp{ .operands_len = @intCast(u32, params.len) });
3305 try gz.zir_code.extra.appendSlice(gz.zir_code.gpa, items);
3306
3307 return rvalue(mod, scope, rl, result, node);
32983308}
32993309
33003310fn builtinCall(