authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2021-02-07 22:26:43+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-02-07 14:51:37-08:00
log0e38362d244f118565f447f8ee2c6b8a700d05bf
treedc069b1282f0bae3f7a6aec92c95d021b897e0dd
parent1d71b19c0d025aeeede229e714679f4b4fb7880d

zig fmt: split Slice and SliceSentinel

This saves 4 whole bytes in the common case where there is no sentinel.

3 files changed, 64 insertions(+), 24 deletions(-)

lib/std/zig/ast.zig+34-7
......@@ -304,6 +304,7 @@ pub const Tree = struct {
304304 .BoolOr,
305305 .SliceOpen,
306306 .Slice,
307 .SliceSentinel,
307308 .Deref,
308309 .ArrayAccess,
309310 .ArrayInitOne,
......@@ -694,19 +695,22 @@ pub const Tree = struct {
694695 return main_tokens[n] + end_offset;
695696 }
696697 },
698
697699 .SliceOpen => {
698700 end_offset += 2; // ellipsis2 and rbracket
699701 n = datas[n].rhs;
700702 },
701703 .Slice => {
702704 const extra = tree.extraData(datas[n].rhs, Node.Slice);
703 if (extra.sentinel != 0) {
704 n = extra.sentinel;
705 } else {
706 assert(extra.end != 0); // should have used SliceOpen if end and sentinel are 0
707 n = extra.end;
708 }
705 assert(extra.end != 0); // should have used SliceOpen
709706 end_offset += 1; // rbracket
707 n = extra.end;
708 },
709 .SliceSentinel => {
710 const extra = tree.extraData(datas[n].rhs, Node.SliceSentinel);
711 assert(extra.sentinel != 0); // should have used Slice
712 end_offset += 1; // rbracket
713 n = extra.sentinel;
710714 },
711715
712716 // These are not supported by lastToken() because implementation would
......@@ -1129,6 +1133,21 @@ pub const Tree = struct {
11291133 assert(tree.nodes.items(.tag)[node] == .Slice);
11301134 const data = tree.nodes.items(.data)[node];
11311135 const extra = tree.extraData(data.rhs, Node.Slice);
1136 return .{
1137 .ast = .{
1138 .sliced = data.lhs,
1139 .lbracket = tree.nodes.items(.main_token)[node],
1140 .start = extra.start,
1141 .end = extra.end,
1142 .sentinel = 0,
1143 },
1144 };
1145 }
1146
1147 pub fn sliceSentinel(tree: Tree, node: Node.Index) Full.Slice {
1148 assert(tree.nodes.items(.tag)[node] == .SliceSentinel);
1149 const data = tree.nodes.items(.data)[node];
1150 const extra = tree.extraData(data.rhs, Node.SliceSentinel);
11321151 return .{
11331152 .ast = .{
11341153 .sliced = data.lhs,
......@@ -1922,9 +1941,12 @@ pub const Node = struct {
19221941 /// `lhs[rhs..]`
19231942 /// main_token is the lbracket.
19241943 SliceOpen,
1925 /// `lhs[b..c :d]`. rhs is index into Slice
1944 /// `lhs[b..c]`. rhs is index into Slice
19261945 /// main_token is the lbracket.
19271946 Slice,
1947 /// `lhs[b..c :d]`. rhs is index into SliceSentinel
1948 /// main_token is the lbracket.
1949 SliceSentinel,
19281950 /// `lhs.*`. rhs is unused.
19291951 Deref,
19301952 /// `lhs[rhs]`.
......@@ -2202,6 +2224,11 @@ pub const Node = struct {
22022224 pub const Slice = struct {
22032225 start: Index,
22042226 end: Index,
2227 };
2228
2229 pub const SliceSentinel = struct {
2230 start: Index,
2231 end: Index,
22052232 sentinel: Index,
22062233 };
22072234
lib/std/zig/parse.zig+29-17
......@@ -3326,23 +3326,35 @@ const Parser = struct {
33263326 },
33273327 });
33283328 }
3329 const sentinel: Node.Index = if (p.eatToken(.Colon)) |_|
3330 try p.parseExpr()
3331 else
3332 0;
3333 _ = try p.expectToken(.RBracket);
3334 return p.addNode(.{
3335 .tag = .Slice,
3336 .main_token = lbracket,
3337 .data = .{
3338 .lhs = lhs,
3339 .rhs = try p.addExtra(.{
3340 .start = index_expr,
3341 .end = end_expr,
3342 .sentinel = sentinel,
3343 }),
3344 },
3345 });
3329 if (p.eatToken(.Colon)) |_| {
3330 const sentinel = try p.parseExpr();
3331 _ = try p.expectToken(.RBracket);
3332 return p.addNode(.{
3333 .tag = .SliceSentinel,
3334 .main_token = lbracket,
3335 .data = .{
3336 .lhs = lhs,
3337 .rhs = try p.addExtra(Node.SliceSentinel{
3338 .start = index_expr,
3339 .end = end_expr,
3340 .sentinel = sentinel,
3341 }),
3342 },
3343 });
3344 } else {
3345 _ = try p.expectToken(.RBracket);
3346 return p.addNode(.{
3347 .tag = .Slice,
3348 .main_token = lbracket,
3349 .data = .{
3350 .lhs = lhs,
3351 .rhs = try p.addExtra(Node.Slice{
3352 .start = index_expr,
3353 .end = end_expr,
3354 }),
3355 },
3356 });
3357 }
33463358 }
33473359 _ = try p.expectToken(.RBracket);
33483360 return p.addNode(.{
lib/std/zig/render.zig+1
......@@ -470,6 +470,7 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac
470470
471471 .SliceOpen => try renderSlice(ais, tree, tree.sliceOpen(node), space),
472472 .Slice => try renderSlice(ais, tree, tree.slice(node), space),
473 .SliceSentinel => try renderSlice(ais, tree, tree.sliceSentinel(node), space),
473474
474475 .Deref => {
475476 try renderExpression(ais, tree, datas[node].lhs, .None);