@@ -125,7 +125,7 @@ func generateGoAliases(funcs []*mkcgo.Func, w io.Writer) {
125
125
}
126
126
handleType (p .Type )
127
127
}
128
- handleType (fn .Ret . Type )
128
+ handleType (fn .Ret )
129
129
}
130
130
types := make ([]string , 0 , len (ctypes ))
131
131
for typ := range ctypes {
@@ -199,9 +199,9 @@ func generateCHeader(src *mkcgo.Source, w io.Writer) {
199
199
continue
200
200
}
201
201
if fnNeedErrWrapper (fn ) {
202
- fmt .Fprintf (w , "%s %s(%s);\n " , fn .Ret . Type , fnCName (fn ), fnCErrWrapperParams (fn , false ))
202
+ fmt .Fprintf (w , "%s %s(%s);\n " , fn .Ret , fnCName (fn ), fnCErrWrapperParams (fn , false ))
203
203
} else {
204
- fmt .Fprintf (w , "%s %s(%s);\n " , fn .Ret . Type , fnCName (fn ), fnToCArgs (fn , true , false ))
204
+ fmt .Fprintf (w , "%s %s(%s);\n " , fn .Ret , fnCName (fn ), fnToCArgs (fn , true , false ))
205
205
}
206
206
}
207
207
fmt .Fprintf (w , "\n " )
@@ -233,10 +233,10 @@ func generateC(src *mkcgo.Source, w io.Writer) {
233
233
234
234
// Function pointer declarations.
235
235
for _ , fn := range src .Funcs {
236
- if fn .VariadicInst {
236
+ if fn .VariadicTarget != "" {
237
237
continue
238
238
}
239
- fmt .Fprintf (w , "%s (*_g_%s)(%s);\n " , fn .Ret . Type , fn .ImportName , fnToCArgs (fn , true , false ))
239
+ fmt .Fprintf (w , "%s (*_g_%s)(%s);\n " , fn .Ret , fn .ImportName () , fnToCArgs (fn , true , false ))
240
240
}
241
241
fmt .Fprintf (w , "\n " )
242
242
@@ -253,7 +253,7 @@ func generateC(src *mkcgo.Source, w io.Writer) {
253
253
for _ , tag := range src .Tags () {
254
254
fmt .Fprintf (w , "void __mkcgo_load_%s(void* handle) {\n " , tag )
255
255
for _ , fn := range src .Funcs {
256
- if fn .VariadicInst {
256
+ if fn .VariadicTarget != "" {
257
257
continue
258
258
}
259
259
tags := fn .Tags
@@ -264,11 +264,11 @@ func generateC(src *mkcgo.Source, w io.Writer) {
264
264
if tagAttr .Tag == tag {
265
265
if tagAttr .Name != "" {
266
266
// TODO: if necessary, support optional functions in here too.
267
- fmt .Fprintf (w , "\t __mkcgo__dlsym2(%s, %s)\n " , fn .ImportName , tagAttr .Name )
267
+ fmt .Fprintf (w , "\t __mkcgo__dlsym2(%s, %s)\n " , fn .ImportName () , tagAttr .Name )
268
268
} else if fn .Optional {
269
- fmt .Fprintf (w , "\t __mkcgo__dlsym_nocheck(%s, %s)\n " , fn .ImportName , fn .ImportName )
269
+ fmt .Fprintf (w , "\t __mkcgo__dlsym_nocheck(%s, %s)\n " , fn .ImportName () , fn .ImportName () )
270
270
} else {
271
- fmt .Fprintf (w , "\t __mkcgo__dlsym(%s)\n " , fn .ImportName )
271
+ fmt .Fprintf (w , "\t __mkcgo__dlsym(%s)\n " , fn .ImportName () )
272
272
}
273
273
break
274
274
}
@@ -278,7 +278,7 @@ func generateC(src *mkcgo.Source, w io.Writer) {
278
278
279
279
fmt .Fprintf (w , "void __mkcgo_unload_%s() {\n " , tag )
280
280
for _ , fn := range src .Funcs {
281
- if fn .VariadicInst {
281
+ if fn .VariadicTarget != "" {
282
282
continue
283
283
}
284
284
tags := fn .Tags
@@ -287,7 +287,7 @@ func generateC(src *mkcgo.Source, w io.Writer) {
287
287
}
288
288
for _ , tagAttr := range tags {
289
289
if tagAttr .Tag == tag {
290
- fmt .Fprintf (w , "\t _g_%s = NULL;\n " , fn .ImportName )
290
+ fmt .Fprintf (w , "\t _g_%s = NULL;\n " , fn .ImportName () )
291
291
break
292
292
}
293
293
}
@@ -308,7 +308,7 @@ func generateC(src *mkcgo.Source, w io.Writer) {
308
308
if fn .Optional {
309
309
// Generate a function that returns true if the function is available.
310
310
fmt .Fprintf (w , "int %s() {\n " , fnCNameAvailable (fn ))
311
- fmt .Fprintf (w , "\t return _g_%s != NULL;\n " , fn .ImportName )
311
+ fmt .Fprintf (w , "\t return _g_%s != NULL;\n " , fn .ImportName () )
312
312
fmt .Fprintf (w , "}\n \n " )
313
313
}
314
314
generateCFn (typedefs , fn , w )
@@ -320,15 +320,15 @@ func generateGoFn(fn *mkcgo.Func, w io.Writer) {
320
320
fnCall := fmt .Sprintf ("C.%s(%s)" , fnCName (fn ), fnToGoArgs (fn ))
321
321
// Function definition
322
322
fmt .Fprintf (w , "func %s(%s)" , goSymName (fn .Name ), fnToGoParams (fn ))
323
- if retIsVoid (fn .Ret ) {
323
+ if isVoid (fn .Ret ) {
324
324
// Easy path, just call the C function. No need to write the return types,
325
325
// nor do error handling, nor cast the return value.
326
326
fmt .Fprintf (w , "{\n " )
327
327
fmt .Fprintf (w , "\t %s\n " , fnCall )
328
328
fmt .Fprintf (w , "}\n \n " )
329
329
return
330
330
}
331
- goType , needCast := cTypeToGo (fn .Ret . Type , false )
331
+ goType , needCast := cTypeToGo (fn .Ret , false )
332
332
if fn .NoError {
333
333
fmt .Fprintf (w , " %s " , goType )
334
334
} else {
@@ -381,24 +381,24 @@ func generateGoFn(fn *mkcgo.Func, w io.Writer) {
381
381
382
382
func generateCFn (typedefs map [string ]string , fn * mkcgo.Func , w io.Writer ) {
383
383
if ! fnNeedErrWrapper (fn ) {
384
- fmt .Fprintf (w , "%s %s(%s) {\n \t " , fn .Ret . Type , fnCName (fn ), fnToCArgs (fn , true , true ))
385
- if ! retIsVoid (fn .Ret ) {
384
+ fmt .Fprintf (w , "%s %s(%s) {\n \t " , fn .Ret , fnCName (fn ), fnToCArgs (fn , true , true ))
385
+ if ! isVoid (fn .Ret ) {
386
386
fmt .Fprintf (w , "return " )
387
387
}
388
- fmt .Fprintf (w , "_g_%s(%s);\n " , fn .ImportName , fnToCArgs (fn , false , true ))
388
+ fmt .Fprintf (w , "_g_%s(%s);\n " , fn .ImportName () , fnToCArgs (fn , false , true ))
389
389
fmt .Fprintf (w , "}\n \n " )
390
390
return
391
391
}
392
392
393
- fmt .Fprintf (w , "%s %s(%s) {\n " , fn .Ret . Type , fnCName (fn ), fnCErrWrapperParams (fn , true ))
393
+ fmt .Fprintf (w , "%s %s(%s) {\n " , fn .Ret , fnCName (fn ), fnCErrWrapperParams (fn , true ))
394
394
fmt .Fprintf (w , "\t mkcgo_err_clear();\n " ) // clear any previous error
395
- fmt .Fprintf (w , "\t %s _ret = _g_%s(%s);\n " , fn .Ret . Type , fn .ImportName , fnToCArgs (fn , false , true ))
395
+ fmt .Fprintf (w , "\t %s _ret = _g_%s(%s);\n " , fn .Ret , fn .ImportName () , fnToCArgs (fn , false , true ))
396
396
errCond := "<= 0"
397
397
if fn .ErrCond != "" {
398
398
errCond = fn .ErrCond
399
- } else if strings .Contains (fn .Ret . Type , "*" ) {
399
+ } else if strings .Contains (fn .Ret , "*" ) {
400
400
errCond = "== NULL"
401
- } else if typ , ok := typedefs [fn .Ret . Type ]; ok && typ == "void*" {
401
+ } else if typ , ok := typedefs [fn .Ret ]; ok && typ == "void*" {
402
402
errCond = "== NULL"
403
403
}
404
404
fmt .Fprintf (w , "\t if (_ret %s) *_err_state = mkcgo_err_retrieve();\n " , errCond )
@@ -470,7 +470,7 @@ var cstdTypesToCgo = map[string]string{
470
470
// the type needs to be casted to goType or not.
471
471
func cTypeToGo (t string , cgo bool ) (string , bool ) {
472
472
t , _ = strings .CutPrefix (t , "const " )
473
- if t == "void" {
473
+ if isVoid ( t ) {
474
474
return "" , true
475
475
}
476
476
if strings .HasPrefix (t , "void*" ) {
@@ -515,7 +515,7 @@ func paramToC(i int, p *mkcgo.Param, addType, addName bool) string {
515
515
if addType {
516
516
s += p .Type
517
517
}
518
- if addName && p .Type != "void" {
518
+ if addName && ! isVoid ( p .Type ) {
519
519
if len (s ) > 0 {
520
520
s += " "
521
521
}
@@ -524,8 +524,9 @@ func paramToC(i int, p *mkcgo.Param, addType, addName bool) string {
524
524
return s
525
525
}
526
526
527
- func retIsVoid (r * mkcgo.Return ) bool {
528
- return r .Type == "void"
527
+ // isVoid reports whether typ is a void type.
528
+ func isVoid (typ string ) bool {
529
+ return typ == "void"
529
530
}
530
531
531
532
// fnToGoParams returns source code for function f parameters.
@@ -580,7 +581,7 @@ func fnCErrWrapperParams(fn *mkcgo.Func, addName bool) string {
580
581
args := fnToCArgs (fn , true , addName )
581
582
if len (args ) == 0 {
582
583
args = errArg
583
- } else if args == "void" {
584
+ } else if isVoid ( args ) {
584
585
args = errArg
585
586
} else {
586
587
args += ", " + errArg
@@ -605,7 +606,7 @@ func fnCNameAvailable(fn *mkcgo.Func) string {
605
606
606
607
// fnNeedErrWrapper reports whether function fn needs an error wrapper.
607
608
func fnNeedErrWrapper (fn * mkcgo.Func ) bool {
608
- return ! fn .NoError && ! retIsVoid (fn .Ret )
609
+ return ! fn .NoError && ! isVoid (fn .Ret )
609
610
}
610
611
611
612
// fnCalledFromGo reports whether function fn is called from Go code.
0 commit comments