Franck Pommereau

fixed side-effect in Go code

......@@ -350,7 +350,7 @@ func (self Marking) Geq (other Marking) bool {
//... a.Geq(b)
//=== false
func (self Marking) Iter (place string) (MsetIterator, *interface{}) {
func (self Marking) Iter (place string) (MsetIterator, interface{}) {
mset, found := (*self.data)[place]
if found {
return mset.Iter()
......@@ -359,7 +359,7 @@ func (self Marking) Iter (place string) (MsetIterator, *interface{}) {
}
}
func (self Marking) IterDup (place string) (MsetIterator, *interface{}) {
func (self Marking) IterDup (place string) (MsetIterator, interface{}) {
mset, found := (*self.data)[place]
if found {
return mset.IterDup()
......
......@@ -176,11 +176,11 @@ func (self Mset) Count (value interface{}) int {
type MsetIterator struct {
done bool
ask chan bool
rep chan *interface{}
rep chan interface{}
}
func (self MsetIterator) Next() *interface{} {
var rep *interface{}
func (self MsetIterator) Next() interface{} {
var rep interface{}
if self.done {
return nil
}
......@@ -209,7 +209,7 @@ func (self Mset) iterate (it MsetIterator, dup bool) {
return
}
if <- it.ask {
it.rep <- &key
it.rep <- key
} else {
return
}
......@@ -220,14 +220,14 @@ func (self Mset) iterate (it MsetIterator, dup bool) {
}
}
func (self Mset) Iter () (MsetIterator, *interface{}) {
it := MsetIterator{false, make(chan bool), make(chan *interface{})}
func (self Mset) Iter () (MsetIterator, interface{}) {
it := MsetIterator{false, make(chan bool), make(chan interface{})}
go self.iterate(it, false)
return it, it.Next()
}
func (self Mset) IterDup () (MsetIterator, *interface{}) {
it := MsetIterator{false, make(chan bool), make(chan *interface{})}
func (self Mset) IterDup () (MsetIterator, interface{}) {
it := MsetIterator{false, make(chan bool), make(chan interface{})}
go self.iterate(it, true)
return it, it.Next()
}
......
......@@ -147,7 +147,7 @@ class CodeGenerator (ast.CodeGenerator) :
self.fill("for %s, %s := %s.Iter(%s); %s != nil; %s = %s.Next() {"
% (ivar, pvar, node.marking, S(node.place.name), pvar, pvar, ivar))
with self.indent() :
self.fill("%s = (*%s).(%s)"
self.fill("%s = %s.(%s)"
% (node.variable, pvar, self.typedef[node.place.type]))
self.fill("if ")
self.visit(node.guard)
......@@ -168,7 +168,7 @@ class CodeGenerator (ast.CodeGenerator) :
self.fill("for %s, %s := %s.Iter(%s); %s != nil; %s = %s.Next() {"
% (ivar, pvar, node.marking, S(node.place.name), pvar, pvar, ivar))
with self.indent() :
self.fill("%s = (*%s).(%s)"
self.fill("%s = %s.(%s)"
% (node.variable, pvar, self.typedef[node.place.type]))
self.children_visit(node.body, True)
self.fill("}")
......@@ -190,7 +190,7 @@ class CodeGenerator (ast.CodeGenerator) :
self.fill("for %s, %s := %s.Iter(); %s != nil; %s = %s.Next() {"
% (ivar, pvar, node.variable, pvar, pvar, ivar))
with self.indent() :
self.fill("_, %s = (*%s).(%s)"
self.fill("_, %s = %s.(%s)"
% (bvar, pvar, self.typedef[node.place.type]))
self.fill("if ! %s { break }" % bvar)
self.fill("}")
......