Skip to content

Commit 4eb07a1

Browse files
authored
Merge pull request #132 from arnetheduck/cnames
Move `go` name mangling to `emitgo`
2 parents e4e9f4d + 4e78075 commit 4eb07a1

File tree

3,263 files changed

+454519
-454462
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

3,263 files changed

+454519
-454462
lines changed

cmd/genbindings/clang2il.go

-5
Original file line numberDiff line numberDiff line change
@@ -702,11 +702,6 @@ func parseMethod(node map[string]interface{}, mm *CppMethod) error {
702702
}
703703
}
704704

705-
// Block reserved Go words, replace with generic parameters
706-
if goReservedWord(parmName) {
707-
parmName += "Val"
708-
}
709-
710705
// Update the name for the existing nth parameter
711706
mm.Parameters[paramCounter].ParameterName = parmName
712707

cmd/genbindings/emitcabi.go

+94-46
Large diffs are not rendered by default.

cmd/genbindings/emitgo.go

+66-49
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,23 @@ func goReservedWord(s string) bool {
2222
}
2323
}
2424

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+
2542
func (p CppParameter) RenderTypeGo(gfs *goFileState) string {
2643
if p.Pointer && p.ParameterType == "char" {
2744
return "string"
@@ -247,7 +264,7 @@ func (gfs *goFileState) emitParametersGo(params []CppParameter) string {
247264

248265
} else {
249266
// Ordinary parameter
250-
tmp = append(tmp, p.ParameterName+" "+p.RenderTypeGo(gfs))
267+
tmp = append(tmp, p.goParameterName()+" "+p.RenderTypeGo(gfs))
251268

252269
}
253270
}
@@ -312,16 +329,16 @@ func (gfs *goFileState) emitParametersGo2CABIForwarding(m CppMethod) (preamble s
312329

313330
func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble string, rvalue string) {
314331

315-
nameprefix := makeNamePrefix(p.ParameterName)
332+
nameprefix := makeNamePrefix(p.goParameterName())
316333

317334
if p.ParameterType == "QString" {
318335
// Go: convert string -> miqt_string*
319336
// CABI: convert miqt_string* -> real QString
320337

321338
gfs.imports["unsafe"] = struct{}{}
322339
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"
325342
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_ms.data))\n"
326343

327344
rvalue = nameprefix + "_ms"
@@ -333,12 +350,12 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
333350

334351
gfs.imports["unsafe"] = struct{}{}
335352
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"
338355
preamble += "} else {\n"
339356
preamble += nameprefix + "_alias.data = (*C.char)(unsafe.Pointer(nil))\n"
340357
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"
342359

343360
rvalue = nameprefix + "_alias"
344361

@@ -351,18 +368,18 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
351368

352369
mallocSize := listType.mallocSizeCgoExpression()
353370

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"
355372
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_CArray))\n"
356373

357-
preamble += "for i := range " + p.ParameterName + "{\n"
374+
preamble += "for i := range " + p.goParameterName() + "{\n"
358375

359-
listType.ParameterName = p.ParameterName + "[i]"
376+
listType.ParameterName = p.goParameterName() + "[i]"
360377
addPreamble, innerRvalue := gfs.emitParameterGo2CABIForwarding(listType)
361378
preamble += addPreamble
362379
preamble += nameprefix + "_CArray[i] = " + innerRvalue + "\n"
363380
preamble += "}\n"
364381

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"
366383

367384
rvalue = nameprefix + "_ma"
368385

@@ -374,15 +391,15 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
374391

375392
gfs.imports["unsafe"] = struct{}{}
376393

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"
378395
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_Keys_CArray))\n"
379396

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"
381398
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_Values_CArray))\n"
382399

383400
preamble += nameprefix + "_ctr := 0\n"
384401

385-
preamble += "for " + nameprefix + "_k, " + nameprefix + "_v := range " + p.ParameterName + "{\n"
402+
preamble += "for " + nameprefix + "_k, " + nameprefix + "_v := range " + p.goParameterName() + "{\n"
386403

387404
kType.ParameterName = nameprefix + "_k"
388405
addPreamble, innerRvalue := gfs.emitParameterGo2CABIForwarding(kType)
@@ -398,7 +415,7 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
398415

399416
preamble += "}\n"
400417

401-
preamble += nameprefix + "_mm := C.struct_miqt_map{\nlen: C.size_t(len(" + p.ParameterName + ")),\nkeys: unsafe.Pointer(" + nameprefix + "_Keys_CArray),\nvalues: unsafe.Pointer(" + nameprefix + "_Values_CArray),\n}\n"
418+
preamble += nameprefix + "_mm := C.struct_miqt_map{\nlen: C.size_t(len(" + p.goParameterName() + ")),\nkeys: unsafe.Pointer(" + nameprefix + "_Keys_CArray),\nvalues: unsafe.Pointer(" + nameprefix + "_Values_CArray),\n}\n"
402419

403420
rvalue = nameprefix + "_mm"
404421

