stack/stack.go
func nameArguments(goroutines []*Goroutine) {
	// Set a name for any pointer occurring more than once.
	type object struct {
		args      []*Arg
		inPrimary bool
		id        int
	}
	objects := map[uint64]object{}
	// Enumerate all the arguments.
	for i := range goroutines {
		for j := range goroutines[i].Stack.Calls {
			for k := range goroutines[i].Stack.Calls[j].Args.Values {
				arg := goroutines[i].Stack.Calls[j].Args.Values[k]
				if arg.IsPtr() {
					objects[arg.Value] = object{
						args:      append(objects[arg.Value].args, &goroutines[i].Stack.Calls[j].Args.Values[k]),
						inPrimary: objects[arg.Value].inPrimary || i == 0,
					}
				}
			}
		}
		// CreatedBy.Args is never set.
	}
	order := make(uint64Slice, 0, len(objects)/2)
	for k, obj := range objects {
		if len(obj.args) > 1 && obj.inPrimary {
			order = append(order, k)
		}
	}
	sort.Sort(order)
	nextID := 1
	for _, k := range order {
		for _, arg := range objects[k].args {
			arg.Name = fmt.Sprintf("#%d", nextID)
		}
		nextID++
	}

	// Now do the rest. This is done so the output is deterministic.
	order = make(uint64Slice, 0, len(objects))
	for k := range objects {
		order = append(order, k)
	}
	sort.Sort(order)
	for _, k := range order {
		// Process the remaining pointers, they were not referenced by primary
		// thread so will have higher IDs.
		if objects[k].inPrimary {
			continue
		}
		for _, arg := range objects[k].args {
			arg.Name = fmt.Sprintf("#%d", nextID)
		}
		nextID++
	}
}
func nameArguments(goroutines []*Goroutine) {
	// Set a name for any pointer occurring more than once.
	type object struct {
		args      []*Arg
		inPrimary bool
		id        int
	}
	objects := map[uint64]object{}
	// Enumerate all the arguments.
	for i := range goroutines {
		for j := range goroutines[i].Stack.Calls {
			for k := range goroutines[i].Stack.Calls[j].Args.Values {
				arg := goroutines[i].Stack.Calls[j].Args.Values[k]
				if arg.IsPtr() {
					objects[arg.Value] = object{
						args:      append(objects[arg.Value].args, &goroutines[i].Stack.Calls[j].Args.Values[k]),
						inPrimary: objects[arg.Value].inPrimary || i == 0,
					}
				}
			}
		}
		// CreatedBy.Args is never set.
	}
	order := make(uint64Slice, 0, len(objects)/2)
	for k, obj := range objects {
		if len(obj.args) > 1 && obj.inPrimary {
			order = append(order, k)
		}
	}
	sort.Sort(order)
	nextID := 1
	for _, k := range order {
		for _, arg := range objects[k].args {
			arg.Name = fmt.Sprintf("#%d", nextID)
		}
		nextID++
	}

	// Now do the rest. This is done so the output is deterministic.
	order = make(uint64Slice, 0, len(objects))
	for k := range objects {
		order = append(order, k)
	}
	sort.Sort(order)
	for _, k := range order {
		// Process the remaining pointers, they were not referenced by primary
		// thread so will have higher IDs.
		if objects[k].inPrimary {
			continue
		}
		for _, arg := range objects[k].args {
			arg.Name = fmt.Sprintf("#%d", nextID)
		}
		nextID++
	}
}
func nameArguments ( goroutines [ ] * Goroutine ) { // Set a name for any pointer occurring more than once. type object struct { args [ ] * Arg inPrimary bool id int } objects := map [ uint64 ] object { } // Enumerate all the arguments. for i := range goroutines { for j := range goroutines [ i ] . Stack . Calls { for k := range goroutines [ i ] . Stack . Calls [ j ] . Args . Values { arg := goroutines [ i ] . Stack . Calls [ j ] . Args . Values [ k ] if arg . IsPtr ( ) { objects [ arg . Value ] = object { args : append ( objects [ arg . Value ] . args , & goroutines [ i ] . Stack . Calls [ j ] . Args . Values [ k ] ) , inPrimary : objects [ arg . Value ] . inPrimary || i == 0 , } } } } // CreatedBy.Args is never set. } order := make ( uint64Slice , 0 , len ( objects ) / 2 ) for k , obj := range objects { if len ( obj . args ) > 1 && obj . inPrimary { order = append ( order , k ) } } sort . Sort ( order ) nextID := 1 for _ , k := range order { for _ , arg := range objects [ k ] . args { arg . Name = fmt . Sprintf ( " " , nextID ) } nextID ++ } // Now do the rest. This is done so the output is deterministic. order = make ( uint64Slice , 0 , len ( objects ) ) for k := range objects { order = append ( order , k ) } sort . Sort ( order ) for _ , k := range order { // Process the remaining pointers, they were not referenced by primary // thread so will have higher IDs. if objects [ k ] . inPrimary { continue } for _ , arg := range objects [ k ] . args { arg . Name = fmt . Sprintf ( " " , nextID ) } nextID ++ } }
// Private stuff.
// nameArguments is a post-processing step where Args are 'named' with numbers.
Private stuff . nameArguments is a post - processing step where Args are named with numbers .