From: Matt Joiner Date: Sun, 18 Oct 2015 14:28:36 +0000 (+1100) Subject: bencode: Don't skip encoding nil pointers and interfaces X-Git-Tag: v1.0.0~1013 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=4b539b1f117ed1e96ca8f7c5d765fbfd0fc61d7a;p=btrtrc.git bencode: Don't skip encoding nil pointers and interfaces This caused an annoying bug for complex types where dictionary values went missing. --- diff --git a/bencode/encode.go b/bencode/encode.go index 0afe277f..de937362 100644 --- a/bencode/encode.go +++ b/bencode/encode.go @@ -179,9 +179,11 @@ func (e *encoder) reflect_value(v reflect.Value) { e.write_string("e") case reflect.Interface, reflect.Ptr: if v.IsNil() { - break + v = reflect.Zero(v.Type().Elem()) + } else { + v = v.Elem() } - e.reflect_value(v.Elem()) + e.reflect_value(v) default: panic(&MarshalTypeError{v.Type()}) } diff --git a/bencode/encode_test.go b/bencode/encode_test.go index a6b2dfd8..b2a7e612 100644 --- a/bencode/encode_test.go +++ b/bencode/encode_test.go @@ -56,6 +56,18 @@ var random_encode_tests = []random_encode_test{ {[]int{}, "le"}, {map[string]int{}, "de"}, {&dummy{1, 2, 3}, "i2ei3ei4e"}, + {struct { + A *string + }{nil}, "d1:A0:e"}, + {struct { + A *string + }{new(string)}, "d1:A0:e"}, + {struct { + A *string `bencode:",omitempty"` + }{nil}, "de"}, + {struct { + A *string `bencode:",omitempty"` + }{new(string)}, "d1:A0:e"}, } func TestRandomEncode(t *testing.T) {