@@ -2,7 +2,6 @@ package codegen
22
33import (
44 "fmt"
5- "log"
65 "strings"
76
87 "github.com/progrium/macdriver/internal/set"
@@ -44,16 +43,18 @@ var typeMap = map[string]string{
4443 "*kernel.UniChar" : "*uint16" ,
4544 "kernel.Boolean_t" : "int" ,
4645 "kernel.Pid_t" : "int32" ,
46+ "CGFloat" : "float64" ,
47+ "uint8_t" : "byte" ,
4748}
4849
4950// GoArgs return go function args
5051func (f * Function ) GoArgs (currentModule * modules.Module ) string {
51- log .Println ("rendering function" , f .Name )
52+ // log.Println("rendering function", f.Name)
5253 var args []string
5354 var blankArgCounter = 0
5455 for _ , p := range f .Parameters {
55- log .Println ("rendering function" , f .Name , p .Name , p .Type )
56- log .Printf ("rendering function ptype: %T" , p .Type )
56+ // log.Println("rendering function", f.Name, p.Name, p.Type)
57+ // log.Printf("rendering function ptype: %T", p.Type)
5758 // if is reserved word, add _ suffix
5859 if p .Name == "" {
5960 p .Name = fmt .Sprintf ("arg%d" , blankArgCounter )
@@ -146,7 +147,7 @@ func (f *Function) WriteGoCallCode(currentModule *modules.Module, cw *CodeWriter
146147 cw .WriteLine ("func " + funcDeclare + " {" )
147148 cw .Indent ()
148149
149- returnTypeStr := f . GoReturn (currentModule )
150+ f . writeGoCallParameterPrep (currentModule , cw )
150151
151152 callCode := fmt .Sprintf ("C.%s(\n " , f .GoName )
152153 var sb strings.Builder
@@ -164,6 +165,8 @@ func (f *Function) WriteGoCallCode(currentModule *modules.Module, cw *CodeWriter
164165 } else {
165166 sb .WriteString (cw .IndentStr + fmt .Sprintf ("(C.%s)(%s)" , tt .CName (), p .GoName ()))
166167 }
168+ case * typing.CStringType :
169+ sb .WriteString (cw .IndentStr + fmt .Sprintf (" %vVal" , p .GoName ()))
167170 case * typing.RefType :
168171 sb .WriteString (cw .IndentStr + fmt .Sprintf (" unsafe.Pointer(%s)" , p .GoName ()))
169172 case * typing.StructType :
@@ -179,6 +182,7 @@ func (f *Function) WriteGoCallCode(currentModule *modules.Module, cw *CodeWriter
179182 }
180183 callCode += sb .String () + cw .IndentStr + ")"
181184
185+ returnTypeStr := f .GoReturn (currentModule )
182186 if returnTypeStr == "" {
183187 cw .WriteLine (callCode )
184188 } else {
@@ -196,6 +200,19 @@ func (f *Function) WriteGoCallCode(currentModule *modules.Module, cw *CodeWriter
196200 cw .WriteLine ("}" )
197201}
198202
203+ // writeGoCallParameterPrep generate go code to prepare parameters for c function call
204+ func (f * Function ) writeGoCallParameterPrep (currentModule * modules.Module , cw * CodeWriter ) {
205+ for _ , p := range f .Parameters {
206+ switch p .Type .(type ) {
207+ default :
208+ continue
209+ case * typing.CStringType :
210+ cw .WriteLineF ("%sVal := C.CString(%v)" , p .GoName (), p .GoName ())
211+ cw .WriteLineF ("defer C.free(unsafe.Pointer(%sVal))" , p .GoName ())
212+ }
213+ }
214+ }
215+
199216func hasBlockParam (params []* Param ) bool {
200217 for _ , p := range params {
201218 if _ , ok := p .Type .(* typing.BlockType ); ok {
@@ -211,6 +228,7 @@ func hasBlockParam(params []*Param) bool {
211228 return false
212229}
213230
231+ // WriteObjcWrapper generate objc wrapper code that maps between C and ObjC.
214232func (f * Function ) WriteObjcWrapper (currentModule * modules.Module , cw * CodeWriter ) {
215233 if f .Deprecated {
216234 return
@@ -226,11 +244,29 @@ func (f *Function) WriteObjcWrapper(currentModule *modules.Module, cw *CodeWrite
226244 }
227245 cw .WriteLineF ("%v %v(%v) {" , returnTypeStr , f .GoName , f .CArgs (currentModule ))
228246 cw .Indent ()
229- var args []string
230- for _ , p := range f .Parameters {
231- args = append (args , p .Name )
247+ cw .WriteLineF ("return (%v)%v(" , returnTypeStr , f .Type .Name )
248+ cw .Indent ()
249+
250+ for idx , p := range f .Parameters {
251+ cw .WriteLineF ("// %T" , p .Type )
252+
253+ var conv string
254+ switch tt := p .Type .(type ) {
255+ case * typing.PointerType :
256+ conv = tt .ObjcName ()
257+ default :
258+ conv = tt .ObjcName ()
259+ }
260+ // get conversion to C type
261+ arg := fmt .Sprintf ("(%v)%v" , conv , p .Name )
262+ if idx < len (f .Parameters )- 1 {
263+ arg += ","
264+ }
265+ cw .WriteLineF ("%v" , arg )
232266 }
233- cw .WriteLineF ("return %v(%v);" , f .Type .Name , strings .Join (args , ", " ))
267+ //cw.WriteLineF("return (%v)%v(%v);", returnTypeStr, f.Type.Name, strings.Join(args, ", "))
268+ cw .UnIndent ()
269+ cw .WriteLine (");" )
234270 cw .UnIndent ()
235271 cw .WriteLine ("}" )
236272}
0 commit comments