MCPcopy Create free account
hub / github.com/golang/mobile / genInterfaceMethodProxy

Method genInterfaceMethodProxy

bind/genobjc.go:947–1022  ·  view source on GitHub ↗
(obj *types.TypeName, m *types.Func)

Source from the content-addressed store, hash-verified

945}
946
947func (g *ObjcGen) genInterfaceMethodProxy(obj *types.TypeName, m *types.Func) {
948 oName := obj.Name()
949 s := g.funcSummary(nil, m)
950 g.genInterfaceMethodSignature(m, oName, false, g.paramName)
951 g.Indent()
952 g.Printf("@autoreleasepool {\n")
953 g.Indent()
954 g.Printf("%s* o = go_seq_objc_from_refnum(refnum);\n", g.refTypeBase(obj.Type()))
955 for _, p := range s.params {
956 g.genRead("_"+p.name, p.name, p.typ, modeTransient)
957 }
958
959 // call method
960 for _, p := range s.retParams {
961 if isErrorType(p.typ) {
962 g.Printf("NSError* %s = nil;\n", p.name)
963 } else {
964 g.Printf("%s %s;\n", g.objcType(p.typ), p.name)
965 }
966 }
967
968 if isErrorType(obj.Type()) && m.Name() == "Error" {
969 // As a special case, ObjC NSErrors are passed to Go pretending to implement the Go error interface.
970 // They don't actually have an Error method, so calls to it needs to be rerouted.
971 g.Printf("%s = [o localizedDescription];\n", s.retParams[0].name)
972 } else {
973 if s.ret == "void" {
974 g.Printf("[o %s];\n", s.callMethod(g))
975 } else if !s.returnsVal() {
976 g.Printf("%s returnVal = [o %s];\n", s.ret, s.callMethod(g))
977 } else {
978 g.Printf("%s = [o %s];\n", s.retParams[0].name, s.callMethod(g))
979 }
980 }
981
982 if len(s.retParams) > 0 {
983 if len(s.retParams) == 1 && !isErrorType(s.retParams[0].typ) {
984 p := s.retParams[0]
985 g.genWrite(p.name, p.typ, modeRetained)
986 g.Printf("return _%s;\n", p.name)
987 } else {
988 var rets []string
989 for _, p := range s.retParams {
990 if isErrorType(p.typ) {
991 g.Printf("NSError *_%s = nil;\n", p.name)
992 if !s.returnsVal() {
993 g.Printf("if (!returnVal) {\n")
994 } else {
995 g.Printf("if (%s != nil) {\n", p.name)
996 }
997 g.Indent()
998 g.Printf("_%[1]s = %[1]s;\n", p.name)
999 g.Outdent()
1000 g.Printf("}\n")
1001 g.genWrite("_"+p.name, p.typ, modeRetained)
1002 rets = append(rets, "__"+p.name)
1003 } else {
1004 g.genWrite(p.name, p.typ, modeRetained)

Callers 1

GenMMethod · 0.95

Calls 13

funcSummaryMethod · 0.95
refTypeBaseMethod · 0.95
genReadMethod · 0.95
objcTypeMethod · 0.95
genWriteMethod · 0.95
isErrorTypeFunction · 0.85
IndentMethod · 0.80
PrintfMethod · 0.80
TypeMethod · 0.80
callMethodMethod · 0.80
returnsValMethod · 0.80

Tested by

no test coverage detected