mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-16 08:43:48 +08:00
reflect: Fix calling Interface method on value created by MakeFunc.
From-SVN: r203212
This commit is contained in:
parent
c6d2bfbb44
commit
8a2cb59f1c
@ -1454,6 +1454,30 @@ func TestMakeFunc(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestMakeFuncInterface(t *testing.T) {
|
||||
switch runtime.GOARCH {
|
||||
case "amd64", "386":
|
||||
default:
|
||||
t.Skip("MakeFunc not implemented for " + runtime.GOARCH)
|
||||
}
|
||||
|
||||
fn := func(i int) int { return i }
|
||||
incr := func(in []Value) []Value {
|
||||
return []Value{ValueOf(int(in[0].Int() + 1))}
|
||||
}
|
||||
fv := MakeFunc(TypeOf(fn), incr)
|
||||
ValueOf(&fn).Elem().Set(fv)
|
||||
if r := fn(2); r != 3 {
|
||||
t.Errorf("Call returned %d, want 3", r)
|
||||
}
|
||||
if r := fv.Call([]Value{ValueOf(14)})[0].Int(); r != 15 {
|
||||
t.Errorf("Call returned %d, want 15", r)
|
||||
}
|
||||
if r := fv.Interface().(func(int) int)(26); r != 27 {
|
||||
t.Errorf("Call returned %d, want 27", r)
|
||||
}
|
||||
}
|
||||
|
||||
type Point struct {
|
||||
x, y int
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value {
|
||||
|
||||
impl := &makeFuncImpl{code: code, typ: ftyp, fn: fn}
|
||||
|
||||
return Value{t, unsafe.Pointer(impl), flag(Func) << flagKindShift}
|
||||
return Value{t, unsafe.Pointer(&impl), flag(Func<<flagKindShift) | flagIndir}
|
||||
}
|
||||
|
||||
// makeFuncStub is an assembly function that is the code half of
|
||||
|
Loading…
Reference in New Issue
Block a user