Commit c36fbdf7 authored by Robert Griesemer's avatar Robert Griesemer

- fix for multiple fields at same depth error

R=rsc
DELTA=9  (5 added, 0 deleted, 4 changed)
OCL=33768
CL=33785
parent 89f69bb3
...@@ -522,6 +522,7 @@ func (t *StructType) fieldByName(name string, mark map[*StructType]bool, depth i ...@@ -522,6 +522,7 @@ func (t *StructType) fieldByName(name string, mark map[*StructType]bool, depth i
mark[t] = true; mark[t] = true;
var fi int; // field index var fi int; // field index
n := 0; // number of matching fields at depth fd
L: for i, _ := range t.fields { L: for i, _ := range t.fields {
f := t.Field(i); f := t.Field(i);
d := inf; d := inf;
...@@ -538,7 +539,7 @@ L: for i, _ := range t.fields { ...@@ -538,7 +539,7 @@ L: for i, _ := range t.fields {
case ft.Name() == name: case ft.Name() == name:
// Matching anonymous top-level field. // Matching anonymous top-level field.
d = depth; d = depth;
case fd > 0: case fd > depth:
// No top-level field yet; look inside nested structs. // No top-level field yet; look inside nested structs.
if st, ok := ft.(*StructType); ok { if st, ok := ft.(*StructType); ok {
f, d = st.fieldByName(name, mark, depth+1); f, d = st.fieldByName(name, mark, depth+1);
...@@ -550,10 +551,11 @@ L: for i, _ := range t.fields { ...@@ -550,10 +551,11 @@ L: for i, _ := range t.fields {
case d < fd: case d < fd:
// Found field at shallower depth. // Found field at shallower depth.
ff, fi, fd = f, i, d; ff, fi, fd = f, i, d;
n = 1;
case d == fd: case d == fd:
// More than one matching field at the same depth (or d, fd == inf). // More than one matching field at the same depth (or d, fd == inf).
// Same as no field found. // Same as no field found at this depth.
fd = inf; n++;
if d == depth { if d == depth {
// Impossible to find a field at lower depth. // Impossible to find a field at lower depth.
break L; break L;
...@@ -561,12 +563,15 @@ L: for i, _ := range t.fields { ...@@ -561,12 +563,15 @@ L: for i, _ := range t.fields {
} }
} }
if fd < inf { if n == 1 {
// Found matching field. // Found matching field.
if len(ff.Index) <= depth { if len(ff.Index) <= depth {
ff.Index = make([]int, depth+1); ff.Index = make([]int, depth+1);
} }
ff.Index[depth] = fi; ff.Index[depth] = fi;
} else {
// None or more than one matching field found.
fd = inf;
} }
mark[t] = false, false; mark[t] = false, false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment