Skip to content

Commit

Permalink
log: add special casing of uint256 into the logger (ethereum#26936)
Browse files Browse the repository at this point in the history
  • Loading branch information
gzliudan committed Nov 15, 2024
1 parent 56df788 commit dca50e8
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 1 deletion.
42 changes: 41 additions & 1 deletion log/format.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (
"sync/atomic"
"time"
"unicode/utf8"

"github.com/holiman/uint256"
)

const (
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
20 changes: 20 additions & 0 deletions log/format_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"math/rand"
"strings"
"testing"

"github.com/holiman/uint256"
)

func TestPrettyInt64(t *testing.T) {
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit dca50e8

Please sign in to comment.