@@ -413,12 +430,12 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
413430
preamble += nameprefix + "_Second_CArray := (*[0xffff]" + vType.parameterTypeCgo() + ")(C.malloc(C.size_t(" + vType.mallocSizeCgoExpression() + ")))\n"
414431
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_Second_CArray))\n"
415432

416-
kType.ParameterName = p.ParameterName + ".First"
433+
kType.ParameterName = p.goParameterName() + ".First"
417434
addPreamble, innerRvalue := gfs.emitParameterGo2CABIForwarding(kType)
418435
preamble += addPreamble
419436
preamble += nameprefix + "_First_CArray[0] = " + innerRvalue + "\n"
420437

421-
vType.ParameterName = p.ParameterName + ".Second"
438+
vType.ParameterName = p.goParameterName() + ".Second"
422439
addPreamble, innerRvalue = gfs.emitParameterGo2CABIForwarding(vType)
423440
preamble += addPreamble
424441
preamble += nameprefix + "_Second_CArray[0] = " + innerRvalue + "\n"
@@ -430,7 +447,7 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
430447
} else if p.Pointer && p.ParameterType == "char" {
431448
// Single char* argument
432449
gfs.imports["unsafe"] = struct{}{}
433-
preamble += nameprefix + "_Cstring := C.CString(" + p.ParameterName + ")\n"
450+
preamble += nameprefix + "_Cstring := C.CString(" + p.goParameterName() + ")\n"
434451
preamble += "defer C.free(unsafe.Pointer(" + nameprefix + "_Cstring))\n"
435452
rvalue = nameprefix + "_Cstring"
436453

@@ -442,23 +459,23 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
442459

443460
if classInfo, ok := KnownClassnames[p.ParameterType]; ok && gfs.currentPackageName != classInfo.PackageName {
444461
// Cross-package
445-
rvalue = "(" + p.parameterTypeCgo() + ")(" + p.ParameterName + ".UnsafePointer())"
462+
rvalue = "(" + p.parameterTypeCgo() + ")(" + p.goParameterName() + ".UnsafePointer())"
446463
} else {
447464
// Same package
448-
rvalue = p.ParameterName + ".cPointer()"
465+
rvalue = p.goParameterName() + ".cPointer()"
449466
}
450467

451468
} else if p.IntType() || p.IsFlagType() || p.IsKnownEnum() || p.ParameterType == "bool" {
452469
if p.Pointer || p.ByRef {
453470
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
455472
} else {
456-
rvalue = "(" + p.parameterTypeCgo() + ")(" + p.ParameterName + ")"
473+
rvalue = "(" + p.parameterTypeCgo() + ")(" + p.goParameterName() + ")"
457474
}
458475

459476
} else {
460477
// Default
461-
rvalue = p.ParameterName
478+
rvalue = p.goParameterName()
462479
}
463480

464481
return preamble, rvalue
@@ -468,7 +485,7 @@ func (gfs *goFileState) emitCabiToGo(assignExpr string, rt CppParameter, rvalue
468485

469486
shouldReturn := assignExpr // "return "
470487
afterword := ""
471-
namePrefix := makeNamePrefix(rt.ParameterName)
488+
namePrefix := makeNamePrefix(rt.goParameterName())
472489

473490
if rt.Void() {
474491
shouldReturn = ""
@@ -644,7 +661,7 @@ func (gfs *goFileState) emitCabiToGo(assignExpr string, rt CppParameter, rvalue
644661
return assignExpr + "(" + rt.RenderTypeGo(gfs) + ")(" + rvalue + ")\n"
645662

646663
} 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))
648665
}
649666

650667
}
@@ -849,19 +866,19 @@ import "C"
849866
}
850867

851868
// Populate outptr pointers
852-
ret.WriteString("C." + cabiClassName(c.ClassName) + "_virtbase(h" + xbaseParams + ")\n")
869+
ret.WriteString("C." + cabiVirtBaseName(c) + "(h" + xbaseParams + ")\n")
853870

854871
}
855872

856873
ret.WriteString(`
857874
return &` + goClassName + `{` + localInit + `}
858875
}
859-
876+
860877
// UnsafeNew` + goClassName + ` constructs the type using only unsafe pointers.
861878
func UnsafeNew` + goClassName + `(h unsafe.Pointer) *` + goClassName + ` {
862879
return new` + goClassName + `( (*C.` + goClassName + `)(h) )
863880
}
864-
881+
865882
`)
866883

867884
//
@@ -888,10 +905,10 @@ import "C"
888905

889906
// Call Cgo constructor
890907

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 + `))
893910
}
894-
911+
895912
`)
896913

897914
}
@@ -906,13 +923,13 @@ import "C"
906923

907924
returnTypeDecl := m.ReturnType.renderReturnTypeGo(&gfs)
908925

909-
rvalue := `C.` + goClassName + `_` + m.SafeMethodName() + `(` + forwarding + `)`
926+
rvalue := `C.` + cabiMethodName(c, m) + `(` + forwarding + `)`
910927

