log: add special casing of uint256 into the logger (#26936)
This commit is contained in:
		
							parent
							
								
									2ed8013f08
								
							
						
					
					
						commit
						8a9a73c99b
					
				
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -36,7 +36,7 @@ require ( | ||||
| 	github.com/graph-gophers/graphql-go v1.3.0 | ||||
| 	github.com/hashicorp/go-bexpr v0.1.10 | ||||
| 	github.com/holiman/bloomfilter/v2 v2.0.3 | ||||
| 	github.com/holiman/uint256 v1.2.0 | ||||
| 	github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c | ||||
| 	github.com/huin/goupnp v1.0.3 | ||||
| 	github.com/influxdata/influxdb v1.8.3 | ||||
| 	github.com/influxdata/influxdb-client-go/v2 v2.4.0 | ||||
|  | ||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							| @ -297,6 +297,10 @@ github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZ | ||||
| github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= | ||||
| github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= | ||||
| github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= | ||||
| github.com/holiman/uint256 v1.2.1 h1:XRtyuda/zw2l+Bq/38n5XUoEF72aSOu/77Thd9pPp2o= | ||||
| github.com/holiman/uint256 v1.2.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= | ||||
| github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8= | ||||
| github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= | ||||
| github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | ||||
| github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= | ||||
| github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= | ||||
|  | ||||
| @ -12,6 +12,8 @@ import ( | ||||
| 	"sync/atomic" | ||||
| 	"time" | ||||
| 	"unicode/utf8" | ||||
| 
 | ||||
| 	"github.com/holiman/uint256" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @ -339,12 +341,20 @@ func formatLogfmtValue(value interface{}, term bool) string { | ||||
| 		return v.Format(timeFormat) | ||||
| 
 | ||||
| 	case *big.Int: | ||||
| 		// Big ints get consumed by the Stringer clause so we need to handle
 | ||||
| 		// Big ints get consumed by the Stringer clause, so we need to handle
 | ||||
| 		// them earlier on.
 | ||||
| 		if v == nil { | ||||
| 			return "<nil>" | ||||
| 		} | ||||
| 		return formatLogfmtBigInt(v) | ||||
| 
 | ||||
| 	case *uint256.Int: | ||||
| 		// Uint256s get consumed by the Stringer clause, so we need to handle
 | ||||
| 		// them earlier on.
 | ||||
| 		if v == nil { | ||||
| 			return "<nil>" | ||||
| 		} | ||||
| 		return formatLogfmtUint256(v) | ||||
| 	} | ||||
| 	if term { | ||||
| 		if s, ok := value.(TerminalStringer); ok { | ||||
| @ -469,6 +479,36 @@ func formatLogfmtBigInt(n *big.Int) string { | ||||
| 	return string(buf[i+1:]) | ||||
| } | ||||
| 
 | ||||
| // formatLogfmtUint256 formats n with thousand separators.
 | ||||
| func formatLogfmtUint256(n *uint256.Int) string { | ||||
| 	if n.IsUint64() { | ||||
| 		return FormatLogfmtUint64(n.Uint64()) | ||||
| 	} | ||||
| 	var ( | ||||
| 		text  = n.Dec() | ||||
| 		buf   = make([]byte, len(text)+len(text)/3) | ||||
| 		comma = 0 | ||||
| 		i     = len(buf) - 1 | ||||
| 	) | ||||
| 	for j := len(text) - 1; j >= 0; j, i = j-1, i-1 { | ||||
| 		c := text[j] | ||||
| 
 | ||||
| 		switch { | ||||
| 		case c == '-': | ||||
| 			buf[i] = c | ||||
| 		case comma == 3: | ||||
| 			buf[i] = ',' | ||||
| 			i-- | ||||
| 			comma = 0 | ||||
| 			fallthrough | ||||
| 		default: | ||||
| 			buf[i] = c | ||||
| 			comma++ | ||||
| 		} | ||||
| 	} | ||||
| 	return string(buf[i+1:]) | ||||
| } | ||||
| 
 | ||||
| // escapeString checks if the provided string needs escaping/quoting, and
 | ||||
| // calls strconv.Quote if needed
 | ||||
| func escapeString(s string) string { | ||||
|  | ||||
| @ -7,6 +7,8 @@ import ( | ||||
| 	"math/rand" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/holiman/uint256" | ||||
| ) | ||||
| 
 | ||||
| func TestPrettyInt64(t *testing.T) { | ||||
| @ -80,6 +82,24 @@ func TestPrettyBigInt(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestPrettyUint256(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		int string | ||||
| 		s   string | ||||
| 	}{ | ||||
| 		{"111222333444555678999", "111,222,333,444,555,678,999"}, | ||||
| 		{"11122233344455567899900", "11,122,233,344,455,567,899,900"}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, tt := range tests { | ||||
| 		v := new(uint256.Int) | ||||
| 		v.SetFromDecimal(tt.int) | ||||
| 		if have := formatLogfmtUint256(v); have != tt.s { | ||||
| 			t.Errorf("invalid output %s, want %s", have, tt.s) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| var sink string | ||||
| 
 | ||||
| func BenchmarkPrettyInt64Logfmt(b *testing.B) { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user