aboutsummaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2013-10-01 03:12:15 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2013-10-01 03:12:15 +0000
commit2cb01a397200b182e28f9d91dfde104e3a3895d1 (patch)
tree4447732d9d4c8bb77dbef74ce06fa4020dfe93e8 /libgo
parent62fecdd3409a01f0c776bb72d98fd5ef1385d27c (diff)
downloadgcc-2cb01a397200b182e28f9d91dfde104e3a3895d1.zip
gcc-2cb01a397200b182e28f9d91dfde104e3a3895d1.tar.gz
gcc-2cb01a397200b182e28f9d91dfde104e3a3895d1.tar.bz2
reflect: Fix reflect.Call with function following non-pointer.
From-SVN: r203052
Diffstat (limited to 'libgo')
-rw-r--r--libgo/go/reflect/all_test.go9
-rw-r--r--libgo/go/reflect/value.go6
2 files changed, 13 insertions, 2 deletions
diff --git a/libgo/go/reflect/all_test.go b/libgo/go/reflect/all_test.go
index 1fed585..140a068 100644
--- a/libgo/go/reflect/all_test.go
+++ b/libgo/go/reflect/all_test.go
@@ -2406,6 +2406,15 @@ func TestVariadic(t *testing.T) {
}
}
+func TestFuncArg(t *testing.T) {
+ f1 := func(i int, f func(int) int) int { return f(i) }
+ f2 := func(i int) int { return i + 1 }
+ r := ValueOf(f1).Call([]Value{ValueOf(100), ValueOf(f2)})
+ if r[0].Int() != 101 {
+ t.Errorf("function returned %d, want 101", r[0].Int())
+ }
+}
+
var tagGetTests = []struct {
Tag StructTag
Key string
diff --git a/libgo/go/reflect/value.go b/libgo/go/reflect/value.go
index 9901ed6..b199f70 100644
--- a/libgo/go/reflect/value.go
+++ b/libgo/go/reflect/value.go
@@ -433,7 +433,7 @@ func (v Value) call(op string, in []Value) []Value {
if v.flag&flagMethod != 0 {
nin++
}
- firstPointer := len(in) > 0 && Kind(t.In(0).(*rtype).kind) != Ptr && v.flag&flagMethod == 0 && isMethod(v.typ)
+ firstPointer := len(in) > 0 && t.In(0).Kind() != Ptr && v.flag&flagMethod == 0 && isMethod(v.typ)
params := make([]unsafe.Pointer, nin)
off := 0
if v.flag&flagMethod != 0 {
@@ -497,8 +497,10 @@ func isMethod(t *rtype) bool {
sawRet := false
for i, c := range s {
if c == '(' {
+ if parens == 0 {
+ params++
+ }
parens++
- params++
} else if c == ')' {
parens--
} else if parens == 0 && c == ' ' && s[i+1] != '(' && !sawRet {