From c36fbdf713a1ed29d0dbe4546be52050c3db1fd3 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 24 Aug 2009 15:45:51 -0700 Subject: [PATCH] - fix for multiple fields at same depth error R=rsc DELTA=9 (5 added, 0 deleted, 4 changed) OCL=33768 CL=33785 --- src/pkg/reflect/type.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/pkg/reflect/type.go b/src/pkg/reflect/type.go index 4b9ada0390..27c28394c5 100644 --- a/src/pkg/reflect/type.go +++ b/src/pkg/reflect/type.go @@ -522,6 +522,7 @@ func (t *StructType) fieldByName(name string, mark map[*StructType]bool, depth i mark[t] = true; var fi int; // field index + n := 0; // number of matching fields at depth fd L: for i, _ := range t.fields { f := t.Field(i); d := inf; @@ -538,7 +539,7 @@ L: for i, _ := range t.fields { case ft.Name() == name: // Matching anonymous top-level field. d = depth; - case fd > 0: + case fd > depth: // No top-level field yet; look inside nested structs. if st, ok := ft.(*StructType); ok { f, d = st.fieldByName(name, mark, depth+1); @@ -550,10 +551,11 @@ L: for i, _ := range t.fields { case d < fd: // Found field at shallower depth. ff, fi, fd = f, i, d; + n = 1; case d == fd: // More than one matching field at the same depth (or d, fd == inf). - // Same as no field found. - fd = inf; + // Same as no field found at this depth. + n++; if d == depth { // Impossible to find a field at lower depth. break L; @@ -561,12 +563,15 @@ L: for i, _ := range t.fields { } } - if fd < inf { + if n == 1 { // Found matching field. if len(ff.Index) <= depth { ff.Index = make([]int, depth+1); } ff.Index[depth] = fi; + } else { + // None or more than one matching field found. + fd = inf; } mark[t] = false, false; -- 2.48.1