From 48435cb3b2290e732504acebc0cd5dac6bd73972 Mon Sep 17 00:00:00 2001 From: nikandfor Date: Thu, 30 Jan 2025 20:12:34 +0100 Subject: [PATCH] fix (*(*eth/common.Hash)(nil)).String() --- tlog.go | 36 ++++++++++++++++++++++++++++++++++++ tlwire/encoder_value.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/tlog.go b/tlog.go index f0a3eb2..d2f71f6 100644 --- a/tlog.go +++ b/tlog.go @@ -51,6 +51,14 @@ type ( d int } + + dumpWrapper struct { + Span + + loc loc.PC + msg string + key string + } ) var ( @@ -432,12 +440,40 @@ func (s Span) IOWriter(d int) io.Writer { } } +func (l *Logger) DumpWriter(d int, msg, key string) io.Writer { + return dumpWrapper{ + Span: Span{ + Logger: l, + }, + + loc: loc.Caller(1 + d), + msg: msg, + key: key, + } +} + +func (s Span) DumpWriter(d int, msg, key string) io.Writer { + return dumpWrapper{ + Span: s, + + loc: loc.Caller(1 + d), + msg: msg, + key: key, + } +} + func (w writeWrapper) Write(p []byte) (int, error) { message(w.Logger, w.ID, w.d, p, nil) return len(p), nil } +func (w dumpWrapper) Write(p []byte) (int, error) { + message(w.Logger, w.ID, -1, w.msg, []any{KeyCaller, w.loc, w.key, p}) + + return len(p), nil +} + func (l *Logger) Write(p []byte) (int, error) { if l == nil || l.Writer == nil { return len(p), nil diff --git a/tlwire/encoder_value.go b/tlwire/encoder_value.go index d7ac17c..73544c4 100644 --- a/tlwire/encoder_value.go +++ b/tlwire/encoder_value.go @@ -2,6 +2,7 @@ package tlwire import ( "fmt" + "math/big" "net/netip" "net/url" "reflect" @@ -109,6 +110,32 @@ func init() { return e.AppendString(b, u.String()) }) + + SetEncoder((*big.Int)(nil), func(e *Encoder, b []byte, x interface{}) []byte { + b = e.AppendSemantic(b, Big) + + y := x.(*big.Int) + if y == nil { + return e.AppendNil(b) + } + + if y.Sign() >= 0 && y.BitLen() <= 64 { + return e.AppendUint64(b, y.Uint64()) + } + + if y.BitLen() <= 63 { + return e.AppendInt64(b, y.Int64()) + } + + b = e.AppendTag(b, String, 0) + st := len(b) + + b = y.Append(b, 10) + + b = e.InsertLen(b, st, len(b)-st) + + return b + }) } func (e *Encoder) AppendKeyValue(b []byte, key string, v interface{}) []byte { @@ -162,6 +189,13 @@ func (e *Encoder) appendRaw(b []byte, r reflect.Value, visited ptrSet) []byte { switch v := v.(type) { case TlogAppender: return v.TlogAppend(b) + } + + if r.Kind() == reflect.Pointer && r.IsNil() { + return e.AppendNil(b) + } + + switch v := v.(type) { case interface{ ProtoMessage() }: // skip case error: