Fix init of zero objects

This commit is contained in:
Marc Vertes
2018-11-28 17:27:46 +01:00
parent 3bd853988b
commit c8fa453ce4
6 changed files with 60 additions and 57 deletions

View File

@@ -16,7 +16,6 @@ var builtin = [...]BuiltinGenerator{
Addr: addr,
Assign: assign,
AssignX: assignX,
Assign0: assign0,
Add: add,
And: and,
Call: call,
@@ -135,25 +134,6 @@ func assign(n *Node) {
}
}
// assign0 implements assignement of zero value, as in a var statement
func assign0(n *Node) {
l := len(n.child) - 1
zero := n.typ.zero
s := n.child[:l]
next := getExec(n.tnext)
values := make([]func(*Frame) reflect.Value, l)
for i, c := range s {
values[i] = genValue(c)
}
n.exec = func(f *Frame) Builtin {
for _, v := range values {
v(f).Set(zero())
}
return next
}
}
func assignMap(n *Node) {
value := genValue(n.child[0].child[0]) // map
value0 := genValue(n.child[0].child[1]) // key
@@ -886,7 +866,7 @@ func arrayLit(n *Node) {
value := valueGenerator(n, n.findex)
next := getExec(n.tnext)
child := n.child[1:]
zero := n.typ.zero
a := n.typ.zero()
values := make([]func(*Frame) reflect.Value, len(child))
for i, c := range child {
convertLiteralValue(c, n.typ.val.TypeOf())
@@ -896,7 +876,6 @@ func arrayLit(n *Node) {
if n.typ.size > 0 {
// Fixed size array
n.exec = func(f *Frame) Builtin {
a := zero()
for i, v := range values {
a.Index(i).Set(v(f))
}
@@ -906,7 +885,6 @@ func arrayLit(n *Node) {
} else {
// Slice
n.exec = func(f *Frame) Builtin {
a := zero()
for _, v := range values {
a = reflect.Append(a, v(f))
}
@@ -945,6 +923,7 @@ func compositeLit(n *Node) {
value := valueGenerator(n, n.findex)
next := getExec(n.tnext)
child := n.child[1:]
a := n.typ.zero()
values := make([]func(*Frame) reflect.Value, len(child))
for i, c := range child {
convertLiteralValue(c, n.typ.field[i].typ.TypeOf())
@@ -952,7 +931,6 @@ func compositeLit(n *Node) {
}
n.exec = func(f *Frame) Builtin {
a := n.typ.zero()
for i, v := range values {
a.Field(i).Set(v(f))
}
@@ -967,13 +945,13 @@ func compositeSparse(n *Node) {
next := getExec(n.tnext)
child := n.child[1:]
values := make(map[int]func(*Frame) reflect.Value)
a := n.typ.zero()
for _, c := range child {
convertLiteralValue(c.child[1], n.typ.field[c.findex].typ.TypeOf())
values[c.findex] = genValue(c.child[1])
}
n.exec = func(f *Frame) Builtin {
a := n.typ.zero()
for i, v := range values {
a.Field(i).Set(v(f))
}