Merge pull request #4 from colincross/bugfixes

Bugfixes
This commit is contained in:
jgennis 2015-03-11 16:43:58 -07:00
commit 50fb09375a
3 changed files with 39 additions and 26 deletions

View file

@ -1024,6 +1024,30 @@ func (c *Context) updateDependencies() (errs []error) {
var check func(group *moduleGroup) []*moduleGroup var check func(group *moduleGroup) []*moduleGroup
cycleError := func(cycle []*moduleGroup) {
// We are the "start" of the cycle, so we're responsible
// for generating the errors. The cycle list is in
// reverse order because all the 'check' calls append
// their own module to the list.
errs = append(errs, &Error{
Err: fmt.Errorf("encountered dependency cycle:"),
Pos: cycle[len(cycle)-1].pos,
})
// Iterate backwards through the cycle list.
curGroup := cycle[len(cycle)-1]
for i := len(cycle) - 1; i >= 0; i-- {
nextGroup := cycle[i]
errs = append(errs, &Error{
Err: fmt.Errorf(" %q depends on %q",
curGroup.properties.Name,
nextGroup.properties.Name),
Pos: curGroup.propertyPos["deps"],
})
curGroup = nextGroup
}
}
check = func(group *moduleGroup) []*moduleGroup { check = func(group *moduleGroup) []*moduleGroup {
visited[group] = true visited[group] = true
checking[group] = true checking[group] = true
@ -1053,23 +1077,7 @@ func (c *Context) updateDependencies() (errs []error) {
// for generating the errors. The cycle list is in // for generating the errors. The cycle list is in
// reverse order because all the 'check' calls append // reverse order because all the 'check' calls append
// their own module to the list. // their own module to the list.
errs = append(errs, &Error{ cycleError(cycle)
Err: fmt.Errorf("encountered dependency cycle:"),
Pos: group.pos,
})
// Iterate backwards through the cycle list.
curGroup := group
for i := len(cycle) - 1; i >= 0; i-- {
nextGroup := cycle[i]
errs = append(errs, &Error{
Err: fmt.Errorf(" %q depends on %q",
curGroup.properties.Name,
nextGroup.properties.Name),
Pos: curGroup.propertyPos["deps"],
})
curGroup = nextGroup
}
// We can continue processing this module's children to // We can continue processing this module's children to
// find more cycles. Since all the modules that were // find more cycles. Since all the modules that were
@ -1095,7 +1103,10 @@ func (c *Context) updateDependencies() (errs []error) {
if !visited[group] { if !visited[group] {
cycle := check(group) cycle := check(group)
if cycle != nil { if cycle != nil {
panic("inconceivable!") if cycle[len(cycle)-1] != group {
panic("inconceivable!")
}
cycleError(cycle)
} }
} }
} }

View file

@ -321,11 +321,11 @@ func evaluateOperator(value1, value2 Value, operator rune, pos scanner.Position)
func addMaps(map1, map2 []*Property, pos scanner.Position) ([]*Property, error) { func addMaps(map1, map2 []*Property, pos scanner.Position) ([]*Property, error) {
ret := make([]*Property, 0, len(map1)) ret := make([]*Property, 0, len(map1))
inMap1 := make(map[string]*Property) inMap1 := make(map[string]*Property)
inMap2 := make(map[string]*Property) inMap2 := make(map[string]*Property)
inBoth := make(map[string]*Property) inBoth := make(map[string]*Property)
for _, prop1 := range map1 { for _, prop1 := range map1 {
inMap1[prop1.Name.Name] = prop1 inMap1[prop1.Name.Name] = prop1
} }
@ -336,7 +336,7 @@ func addMaps(map1, map2 []*Property, pos scanner.Position) ([]*Property, error)
inBoth[prop2.Name.Name] = prop2 inBoth[prop2.Name.Name] = prop2
} }
} }
for _, prop1 := range map1 { for _, prop1 := range map1 {
if prop2, ok := inBoth[prop1.Name.Name]; ok { if prop2, ok := inBoth[prop1.Name.Name]; ok {
var err error var err error
@ -356,7 +356,7 @@ func addMaps(map1, map2 []*Property, pos scanner.Position) ([]*Property, error)
ret = append(ret, prop2) ret = append(ret, prop2)
} }
} }
return ret, nil return ret, nil
} }

View file

@ -64,10 +64,12 @@ func CopyProperties(dstValue, srcValue reflect.Value) {
panic(fmt.Errorf("can't copy field %q: slice elements are "+ panic(fmt.Errorf("can't copy field %q: slice elements are "+
"not strings", field.Name)) "not strings", field.Name))
} }
newSlice := reflect.MakeSlice(field.Type, srcFieldValue.Len(), if srcFieldValue != dstFieldValue {
srcFieldValue.Len()) newSlice := reflect.MakeSlice(field.Type, srcFieldValue.Len(),
dstFieldValue.Set(newSlice) srcFieldValue.Len())
reflect.Copy(dstFieldValue, srcFieldValue) reflect.Copy(newSlice, srcFieldValue)
dstFieldValue.Set(newSlice)
}
} else { } else {
dstFieldValue.Set(srcFieldValue) dstFieldValue.Set(srcFieldValue)
} }