Browse Source

codec: defer call with closure giving weird errors - revert

Ugorji Nwoke 7 years ago
parent
commit
52c929c5b8
2 changed files with 6 additions and 2 deletions
  1. 3 1
      codec/decode.go
  2. 3 1
      codec/encode.go

+ 3 - 1
codec/decode.go

@@ -2402,7 +2402,9 @@ func (d *Decoder) naked() *decNaked {
 // Note: we allow nil values in the stream anywhere except for map keys.
 // Note: we allow nil values in the stream anywhere except for map keys.
 // A nil value in the encoded stream where a map key is expected is treated as an error.
 // A nil value in the encoded stream where a map key is expected is treated as an error.
 func (d *Decoder) Decode(v interface{}) (err error) {
 func (d *Decoder) Decode(v interface{}) (err error) {
-	defer func() { d.deferred(&err) }() // put in closure, as runtime optimizes defer with no params
+	defer d.deferred(&err)
+	// defer func() { d.deferred(&err) }() // use closure, as runtime optimizes defer with no params
+	// { x := d; y := &err; defer func() { x.deferred(y) }() } // https://github.com/golang/go/issues/14939#issuecomment-417836139
 	d.MustDecode(v)
 	d.MustDecode(v)
 	return
 	return
 }
 }

+ 3 - 1
codec/encode.go

@@ -1224,7 +1224,9 @@ func (e *Encoder) ResetBytes(out *[]byte) {
 // Some formats support symbols (e.g. binc) and will properly encode the string
 // Some formats support symbols (e.g. binc) and will properly encode the string
 // only once in the stream, and use a tag to refer to it thereafter.
 // only once in the stream, and use a tag to refer to it thereafter.
 func (e *Encoder) Encode(v interface{}) (err error) {
 func (e *Encoder) Encode(v interface{}) (err error) {
-	defer func() { e.deferred(&err) }() // put in closure, as runtime optimizes defer with no params
+	defer e.deferred(&err)
+	// defer func() { e.deferred(&err) }() } // use closure, as runtime optimizes defer with no params
+	// { x := e; y := &err; defer func() { x.deferred(y) }() } // https://github.com/golang/go/issues/14939#issuecomment-417836139
 	e.MustEncode(v)
 	e.MustEncode(v)
 	return
 	return
 }
 }