]> Sergey Matveev's repositories - btrtrc.git/commitdiff
bencode: Don't skip encoding nil pointers and interfaces
authorMatt Joiner <anacrolix@gmail.com>
Sun, 18 Oct 2015 14:28:36 +0000 (01:28 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 18 Oct 2015 14:28:36 +0000 (01:28 +1100)
This caused an annoying bug for complex types where dictionary values went missing.

bencode/encode.go
bencode/encode_test.go

index 0afe277f28edf24af7e176b9950d5d3f3b9a0335..de93736245bea44553fa36dd560062fd8532a4d5 100644 (file)
@@ -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()})
        }
index a6b2dfd835f2aa267e5e5f1eb5d34b38de7ef60c..b2a7e612c26b1911428b9ee792dca65ee9fb2f02 100644 (file)
@@ -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) {