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
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;
......
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