internal/lib/reflect: toFFIArg check interface
This commit is contained in:
@@ -2033,17 +2033,19 @@ type closure struct {
|
|||||||
env unsafe.Pointer
|
env unsafe.Pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
func toFFIArg(v Value) unsafe.Pointer {
|
func toFFIArg(v Value, typ *abi.Type) unsafe.Pointer {
|
||||||
kind := v.typ_.Kind()
|
kind := typ.Kind()
|
||||||
switch kind {
|
switch kind {
|
||||||
case abi.Bool, abi.Int, abi.Int8, abi.Int16, abi.Int32, abi.Int64,
|
case abi.Bool, abi.Int, abi.Int8, abi.Int16, abi.Int32, abi.Int64,
|
||||||
abi.Uint, abi.Uint8, abi.Uint16, abi.Uint32, abi.Uint64, abi.Uintptr,
|
abi.Uint, abi.Uint8, abi.Uint16, abi.Uint32, abi.Uint64, abi.Uintptr,
|
||||||
abi.Float32, abi.Float64, abi.Complex64:
|
abi.Float32, abi.Float64:
|
||||||
if v.flag&flagAddr != 0 {
|
if v.flag&flagAddr != 0 {
|
||||||
return v.ptr
|
return v.ptr
|
||||||
} else {
|
} else {
|
||||||
return unsafe.Pointer(&v.ptr)
|
return unsafe.Pointer(&v.ptr)
|
||||||
}
|
}
|
||||||
|
case abi.Complex64:
|
||||||
|
//TODO
|
||||||
case abi.Complex128:
|
case abi.Complex128:
|
||||||
return unsafe.Pointer(v.ptr)
|
return unsafe.Pointer(v.ptr)
|
||||||
case abi.Array:
|
case abi.Array:
|
||||||
@@ -2056,6 +2058,8 @@ func toFFIArg(v Value) unsafe.Pointer {
|
|||||||
case abi.Func:
|
case abi.Func:
|
||||||
return unsafe.Pointer(&v.ptr)
|
return unsafe.Pointer(&v.ptr)
|
||||||
case abi.Interface:
|
case abi.Interface:
|
||||||
|
i := v.Interface()
|
||||||
|
return unsafe.Pointer(&i)
|
||||||
case abi.Map:
|
case abi.Map:
|
||||||
return unsafe.Pointer(&v.ptr)
|
return unsafe.Pointer(&v.ptr)
|
||||||
case abi.Pointer:
|
case abi.Pointer:
|
||||||
@@ -2150,6 +2154,7 @@ func (v Value) call(op string, in []Value) (out []Value) {
|
|||||||
args []unsafe.Pointer
|
args []unsafe.Pointer
|
||||||
fn unsafe.Pointer
|
fn unsafe.Pointer
|
||||||
ret unsafe.Pointer
|
ret unsafe.Pointer
|
||||||
|
ioff int
|
||||||
)
|
)
|
||||||
if v.typ_.IsClosure() {
|
if v.typ_.IsClosure() {
|
||||||
ft := v.typ_.StructType().Fields[0].Typ.FuncType()
|
ft := v.typ_.StructType().Fields[0].Typ.FuncType()
|
||||||
@@ -2160,6 +2165,7 @@ func (v Value) call(op string, in []Value) (out []Value) {
|
|||||||
env unsafe.Pointer
|
env unsafe.Pointer
|
||||||
})(v.ptr)
|
})(v.ptr)
|
||||||
fn = c.fn
|
fn = c.fn
|
||||||
|
ioff = 1
|
||||||
args = append(args, unsafe.Pointer(&c.env))
|
args = append(args, unsafe.Pointer(&c.env))
|
||||||
} else {
|
} else {
|
||||||
if v.flag&flagMethod != 0 {
|
if v.flag&flagMethod != 0 {
|
||||||
@@ -2170,6 +2176,7 @@ func (v Value) call(op string, in []Value) (out []Value) {
|
|||||||
rcvrtype, ft, fn = methodReceiver(op, v, int(v.flag)>>flagMethodShift)
|
rcvrtype, ft, fn = methodReceiver(op, v, int(v.flag)>>flagMethodShift)
|
||||||
tin = append([]*abi.Type{rcvrtype}, ft.In...)
|
tin = append([]*abi.Type{rcvrtype}, ft.In...)
|
||||||
tout = ft.Out
|
tout = ft.Out
|
||||||
|
ioff = 1
|
||||||
if v.flag&flagIndir != 0 {
|
if v.flag&flagIndir != 0 {
|
||||||
args = append(args, v.ptr)
|
args = append(args, v.ptr)
|
||||||
} else {
|
} else {
|
||||||
@@ -2194,8 +2201,8 @@ func (v Value) call(op string, in []Value) (out []Value) {
|
|||||||
v := runtime.AllocZ(sig.RType.Size)
|
v := runtime.AllocZ(sig.RType.Size)
|
||||||
ret = unsafe.Pointer(&v)
|
ret = unsafe.Pointer(&v)
|
||||||
}
|
}
|
||||||
for _, in := range in {
|
for i, in := range in {
|
||||||
args = append(args, toFFIArg(in))
|
args = append(args, toFFIArg(in, tin[ioff+i]))
|
||||||
}
|
}
|
||||||
ffi.Call(sig, fn, ret, args...)
|
ffi.Call(sig, fn, ret, args...)
|
||||||
switch n := len(tout); n {
|
switch n := len(tout); n {
|
||||||
|
|||||||
Reference in New Issue
Block a user