mirror of
https://github.com/mappu/miqt.git
synced 2024-12-23 01:18:37 +00:00
genbindings: basic support for QList<> of non qt pointer type
This commit is contained in:
parent
9a78d87e00
commit
a579f80d34
@ -9,6 +9,8 @@ import (
|
||||
func (p CppParameter) RenderTypeCpp() string {
|
||||
ret := p.ParameterType
|
||||
switch p.ParameterType {
|
||||
case "uchar":
|
||||
ret = "unsigned char"
|
||||
case "uint":
|
||||
ret = "unsigned int"
|
||||
case "ulong":
|
||||
@ -31,6 +33,8 @@ func (p CppParameter) RenderTypeCpp() string {
|
||||
ret = "uint64_t"
|
||||
case "qfloat16":
|
||||
ret = "_Float16" // No idea where this typedef comes from, but it exists
|
||||
case "qsizetype":
|
||||
ret = "size_t"
|
||||
case "QRgb":
|
||||
ret = "unsigned int"
|
||||
}
|
||||
@ -84,8 +88,7 @@ func emitParametersCabi(m CppMethod, selfType string) string {
|
||||
} else {
|
||||
// The Go code has called this with two arguments: T* and len
|
||||
// Declare that we take two parameters
|
||||
// TODO support QList<int>
|
||||
tmp = append(tmp, t.ParameterType+"* "+p.ParameterName+", size_t "+p.ParameterName+"_len")
|
||||
tmp = append(tmp, t.RenderTypeCpp()+"* "+p.ParameterName+", size_t "+p.ParameterName+"_len")
|
||||
}
|
||||
|
||||
} else if (p.ByRef || p.Pointer) && p.QtClassType() {
|
||||
@ -114,7 +117,7 @@ func emitParametersCabi(m CppMethod, selfType string) string {
|
||||
tmp = append(tmp, "char** _out, size_t* _out_Strlen")
|
||||
|
||||
} else if t, ok := m.ReturnType.QListOf(); ok {
|
||||
tmp = append(tmp, t.ParameterType+"** _out, size_t* _out_len")
|
||||
tmp = append(tmp, t.RenderTypeCpp()+"** _out, size_t* _out_len")
|
||||
|
||||
}
|
||||
|
||||
|
@ -91,6 +91,14 @@ func (p CppParameter) RenderTypeGo() string {
|
||||
return ret // ignore const
|
||||
}
|
||||
|
||||
func (p CppParameter) parameterTypeCgo() string {
|
||||
tmp := strings.Replace(p.RenderTypeCpp(), `*`, "", -1)
|
||||
if strings.HasPrefix(tmp, "unsigned ") {
|
||||
tmp = "u" + tmp[9:] // Cgo uses uchar, uint instead of full name
|
||||
}
|
||||
return "C." + strings.Replace(tmp, " ", "_", -1)
|
||||
}
|
||||
|
||||
func emitParametersGo(params []CppParameter) string {
|
||||
tmp := make([]string, 0, len(params))
|
||||
for _, p := range params {
|
||||
@ -121,8 +129,8 @@ func emitParametersGo2CABIForwarding(m CppMethod) (preamble string, fowarding st
|
||||
// Combo
|
||||
|
||||
preamble += "// For the C ABI, malloc two C arrays; raw char* pointers and their lengths\n"
|
||||
preamble += p.ParameterName + "_CArray := (*[0xffff]*C." + listType.ParameterType + ")(C.malloc(c.ulong(8 * len(" + p.ParameterName + "))))\n"
|
||||
preamble += p.ParameterName + "_Lengths := (*[0xffff]*C." + listType.ParameterType + ")(C.malloc(c.ulong(8 * len(" + p.ParameterName + "))))\n"
|
||||
preamble += p.ParameterName + "_CArray := (*[0xffff]*" + listType.parameterTypeCgo() + ")(C.malloc(c.ulong(8 * len(" + p.ParameterName + "))))\n"
|
||||
preamble += p.ParameterName + "_Lengths := (*[0xffff]*C.size_t)(C.malloc(c.ulong(8 * len(" + p.ParameterName + "))))\n"
|
||||
preamble += "defer C.free(" + p.ParameterName + "_CArray)\n"
|
||||
preamble += "defer C.free(" + p.ParameterName + "_Lengths)\n"
|
||||
preamble += "for i := range " + p.ParameterName + "{\n"
|
||||
@ -136,10 +144,8 @@ func emitParametersGo2CABIForwarding(m CppMethod) (preamble string, fowarding st
|
||||
|
||||
} else {
|
||||
|
||||
// TODO handle QList<int>
|
||||
|
||||
preamble += "// For the C ABI, malloc a C array of raw pointers\n"
|
||||
preamble += p.ParameterName + "_CArray := (*[0xffff]*C." + listType.ParameterType + ")(C.malloc(c.ulong(8 * len(" + p.ParameterName + "))))\n"
|
||||
preamble += p.ParameterName + "_CArray := (*[0xffff]*" + listType.parameterTypeCgo() + ")(C.malloc(c.ulong(8 * len(" + p.ParameterName + "))))\n"
|
||||
preamble += "defer C.free(" + p.ParameterName + "_CArray)\n"
|
||||
preamble += "for i := range " + p.ParameterName + "{\n"
|
||||
preamble += p.ParameterName + "_CArray[i] = " + p.ParameterName + "[i].cPointer()\n"
|
||||
@ -277,7 +283,7 @@ import "C"
|
||||
shouldReturn = ""
|
||||
returnTypeDecl = "[]" + t.RenderTypeGo()
|
||||
|
||||
preamble += "var _out **C." + t.ParameterType + " = nil\n"
|
||||
preamble += "var _out **" + t.parameterTypeCgo() + " = nil\n"
|
||||
preamble += "var _out_len C.size_t = 0\n"
|
||||
afterword += "ret := make([]" + t.RenderTypeGo() + ", _out_Strlen)\n"
|
||||
afterword += "for i := 0; i < _out_len; i++ {\n"
|
||||
|
Loading…
Reference in New Issue
Block a user