diff --git a/lib/zap/buf.go b/lib/zap/buf.go index 097626c7fa3fd1efc57931c0de5912e7e5d1da42..bf9200b6f7e3bce8583f73e249081c52a96016af 100644 --- a/lib/zap/buf.go +++ b/lib/zap/buf.go @@ -202,15 +202,27 @@ func (T *Buf) readFloat64() (float64, bool) { return math.Float64frombits(v), true } -func (T *Buf) readString() (string, bool) { +func (T *Buf) readUnsafeString() ([]byte, bool) { rem := T.remaining() for i, c := range rem { if c == 0 { T.pos += i + 1 - return string(rem[:i]), true + return rem[:i], true } } - return "", false + return nil, false +} + +func (T *Buf) readStringBytes(v []byte) ([]byte, bool) { + str, ok := T.readUnsafeString() + v = slices.Resize(v, len(str)) + copy(v, str) + return v, ok +} + +func (T *Buf) readString() (string, bool) { + str, ok := T.readUnsafeString() + return string(str), ok } func (T *Buf) readBytes(b []byte) bool { @@ -283,6 +295,11 @@ func (T *Buf) writeFloat64(v float64) { T.writeUint64(math.Float64bits(v)) } +func (T *Buf) writeStringBytes(v []byte) { + T.buf = append(T.buf, v...) + T.buf = append(T.buf, 0) +} + func (T *Buf) writeString(v string) { T.buf = append(T.buf, v...) T.buf = append(T.buf, 0) diff --git a/lib/zap/in.go b/lib/zap/in.go index 6cc3b9f62a58a3a412aa723b7db551ff509d502e..5eecf6258d924ab3f7af27ad9c0ca09b75f64470 100644 --- a/lib/zap/in.go +++ b/lib/zap/in.go @@ -70,6 +70,11 @@ func (T In) Float64() (float64, bool) { return T.buf.readFloat64() } +func (T In) StringBytes(b []byte) ([]byte, bool) { + T.buf.assertRev(T.rev) + return T.buf.readStringBytes(b) +} + func (T In) String() (string, bool) { T.buf.assertRev(T.rev) return T.buf.readString() diff --git a/lib/zap/out.go b/lib/zap/out.go index 9aec94afd08cd8aaf7a9a3c95a28aa59b5a6de1a..551f9d8c1405c9a9c9282bad9244b9af9066943c 100644 --- a/lib/zap/out.go +++ b/lib/zap/out.go @@ -70,6 +70,11 @@ func (T Out) Float64(v float64) { T.buf.writeFloat64(v) } +func (T Out) StringBytes(v []byte) { + T.buf.assertRev(T.rev) + T.buf.writeStringBytes(v) +} + func (T Out) String(v string) { T.buf.assertRev(T.rev) T.buf.writeString(v) diff --git a/lib/zap/zio/readwriter.go b/lib/zap/zio/readwriter.go index b5abf5ac4f2fc8ed8af0e91a99c143e55cf15323..0f09732e6b6bdcbbbbc3ba02cecfbe536f9c9331 100644 --- a/lib/zap/zio/readwriter.go +++ b/lib/zap/zio/readwriter.go @@ -9,7 +9,8 @@ import ( ) type ReadWriter struct { - rw dio.ReadWriter + rw dio.ReadWriter + // they are seperated out to prevent an expensive runtime.convI2I (which causes runtime.getitab) r io.Reader w io.Writer buf zap.Buf