mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-31 02:36:18 +08:00 
			
		
		
		
	proc/variables: fill Len field of maps when recursion limit is reached (#834)
If we don't fill the Len field there will be no way for the user to distinguish maps we didn't load from empty maps.
This commit is contained in:
		 Alessandro Arzilli
					Alessandro Arzilli
				
			
				
					committed by
					
						 Derek Parker
						Derek Parker
					
				
			
			
				
	
			
			
			 Derek Parker
						Derek Parker
					
				
			
						parent
						
							a4df01e105
						
					
				
				
					commit
					d8bb8ed5bf
				
			| @ -85,6 +85,10 @@ type Item struct { | |||||||
|  |  | ||||||
| type Menu []Item | type Menu []Item | ||||||
|  |  | ||||||
|  | type truncatedMap struct { | ||||||
|  | 	v []map[string]astruct | ||||||
|  | } | ||||||
|  |  | ||||||
| func main() { | func main() { | ||||||
| 	i1 := 1 | 	i1 := 1 | ||||||
| 	i2 := 2 | 	i2 := 2 | ||||||
| @ -223,6 +227,8 @@ func main() { | |||||||
| 	zsvar := struct{}{} | 	zsvar := struct{}{} | ||||||
| 	zsslice := make([]struct{}, 3) | 	zsslice := make([]struct{}, 3) | ||||||
| 	zsvmap := map[string]struct{}{"testkey": struct{}{}} | 	zsvmap := map[string]struct{}{"testkey": struct{}{}} | ||||||
|  | 	var tm truncatedMap | ||||||
|  | 	tm.v = []map[string]astruct{m1} | ||||||
|  |  | ||||||
| 	var amb1 = 1 | 	var amb1 = 1 | ||||||
| 	runtime.Breakpoint() | 	runtime.Breakpoint() | ||||||
| @ -231,5 +237,5 @@ func main() { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	runtime.Breakpoint() | 	runtime.Breakpoint() | ||||||
| 	fmt.Println(i1, i2, i3, p1, amb1, s1, s3, a1, p2, p3, s2, as1, str1, f1, fn1, fn2, nilslice, nilptr, ch1, chnil, m1, mnil, m2, m3, up1, i4, i5, i6, err1, err2, errnil, iface1, iface2, ifacenil, arr1, parr, cpx1, const1, iface3, iface4, recursive1, recursive1.x, iface5, iface2fn1, iface2fn2, bencharr, benchparr, mapinf, mainMenu, b, b2, sd, anonstruct1, anonstruct2, anoniface1, anonfunc, mapanonstruct1, ifacearr, efacearr, ni8, ni16, ni32, pinf, ninf, nan, zsvmap, zsslice, zsvar) | 	fmt.Println(i1, i2, i3, p1, amb1, s1, s3, a1, p2, p3, s2, as1, str1, f1, fn1, fn2, nilslice, nilptr, ch1, chnil, m1, mnil, m2, m3, up1, i4, i5, i6, err1, err2, errnil, iface1, iface2, ifacenil, arr1, parr, cpx1, const1, iface3, iface4, recursive1, recursive1.x, iface5, iface2fn1, iface2fn2, bencharr, benchparr, mapinf, mainMenu, b, b2, sd, anonstruct1, anonstruct2, anoniface1, anonfunc, mapanonstruct1, ifacearr, efacearr, ni8, ni16, ni32, pinf, ninf, nan, zsvmap, zsslice, zsvar, tm) | ||||||
| } | } | ||||||
|  | |||||||
| @ -824,6 +824,9 @@ func (v *Variable) loadValueInternal(recurseLevel int, cfg LoadConfig) { | |||||||
| 	case reflect.Map: | 	case reflect.Map: | ||||||
| 		if recurseLevel <= cfg.MaxVariableRecurse { | 		if recurseLevel <= cfg.MaxVariableRecurse { | ||||||
| 			v.loadMap(recurseLevel, cfg) | 			v.loadMap(recurseLevel, cfg) | ||||||
|  | 		} else { | ||||||
|  | 			// loads length so that the client knows that the map isn't empty | ||||||
|  | 			v.mapIterator() | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 	case reflect.String: | 	case reflect.String: | ||||||
|  | |||||||
| @ -694,6 +694,7 @@ func TestEvalExpression(t *testing.T) { | |||||||
|  |  | ||||||
| 		{"zsslice", false, `[]struct {} len: 3, cap: 3, [{},{},{}]`, `[]struct {} len: 3, cap: 3, [...]`, "[]struct {}", nil}, | 		{"zsslice", false, `[]struct {} len: 3, cap: 3, [{},{},{}]`, `[]struct {} len: 3, cap: 3, [...]`, "[]struct {}", nil}, | ||||||
| 		{"zsvmap", false, `map[string]struct {} ["testkey": {}, ]`, `map[string]struct {} [...]`, "map[string]struct {}", nil}, | 		{"zsvmap", false, `map[string]struct {} ["testkey": {}, ]`, `map[string]struct {} [...]`, "map[string]struct {}", nil}, | ||||||
|  | 		{"tm", false, "main.truncatedMap {v: []map[string]main.astruct len: 1, cap: 1, [[...]]}", "main.truncatedMap {v: []map[string]main.astruct len: 1, cap: 1, [...]}", "main.truncatedMap", nil}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ver, _ := proc.ParseVersionString(runtime.Version()) | 	ver, _ := proc.ParseVersionString(runtime.Version()) | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user