@@ -22,6 +22,23 @@ func goReservedWord(s string) bool {
22
22
}
23
23
}
24
24
25
+ func (nm CppMethod ) goMethodName () string {
26
+ // Also make the first letter uppercase so it becomes public in Go
27
+ tmp := nm .SafeMethodName ()
28
+ tmp = titleCase (tmp )
29
+ return tmp
30
+ }
31
+
32
+ func (p CppParameter ) goParameterName () string {
33
+ // Also make the first letter uppercase so it becomes public in Go
34
+ parmName := p .ParameterName
35
+ if goReservedWord (parmName ) {
36
+ parmName += "Val"
37
+ }
38
+
39
+ return parmName
40
+ }
41
+
25
42
func (p CppParameter ) RenderTypeGo (gfs * goFileState ) string {
26
43
if p .Pointer && p .ParameterType == "char" {
27
44
return "string"
@@ -247,7 +264,7 @@ func (gfs *goFileState) emitParametersGo(params []CppParameter) string {
247
264
248
265
} else {
249
266
// Ordinary parameter
250
- tmp = append (tmp , p .ParameterName + " " + p .RenderTypeGo (gfs ))
267
+ tmp = append (tmp , p .goParameterName () + " " + p .RenderTypeGo (gfs ))
251
268
252
269
}
253
270
}
@@ -312,16 +329,16 @@ func (gfs *goFileState) emitParametersGo2CABIForwarding(m CppMethod) (preamble s
312
329
313
330
func (gfs * goFileState ) emitParameterGo2CABIForwarding (p CppParameter ) (preamble string , rvalue string ) {
314
331
315
- nameprefix := makeNamePrefix (p .ParameterName )
332
+ nameprefix := makeNamePrefix (p .goParameterName () )
316
333
317
334
if p .ParameterType == "QString" {
318
335
// Go: convert string -> miqt_string*
319
336
// CABI: convert miqt_string* -> real QString
320
337
321
338
gfs .imports ["unsafe" ] = struct {}{}
322
339
preamble += nameprefix + "_ms := C.struct_miqt_string{}\n "
323
- preamble += nameprefix + "_ms.data = C.CString(" + p .ParameterName + ")\n "
324
- preamble += nameprefix + "_ms.len = C.size_t(len(" + p .ParameterName + "))\n "
340
+ preamble += nameprefix + "_ms.data = C.CString(" + p .goParameterName () + ")\n "
341
+ preamble += nameprefix + "_ms.len = C.size_t(len(" + p .goParameterName () + "))\n "
325
342
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_ms.data))\n "
326
343
327
344
rvalue = nameprefix + "_ms"
@@ -333,12 +350,12 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
333
350
334
351
gfs .imports ["unsafe" ] = struct {}{}
335
352
preamble += nameprefix + "_alias := C.struct_miqt_string{}\n "
336
- preamble += "if len(" + p .ParameterName + ") > 0 {\n "
337
- preamble += nameprefix + "_alias.data = (*C.char)(unsafe.Pointer(&" + p .ParameterName + "[0]))\n "
353
+ preamble += "if len(" + p .goParameterName () + ") > 0 {\n "
354
+ preamble += nameprefix + "_alias.data = (*C.char)(unsafe.Pointer(&" + p .goParameterName () + "[0]))\n "
338
355
preamble += "} else {\n "
339
356
preamble += nameprefix + "_alias.data = (*C.char)(unsafe.Pointer(nil))\n "
340
357
preamble += "}\n "
341
- preamble += nameprefix + "_alias.len = C.size_t(len(" + p .ParameterName + "))\n "
358
+ preamble += nameprefix + "_alias.len = C.size_t(len(" + p .goParameterName () + "))\n "
342
359
343
360
rvalue = nameprefix + "_alias"
344
361
@@ -351,18 +368,18 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
351
368
352
369
mallocSize := listType .mallocSizeCgoExpression ()
353
370
354
- preamble += nameprefix + "_CArray := (*[0xffff]" + listType .parameterTypeCgo () + ")(C.malloc(C.size_t(" + mallocSize + " * len(" + p .ParameterName + "))))\n "
371
+ preamble += nameprefix + "_CArray := (*[0xffff]" + listType .parameterTypeCgo () + ")(C.malloc(C.size_t(" + mallocSize + " * len(" + p .goParameterName () + "))))\n "
355
372
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_CArray))\n "
356
373
357
- preamble += "for i := range " + p .ParameterName + "{\n "
374
+ preamble += "for i := range " + p .goParameterName () + "{\n "
358
375
359
- listType .ParameterName = p .ParameterName + "[i]"
376
+ listType .ParameterName = p .goParameterName () + "[i]"
360
377
addPreamble , innerRvalue := gfs .emitParameterGo2CABIForwarding (listType )
361
378
preamble += addPreamble
362
379
preamble += nameprefix + "_CArray[i] = " + innerRvalue + "\n "
363
380
preamble += "}\n "
364
381
365
- preamble += nameprefix + "_ma := C.struct_miqt_array{len: C.size_t(len(" + p .ParameterName + ")), data: unsafe.Pointer(" + nameprefix + "_CArray)}\n "
382
+ preamble += nameprefix + "_ma := C.struct_miqt_array{len: C.size_t(len(" + p .goParameterName () + ")), data: unsafe.Pointer(" + nameprefix + "_CArray)}\n "
366
383
367
384
rvalue = nameprefix + "_ma"
368
385
@@ -374,15 +391,15 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
374
391
375
392
gfs .imports ["unsafe" ] = struct {}{}
376
393
377
- preamble += nameprefix + "_Keys_CArray := (*[0xffff]" + kType .parameterTypeCgo () + ")(C.malloc(C.size_t(" + kType .mallocSizeCgoExpression () + " * len(" + p .ParameterName + "))))\n "
394
+ preamble += nameprefix + "_Keys_CArray := (*[0xffff]" + kType .parameterTypeCgo () + ")(C.malloc(C.size_t(" + kType .mallocSizeCgoExpression () + " * len(" + p .goParameterName () + "))))\n "
378
395
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_Keys_CArray))\n "
379
396
380
- preamble += nameprefix + "_Values_CArray := (*[0xffff]" + vType .parameterTypeCgo () + ")(C.malloc(C.size_t(" + vType .mallocSizeCgoExpression () + " * len(" + p .ParameterName + "))))\n "
397
+ preamble += nameprefix + "_Values_CArray := (*[0xffff]" + vType .parameterTypeCgo () + ")(C.malloc(C.size_t(" + vType .mallocSizeCgoExpression () + " * len(" + p .goParameterName () + "))))\n "
381
398
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_Values_CArray))\n "
382
399
383
400
preamble += nameprefix + "_ctr := 0\n "
384
401
385
- preamble += "for " + nameprefix + "_k, " + nameprefix + "_v := range " + p .ParameterName + "{\n "
402
+ preamble += "for " + nameprefix + "_k, " + nameprefix + "_v := range " + p .goParameterName () + "{\n "
386
403
387
404
kType .ParameterName = nameprefix + "_k"
388
405
addPreamble , innerRvalue := gfs .emitParameterGo2CABIForwarding (kType )
@@ -398,7 +415,7 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
398
415
399
416
preamble += "}\n "
400
417
401
- preamble += nameprefix + "_mm := C.struct_miqt_map{\n len: C.size_t(len(" + p .ParameterName + ")),\n keys: unsafe.Pointer(" + nameprefix + "_Keys_CArray),\n values: unsafe.Pointer(" + nameprefix + "_Values_CArray),\n }\n "
418
+ preamble += nameprefix + "_mm := C.struct_miqt_map{\n len: C.size_t(len(" + p .goParameterName () + ")),\n keys: unsafe.Pointer(" + nameprefix + "_Keys_CArray),\n values: unsafe.Pointer(" + nameprefix + "_Values_CArray),\n }\n "
402
419
403
420
rvalue = nameprefix + "_mm"
404
421
@@ -413,12 +430,12 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
413
430
preamble += nameprefix + "_Second_CArray := (*[0xffff]" + vType .parameterTypeCgo () + ")(C.malloc(C.size_t(" + vType .mallocSizeCgoExpression () + ")))\n "
414
431
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_Second_CArray))\n "
415
432
416
- kType .ParameterName = p .ParameterName + ".First"
433
+ kType .ParameterName = p .goParameterName () + ".First"
417
434
addPreamble , innerRvalue := gfs .emitParameterGo2CABIForwarding (kType )
418
435
preamble += addPreamble
419
436
preamble += nameprefix + "_First_CArray[0] = " + innerRvalue + "\n "
420
437
421
- vType .ParameterName = p .ParameterName + ".Second"
438
+ vType .ParameterName = p .goParameterName () + ".Second"
422
439
addPreamble , innerRvalue = gfs .emitParameterGo2CABIForwarding (vType )
423
440
preamble += addPreamble
424
441
preamble += nameprefix + "_Second_CArray[0] = " + innerRvalue + "\n "
@@ -430,7 +447,7 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
430
447
} else if p .Pointer && p .ParameterType == "char" {
431
448
// Single char* argument
432
449
gfs .imports ["unsafe" ] = struct {}{}
433
- preamble += nameprefix + "_Cstring := C.CString(" + p .ParameterName + ")\n "
450
+ preamble += nameprefix + "_Cstring := C.CString(" + p .goParameterName () + ")\n "
434
451
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_Cstring))\n "
435
452
rvalue = nameprefix + "_Cstring"
436
453
@@ -442,23 +459,23 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
442
459
443
460
if classInfo , ok := KnownClassnames [p .ParameterType ]; ok && gfs .currentPackageName != classInfo .PackageName {
444
461
// Cross-package
445
- rvalue = "(" + p .parameterTypeCgo () + ")(" + p .ParameterName + ".UnsafePointer())"
462
+ rvalue = "(" + p .parameterTypeCgo () + ")(" + p .goParameterName () + ".UnsafePointer())"
446
463
} else {
447
464
// Same package
448
- rvalue = p .ParameterName + ".cPointer()"
465
+ rvalue = p .goParameterName () + ".cPointer()"
449
466
}
450
467
451
468
} else if p .IntType () || p .IsFlagType () || p .IsKnownEnum () || p .ParameterType == "bool" {
452
469
if p .Pointer || p .ByRef {
453
470
gfs .imports ["unsafe" ] = struct {}{}
454
- rvalue = "(" + p .parameterTypeCgo () + ")(unsafe.Pointer(" + p .ParameterName + "))" // n.b. This may not work if the integer type conversion was wrong
471
+ rvalue = "(" + p .parameterTypeCgo () + ")(unsafe.Pointer(" + p .goParameterName () + "))" // n.b. This may not work if the integer type conversion was wrong
455
472
} else {
456
- rvalue = "(" + p .parameterTypeCgo () + ")(" + p .ParameterName + ")"
473
+ rvalue = "(" + p .parameterTypeCgo () + ")(" + p .goParameterName () + ")"
457
474
}
458
475
459
476
} else {
460
477
// Default
461
- rvalue = p .ParameterName
478
+ rvalue = p .goParameterName ()
462
479
}
463
480
464
481
return preamble , rvalue
@@ -468,7 +485,7 @@ func (gfs *goFileState) emitCabiToGo(assignExpr string, rt CppParameter, rvalue
468
485
469
486
shouldReturn := assignExpr // "return "
470
487
afterword := ""
471
- namePrefix := makeNamePrefix (rt .ParameterName )
488
+ namePrefix := makeNamePrefix (rt .goParameterName () )
472
489
473
490
if rt .Void () {
474
491
shouldReturn = ""
@@ -644,7 +661,7 @@ func (gfs *goFileState) emitCabiToGo(assignExpr string, rt CppParameter, rvalue
644
661
return assignExpr + "(" + rt .RenderTypeGo (gfs ) + ")(" + rvalue + ")\n "
645
662
646
663
} else {
647
- panic (fmt .Sprintf ("emitgo::emitCabiToGo missing type handler for parameter %+v" , rt ))
664
+ return "int /* TODO */" // panic(fmt.Sprintf("emitgo::emitCabiToGo missing type handler for parameter %+v", rt))
648
665
}
649
666
650
667
}
@@ -849,19 +866,19 @@ import "C"
849
866
}
850
867
851
868
// Populate outptr pointers
852
- ret .WriteString ("C." + cabiClassName ( c . ClassName ) + "_virtbase (h" + xbaseParams + ")\n " )
869
+ ret .WriteString ("C." + cabiVirtBaseName ( c ) + "(h" + xbaseParams + ")\n " )
853
870
854
871
}
855
872
856
873
ret .WriteString (`
857
874
return &` + goClassName + `{` + localInit + `}
858
875
}
859
-
876
+
860
877
// UnsafeNew` + goClassName + ` constructs the type using only unsafe pointers.
861
878
func UnsafeNew` + goClassName + `(h unsafe.Pointer) *` + goClassName + ` {
862
879
return new` + goClassName + `( (*C.` + goClassName + `)(h) )
863
880
}
864
-
881
+
865
882
` )
866
883
867
884
//
@@ -888,10 +905,10 @@ import "C"
888
905
889
906
// Call Cgo constructor
890
907
891
- ret .WriteString (`
892
- return new` + goClassName + `(C.` + goClassName + `_new` + maybeSuffix ( i ) + `(` + forwarding + `))
908
+ ret .WriteString (`
909
+ return new` + goClassName + `(C.` + cabiNewName ( c , i ) + `(` + forwarding + `))
893
910
}
894
-
911
+
895
912
` )
896
913
897
914
}
@@ -906,13 +923,13 @@ import "C"
906
923
907
924
returnTypeDecl := m .ReturnType .renderReturnTypeGo (& gfs )
908
925
909
- rvalue := `C.` + goClassName + `_` + m . SafeMethodName ( ) + `(` + forwarding + `)`
926
+ rvalue := `C.` + cabiMethodName ( c , m ) + `(` + forwarding + `)`
910
927
911
928
returnFunc := gfs .emitCabiToGo ("return " , m .ReturnType , rvalue )
912
929
913
- receiverAndMethod := `(this *` + goClassName + `) ` + m .SafeMethodName ()
930
+ receiverAndMethod := `(this *` + goClassName + `) ` + m .goMethodName ()
914
931
if m .IsStatic {
915
- receiverAndMethod = goClassName + `_` + m .SafeMethodName ()
932
+ receiverAndMethod = goClassName + `_` + m .goMethodName ()
916
933
}
917
934
918
935
ret .WriteString (`
@@ -943,16 +960,16 @@ import "C"
943
960
conversion = "// Convert all CABI parameters to Go parameters\n "
944
961
}
945
962
for i , pp := range m .Parameters {
946
- cgoNamedParams = append (cgoNamedParams , pp .ParameterName + " " + pp .parameterTypeCgo ())
963
+ cgoNamedParams = append (cgoNamedParams , pp .goParameterName () + " " + pp .parameterTypeCgo ())
947
964
948
965
paramNames = append (paramNames , fmt .Sprintf ("slotval%d" , i + 1 ))
949
- conversion += gfs .emitCabiToGo (fmt .Sprintf ("slotval%d := " , i + 1 ), pp , pp .ParameterName ) + "\n "
966
+ conversion += gfs .emitCabiToGo (fmt .Sprintf ("slotval%d := " , i + 1 ), pp , pp .goParameterName () ) + "\n "
950
967
}
951
968
952
969
goCbType := `func(` + gfs .emitParametersGo (m .Parameters ) + `)`
953
970
callbackName := cabiCallbackName (c , m )
954
- ret .WriteString (`func (this *` + goClassName + `) On` + m .SafeMethodName () + `(slot ` + goCbType + `) {
955
- C.` + goClassName + `_connect_` + m . SafeMethodName ( ) + `(this.h, C.intptr_t(cgo.NewHandle(slot)) )
971
+ ret .WriteString (`func (this *` + goClassName + `) On` + m .goMethodName () + `(slot ` + goCbType + `) {
972
+ C.` + cabiConnectName ( c , m ) + `(this.h, C.intptr_t(cgo.NewHandle(slot)) )
956
973
}
957
974
958
975
//export ` + callbackName + `
@@ -961,9 +978,9 @@ import "C"
961
978
if !ok {
962
979
panic("miqt: callback of non-callback type (heap corruption?)")
963
980
}
964
-
981
+
965
982
` + conversion + `
966
-
983
+
967
984
gofunc(` + strings .Join (paramNames , `, ` ) + ` )
968
985
}
969
986
@@ -987,9 +1004,9 @@ import "C"
987
1004
returnTypeDecl := m .ReturnType .renderReturnTypeGo (& gfs )
988
1005
989
1006
ret .WriteString (`
990
- func (this *` + goClassName + `) callVirtualBase_` + m .SafeMethodName () + `(` + gfs .emitParametersGo (m .Parameters ) + `) ` + returnTypeDecl + ` {
1007
+ func (this *` + goClassName + `) callVirtualBase_` + m .goMethodName () + `(` + gfs .emitParametersGo (m .Parameters ) + `) ` + returnTypeDecl + ` {
991
1008
` + preamble + `
992
- ` + gfs .emitCabiToGo ("return " , m .ReturnType , `C.` + goClassName + `_virtualbase_` + m . SafeMethodName ( )+ `(` + forwarding + `)` ) + `
1009
+ ` + gfs .emitCabiToGo ("return " , m .ReturnType , `C.` + cabiVirtualBaseName ( c , m )+ `(` + forwarding + `)` ) + `
993
1010
}
994
1011
` )
995
1012
@@ -1004,18 +1021,18 @@ import "C"
1004
1021
var cgoNamedParams []string
1005
1022
var paramNames []string
1006
1023
if ! m .IsPureVirtual {
1007
- paramNames = append (paramNames , "(&" + goClassName + "{h: self}).callVirtualBase_" + m .SafeMethodName ())
1024
+ paramNames = append (paramNames , "(&" + goClassName + "{h: self}).callVirtualBase_" + m .goMethodName ())
1008
1025
}
1009
1026
conversion := ""
1010
1027
1011
1028
if len (m .Parameters ) > 0 {
1012
1029
conversion = "// Convert all CABI parameters to Go parameters\n "
1013
1030
}
1014
1031
for i , pp := range m .Parameters {
1015
- cgoNamedParams = append (cgoNamedParams , pp .ParameterName + " " + pp .parameterTypeCgo ())
1032
+ cgoNamedParams = append (cgoNamedParams , pp .goParameterName () + " " + pp .parameterTypeCgo ())
1016
1033
1017
1034
paramNames = append (paramNames , fmt .Sprintf ("slotval%d" , i + 1 ))
1018
- conversion += gfs .emitCabiToGo (fmt .Sprintf ("slotval%d := " , i + 1 ), pp , pp .ParameterName ) + "\n "
1035
+ conversion += gfs .emitCabiToGo (fmt .Sprintf ("slotval%d := " , i + 1 ), pp , pp .goParameterName () ) + "\n "
1019
1036
}
1020
1037
1021
1038
cabiReturnType := m .ReturnType .parameterTypeCgo ()
@@ -1036,7 +1053,7 @@ import "C"
1036
1053
goCbType += `) ` + m .ReturnType .renderReturnTypeGo (& gfs )
1037
1054
callbackName := cabiCallbackName (c , m )
1038
1055
ret .WriteString (`func (this *` + goClassName + `) On` + m .SafeMethodName () + `(slot ` + goCbType + `) {
1039
- ok := C.` + goClassName + `_override_virtual_` + m . SafeMethodName ( ) + `(unsafe.Pointer(this.h), C.intptr_t(cgo.NewHandle(slot)) )
1056
+ ok := C.` + cabiOverrideVirtualName ( c , m ) + `(unsafe.Pointer(this.h), C.intptr_t(cgo.NewHandle(slot)) )
1040
1057
if !ok {
1041
1058
panic("miqt: can only override virtual methods for directly constructed types")
1042
1059
}
@@ -1048,7 +1065,7 @@ import "C"
1048
1065
if !ok {
1049
1066
panic("miqt: callback of non-callback type (heap corruption?)")
1050
1067
}
1051
-
1068
+
1052
1069
` )
1053
1070
ret .WriteString (conversion + "\n " )
1054
1071
if cabiReturnType == "" {
@@ -1075,9 +1092,9 @@ import "C"
1075
1092
ret .WriteString (`
1076
1093
// Delete this object from C++ memory.
1077
1094
func (this *` + goClassName + `) Delete() {
1078
- C.` + goClassName + `_Delete (this.h)
1095
+ C.` + cabiDeleteName ( c ) + `(this.h)
1079
1096
}
1080
-
1097
+
1081
1098
// GoGC adds a Go Finalizer to this pointer, so that it will be deleted
1082
1099
// from C++ memory once it is unreachable from Go memory.
1083
1100
func (this *` + goClassName + `) GoGC() {
0 commit comments