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