@@ -423,6 +423,13 @@ func (enc *Encoder) eMap(key Key, rv reflect.Value, inline bool) {
423
423
424
424
const is32Bit = (32 << (^ uint (0 ) >> 63 )) == 32
425
425
426
+ func pointerTo (t reflect.Type ) reflect.Type {
427
+ if t .Kind () == reflect .Ptr {
428
+ return pointerTo (t .Elem ())
429
+ }
430
+ return t
431
+ }
432
+
426
433
func (enc * Encoder ) eStruct (key Key , rv reflect.Value , inline bool ) {
427
434
// Write keys for fields directly under this key first, because if we write
428
435
// a field that creates a new table then all keys under it will be in that
@@ -435,18 +442,11 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) {
435
442
rt = rv .Type ()
436
443
fieldsDirect , fieldsSub [][]int
437
444
addFields func (rt reflect.Type , rv reflect.Value , start []int )
438
- ptrto func (t reflect.Type ) reflect.Type
439
445
)
440
- ptrto = func (t reflect.Type ) reflect.Type {
441
- if t .Kind () == reflect .Ptr {
442
- return ptrto (t .Elem ())
443
- }
444
- return t
445
- }
446
446
addFields = func (rt reflect.Type , rv reflect.Value , start []int ) {
447
447
for i := 0 ; i < rt .NumField (); i ++ {
448
448
f := rt .Field (i )
449
- isEmbed := f .Anonymous && ptrto (f .Type ).Kind () == reflect .Struct
449
+ isEmbed := f .Anonymous && pointerTo (f .Type ).Kind () == reflect .Struct
450
450
if f .PkgPath != "" && ! isEmbed { /// Skip unexported fields.
451
451
continue
452
452
}
@@ -586,8 +586,7 @@ func tomlTypeOfGo(rv reflect.Value) tomlType {
586
586
}
587
587
588
588
func isMarshaler (rv reflect.Value ) bool {
589
- return rv .Type ().Implements (marshalText ) ||
590
- rv .Type ().Implements (marshalToml )
589
+ return rv .Type ().Implements (marshalText ) || rv .Type ().Implements (marshalToml )
591
590
}
592
591
593
592
// isTableArray reports if all entries in the array or slice are a table.
@@ -706,12 +705,13 @@ func encPanic(err error) {
706
705
panic (tomlEncodeError {err })
707
706
}
708
707
708
+ // Resolve any level of pointers to the actual value (e.g. **string → string).
709
709
func eindirect (v reflect.Value ) reflect.Value {
710
710
if v .Kind () != reflect .Ptr && v .Kind () != reflect .Interface {
711
711
if isMarshaler (v ) {
712
712
return v
713
713
}
714
- if v .CanAddr () {
714
+ if v .CanAddr () { /// Special case for marshalers; see #358.
715
715
if pv := v .Addr (); isMarshaler (pv ) {
716
716
return pv
717
717
}
0 commit comments