@@ -55,7 +55,8 @@ func (f *Function) CArgs(currentModule *modules.Module) string {
5555 // log.Println("rendering function", f.Name)
5656 var args []string
5757 for _ , p := range f .Parameters {
58- args = append (args , fmt .Sprintf ("%s %s" , p .Type .ObjcName (), p .Name ))
58+ log .Printf ("rendering cfunction arg: %s %s %T" , p .Name , p .Type , p .Type )
59+ args = append (args , fmt .Sprintf ("%s %s" , p .Type .CName (), p .Name ))
5960 }
6061 return strings .Join (args , ", " )
6162}
@@ -110,59 +111,40 @@ func (f *Function) WriteGoCallCode(currentModule *modules.Module, cw *CodeWriter
110111 cw .WriteLine ("func " + funcDeclare + " {" )
111112 cw .Indent ()
112113
113- var returnTypeStr string
114- rt := typing .UnwrapAlias (f .ReturnType )
115- switch rt .(type ) {
116- case * typing.VoidType :
117- returnTypeStr = "objc.Void"
118- default :
119- returnTypeStr = f .ReturnType .GoName (currentModule , true )
120- }
121- callCode := fmt .Sprintf ("objc.Call[%s](%s, objc.Sel(\" %s\" )" , returnTypeStr , f .Selector ())
114+ returnTypeStr := f .GoReturn (currentModule )
115+
116+ callCode := fmt .Sprintf ("C.%s(" , f .GoName )
122117 var sb strings.Builder
123118 for idx , p := range f .Parameters {
124- sb . WriteString ( ", " )
119+ // cast to C type
125120 switch tt := p .Type .(type ) {
126- case * typing.ClassType :
127- sb .WriteString ("objc.Ptr(" + p .GoName () + ")" )
128- case * typing.ProtocolType :
129- pvar := fmt .Sprintf ("po%d" , idx )
130- cw .WriteLineF ("%s := objc.WrapAsProtocol(\" %s\" , %s)" , pvar , tt .Name , p .GoName ())
131- sb .WriteString (pvar )
132- case * typing.PointerType :
133- switch tt .Type .(type ) {
134- case * typing.ClassType : //object pointer convert to unsafe.Pointer, avoiding ffi treat it as PointerHolder
135- sb .WriteString (fmt .Sprintf ("unsafe.Pointer(%s)" , p .GoName ()))
136- default :
137- sb .WriteString (p .GoName ())
138- }
121+ case * typing.AliasType :
122+ sb .WriteString (fmt .Sprintf ("C.%s(%s)" , tt .CName (), p .GoName ()))
139123 default :
140124 sb .WriteString (p .GoName ())
141125 }
126+ if idx < len (f .Parameters )- 1 {
127+ sb .WriteString (", " )
128+ }
142129 }
143130 callCode += sb .String () + ")"
144131
145- switch rt .(type ) {
146- case * typing.VoidType :
132+ if returnTypeStr == "" {
147133 cw .WriteLine (callCode )
148- default :
134+ } else {
149135 var resultName = "rv"
150136 cw .WriteLine (resultName + " := " + callCode )
151- cw .WriteLine ("return " + resultName )
137+ cw .WriteLineF ("return %s(%s)" , returnTypeStr , resultName )
152138 }
153139 cw .UnIndent ()
154140 cw .WriteLine ("}" )
155141}
156142
157143func (f * Function ) WriteCSignature (currentModule * modules.Module , cw * CodeWriter ) {
158144 var returnTypeStr string
159- rt := typing .UnwrapAlias (f .ReturnType )
160- switch rt .(type ) {
161- case * typing.VoidType :
162- returnTypeStr = "void *"
163- default :
164- returnTypeStr = f .ReturnType .ObjcName ()
165- }
145+ rt := f .Type .ReturnType
146+ log .Printf ("rt: %T" , rt )
147+ returnTypeStr = rt .CName ()
166148 cw .WriteLineF ("// %v %v(%v); " , returnTypeStr , f .GoName , f .CArgs (currentModule ))
167149}
168150
0 commit comments