fix: handle call ellipsis

This commit is contained in:
Nicholas Wiersma
2020-06-03 16:42:04 +02:00
committed by GitHub
parent 2de0c80d38
commit eb25c84797
5 changed files with 70 additions and 12 deletions

View File

@@ -26,6 +26,7 @@ var builtin = [...]bltnGenerator{
aAndNotAssign: andNotAssign,
aBitNot: bitNot,
aCall: call,
aCallSlice: call,
aCase: _case,
aCompositeLit: arrayLit,
aDec: dec,
@@ -884,6 +885,12 @@ func callBin(n *node) {
}
}
// Determine if we should use `Call` or `CallSlice` on the function Value.
callFn := func(v reflect.Value, in []reflect.Value) []reflect.Value { return v.Call(in) }
if n.action == aCallSlice {
callFn = func(v reflect.Value, in []reflect.Value) []reflect.Value { return v.CallSlice(in) }
}
for i, c := range child {
defType := funcType.In(pindex(i, variadic))
switch {
@@ -919,6 +926,13 @@ func callBin(n *node) {
values = append(values, genFunctionWrapper(c))
case interfaceT:
values = append(values, genValueInterfaceValue(c))
case arrayT:
switch c.typ.val.cat {
case interfaceT:
values = append(values, genValueInterfaceArray(c))
default:
values = append(values, genInterfaceWrapper(c, defType))
}
default:
values = append(values, genInterfaceWrapper(c, defType))
}
@@ -945,7 +959,7 @@ func callBin(n *node) {
for i, v := range values {
in[i] = v(f)
}
go value(f).Call(in)
go callFn(value(f), in)
return tnext
}
case fnext != nil:
@@ -956,7 +970,7 @@ func callBin(n *node) {
for i, v := range values {
in[i] = v(f)
}
res := value(f).Call(in)
res := callFn(value(f), in)
b := res[0].Bool()
f.data[index].SetBool(b)
if b {
@@ -981,7 +995,7 @@ func callBin(n *node) {
for i, v := range values {
in[i] = v(f)
}
out := value(f).Call(in)
out := callFn(value(f), in)
for i, v := range rvalues {
if v != nil {
v(f).Set(out[i])
@@ -998,7 +1012,7 @@ func callBin(n *node) {
for i, v := range values {
in[i] = v(f)
}
out := value(f).Call(in)
out := callFn(value(f), in)
for i, v := range out {
f.data[b+i].Set(v)
}
@@ -1010,7 +1024,7 @@ func callBin(n *node) {
for i, v := range values {
in[i] = v(f)
}
out := value(f).Call(in)
out := callFn(value(f), in)
copy(f.data[n.findex:], out)
return tnext
}
@@ -1019,7 +1033,7 @@ func callBin(n *node) {
}
func getIndexBinMethod(n *node) {
//dest := genValue(n)
// dest := genValue(n)
i := n.findex
m := n.val.(int)
value := genValue(n.child[0])
@@ -1027,7 +1041,7 @@ func getIndexBinMethod(n *node) {
n.exec = func(f *frame) bltn {
// Can not use .Set() because dest type contains the receiver and source not
//dest(f).Set(value(f).Method(m))
// dest(f).Set(value(f).Method(m))
f.data[i] = value(f).Method(m)
return next
}
@@ -1623,7 +1637,7 @@ func _return(n *node) {
case 0:
n.exec = nil
case 1:
if child[0].kind == binaryExpr || child[0].action == aCall {
if child[0].kind == binaryExpr || isCall(child[0]) {
n.exec = nil
} else {
v := values[0]