| ... | ... | @@ -659,6 +659,8 @@ const DocData = struct { |
| 659 | 659 | enumToInt: usize, // index in `exprs` |
| 660 | 660 | compileError: []const u8, |
| 661 | 661 | string: []const u8, // direct value |
| 662 | switchIndex: usize, // index in `exprs` |
| 663 | switchOp: SwitchOp, |
| 662 | 664 | // Index a `type` like struct with expressions |
| 663 | 665 | // it's necessary because when a caller ask by a binOp maybe there are |
| 664 | 666 | // more binary op inside them, so the caller get's the current `exprs` index |
| ... | ... | @@ -681,6 +683,13 @@ const DocData = struct { |
| 681 | 683 | floor: bool = false, |
| 682 | 684 | trunc: bool = false, |
| 683 | 685 | }; |
| 686 | const SwitchOp = struct { |
| 687 | cases: []usize, |
| 688 | else_index: ?usize, |
| 689 | // body_cases: ?[]usize, |
| 690 | |
| 691 | // const Case = struct { lhs: Expr, rhs: Expr }; |
| 692 | }; |
| 684 | 693 | const As = struct { |
| 685 | 694 | typeRefArg: ?usize, // index in `exprs` |
| 686 | 695 | exprArg: usize, // index in `exprs` |
| ... | ... | @@ -765,6 +774,16 @@ const DocData = struct { |
| 765 | 774 | try w.print("{s}", .{comma}); |
| 766 | 775 | } |
| 767 | 776 | }, |
| 777 | .switchOp => |v| try std.json.stringify( |
| 778 | struct { switchOp: SwitchOp }{ .switchOp = v }, |
| 779 | options, |
| 780 | w, |
| 781 | ), |
| 782 | .switchIndex => |v| try std.json.stringify( |
| 783 | struct { switchIndex: usize }{ .switchIndex = v }, |
| 784 | options, |
| 785 | w, |
| 786 | ), |
| 768 | 787 | .binOp => |v| try std.json.stringify( |
| 769 | 788 | struct { binOp: BinOp }{ .binOp = v }, |
| 770 | 789 | options, |
| ... | ... | @@ -2170,12 +2189,13 @@ fn walkInstruction( |
| 2170 | 2189 | file, |
| 2171 | 2190 | parent_scope, |
| 2172 | 2191 | un_node.operand, |
| 2173 | | false, |
| 2192 | need_type, |
| 2174 | 2193 | ); |
| 2175 | 2194 | const operand_index = self.exprs.items.len; |
| 2176 | 2195 | try self.exprs.append(self.arena, operand.expr); |
| 2196 | |
| 2177 | 2197 | return DocData.WalkResult{ |
| 2178 | | .typeRef = .{ .type = @enumToInt(Ref.comptime_int_type) }, |
| 2198 | .typeRef = operand.typeRef, |
| 2179 | 2199 | .expr = .{ .bitSizeOf = operand_index }, |
| 2180 | 2200 | }; |
| 2181 | 2201 | }, |
| ... | ... | @@ -2191,14 +2211,135 @@ fn walkInstruction( |
| 2191 | 2211 | const operand_index = self.exprs.items.len; |
| 2192 | 2212 | try self.exprs.append(self.arena, operand.expr); |
| 2193 | 2213 | |
| 2194 | | std.debug.print("un_node = {any}\n", .{un_node}); |
| 2195 | | std.debug.print("operand = {any}\n", .{operand}); |
| 2196 | | std.debug.print("operand_expr = {any}\n", .{operand.expr}); |
| 2197 | 2214 | return DocData.WalkResult{ |
| 2198 | 2215 | .typeRef = .{ .type = @enumToInt(Ref.comptime_int_type) }, |
| 2199 | 2216 | .expr = .{ .enumToInt = operand_index }, |
| 2200 | 2217 | }; |
| 2201 | 2218 | }, |
| 2219 | .switch_block => { |
| 2220 | const pl_node = data[inst_index].pl_node; |
| 2221 | const extra = file.zir.extraData(Zir.Inst.SwitchBlock, pl_node.payload_index); |
| 2222 | const array_data = try self.arena.alloc(usize, extra.data.bits.scalar_cases_len); |
| 2223 | var extra_index = extra.end; |
| 2224 | |
| 2225 | const sep = "=" ** 200; |
| 2226 | std.debug.print("{s}\n", .{sep}); |
| 2227 | std.debug.print("pl_node = {any}\n", .{pl_node}); |
| 2228 | std.debug.print("extra = {any}\n", .{extra}); |
| 2229 | |
| 2230 | const multi_cases_len = if (extra.data.bits.has_multi_cases) blk: { |
| 2231 | const multi_cases_len = file.zir.extra[extra_index]; |
| 2232 | extra_index += 1; |
| 2233 | break :blk multi_cases_len; |
| 2234 | } else 0; |
| 2235 | |
| 2236 | var else_index: ?usize = null; |
| 2237 | const special_prong = extra.data.bits.specialProng(); |
| 2238 | if (special_prong != .none) { |
| 2239 | const body_len = file.zir.extra[extra_index]; |
| 2240 | extra_index += 1; |
| 2241 | const body = file.zir.extra[extra_index..][0..body_len]; |
| 2242 | extra_index += body.len; |
| 2243 | for (body) |body_member| { |
| 2244 | const item_ref = @intToEnum(Ref, file.zir.extra[extra_index]); |
| 2245 | const item = try self.walkRef(file, parent_scope, item_ref, false); |
| 2246 | std.debug.print("prong item_ref = {any}\n", .{item_ref}); |
| 2247 | std.debug.print("prong item = {any}\n", .{item}); |
| 2248 | std.debug.print("body member = {any}\n", .{body_member}); |
| 2249 | const item_index = self.exprs.items.len; |
| 2250 | try self.exprs.append(self.arena, item.expr); |
| 2251 | else_index = item_index; |
| 2252 | } |
| 2253 | } |
| 2254 | |
| 2255 | // var array_type: ?DocData.Expr = null; |
| 2256 | { |
| 2257 | const scalar_cases_len = extra.data.bits.scalar_cases_len; |
| 2258 | var scalar_i: usize = 0; |
| 2259 | while (scalar_i < scalar_cases_len) : (scalar_i += 1) { |
| 2260 | const item_ref = @intToEnum(Ref, file.zir.extra[extra_index]); |
| 2261 | const item = try self.walkRef(file, parent_scope, item_ref, false); |
| 2262 | extra_index += 1; |
| 2263 | const body_len = file.zir.extra[extra_index]; |
| 2264 | extra_index += 1; |
| 2265 | const body = file.zir.extra[extra_index..][0..body_len]; |
| 2266 | extra_index += body_len; |
| 2267 | _ = body; |
| 2268 | array_data[scalar_i] = item.expr.as.exprArg; |
| 2269 | |
| 2270 | const body_ref = @intToEnum(Ref, file.zir.extra[extra_index]); |
| 2271 | const body_item = try self.walkRef(file, parent_scope, item_ref, false); |
| 2272 | |
| 2273 | array_data[scalar_i] = item.expr.as.exprArg; |
| 2274 | std.debug.print("{s}\n", .{sep}); |
| 2275 | std.debug.print("body item_ref = {any}\n", .{item_ref}); |
| 2276 | std.debug.print("body item = {any}\n", .{item}); |
| 2277 | std.debug.print("body_len scalar cases = {any}\n", .{body_ref}); |
| 2278 | std.debug.print("body scalar cases = {any}\n", .{body_item}); |
| 2279 | std.debug.print("{s}\n", .{sep}); |
| 2280 | } |
| 2281 | } |
| 2282 | { |
| 2283 | var multi_i: usize = 0; |
| 2284 | while (multi_i < multi_cases_len) : (multi_i += 1) { |
| 2285 | const items_len = file.zir.extra[extra_index]; |
| 2286 | extra_index += 1; |
| 2287 | const ranges_len = file.zir.extra[extra_index]; |
| 2288 | extra_index += 1; |
| 2289 | const body_len = file.zir.extra[extra_index]; |
| 2290 | extra_index += 1; |
| 2291 | const items = file.zir.refSlice(extra_index, items_len); |
| 2292 | extra_index += items_len; |
| 2293 | _ = items; |
| 2294 | |
| 2295 | var range_i: usize = 0; |
| 2296 | while (range_i < ranges_len) : (range_i += 1) { |
| 2297 | extra_index += 1; |
| 2298 | extra_index += 1; |
| 2299 | } |
| 2300 | |
| 2301 | const body = file.zir.extra[extra_index..][0..body_len]; |
| 2302 | extra_index += body_len; |
| 2303 | |
| 2304 | std.debug.print("body multi_i = {any}\n", .{body}); |
| 2305 | std.debug.print("items = {any}\n", .{items}); |
| 2306 | } |
| 2307 | } |
| 2308 | |
| 2309 | // std.debug.print("multi_cases_len = {}\n", .{multi_cases_len}); |
| 2310 | std.debug.print("{s}\n", .{sep}); |
| 2311 | |
| 2312 | const switch_index = self.exprs.items.len; |
| 2313 | try self.exprs.append(self.arena, .{ .switchOp = .{ .cases = array_data, .else_index = else_index } }); |
| 2314 | |
| 2315 | return DocData.WalkResult{ |
| 2316 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| 2317 | .expr = .{ .switchIndex = switch_index }, |
| 2318 | }; |
| 2319 | }, |
| 2320 | .switch_cond => { |
| 2321 | const un_node = data[inst_index].un_node; |
| 2322 | const operand = try self.walkRef( |
| 2323 | file, |
| 2324 | parent_scope, |
| 2325 | un_node.operand, |
| 2326 | need_type, |
| 2327 | ); |
| 2328 | const operand_index = self.exprs.items.len; |
| 2329 | try self.exprs.append(self.arena, operand.expr); |
| 2330 | |
| 2331 | // const sep = "=" ** 200; |
| 2332 | // std.debug.print("{s}\n", .{sep}); |
| 2333 | // std.debug.print("SWITCH COND\n", .{}); |
| 2334 | // std.debug.print("un_node {any} \n", .{un_node}); |
| 2335 | // std.debug.print("operand {any} \n", .{operand}); |
| 2336 | // std.debug.print("{s}\n", .{sep}); |
| 2337 | |
| 2338 | return DocData.WalkResult{ |
| 2339 | .typeRef = operand.typeRef, |
| 2340 | .expr = .{ .typeOf = operand_index }, |
| 2341 | }; |
| 2342 | }, |
| 2202 | 2343 | |
| 2203 | 2344 | .typeof => { |
| 2204 | 2345 | const un_node = data[inst_index].un_node; |