mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-31 10:47:27 +08:00 
			
		
		
		
	api,dap: fix hexadecimal printing of vars with symbolic const values (#3487)
Fix hexadecimal printing of variables that can be represented using symbolic const values in DAP as well as the command line interface. Fixes #3485
This commit is contained in:
		 Alessandro Arzilli
					Alessandro Arzilli
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							e404917db7
						
					
				
				
					commit
					7fb9ddae4d
				
			| @ -1104,16 +1104,16 @@ func TestPackageRenames(t *testing.T) { | ||||
|  | ||||
| func TestConstants(t *testing.T) { | ||||
| 	testcases := []varTest{ | ||||
| 		{"a", true, "constTwo (2)", "", "main.ConstType", nil}, | ||||
| 		{"b", true, "constThree (3)", "", "main.ConstType", nil}, | ||||
| 		{"c", true, "bitZero|bitOne (3)", "", "main.BitFieldType", nil}, | ||||
| 		{"d", true, "33", "", "main.BitFieldType", nil}, | ||||
| 		{"e", true, "10", "", "main.ConstType", nil}, | ||||
| 		{"f", true, "0", "", "main.BitFieldType", nil}, | ||||
| 		{"bitZero", true, "1", "", "main.BitFieldType", nil}, | ||||
| 		{"bitOne", true, "2", "", "main.BitFieldType", nil}, | ||||
| 		{"constTwo", true, "2", "", "main.ConstType", nil}, | ||||
| 		{"pkg.SomeConst", false, "2", "", "int", nil}, | ||||
| 		{"a", true, "constTwo (2)", "0x2", "main.ConstType", nil}, | ||||
| 		{"b", true, "constThree (3)", "0x3", "main.ConstType", nil}, | ||||
| 		{"c", true, "bitZero|bitOne (3)", "0x3", "main.BitFieldType", nil}, | ||||
| 		{"d", true, "33", "0x21", "main.BitFieldType", nil}, | ||||
| 		{"e", true, "10", "0xa", "main.ConstType", nil}, | ||||
| 		{"f", true, "0", "0x0", "main.BitFieldType", nil}, | ||||
| 		{"bitZero", true, "1", "0x1", "main.BitFieldType", nil}, | ||||
| 		{"bitOne", true, "2", "0x2", "main.BitFieldType", nil}, | ||||
| 		{"constTwo", true, "2", "0x2", "main.ConstType", nil}, | ||||
| 		{"pkg.SomeConst", false, "2", "0x2", "int", nil}, | ||||
| 	} | ||||
| 	ver, _ := goversion.Parse(runtime.Version()) | ||||
| 	if ver.Major > 0 && !ver.AfterOrEqual(goversion.GoVersion{Major: 1, Minor: 10, Rev: -1}) { | ||||
| @ -1126,6 +1126,11 @@ func TestConstants(t *testing.T) { | ||||
| 			variable, err := evalVariableWithCfg(p, testcase.name, pnormalLoadConfig) | ||||
| 			assertNoError(err, t, fmt.Sprintf("EvalVariable(%s)", testcase.name)) | ||||
| 			assertVariable(t, variable, testcase) | ||||
| 			cv := api.ConvertVar(variable) | ||||
| 			str := cv.SinglelineStringFormatted("%#x") | ||||
| 			if str != testcase.alternate { | ||||
| 				t.Errorf("for %s expected %q got %q when formatting in hexadecimal", testcase.name, testcase.alternate, str) | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| @ -173,7 +173,7 @@ func (v *Variable) writeBasicType(buf io.Writer, fmtstr string) { | ||||
| 			buf.Write([]byte(v.Value)) | ||||
| 			return | ||||
| 		} | ||||
| 		n, _ := strconv.ParseInt(v.Value, 10, 64) | ||||
| 		n, _ := strconv.ParseInt(ExtractIntValue(v.Value), 10, 64) | ||||
| 		fmt.Fprintf(buf, fmtstr, n) | ||||
|  | ||||
| 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: | ||||
| @ -181,7 +181,7 @@ func (v *Variable) writeBasicType(buf io.Writer, fmtstr string) { | ||||
| 			buf.Write([]byte(v.Value)) | ||||
| 			return | ||||
| 		} | ||||
| 		n, _ := strconv.ParseUint(v.Value, 10, 64) | ||||
| 		n, _ := strconv.ParseUint(ExtractIntValue(v.Value), 10, 64) | ||||
| 		fmt.Fprintf(buf, fmtstr, n) | ||||
|  | ||||
| 	case reflect.Float32, reflect.Float64: | ||||
| @ -215,6 +215,17 @@ func (v *Variable) writeBasicType(buf io.Writer, fmtstr string) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func ExtractIntValue(s string) string { | ||||
| 	if s == "" || s[len(s)-1] != ')' { | ||||
| 		return s | ||||
| 	} | ||||
| 	open := strings.LastIndex(s, "(") | ||||
| 	if open < 0 { | ||||
| 		return s | ||||
| 	} | ||||
| 	return s[open+1 : len(s)-1] | ||||
| } | ||||
|  | ||||
| func (v *Variable) writeSliceTo(buf io.Writer, newlines, includeType bool, indent, fmtstr string) { | ||||
| 	if includeType { | ||||
| 		fmt.Fprintf(buf, "%s len: %d, cap: %d, ", v.Type, v.Len, v.Cap) | ||||
|  | ||||
| @ -2593,7 +2593,7 @@ func (s *Session) convertVariableWithOpts(v *proc.Variable, qualifiedNameOrExpr | ||||
|  | ||||
| 	switch v.Kind { | ||||
| 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: | ||||
| 		n, _ := strconv.ParseUint(api.ConvertVar(v).Value, 10, 64) | ||||
| 		n, _ := strconv.ParseUint(api.ExtractIntValue(api.ConvertVar(v).Value), 10, 64) | ||||
| 		value = fmt.Sprintf("%s = %#x", value, n) | ||||
| 	case reflect.UnsafePointer: | ||||
| 		// Skip child reference | ||||
|  | ||||
		Reference in New Issue
	
	Block a user