911928
returnFunc := gfs.emitCabiToGo("return ", m.ReturnType, rvalue)
912929

913-
receiverAndMethod := `(this *` + goClassName + `) ` + m.SafeMethodName()
930+
receiverAndMethod := `(this *` + goClassName + `) ` + m.goMethodName()
914931
if m.IsStatic {
915-
receiverAndMethod = goClassName + `_` + m.SafeMethodName()
932+
receiverAndMethod = goClassName + `_` + m.goMethodName()
916933
}
917934

918935
ret.WriteString(`
@@ -943,16 +960,16 @@ import "C"
943960
conversion = "// Convert all CABI parameters to Go parameters\n"
944961
}
945962
for i, pp := range m.Parameters {
946-
cgoNamedParams = append(cgoNamedParams, pp.ParameterName+" "+pp.parameterTypeCgo())
963+
cgoNamedParams = append(cgoNamedParams, pp.goParameterName()+" "+pp.parameterTypeCgo())
947964

948965
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"
950967
}
951968

952969
goCbType := `func(` + gfs.emitParametersGo(m.Parameters) + `)`
953970
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)) )
956973
}
957974
958975
//export ` + callbackName + `
@@ -961,9 +978,9 @@ import "C"
961978
if !ok {
962979
panic("miqt: callback of non-callback type (heap corruption?)")
963980
}
964-
981+
965982
` + conversion + `
966-
983+
967984
gofunc(` + strings.Join(paramNames, `, `) + ` )
968985
}
969986
@@ -987,9 +1004,9 @@ import "C"
9871004
returnTypeDecl := m.ReturnType.renderReturnTypeGo(&gfs)
9881005

9891006
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 + ` {
9911008
` + preamble + `
992-
` + gfs.emitCabiToGo("return ", m.ReturnType, `C.`+goClassName+`_virtualbase_`+m.SafeMethodName()+`(`+forwarding+`)`) + `
1009+
` + gfs.emitCabiToGo("return ", m.ReturnType, `C.`+cabiVirtualBaseName(c, m)+`(`+forwarding+`)`) + `
9931010
}
9941011
`)
9951012

@@ -1004,18 +1021,18 @@ import "C"
10041021
var cgoNamedParams []string
10051022
var paramNames []string
10061023
if !m.IsPureVirtual {
1007-
paramNames = append(paramNames, "(&"+goClassName+"{h: self}).callVirtualBase_"+m.SafeMethodName())
1024+
paramNames = append(paramNames, "(&"+goClassName+"{h: self}).callVirtualBase_"+m.goMethodName())
10081025
}
10091026
conversion := ""
10101027

10111028
if len(m.Parameters) > 0 {
10121029
conversion = "// Convert all CABI parameters to Go parameters\n"
10131030
}
10141031
for i, pp := range m.Parameters {
1015-
cgoNamedParams = append(cgoNamedParams, pp.ParameterName+" "+pp.parameterTypeCgo())
1032+
cgoNamedParams = append(cgoNamedParams, pp.goParameterName()+" "+pp.parameterTypeCgo())
10161033

10171034
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"
10191036
}
10201037

10211038
cabiReturnType := m.ReturnType.parameterTypeCgo()
@@ -1036,7 +1053,7 @@ import "C"
10361053
goCbType += `) ` + m.ReturnType.renderReturnTypeGo(&gfs)
10371054
callbackName := cabiCallbackName(c, m)
10381055
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)) )
10401057
if !ok {
10411058
panic("miqt: can only override virtual methods for directly constructed types")
10421059
}
@@ -1048,7 +1065,7 @@ import "C"
10481065
if !ok {
10491066
panic("miqt: callback of non-callback type (heap corruption?)")
10501067
}
1051-
1068+
10521069
`)
10531070
ret.WriteString(conversion + "\n")
10541071
if cabiReturnType == "" {
@@ -1075,9 +1092,9 @@ import "C"
10751092
ret.WriteString(`
10761093
// Delete this object from C++ memory.
10771094
func (this *` + goClassName + `) Delete() {
1078-
C.` + goClassName + `_Delete(this.h)
1095+
C.` + cabiDeleteName(c) + `(this.h)
10791096
}
1080-
1097+
10811098
// GoGC adds a Go Finalizer to this pointer, so that it will be deleted
10821099
// from C++ memory once it is unreachable from Go memory.
10831100
func (this *` + goClassName + `) GoGC() {

cmd/genbindings/intermediate.go

-3
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,6 @@ func (nm CppMethod) SafeMethodName() string {
351351
)
352352
tmp = replacer.Replace(tmp)
353353

354-
// Also make the first letter uppercase so it becomes public in Go
355-
tmp = titleCase(tmp)
356-
357354
// Replace spaces (e.g. `operator long long` with CamelCase
358355
tmp = regexp.MustCompile(` ([a-zA-Z])`).ReplaceAllStringFunc(tmp, func(match string) string { return strings.ToUpper(match[1:]) })
359356

0 commit comments

Comments
 (0)