(obj *types.TypeName, m *types.Func)
| 945 | } |
| 946 | |
| 947 | func (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) |
no test coverage detected