Skip to content

Commit e46c129

Browse files
committed
all: use ZeroCopy on decoder
1 parent 0a1ab0b commit e46c129

File tree

4 files changed

+30
-9
lines changed

4 files changed

+30
-9
lines changed

conn.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package jsonrpc2
55

66
import (
7+
"bytes"
78
"context"
89
"fmt"
910
"sync"
@@ -141,7 +142,9 @@ func (c *conn) Call(ctx context.Context, method string, params, result interface
141142
return id, nil
142143
}
143144

144-
if err := json.Unmarshal(resp.result, result); err != nil {
145+
dec := json.NewDecoder(bytes.NewReader(resp.result))
146+
dec.ZeroCopy()
147+
if err := dec.Decode(result); err != nil {
145148
return id, fmt.Errorf("unmarshaling result: %w", err)
146149
}
147150

jsonrpc2_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package jsonrpc2_test
55

66
import (
7+
"bytes"
78
"context"
89
"fmt"
910
"io"
@@ -141,21 +142,27 @@ func testHandler() jsonrpc2.Handler {
141142

142143
case methodOneString:
143144
var v string
144-
if err := json.Unmarshal(req.Params(), &v); err != nil {
145+
dec := json.NewDecoder(bytes.NewReader(req.Params()))
146+
dec.ZeroCopy()
147+
if err := dec.Decode(&v); err != nil {
145148
return reply(ctx, nil, fmt.Errorf("%s: %w", jsonrpc2.ErrParse, err))
146149
}
147150
return reply(ctx, "got:"+v, nil)
148151

149152
case methodOneNumber:
150153
var v int
151-
if err := json.Unmarshal(req.Params(), &v); err != nil {
154+
dec := json.NewDecoder(bytes.NewReader(req.Params()))
155+
dec.ZeroCopy()
156+
if err := dec.Decode(&v); err != nil {
152157
return reply(ctx, nil, fmt.Errorf("%s: %w", jsonrpc2.ErrParse, err))
153158
}
154159
return reply(ctx, fmt.Sprintf("got:%d", v), nil)
155160

156161
case methodJoin:
157162
var v []string
158-
if err := json.Unmarshal(req.Params(), &v); err != nil {
163+
dec := json.NewDecoder(bytes.NewReader(req.Params()))
164+
dec.ZeroCopy()
165+
if err := dec.Decode(&v); err != nil {
159166
return reply(ctx, nil, fmt.Errorf("%s: %w", jsonrpc2.ErrParse, err))
160167
}
161168
return reply(ctx, path.Join(v...), nil)

message.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package jsonrpc2
55

66
import (
7+
"bytes"
78
"errors"
89
"fmt"
910

@@ -102,7 +103,9 @@ func (c Call) MarshalJSON() ([]byte, error) {
102103
// UnmarshalJSON implements json.Unmarshaler.
103104
func (c *Call) UnmarshalJSON(data []byte) error {
104105
var req wireRequest
105-
if err := json.Unmarshal(data, &req); err != nil {
106+
dec := json.NewDecoder(bytes.NewReader(data))
107+
dec.ZeroCopy()
108+
if err := dec.Decode(&req); err != nil {
106109
return fmt.Errorf("unmarshaling call: %w", err)
107110
}
108111

@@ -181,7 +184,9 @@ func (r Response) MarshalJSON() ([]byte, error) {
181184
// UnmarshalJSON implements json.Unmarshaler.
182185
func (r *Response) UnmarshalJSON(data []byte) error {
183186
var resp wireResponse
184-
if err := json.Unmarshal(data, &resp); err != nil {
187+
dec := json.NewDecoder(bytes.NewReader(data))
188+
dec.ZeroCopy()
189+
if err := dec.Decode(&resp); err != nil {
185190
return fmt.Errorf("unmarshaling jsonrpc response: %w", err)
186191
}
187192

@@ -276,7 +281,9 @@ func (n Notification) MarshalJSON() ([]byte, error) {
276281
// UnmarshalJSON implements json.Unmarshaler.
277282
func (n *Notification) UnmarshalJSON(data []byte) error {
278283
var req wireRequest
279-
if err := json.Unmarshal(data, &req); err != nil {
284+
dec := json.NewDecoder(bytes.NewReader(data))
285+
dec.ZeroCopy()
286+
if err := dec.Decode(&req); err != nil {
280287
return fmt.Errorf("unmarshaling notification: %w", err)
281288
}
282289

@@ -291,7 +298,9 @@ func (n *Notification) UnmarshalJSON(data []byte) error {
291298
// DecodeMessage decodes data to Message.
292299
func DecodeMessage(data []byte) (Message, error) {
293300
var msg combined
294-
if err := json.Unmarshal(data, &msg); err != nil {
301+
dec := json.NewDecoder(bytes.NewReader(data))
302+
dec.ZeroCopy()
303+
if err := dec.Decode(&msg); err != nil {
295304
return nil, fmt.Errorf("unmarshaling jsonrpc message: %w", err)
296305
}
297306

wire_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ func TestIDDecode(t *testing.T) {
8585
t.Parallel()
8686

8787
var got *jsonrpc2.ID
88-
if err := json.Unmarshal(tt.encoded, &got); err != nil {
88+
dec := json.NewDecoder(bytes.NewReader(tt.encoded))
89+
dec.ZeroCopy()
90+
if err := dec.Decode(&got); err != nil {
8991
t.Fatal(err)
9092
}
9193

0 commit comments

Comments
 (0)