Skip to content

Commit 0c09d87

Browse files
authored
Replace make+copy with bytes.Clone (#1564)
Idiomatic single-call replacement for the two-line make([]byte, buf.Len()) + copy pattern. No performance change; readability improvement.
1 parent b4a958c commit 0c09d87

File tree

4 files changed

+91
-16
lines changed

4 files changed

+91
-16
lines changed

jwe/compress.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ func compress(plaintext []byte) ([]byte, error) {
5656
return nil, fmt.Errorf(`failed to close compression writer: %w`, err)
5757
}
5858

59-
ret := make([]byte, buf.Len())
60-
copy(ret, buf.Bytes())
59+
ret := bytes.Clone(buf.Bytes())
6160
return ret, nil
6261
}

jwe/message.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package jwe
22

33
import (
4+
"bytes"
45
"fmt"
56
"sort"
67
"strings"
@@ -71,8 +72,7 @@ func (r *stdRecipient) MarshalJSON() ([]byte, error) {
7172
buf.WriteString(base64.EncodeToString(r.encryptedKey))
7273
buf.WriteString(`"}`)
7374

74-
ret := make([]byte, buf.Len())
75-
copy(ret, buf.Bytes())
75+
ret := bytes.Clone(buf.Bytes())
7676
return ret, nil
7777
}
7878

@@ -344,8 +344,7 @@ func (m *Message) MarshalJSON() ([]byte, error) {
344344
}
345345
fmt.Fprintf(buf, `}`)
346346

347-
ret := make([]byte, buf.Len())
348-
copy(ret, buf.Bytes())
347+
ret := bytes.Clone(buf.Bytes())
349348
return ret, nil
350349
}
351350

@@ -554,7 +553,6 @@ func Compact(m *Message, _ ...CompactOption) ([]byte, error) {
554553
buf.WriteByte(tokens.Period)
555554
buf.Write(tag)
556555

557-
result := make([]byte, buf.Len())
558-
copy(result, buf.Bytes())
556+
result := bytes.Clone(buf.Bytes())
559557
return result, nil
560558
}

jws/bench_serialize_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package jws_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/lestrrat-go/jwx/v3/internal/jwxtest"
7+
"github.com/lestrrat-go/jwx/v3/jwa"
8+
"github.com/lestrrat-go/jwx/v3/jws"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func BenchmarkCompact(b *testing.B) {
13+
b.ReportAllocs()
14+
15+
key, err := jwxtest.GenerateRsaKey()
16+
require.NoError(b, err)
17+
18+
payload := []byte(`{"iss":"bench","sub":"perf","aud":"test","exp":9999999999}`)
19+
signed, err := jws.Sign(payload, jws.WithKey(jwa.RS256(), key))
20+
require.NoError(b, err)
21+
22+
msg, err := jws.Parse(signed)
23+
require.NoError(b, err)
24+
25+
b.ResetTimer()
26+
for b.Loop() {
27+
_, err := jws.Compact(msg)
28+
if err != nil {
29+
b.Fatal(err)
30+
}
31+
}
32+
}
33+
34+
func BenchmarkMarshalJSON(b *testing.B) {
35+
b.ReportAllocs()
36+
37+
key, err := jwxtest.GenerateRsaKey()
38+
require.NoError(b, err)
39+
40+
payload := []byte(`{"iss":"bench","sub":"perf","aud":"test","exp":9999999999}`)
41+
signed, err := jws.Sign(payload, jws.WithKey(jwa.RS256(), key))
42+
require.NoError(b, err)
43+
44+
msg, err := jws.Parse(signed)
45+
require.NoError(b, err)
46+
47+
b.ResetTimer()
48+
for b.Loop() {
49+
_, err := msg.MarshalJSON()
50+
if err != nil {
51+
b.Fatal(err)
52+
}
53+
}
54+
}
55+
56+
func BenchmarkMarshalJSONMultiSig(b *testing.B) {
57+
b.ReportAllocs()
58+
59+
rsaKey, err := jwxtest.GenerateRsaKey()
60+
require.NoError(b, err)
61+
ecKey, err := jwxtest.GenerateEcdsaKey(jwa.P256())
62+
require.NoError(b, err)
63+
64+
payload := []byte(`{"iss":"bench","sub":"perf","aud":"test","exp":9999999999}`)
65+
signed, err := jws.Sign(payload,
66+
jws.WithJSON(),
67+
jws.WithKey(jwa.RS256(), rsaKey),
68+
jws.WithKey(jwa.ES256(), ecKey),
69+
)
70+
require.NoError(b, err)
71+
72+
msg, err := jws.Parse(signed)
73+
require.NoError(b, err)
74+
75+
b.ResetTimer()
76+
for b.Loop() {
77+
_, err := msg.MarshalJSON()
78+
if err != nil {
79+
b.Fatal(err)
80+
}
81+
}
82+
}

jws/message.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,7 @@ func (s *Signature) sign2(payload []byte, signer interface{ Algorithm() jwa.Sign
194194

195195
buf.WriteByte(tokens.Period)
196196
buf.WriteString(encoder.EncodeToString(s.signature))
197-
ret := make([]byte, buf.Len())
198-
copy(ret, buf.Bytes())
197+
ret := bytes.Clone(buf.Bytes())
199198

200199
return s.signature, ret, nil
201200
}
@@ -427,8 +426,7 @@ func (m Message) marshalFlattened() ([]byte, error) {
427426
buf.WriteRune('"')
428427
buf.WriteRune(tokens.CloseCurlyBracket)
429428

430-
ret := make([]byte, buf.Len())
431-
copy(ret, buf.Bytes())
429+
ret := bytes.Clone(buf.Bytes())
432430
return ret, nil
433431
}
434432

@@ -483,8 +481,7 @@ func (m Message) marshalFull() ([]byte, error) {
483481
}
484482
buf.WriteString(`]}`)
485483

486-
ret := make([]byte, buf.Len())
487-
copy(ret, buf.Bytes())
484+
ret := bytes.Clone(buf.Bytes())
488485
return ret, nil
489486
}
490487

@@ -544,7 +541,6 @@ func Compact(msg *Message, options ...CompactOption) ([]byte, error) {
544541

545542
buf.WriteByte(tokens.Period)
546543
buf.WriteString(encoder.EncodeToString(s.signature))
547-
ret := make([]byte, buf.Len())
548-
copy(ret, buf.Bytes())
544+
ret := bytes.Clone(buf.Bytes())
549545
return ret, nil
550546
}

0 commit comments

Comments
 (0)