mirror of
https://github.com/mappu/miqt.git
synced 2024-12-22 08:58:37 +00:00
genbindings: pass miqt_array in CABI by value
This commit is contained in:
parent
addde79d58
commit
b53707c7cf
@ -15,10 +15,10 @@ func (p CppParameter) RenderTypeCabi() string {
|
||||
return "struct miqt_string"
|
||||
|
||||
} else if _, ok := p.QListOf(); ok {
|
||||
return "struct miqt_array*"
|
||||
return "struct miqt_array"
|
||||
|
||||
} else if _, ok := p.QSetOf(); ok {
|
||||
return "struct miqt_array*"
|
||||
return "struct miqt_array"
|
||||
|
||||
} else if (p.Pointer || p.ByRef) && p.QtClassType() {
|
||||
return cabiClassName(p.ParameterType) + "*"
|
||||
@ -155,10 +155,10 @@ func emitParametersCabi(m CppMethod, selfType string) string {
|
||||
tmp = append(tmp, "struct miqt_string "+p.ParameterName)
|
||||
|
||||
} else if t, ok := p.QListOf(); ok {
|
||||
tmp = append(tmp, "struct miqt_array* /* of "+t.RenderTypeCabi()+" */ "+p.ParameterName)
|
||||
tmp = append(tmp, "struct miqt_array /* of "+t.RenderTypeCabi()+" */ "+p.ParameterName)
|
||||
|
||||
} else if t, ok := p.QSetOf(); ok {
|
||||
tmp = append(tmp, "struct miqt_array* /* Set of "+t.RenderTypeCabi()+" */ "+p.ParameterName)
|
||||
tmp = append(tmp, "struct miqt_array /* Set of "+t.RenderTypeCabi()+" */ "+p.ParameterName)
|
||||
|
||||
} else if p.QtClassType() {
|
||||
if p.ByRef || p.Pointer {
|
||||
@ -218,10 +218,10 @@ func emitCABI2CppForwarding(p CppParameter, indent string) (preamble string, for
|
||||
} else if listType, ok := p.QListOf(); ok {
|
||||
|
||||
preamble += indent + p.GetQtCppType().ParameterType + " " + nameprefix + "_QList;\n"
|
||||
preamble += indent + nameprefix + "_QList.reserve(" + p.ParameterName + "->len);\n"
|
||||
preamble += indent + nameprefix + "_QList.reserve(" + p.ParameterName + ".len);\n"
|
||||
|
||||
preamble += indent + listType.RenderTypeCabi() + "* " + nameprefix + "_arr = static_cast<" + listType.RenderTypeCabi() + "*>(" + p.ParameterName + "->data);\n"
|
||||
preamble += indent + "for(size_t i = 0; i < " + p.ParameterName + "->len; ++i) {\n"
|
||||
preamble += indent + listType.RenderTypeCabi() + "* " + nameprefix + "_arr = static_cast<" + listType.RenderTypeCabi() + "*>(" + p.ParameterName + ".data);\n"
|
||||
preamble += indent + "for(size_t i = 0; i < " + p.ParameterName + ".len; ++i) {\n"
|
||||
|
||||
listType.ParameterName = nameprefix + "_arr[i]"
|
||||
addPre, addFwd := emitCABI2CppForwarding(listType, indent+"\t")
|
||||
@ -362,9 +362,9 @@ func emitAssignCppToCabi(assignExpression string, p CppParameter, rvalue string)
|
||||
afterCall += emitAssignCppToCabi(indent+"\t"+namePrefix+"_arr[i] = ", t, namePrefix+"_ret[i]")
|
||||
afterCall += indent + "}\n"
|
||||
|
||||
afterCall += indent + "struct miqt_array* " + namePrefix + "_out = static_cast<struct miqt_array*>(malloc(sizeof(struct miqt_array)));\n"
|
||||
afterCall += indent + "" + namePrefix + "_out->len = " + namePrefix + "_ret.length();\n"
|
||||
afterCall += indent + "" + namePrefix + "_out->data = static_cast<void*>(" + namePrefix + "_arr);\n"
|
||||
afterCall += indent + "struct miqt_array " + namePrefix + "_out;\n"
|
||||
afterCall += indent + "" + namePrefix + "_out.len = " + namePrefix + "_ret.length();\n"
|
||||
afterCall += indent + "" + namePrefix + "_out.data = static_cast<void*>(" + namePrefix + "_arr);\n"
|
||||
|
||||
afterCall += indent + assignExpression + "" + namePrefix + "_out;\n"
|
||||
|
||||
@ -380,9 +380,9 @@ func emitAssignCppToCabi(assignExpression string, p CppParameter, rvalue string)
|
||||
afterCall += emitAssignCppToCabi(indent+"\t"+namePrefix+"_arr["+namePrefix+"_ctr++] = ", t, namePrefix+"_itr.next()")
|
||||
afterCall += indent + "}\n"
|
||||
|
||||
afterCall += indent + "struct miqt_array* " + namePrefix + "_out = static_cast<struct miqt_array*>(malloc(sizeof(struct miqt_array)));\n"
|
||||
afterCall += indent + "" + namePrefix + "_out->len = " + namePrefix + "_ret.size();\n"
|
||||
afterCall += indent + "" + namePrefix + "_out->data = static_cast<void*>(" + namePrefix + "_arr);\n"
|
||||
afterCall += indent + "struct miqt_array " + namePrefix + "_out;\n"
|
||||
afterCall += indent + "" + namePrefix + "_out.len = " + namePrefix + "_ret.size();\n"
|
||||
afterCall += indent + "" + namePrefix + "_out.data = static_cast<void*>(" + namePrefix + "_arr);\n"
|
||||
|
||||
afterCall += indent + assignExpression + "" + namePrefix + "_out;\n"
|
||||
|
||||
|
@ -154,11 +154,11 @@ func (p CppParameter) parameterTypeCgo() string {
|
||||
}
|
||||
|
||||
if _, ok := p.QListOf(); ok {
|
||||
return "*C.struct_miqt_array"
|
||||
return "C.struct_miqt_array"
|
||||
}
|
||||
|
||||
if _, ok := p.QSetOf(); ok {
|
||||
return "*C.struct_miqt_array"
|
||||
return "C.struct_miqt_array"
|
||||
}
|
||||
|
||||
tmp := strings.Replace(p.RenderTypeCabi(), `*`, "", -1)
|
||||
@ -298,7 +298,6 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
|
||||
// Go: convert T[] -> t* and len
|
||||
// CABI: create a real QList<>
|
||||
|
||||
gfs.imports["runtime"] = struct{}{}
|
||||
gfs.imports["unsafe"] = struct{}{}
|
||||
|
||||
mallocSize := listType.mallocSizeCgoExpression()
|
||||
@ -314,8 +313,7 @@ func (gfs *goFileState) emitParameterGo2CABIForwarding(p CppParameter) (preamble
|
||||
preamble += nameprefix + "_CArray[i] = " + innerRvalue + "\n"
|
||||
preamble += "}\n"
|
||||
|
||||
preamble += p.ParameterName + "_ma := &C.struct_miqt_array{len: C.size_t(len(" + p.ParameterName + ")), data: unsafe.Pointer(" + nameprefix + "_CArray)}\n"
|
||||
preamble += "defer runtime.KeepAlive(unsafe.Pointer(" + nameprefix + "_ma))\n"
|
||||
preamble += p.ParameterName + "_ma := C.struct_miqt_array{len: C.size_t(len(" + p.ParameterName + ")), data: unsafe.Pointer(" + nameprefix + "_CArray)}\n"
|
||||
|
||||
rvalue = p.ParameterName + "_ma"
|
||||
|
||||
@ -413,7 +411,7 @@ func (gfs *goFileState) emitCabiToGo(assignExpr string, rt CppParameter, rvalue
|
||||
} else if t, ok := rt.QListOf(); ok {
|
||||
gfs.imports["unsafe"] = struct{}{}
|
||||
|
||||
shouldReturn = "var " + namePrefix + "_ma *C.struct_miqt_array = "
|
||||
shouldReturn = "var " + namePrefix + "_ma C.struct_miqt_array = "
|
||||
|
||||
afterword += namePrefix + "_ret := make([]" + t.RenderTypeGo(gfs) + ", int(" + namePrefix + "_ma.len))\n"
|
||||
afterword += namePrefix + "_outCast := (*[0xffff]" + t.parameterTypeCgo() + ")(unsafe.Pointer(" + namePrefix + "_ma.data)) // hey ya\n"
|
||||
@ -422,7 +420,6 @@ func (gfs *goFileState) emitCabiToGo(assignExpr string, rt CppParameter, rvalue
|
||||
afterword += gfs.emitCabiToGo(namePrefix+"_ret[i] = ", t, namePrefix+"_outCast[i]")
|
||||
|
||||
afterword += "}\n"
|
||||
afterword += "C.free(unsafe.Pointer(" + namePrefix + "_ma))\n"
|
||||
afterword += assignExpr + " " + namePrefix + "_ret\n"
|
||||
return shouldReturn + " " + rvalue + "\n" + afterword
|
||||
|
||||
@ -430,7 +427,7 @@ func (gfs *goFileState) emitCabiToGo(assignExpr string, rt CppParameter, rvalue
|
||||
|
||||
gfs.imports["unsafe"] = struct{}{}
|
||||
|
||||
shouldReturn = "var " + namePrefix + "_ma *C.struct_miqt_array = "
|
||||
shouldReturn = "var " + namePrefix + "_ma C.struct_miqt_array = "
|
||||
|
||||
afterword += namePrefix + "_ret := make(map[" + t.RenderTypeGo(gfs) + "]struct{}, int(" + namePrefix + "_ma.len))\n"
|
||||
afterword += namePrefix + "_outCast := (*[0xffff]" + t.parameterTypeCgo() + ")(unsafe.Pointer(" + namePrefix + "_ma.data)) // hey ya\n"
|
||||
@ -440,7 +437,6 @@ func (gfs *goFileState) emitCabiToGo(assignExpr string, rt CppParameter, rvalue
|
||||
afterword += namePrefix + "_ret[" + namePrefix + "_element] = struct{}{}\n"
|
||||
|
||||
afterword += "}\n"
|
||||
afterword += "C.free(unsafe.Pointer(" + namePrefix + "_ma))\n"
|
||||
afterword += assignExpr + " " + namePrefix + "_ret\n"
|
||||
return shouldReturn + " " + rvalue + "\n" + afterword
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user