fix: handle call ellipsis
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user