Skip to content

Commit 0125a4a

Browse files
authored
Merge pull request #234 from tendermint/develop
Release v0.13.0
2 parents faa6e73 + 4058e6a commit 0125a4a

23 files changed

+864
-247
lines changed

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,29 @@
11
# Changelog
22

3+
## 0.13.0 (October 15, 2018)
4+
5+
BREAKING CHANGE:
6+
- `time.Time`: validate seconds since 1970 are in valid range during encoding; i.e. in the interval [-62135596800, 253402300800)
7+
- `time.Time`: match encoding of time.Time to protobuf's well known type [Timestamp] ([#224])
8+
- Rename `MarshalBinary` to `MarshalBinaryLengthPrefixed` ([#222])
9+
10+
[Timestamp]: https://github.com/protocolbuffers/protobuf/blob/d2980062c859649523d5fd51d6b55ab310e47482/src/google/protobuf/timestamp.proto#L123-L135
11+
12+
IMPROVEMENTS:
13+
- Add `MustUnmarshalJSON` and `MustMarshalJSON` that panic if an error occurs ([#228])
14+
- Optimize performance by removing `defer`s in `getTypeInfo` ([#227] by @ValarDragon)
15+
- Optimize performance by removing unnecessary allocation in `UvarintSize` ([#225] by [@ValarDragon])
16+
- Add test that shows compatibility with stdlib (JSON time encoding) ([#131] by [@odeke-em])
17+
18+
[#224]: https://github.com/tendermint/go-amino/pull/224
19+
[#222]: https://github.com/tendermint/go-amino/pull/222
20+
[#228]: https://github.com/tendermint/go-amino/pull/228
21+
[#227]: https://github.com/tendermint/go-amino/pull/227
22+
[#225]: https://github.com/tendermint/go-amino/pull/225
23+
[#131]: https://github.com/tendermint/go-amino/pull/131
24+
[@ValarDragon]: https://github.com/ValarDragon
25+
[@odeke-em]: https://github.com/odeke-em
26+
327
## 0.12.0 (August 4, 2018)
428

529
BREAKING CHANGE:

amino.go

Lines changed: 49 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ func init() {
3232
}
3333
}
3434

35-
func MarshalBinary(o interface{}) ([]byte, error) {
36-
return gcdc.MarshalBinary(o)
35+
func MarshalBinaryLengthPrefixed(o interface{}) ([]byte, error) {
36+
return gcdc.MarshalBinaryLengthPrefixed(o)
3737
}
3838

39-
func MarshalBinaryWriter(w io.Writer, o interface{}) (n int64, err error) {
40-
return gcdc.MarshalBinaryWriter(w, o)
39+
func MarshalBinaryLengthPrefixedWriter(w io.Writer, o interface{}) (n int64, err error) {
40+
return gcdc.MarshalBinaryLengthPrefixedWriter(w, o)
4141
}
4242

43-
func MustMarshalBinary(o interface{}) []byte {
44-
return gcdc.MustMarshalBinary(o)
43+
func MustMarshalBinaryLengthPrefixed(o interface{}) []byte {
44+
return gcdc.MustMarshalBinaryLengthPrefixed(o)
4545
}
4646

4747
func MarshalBinaryBare(o interface{}) ([]byte, error) {
@@ -52,16 +52,16 @@ func MustMarshalBinaryBare(o interface{}) []byte {
5252
return gcdc.MustMarshalBinaryBare(o)
5353
}
5454

55-
func UnmarshalBinary(bz []byte, ptr interface{}) error {
56-
return gcdc.UnmarshalBinary(bz, ptr)
55+
func UnmarshalBinaryLengthPrefixed(bz []byte, ptr interface{}) error {
56+
return gcdc.UnmarshalBinaryLengthPrefixedBinary(bz, ptr)
5757
}
5858

59-
func UnmarshalBinaryReader(r io.Reader, ptr interface{}, maxSize int64) (n int64, err error) {
60-
return gcdc.UnmarshalBinaryReader(r, ptr, maxSize)
59+
func UnmarshalBinaryLengthPrefixedReader(r io.Reader, ptr interface{}, maxSize int64) (n int64, err error) {
60+
return gcdc.UnmarshalBinaryLengthPrefixedReader(r, ptr, maxSize)
6161
}
6262

63-
func MustUnmarshalBinary(bz []byte, ptr interface{}) {
64-
gcdc.MustUnmarshalBinary(bz, ptr)
63+
func MustUnmarshalBinaryLengthPrefixed(bz []byte, ptr interface{}) {
64+
gcdc.MustUnmarshalBinaryLengthPrefixed(bz, ptr)
6565
}
6666

6767
func UnmarshalBinaryBare(bz []byte, ptr interface{}) error {
@@ -127,14 +127,14 @@ func (typ Typ3) String() string {
127127
//----------------------------------------
128128
// *Codec methods
129129

130-
// MarshalBinary encodes the object o according to the Amino spec,
130+
// MarshalBinaryLengthPrefixed encodes the object o according to the Amino spec,
131131
// but prefixed by a uvarint encoding of the object to encode.
132132
// Use MarshalBinaryBare if you don't want byte-length prefixing.
133133
//
134-
// For consistency, MarshalBinary will first dereference pointers
135-
// before encoding. MarshalBinary will panic if o is a nil-pointer,
134+
// For consistency, MarshalBinaryLengthPrefixed will first dereference pointers
135+
// before encoding. MarshalBinaryLengthPrefixed will panic if o is a nil-pointer,
136136
// or if o is invalid.
137-
func (cdc *Codec) MarshalBinary(o interface{}) ([]byte, error) {
137+
func (cdc *Codec) MarshalBinaryLengthPrefixed(o interface{}) ([]byte, error) {
138138

139139
// Write the bytes here.
140140
var buf = new(bytes.Buffer)
@@ -160,11 +160,11 @@ func (cdc *Codec) MarshalBinary(o interface{}) ([]byte, error) {
160160
return buf.Bytes(), nil
161161
}
162162

163-
// MarshalBinaryWriter writes the bytes as would be returned from
164-
// MarshalBinary to the writer w.
165-
func (cdc *Codec) MarshalBinaryWriter(w io.Writer, o interface{}) (n int64, err error) {
163+
// MarshalBinaryLengthPrefixedWriter writes the bytes as would be returned from
164+
// MarshalBinaryLengthPrefixed to the writer w.
165+
func (cdc *Codec) MarshalBinaryLengthPrefixedWriter(w io.Writer, o interface{}) (n int64, err error) {
166166
var bz, _n = []byte(nil), int(0)
167-
bz, err = cdc.MarshalBinary(o)
167+
bz, err = cdc.MarshalBinaryLengthPrefixed(o)
168168
if err != nil {
169169
return 0, err
170170
}
@@ -174,8 +174,8 @@ func (cdc *Codec) MarshalBinaryWriter(w io.Writer, o interface{}) (n int64, err
174174
}
175175

176176
// Panics if error.
177-
func (cdc *Codec) MustMarshalBinary(o interface{}) []byte {
178-
bz, err := cdc.MarshalBinary(o)
177+
func (cdc *Codec) MustMarshalBinaryLengthPrefixed(o interface{}) []byte {
178+
bz, err := cdc.MarshalBinaryLengthPrefixed(o)
179179
if err != nil {
180180
panic(err)
181181
}
@@ -191,8 +191,8 @@ func (cdc *Codec) MarshalBinaryBare(o interface{}) ([]byte, error) {
191191
var rv, _, isNilPtr = derefPointers(reflect.ValueOf(o))
192192
if isNilPtr {
193193
// NOTE: You can still do so by calling
194-
// `.MarshalBinary(struct{ *SomeType })` or so on.
195-
panic("MarshalBinary cannot marshal a nil pointer directly. Try wrapping in a struct?")
194+
// `.MarshalBinaryLengthPrefixed(struct{ *SomeType })` or so on.
195+
panic("MarshalBinaryBare cannot marshal a nil pointer directly. Try wrapping in a struct?")
196196
}
197197

198198
// Encode Amino:binary bytes.
@@ -228,11 +228,11 @@ func (cdc *Codec) MustMarshalBinaryBare(o interface{}) []byte {
228228
}
229229

230230
// Like UnmarshalBinaryBare, but will first decode the byte-length prefix.
231-
// UnmarshalBinary will panic if ptr is a nil-pointer.
231+
// UnmarshalBinaryLengthPrefixedBinary will panic if ptr is a nil-pointer.
232232
// Returns an error if not all of bz is consumed.
233-
func (cdc *Codec) UnmarshalBinary(bz []byte, ptr interface{}) error {
233+
func (cdc *Codec) UnmarshalBinaryLengthPrefixedBinary(bz []byte, ptr interface{}) error {
234234
if len(bz) == 0 {
235-
return errors.New("UnmarshalBinary cannot decode empty bytes")
235+
return errors.New("UnmarshalBinaryLengthPrefixedBinary cannot decode empty bytes")
236236
}
237237

238238
// Read byte-length prefix.
@@ -241,10 +241,10 @@ func (cdc *Codec) UnmarshalBinary(bz []byte, ptr interface{}) error {
241241
return fmt.Errorf("Error reading msg byte-length prefix: got code %v", n)
242242
}
243243
if u64 > uint64(len(bz)-n) {
244-
return fmt.Errorf("Not enough bytes to read in UnmarshalBinary, want %v more bytes but only have %v",
244+
return fmt.Errorf("Not enough bytes to read in UnmarshalBinaryLengthPrefixedBinary, want %v more bytes but only have %v",
245245
u64, len(bz)-n)
246246
} else if u64 < uint64(len(bz)-n) {
247-
return fmt.Errorf("Bytes left over in UnmarshalBinary, should read %v more bytes but have %v",
247+
return fmt.Errorf("Bytes left over in UnmarshalBinaryLengthPrefixedBinary, should read %v more bytes but have %v",
248248
u64, len(bz)-n)
249249
}
250250
bz = bz[n:]
@@ -254,9 +254,9 @@ func (cdc *Codec) UnmarshalBinary(bz []byte, ptr interface{}) error {
254254
}
255255

256256
// Like UnmarshalBinaryBare, but will first read the byte-length prefix.
257-
// UnmarshalBinaryReader will panic if ptr is a nil-pointer.
257+
// UnmarshalBinaryLengthPrefixedReader will panic if ptr is a nil-pointer.
258258
// If maxSize is 0, there is no limit (not recommended).
259-
func (cdc *Codec) UnmarshalBinaryReader(r io.Reader, ptr interface{}, maxSize int64) (n int64, err error) {
259+
func (cdc *Codec) UnmarshalBinaryLengthPrefixedReader(r io.Reader, ptr interface{}, maxSize int64) (n int64, err error) {
260260
if maxSize < 0 {
261261
panic("maxSize cannot be negative.")
262262
}
@@ -310,8 +310,8 @@ func (cdc *Codec) UnmarshalBinaryReader(r io.Reader, ptr interface{}, maxSize in
310310
}
311311

312312
// Panics if error.
313-
func (cdc *Codec) MustUnmarshalBinary(bz []byte, ptr interface{}) {
314-
err := cdc.UnmarshalBinary(bz, ptr)
313+
func (cdc *Codec) MustUnmarshalBinaryLengthPrefixed(bz []byte, ptr interface{}) {
314+
err := cdc.UnmarshalBinaryLengthPrefixedBinary(bz, ptr)
315315
if err != nil {
316316
panic(err)
317317
}
@@ -399,6 +399,15 @@ func (cdc *Codec) MarshalJSON(o interface{}) ([]byte, error) {
399399
return w.Bytes(), nil
400400
}
401401

402+
// MustMarshalJSON panics if an error occurs. Besides tha behaves exactly like MarshalJSON.
403+
func (cdc *Codec) MustMarshalJSON(o interface{}) []byte {
404+
bz, err := cdc.MarshalJSON(o)
405+
if err != nil {
406+
panic(err)
407+
}
408+
return bz
409+
}
410+
402411
func (cdc *Codec) UnmarshalJSON(bz []byte, ptr interface{}) error {
403412
if len(bz) == 0 {
404413
return errors.New("UnmarshalJSON cannot decode empty bytes")
@@ -430,6 +439,13 @@ func (cdc *Codec) UnmarshalJSON(bz []byte, ptr interface{}) error {
430439
return cdc.decodeReflectJSON(bz, info, rv, FieldOptions{})
431440
}
432441

442+
// MustUnmarshalJSON panics if an error occurs. Besides tha behaves exactly like UnmarshalJSON.
443+
func (cdc *Codec) MustUnmarshalJSON(bz []byte, ptr interface{}) {
444+
if err := cdc.UnmarshalJSON(bz, ptr); err != nil {
445+
panic(err)
446+
}
447+
}
448+
433449
// MarshalJSONIndent calls json.Indent on the output of cdc.MarshalJSON
434450
// using the given prefix and indent string.
435451
func (cdc *Codec) MarshalJSONIndent(o interface{}, prefix, indent string) ([]byte, error) {

amino_test.go

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ func TestMarshalBinary(t *testing.T) {
2424
Time: time.Now().UTC().Truncate(time.Millisecond), // strip monotonic and timezone.
2525
}
2626

27-
b, err := cdc.MarshalBinary(s)
27+
b, err := cdc.MarshalBinaryLengthPrefixed(s)
2828
assert.Nil(t, err)
29-
t.Logf("MarshalBinary(s) -> %X", b)
29+
t.Logf("MarshalBinaryLengthPrefixed(s) -> %X", b)
3030

3131
var s2 SimpleStruct
32-
err = cdc.UnmarshalBinary(b, &s2)
32+
err = cdc.UnmarshalBinaryLengthPrefixedBinary(b, &s2)
3333
assert.Nil(t, err)
3434
assert.Equal(t, s, s2)
3535
}
@@ -49,12 +49,12 @@ func TestUnmarshalBinaryReader(t *testing.T) {
4949
Time: time.Now().UTC().Truncate(time.Millisecond), // strip monotonic and timezone.
5050
}
5151

52-
b, err := cdc.MarshalBinary(s)
52+
b, err := cdc.MarshalBinaryLengthPrefixed(s)
5353
assert.Nil(t, err)
54-
t.Logf("MarshalBinary(s) -> %X", b)
54+
t.Logf("MarshalBinaryLengthPrefixed(s) -> %X", b)
5555

5656
var s2 SimpleStruct
57-
_, err = cdc.UnmarshalBinaryReader(bytes.NewBuffer(b), &s2, 0)
57+
_, err = cdc.UnmarshalBinaryLengthPrefixedReader(bytes.NewBuffer(b), &s2, 0)
5858
assert.Nil(t, err)
5959

6060
assert.Equal(t, s, s2)
@@ -64,13 +64,13 @@ func TestUnmarshalBinaryReaderSize(t *testing.T) {
6464
var cdc = amino.NewCodec()
6565

6666
var s1 string = "foo"
67-
b, err := cdc.MarshalBinary(s1)
67+
b, err := cdc.MarshalBinaryLengthPrefixed(s1)
6868
assert.Nil(t, err)
69-
t.Logf("MarshalBinary(s) -> %X", b)
69+
t.Logf("MarshalBinaryLengthPrefixed(s) -> %X", b)
7070

7171
var s2 string
7272
var n int64
73-
n, err = cdc.UnmarshalBinaryReader(bytes.NewBuffer(b), &s2, 0)
73+
n, err = cdc.UnmarshalBinaryLengthPrefixedReader(bytes.NewBuffer(b), &s2, 0)
7474
assert.Nil(t, err)
7575
assert.Equal(t, s1, s2)
7676
frameLengthBytes, msgLengthBytes := 1, 1
@@ -81,15 +81,15 @@ func TestUnmarshalBinaryReaderSizeLimit(t *testing.T) {
8181
var cdc = amino.NewCodec()
8282

8383
var s1 string = "foo"
84-
b, err := cdc.MarshalBinary(s1)
84+
b, err := cdc.MarshalBinaryLengthPrefixed(s1)
8585
assert.Nil(t, err)
86-
t.Logf("MarshalBinary(s) -> %X", b)
86+
t.Logf("MarshalBinaryLengthPrefixed(s) -> %X", b)
8787

8888
var s2 string
8989
var n int64
90-
n, err = cdc.UnmarshalBinaryReader(bytes.NewBuffer(b), &s2, int64(len(b)-1))
90+
n, err = cdc.UnmarshalBinaryLengthPrefixedReader(bytes.NewBuffer(b), &s2, int64(len(b)-1))
9191
assert.NotNil(t, err, "insufficient limit should lead to failure")
92-
n, err = cdc.UnmarshalBinaryReader(bytes.NewBuffer(b), &s2, int64(len(b)))
92+
n, err = cdc.UnmarshalBinaryLengthPrefixedReader(bytes.NewBuffer(b), &s2, int64(len(b)))
9393
assert.Nil(t, err, "sufficient limit should not cause failure")
9494
assert.Equal(t, s1, s2)
9595
frameLengthBytes, msgLengthBytes := 1, 1
@@ -111,12 +111,12 @@ func TestUnmarshalBinaryReaderTooLong(t *testing.T) {
111111
Time: time.Now().UTC().Truncate(time.Millisecond), // strip monotonic and timezone.
112112
}
113113

114-
b, err := cdc.MarshalBinary(s)
114+
b, err := cdc.MarshalBinaryLengthPrefixed(s)
115115
assert.Nil(t, err)
116-
t.Logf("MarshalBinary(s) -> %X", b)
116+
t.Logf("MarshalBinaryLengthPrefixed(s) -> %X", b)
117117

118118
var s2 SimpleStruct
119-
_, err = cdc.UnmarshalBinaryReader(bytes.NewBuffer(b), &s2, 1) // 1 byte limit is ridiculous.
119+
_, err = cdc.UnmarshalBinaryLengthPrefixedReader(bytes.NewBuffer(b), &s2, 1) // 1 byte limit is ridiculous.
120120
assert.NotNil(t, err)
121121
}
122122

@@ -126,26 +126,26 @@ func TestUnmarshalBinaryBufferedWritesReads(t *testing.T) {
126126

127127
// Write 3 times.
128128
var s1 string = "foo"
129-
_, err := cdc.MarshalBinaryWriter(buf, s1)
129+
_, err := cdc.MarshalBinaryLengthPrefixedWriter(buf, s1)
130130
assert.Nil(t, err)
131-
_, err = cdc.MarshalBinaryWriter(buf, s1)
131+
_, err = cdc.MarshalBinaryLengthPrefixedWriter(buf, s1)
132132
assert.Nil(t, err)
133-
_, err = cdc.MarshalBinaryWriter(buf, s1)
133+
_, err = cdc.MarshalBinaryLengthPrefixedWriter(buf, s1)
134134
assert.Nil(t, err)
135135

136136
// Read 3 times.
137137
var s2 string
138-
_, err = cdc.UnmarshalBinaryReader(buf, &s2, 0)
138+
_, err = cdc.UnmarshalBinaryLengthPrefixedReader(buf, &s2, 0)
139139
assert.Nil(t, err)
140140
assert.Equal(t, s1, s2)
141-
_, err = cdc.UnmarshalBinaryReader(buf, &s2, 0)
141+
_, err = cdc.UnmarshalBinaryLengthPrefixedReader(buf, &s2, 0)
142142
assert.Nil(t, err)
143143
assert.Equal(t, s1, s2)
144-
_, err = cdc.UnmarshalBinaryReader(buf, &s2, 0)
144+
_, err = cdc.UnmarshalBinaryLengthPrefixedReader(buf, &s2, 0)
145145
assert.Nil(t, err)
146146
assert.Equal(t, s1, s2)
147147

148148
// Reading 4th time fails.
149-
_, err = cdc.UnmarshalBinaryReader(buf, &s2, 0)
149+
_, err = cdc.UnmarshalBinaryLengthPrefixedReader(buf, &s2, 0)
150150
assert.NotNil(t, err)
151151
}

binary-decode.go

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"reflect"
77
"time"
88

9-
"encoding/binary"
109
"github.com/davecgh/go-spew/spew"
1110
)
1211

@@ -838,33 +837,6 @@ func consumeAny(typ3 Typ3, bz []byte) (n int, err error) {
838837
return
839838
}
840839

841-
func consumeStruct(bz []byte) (n int, err error) {
842-
var _n, typ = int(0), Typ3(0x00)
843-
for {
844-
typ, _n, err = consumeFieldKey(bz)
845-
if slide(&bz, &n, _n) && err != nil {
846-
return
847-
}
848-
_n, err = consumeAny(typ, bz)
849-
if slide(&bz, &n, _n) && err != nil {
850-
return
851-
}
852-
}
853-
return
854-
}
855-
856-
func consumeFieldKey(bz []byte) (typ Typ3, n int, err error) {
857-
var u64 uint64
858-
u64, n = binary.Uvarint(bz)
859-
if n < 0 {
860-
n = 0
861-
err = errors.New("error decoding uvarint")
862-
return
863-
}
864-
typ = Typ3(u64 & 0x07)
865-
return
866-
}
867-
868840
//----------------------------------------
869841

870842
func DecodeDisambPrefixBytes(bz []byte) (db DisambBytes, hasDb bool, pb PrefixBytes, hasPb bool, n int, err error) {

0 commit comments

Comments
 (0)