From 26e79fe0bd0b918390efceb8b531eb735598561b Mon Sep 17 00:00:00 2001 From: Alexander Oster Date: Tue, 18 Aug 2020 23:07:59 +0200 Subject: [PATCH 1/2] Fixed Go Injection --- Source/buildbindinggo.go | 43 +++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/Source/buildbindinggo.go b/Source/buildbindinggo.go index 030fba7e..ee65a644 100644 --- a/Source/buildbindinggo.go +++ b/Source/buildbindinggo.go @@ -535,6 +535,22 @@ func buildGoWrapper(component ComponentDefinition, w LanguageWriter) error { w.Writeln("/*") w.Writeln("#include \"%s_dynamic.cc\"", packageName) w.Writeln("") + + if len(component.ImportedComponentDefinitions) > 0 { + w.Writeln("// Injected Components") + for _, subComponent := range(component.ImportedComponentDefinitions) { + subNameSpace := subComponent.NameSpace + + w.Writeln("%sHandle inject%sHandle (void * p%sHandle)", subNameSpace, subNameSpace, subNameSpace) + w.Writeln("{"); + w.Writeln(" return (%sHandle) p%sHandle;", subNameSpace, subNameSpace); + w.Writeln("}"); + w.Writeln(""); + } + } + + + w.Writeln("") w.Writeln("%sHandle load%sLibrary (const char * pFileName)", component.NameSpace, component.NameSpace) w.Writeln("{") w.Writeln(" %sResult nResult;", component.NameSpace) @@ -586,6 +602,15 @@ func buildGoWrapper(component ComponentDefinition, w LanguageWriter) error { w.Writeln(" \"fmt\"") w.Writeln(" \"unsafe\"") w.Writeln(" \"runtime\"") + + if len(component.ImportedComponentDefinitions) > 0 { + w.Writeln(" // Injected Components") + for _, subComponent := range(component.ImportedComponentDefinitions) { + subNameSpace := subComponent.NameSpace + w.Writeln(" \"../%s\"", subNameSpace) + } + } + w.Writeln(")") w.Writeln("") w.Writeln("type ref = C.%sHandle", component.NameSpace) @@ -608,7 +633,7 @@ func buildGoWrapper(component ComponentDefinition, w LanguageWriter) error { w.Writeln("// Wrapper represents the number wrapper") w.Writeln("type Wrapper struct {") w.Writeln(" _ [0]func() // uncomparable; to make == not compile") - w.Writeln(" LibraryHandle ref") + w.Writeln(" LibraryHandle C.%sHandle", component.NameSpace) w.Writeln("}") for _, class := range component.Classes { @@ -724,7 +749,7 @@ func getGoType(paramType, namespace, paramClass, paramName string, isPtr bool) ( tp.Type = ptrStr + "string" tp.CType = ptrStr + "*C.char" tp.CToGo = "" - tp.GoToC = fmt.Sprintf("(%s)(unsafe.Pointer(&[]byte(%s)[0]))", tp.CType, paramName) + tp.GoToC = fmt.Sprintf("C.CString(%s)", paramName) tp.Empty = "\"\"" case "pointer": tp.Type = "uint64" @@ -936,7 +961,7 @@ func writeGoMethod(method ComponentDefinitionMethod, w LanguageWriter, NameSpace implmethodname := "C.CCall_" + packageName + "_" returnValues = append(returnValues, "nil") classReturnTypes = append(classReturnTypes, "error") - errorReturn = append(errorReturn, "makeError(uint32(ret))") + errorReturn = append(errorReturn, "makeError(uint32(returnValue))") var returnString string if len(classReturnTypes) == 1 { @@ -961,12 +986,12 @@ func writeGoMethod(method ComponentDefinitionMethod, w LanguageWriter, NameSpace retInst := ":" if requiresInitCall { if isGlobal { - w.Writeln(" ret := %s(wrapper.LibraryHandle, %s)", implmethodname, strings.Join(initCallParameters, ", ")) + w.Writeln(" returnValue := %s(wrapper.LibraryHandle, %s)", implmethodname, strings.Join(initCallParameters, ", ")) } else { - w.Writeln(" ret := %s(inst.wrapperRef.LibraryHandle, %s)", implmethodname, strings.Join(initCallParameters, ", ")) + w.Writeln(" returnValue := %s(inst.wrapperRef.LibraryHandle, %s)", implmethodname, strings.Join(initCallParameters, ", ")) } - w.Writeln(" if ret != 0 {") + w.Writeln(" if returnValue != 0 {") w.Writeln(" return %s", strings.Join(errorReturn, ", ")) w.Writeln(" }") w.Writelns(" ", initCallLines) @@ -974,12 +999,12 @@ func writeGoMethod(method ComponentDefinitionMethod, w LanguageWriter, NameSpace } if isGlobal { - w.Writeln(" ret %s= %s(wrapper.LibraryHandle, %s)", retInst, implmethodname, strings.Join(callParameters, ", ")) + w.Writeln(" returnValue %s= %s(wrapper.LibraryHandle, %s)", retInst, implmethodname, strings.Join(callParameters, ", ")) } else { - w.Writeln(" ret %s= %s(inst.wrapperRef.LibraryHandle, %s)", retInst, implmethodname, strings.Join(callParameters, ", ")) + w.Writeln(" returnValue %s= %s(inst.wrapperRef.LibraryHandle, %s)", retInst, implmethodname, strings.Join(callParameters, ", ")) } - w.Writeln(" if ret != 0 {") + w.Writeln(" if returnValue != 0 {") w.Writeln(" return %s", strings.Join(errorReturn, ", ")) w.Writeln(" }") w.Writelns(" ", preOKReturn) From af7ef08ad34735612b754898f41570dfc8878f11 Mon Sep 17 00:00:00 2001 From: Alexander Oster Date: Wed, 19 Aug 2020 17:53:53 +0200 Subject: [PATCH 2/2] Fixed Linux Go Header generation --- Source/buildbindingccpp.go | 1 + Source/buildbindinggo.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Source/buildbindingccpp.go b/Source/buildbindingccpp.go index 7e5798a7..6ed30a18 100644 --- a/Source/buildbindingccpp.go +++ b/Source/buildbindingccpp.go @@ -1129,6 +1129,7 @@ func buildCppHeader(component ComponentDefinition, w LanguageWriter, NameSpace s w.Writeln("#include ") w.Writeln("#else // _WIN32") w.Writeln("#include ") + w.Writeln("#include ") w.Writeln("#endif // _WIN32") w.Writeln("#include ") w.Writeln("#include ") diff --git a/Source/buildbindinggo.go b/Source/buildbindinggo.go index ee65a644..4ddc34d1 100644 --- a/Source/buildbindinggo.go +++ b/Source/buildbindinggo.go @@ -533,6 +533,8 @@ func buildGoWrapper(component ComponentDefinition, w LanguageWriter) error { w.Writeln("package %s", packageName) w.Writeln("") w.Writeln("/*") + w.Writeln("#cgo linux LDFLAGS: -ldl") + w.Writeln("#include ") w.Writeln("#include \"%s_dynamic.cc\"", packageName) w.Writeln("")