From 047cdbae0d95dbef453c17aec7d48d6ef7b79cc9 Mon Sep 17 00:00:00 2001
From: Matt Joiner <anacrolix@gmail.com>
Date: Mon, 24 May 2021 17:31:52 +1000
Subject: [PATCH] bencode: Improve support for embedded structs

---
 bencode/decode.go | 11 ++++++++---
 bencode/encode.go | 16 ++++++++++++----
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/bencode/decode.go b/bencode/decode.go
index e891f5be..43bb9ce6 100644
--- a/bencode/decode.go
+++ b/bencode/decode.go
@@ -253,14 +253,19 @@ func parseStructFields(struct_ reflect.Type, each func(key string, df dictField)
 		i := _i
 		f := struct_.Field(i)
 		if f.Anonymous {
-			parseStructFields(f.Type.Elem(), func(key string, df dictField) {
+			t := f.Type
+			if t.Kind() == reflect.Ptr {
+				t = t.Elem()
+			}
+			parseStructFields(t, func(key string, df dictField) {
 				innerGet := df.Get
 				df.Get = func(value reflect.Value) func(reflect.Value) {
 					anonPtr := value.Field(i)
-					if anonPtr.IsNil() {
+					if anonPtr.Kind() == reflect.Ptr && anonPtr.IsNil() {
 						anonPtr.Set(reflect.New(f.Type.Elem()))
+						anonPtr = anonPtr.Elem()
 					}
-					return innerGet(anonPtr.Elem())
+					return innerGet(anonPtr)
 				}
 				each(key, df)
 			})
diff --git a/bencode/encode.go b/bencode/encode.go
index f25cfef8..05153a8c 100644
--- a/bencode/encode.go
+++ b/bencode/encode.go
@@ -231,16 +231,24 @@ func makeEncodeFields(t reflect.Type) (fs []encodeField) {
 			continue
 		}
 		if f.Anonymous {
-			anonEFs := makeEncodeFields(f.Type.Elem())
+			t := f.Type
+			if t.Kind() == reflect.Ptr {
+				t = t.Elem()
+			}
+			anonEFs := makeEncodeFields(t)
 			for aefi := range anonEFs {
 				anonEF := anonEFs[aefi]
 				bottomField := anonEF
 				bottomField.i = func(v reflect.Value) reflect.Value {
 					v = v.Field(i)
-					if v.IsNil() {
-						return reflect.Value{}
+					if v.Kind() == reflect.Ptr {
+						if v.IsNil() {
+							// This will skip serializing this value.
+							return reflect.Value{}
+						}
+						v = v.Elem()
 					}
-					return anonEF.i(v.Elem())
+					return anonEF.i(v)
 				}
 				fs = append(fs, bottomField)
 			}
-- 
2.51.0