| ... | ... | @@ -6912,11 +6912,11 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 6912 | 6912 | const final_len = lhs_info.len + rhs_info.len; |
| 6913 | 6913 | const final_len_including_sent = final_len + @boolToInt(res_sent != null); |
| 6914 | 6914 | const is_pointer = lhs_ty.zigTypeTag() == .Pointer; |
| 6915 | const lhs_sub_val = if (is_pointer) (try lhs_val.pointerDeref(sema.arena)).? else lhs_val; |
| 6916 | const rhs_sub_val = if (is_pointer) (try rhs_val.pointerDeref(sema.arena)).? else rhs_val; |
| 6915 | 6917 | var anon_decl = try block.startAnonDecl(); |
| 6916 | 6918 | defer anon_decl.deinit(); |
| 6917 | 6919 | |
| 6918 | | const lhs_sub_val = if (is_pointer) (try lhs_val.pointerDeref(anon_decl.arena())).? else lhs_val; |
| 6919 | | const rhs_sub_val = if (is_pointer) (try rhs_val.pointerDeref(anon_decl.arena())).? else rhs_val; |
| 6920 | 6920 | const buf = try anon_decl.arena().alloc(Value, final_len_including_sent); |
| 6921 | 6921 | { |
| 6922 | 6922 | var i: u64 = 0; |
| ... | ... | @@ -6936,18 +6936,20 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 6936 | 6936 | buf[final_len] = try rs.copy(anon_decl.arena()); |
| 6937 | 6937 | break :ty try Type.Tag.array_sentinel.create(anon_decl.arena(), .{ |
| 6938 | 6938 | .len = final_len, |
| 6939 | | .elem_type = lhs_info.elem_type, |
| 6940 | | .sentinel = rs, |
| 6939 | .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()), |
| 6940 | .sentinel = try rs.copy(anon_decl.arena()), |
| 6941 | 6941 | }); |
| 6942 | 6942 | } else try Type.Tag.array.create(anon_decl.arena(), .{ |
| 6943 | 6943 | .len = final_len, |
| 6944 | | .elem_type = lhs_info.elem_type, |
| 6944 | .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()), |
| 6945 | 6945 | }); |
| 6946 | 6946 | const val = try Value.Tag.array.create(anon_decl.arena(), buf); |
| 6947 | | return if (is_pointer) |
| 6948 | | sema.analyzeDeclRef(try anon_decl.finish(ty, val)) |
| 6949 | | else |
| 6950 | | sema.analyzeDeclVal(block, .unneeded, try anon_decl.finish(ty, val)); |
| 6947 | const decl = try anon_decl.finish(ty, val); |
| 6948 | if (is_pointer) { |
| 6949 | return sema.analyzeDeclRef(decl); |
| 6950 | } else { |
| 6951 | return sema.analyzeDeclVal(block, .unneeded, decl); |
| 6952 | } |
| 6951 | 6953 | } else { |
| 6952 | 6954 | return sema.fail(block, lhs_src, "TODO runtime array_cat", .{}); |
| 6953 | 6955 | } |
| ... | ... | @@ -6990,10 +6992,11 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 6990 | 6992 | const final_len_including_sent = final_len + @boolToInt(mulinfo.sentinel != null); |
| 6991 | 6993 | |
| 6992 | 6994 | if (try sema.resolveDefinedValue(block, lhs_src, lhs)) |lhs_val| { |
| 6995 | const lhs_sub_val = if (lhs_ty.zigTypeTag() == .Pointer) (try lhs_val.pointerDeref(sema.arena)).? else lhs_val; |
| 6996 | |
| 6993 | 6997 | var anon_decl = try block.startAnonDecl(); |
| 6994 | 6998 | defer anon_decl.deinit(); |
| 6995 | 6999 | |
| 6996 | | const lhs_sub_val = if (lhs_ty.zigTypeTag() == .Pointer) (try lhs_val.pointerDeref(anon_decl.arena())).? else lhs_val; |
| 6997 | 7000 | const final_ty = if (mulinfo.sentinel) |sent| |
| 6998 | 7001 | try Type.Tag.array_sentinel.create(anon_decl.arena(), .{ |
| 6999 | 7002 | .len = final_len, |
| ... | ... | @@ -7010,7 +7013,8 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 7010 | 7013 | // Optimization for the common pattern of a single element repeated N times, such |
| 7011 | 7014 | // as zero-filling a byte array. |
| 7012 | 7015 | const val = if (mulinfo.len == 1) blk: { |
| 7013 | | const copied_val = try (try lhs_sub_val.elemValue(sema.arena, 0)).copy(anon_decl.arena()); |
| 7016 | const elem_val = try lhs_sub_val.elemValue(sema.arena, 0); |
| 7017 | const copied_val = try elem_val.copy(anon_decl.arena()); |
| 7014 | 7018 | break :blk try Value.Tag.repeated.create(anon_decl.arena(), copied_val); |
| 7015 | 7019 | } else blk: { |
| 7016 | 7020 | // the actual loop |
| ... | ... | @@ -7027,10 +7031,11 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 7027 | 7031 | } |
| 7028 | 7032 | break :blk try Value.Tag.array.create(anon_decl.arena(), buf); |
| 7029 | 7033 | }; |
| 7034 | const decl = try anon_decl.finish(final_ty, val); |
| 7030 | 7035 | if (lhs_ty.zigTypeTag() == .Pointer) { |
| 7031 | | return sema.analyzeDeclRef(try anon_decl.finish(final_ty, val)); |
| 7036 | return sema.analyzeDeclRef(decl); |
| 7032 | 7037 | } else { |
| 7033 | | return sema.analyzeDeclVal(block, .unneeded, try anon_decl.finish(final_ty, val)); |
| 7038 | return sema.analyzeDeclVal(block, .unneeded, decl); |
| 7034 | 7039 | } |
| 7035 | 7040 | } |
| 7036 | 7041 | return sema.fail(block, lhs_src, "TODO runtime array_mul", .{}); |