From 1f5df0e03401be36e68dd31f4704ebdc03141986 Mon Sep 17 00:00:00 2001 From: Vallahor Date: Wed, 1 Jun 2022 16:06:49 -0300 Subject: [PATCH] add: slice_start, slice_end and slice_sentinel --- lib/docs/main.js | 51 +++++++++++++++++- src/Autodoc.zig | 138 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 188 insertions(+), 1 deletion(-) diff --git a/lib/docs/main.js b/lib/docs/main.js index f8561f86a5..277389ddf5 100644 --- a/lib/docs/main.js +++ b/lib/docs/main.js @@ -1086,7 +1086,33 @@ var zigAnalysis; return literal; } case "void": { - return "VOID WIP"; + return "void"; + } + case "slice":{ + let payloadHtml = ""; + const lhsExpr = zigAnalysis.exprs[expr.slice.lhs]; + const startExpr = zigAnalysis.exprs[expr.slice.start]; + console.log(expr) + let decl = exprName(lhsExpr); + let start = exprName(startExpr); + let end = ""; + let sentinel = ""; + if (expr.slice['end']) { + const endExpr = zigAnalysis.exprs[expr.slice.end]; + let end_ = exprName(endExpr); + end += end_; + } + if (expr.slice['sentinel']) { + const sentinelExpr = zigAnalysis.exprs[expr.slice.sentinel]; + let sentinel_ = exprName(sentinelExpr); + sentinel += " :" + sentinel_; + } + payloadHtml += decl + "["+ start + ".." + end + sentinel + "]"; + return payloadHtml; + } + case "sliceIndex": { + const sliceIndex = zigAnalysis.exprs[expr.sliceIndex]; + return exprName(sliceIndex, opts); } case "switchOp":{ let payloadHtml = "switch() {
"; @@ -1257,6 +1283,7 @@ var zigAnalysis; } case "builtinBinIndex" : { const builtinBinIndex = zigAnalysis.exprs[expr.builtinBinIndex]; + console.log(expr) return exprName(builtinBinIndex, opts); } case "builtinBin": { @@ -1265,6 +1292,8 @@ var zigAnalysis; let lhs = exprName(lhsOp, opts); let rhs = exprName(rhsOp, opts); + console.log(expr); + let payloadHtml = "@"; switch (expr.builtinBin.name) { case "float_to_int": { @@ -1311,6 +1340,26 @@ var zigAnalysis; payloadHtml += "hasField"; break; } + case "clz": { + payloadHtml += "clz"; + break; + } + case "ctz": { + payloadHtml += "ctz"; + break; + } + case "pop_count": { + payloadHtml += "popCount"; + break; + } + case "byte_swap": { + payloadHtml += "byteSwap"; + break; + } + case "bit_reverse": { + payloadHtml += "bitReverse"; + break; + } default: console.log("builtin function not handled yet or doesn't exist!"); }; return payloadHtml + "(" + lhs + ", " + rhs + ")"; diff --git a/src/Autodoc.zig b/src/Autodoc.zig index 5077b7df81..88e0354af0 100644 --- a/src/Autodoc.zig +++ b/src/Autodoc.zig @@ -668,6 +668,8 @@ const DocData = struct { compileError: []const u8, errorSets: usize, string: []const u8, // direct value + sliceIndex: usize, + slice: Slice, builtin: Builtin, builtinIndex: usize, builtinBin: BuiltinBin, @@ -709,6 +711,12 @@ const DocData = struct { name: []const u8 = "", // fn name param: usize, // index in `exprs` }; + const Slice = struct { + lhs: usize, // index in `exprs` + start: usize, + end: ?usize = null, + sentinel: ?usize = null, // index in `exprs` + }; const As = struct { typeRefArg: ?usize, // index in `exprs` exprArg: usize, // index in `exprs` @@ -833,6 +841,16 @@ const DocData = struct { options, w, ), + .slice => |v| try std.json.stringify( + struct { slice: Slice }{ .slice = v }, + options, + w, + ), + .sliceIndex => |v| try std.json.stringify( + struct { sliceIndex: usize }{ .sliceIndex = v }, + options, + w, + ), .typeOf_peer => |v| try std.json.stringify( struct { typeOf_peer: []usize }{ .typeOf_peer = v }, options, @@ -1106,6 +1124,123 @@ fn walkInstruction( // .expr = .{ .binOpIndex = binop_index }, // }; // }, + .slice_start => { + const pl_node = data[inst_index].pl_node; + const extra = file.zir.extraData(Zir.Inst.SliceStart, pl_node.payload_index); + + const slice_index = self.exprs.items.len; + try self.exprs.append(self.arena, .{ .slice = .{ .lhs = 0, .start = 0 } }); + + var lhs: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.lhs, + false, + ); + var start: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.start, + false, + ); + + const lhs_index = self.exprs.items.len; + try self.exprs.append(self.arena, lhs.expr); + const start_index = self.exprs.items.len; + try self.exprs.append(self.arena, start.expr); + self.exprs.items[slice_index] = .{ .slice = .{ .lhs = lhs_index, .start = start_index } }; + + return DocData.WalkResult{ + .typeRef = .{ .type = @enumToInt(Ref.type_type) }, + .expr = .{ .sliceIndex = slice_index }, + }; + }, + .slice_end => { + const pl_node = data[inst_index].pl_node; + const extra = file.zir.extraData(Zir.Inst.SliceEnd, pl_node.payload_index); + + const slice_index = self.exprs.items.len; + try self.exprs.append(self.arena, .{ .slice = .{ .lhs = 0, .start = 0 } }); + + var lhs: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.lhs, + false, + ); + var start: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.start, + false, + ); + var end: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.end, + false, + ); + + const lhs_index = self.exprs.items.len; + try self.exprs.append(self.arena, lhs.expr); + const start_index = self.exprs.items.len; + try self.exprs.append(self.arena, start.expr); + const end_index = self.exprs.items.len; + try self.exprs.append(self.arena, end.expr); + self.exprs.items[slice_index] = .{ .slice = .{ .lhs = lhs_index, .start = start_index, .end = end_index } }; + + return DocData.WalkResult{ + .typeRef = .{ .type = @enumToInt(Ref.type_type) }, + .expr = .{ .sliceIndex = slice_index }, + }; + }, + .slice_sentinel => { + const pl_node = data[inst_index].pl_node; + const extra = file.zir.extraData(Zir.Inst.SliceSentinel, pl_node.payload_index); + + const slice_index = self.exprs.items.len; + try self.exprs.append(self.arena, .{ .slice = .{ .lhs = 0, .start = 0 } }); + + var lhs: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.lhs, + false, + ); + var start: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.start, + false, + ); + var end: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.end, + false, + ); + var sentinel: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.sentinel, + false, + ); + + const lhs_index = self.exprs.items.len; + try self.exprs.append(self.arena, lhs.expr); + const start_index = self.exprs.items.len; + try self.exprs.append(self.arena, start.expr); + const end_index = self.exprs.items.len; + try self.exprs.append(self.arena, end.expr); + const sentinel_index = self.exprs.items.len; + try self.exprs.append(self.arena, sentinel.expr); + self.exprs.items[slice_index] = .{ .slice = .{ .lhs = lhs_index, .start = start_index, .end = end_index, .sentinel = sentinel_index } }; + + return DocData.WalkResult{ + .typeRef = .{ .type = @enumToInt(Ref.type_type) }, + .expr = .{ .sliceIndex = slice_index }, + }; + }, .bit_or => { const pl_node = data[inst_index].pl_node; const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); @@ -1924,6 +2059,7 @@ fn walkInstruction( }; }, + // builtin functions .align_of, .bool_to_int, .embed_file, @@ -1966,6 +2102,8 @@ fn walkInstruction( .expr = .{ .builtinIndex = bin_index }, }; }, + // @check + // .clz, .ctz, .pop_count, .byte_swap, .bit_reverse .float_to_int, .int_to_float, .int_to_ptr, .int_to_enum, .float_cast, .int_cast, .ptr_cast, .truncate, .align_cast, .has_decl, .has_field => { const pl_node = data[inst_index].pl_node; const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);