add: slice_start, slice_end and slice_sentinel

This commit is contained in:
Vallahor 2022-06-01 16:06:49 -03:00 committed by Andrew Kelley
parent b9fa91002e
commit 1f5df0e034
2 changed files with 188 additions and 1 deletions

View File

@ -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() {</br>";
@ -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 + ")";

View File

@ -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);