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