| ... | @@ -4767,15 +4767,25 @@ pub fn populateTestFunctions(mod: *Module) !void { | ... | @@ -4767,15 +4767,25 @@ pub fn populateTestFunctions(mod: *Module) !void { |
| 4767 | try mod.linkerUpdateDecl(array_decl); | 4767 | try mod.linkerUpdateDecl(array_decl); |
| 4768 | | 4768 | |
| 4769 | { | 4769 | { |
| 4770 | var arena_instance = decl.value_arena.?.promote(gpa); | 4770 | var new_decl_arena = std.heap.ArenaAllocator.init(gpa); |
| 4771 | defer decl.value_arena.?.* = arena_instance.state; | 4771 | errdefer new_decl_arena.deinit(); |
| 4772 | const arena = &arena_instance.allocator; | 4772 | const arena = &new_decl_arena.allocator; |
| 4773 | | 4773 | |
| 4774 | decl.ty = try Type.Tag.const_slice.create(arena, try tmp_test_fn_ty.copy(arena)); | 4774 | // This copy accesses the old Decl Type/Value so it must be done before `clearValues`. |
| 4775 | decl.val = try Value.Tag.slice.create(arena, .{ | 4775 | const new_ty = try Type.Tag.const_slice.create(arena, try tmp_test_fn_ty.copy(arena)); |
| | 4776 | const new_val = try Value.Tag.slice.create(arena, .{ |
| 4776 | .ptr = try Value.Tag.decl_ref.create(arena, array_decl), | 4777 | .ptr = try Value.Tag.decl_ref.create(arena, array_decl), |
| 4777 | .len = try Value.Tag.int_u64.create(arena, mod.test_functions.count()), | 4778 | .len = try Value.Tag.int_u64.create(arena, mod.test_functions.count()), |
| 4778 | }); | 4779 | }); |
| | 4780 | |
| | 4781 | // Since we are replacing the Decl's value we must perform cleanup on the |
| | 4782 | // previous value. |
| | 4783 | decl.clearValues(gpa); |
| | 4784 | decl.ty = new_ty; |
| | 4785 | decl.val = new_val; |
| | 4786 | decl.has_tv = true; |
| | 4787 | |
| | 4788 | try decl.finalizeNewArena(&new_decl_arena); |
| 4779 | } | 4789 | } |
| 4780 | try mod.linkerUpdateDecl(decl); | 4790 | try mod.linkerUpdateDecl(decl); |
| 4781 | } | 4791 | } |