mirror of
				https://github.com/golang/go.git
				synced 2025-11-04 10:40:57 +00:00 
			
		
		
		
	
		
			
	
	
		
			30 lines
		
	
	
	
		
			680 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			30 lines
		
	
	
	
		
			680 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// run
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Copyright 2017 The Go Authors. All rights reserved.
							 | 
						||
| 
								 | 
							
								// Use of this source code is governed by a BSD-style
							 | 
						||
| 
								 | 
							
								// license that can be found in the LICENSE file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package main
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import "runtime/debug"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type T struct {
							 | 
						||
| 
								 | 
							
									// >= 16 bytes to avoid tiny alloc.
							 | 
						||
| 
								 | 
							
									a, b int
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func main() {
							 | 
						||
| 
								 | 
							
									debug.SetGCPercent(1)
							 | 
						||
| 
								 | 
							
									for i := 0; i < 100000; i++ {
							 | 
						||
| 
								 | 
							
										m := make(map[*T]struct{}, 0)
							 | 
						||
| 
								 | 
							
										for j := 0; j < 20; j++ {
							 | 
						||
| 
								 | 
							
											// During the call to mapassign_fast64, the key argument
							 | 
						||
| 
								 | 
							
											// was incorrectly treated as a uint64. If the stack was
							 | 
						||
| 
								 | 
							
											// scanned during that call, the only pointer to k was
							 | 
						||
| 
								 | 
							
											// missed, leading to *k being collected prematurely.
							 | 
						||
| 
								 | 
							
											k := new(T)
							 | 
						||
| 
								 | 
							
											m[k] = struct{}{}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |