diff --git a/cmd/genbindings/emitcabi.go b/cmd/genbindings/emitcabi.go index 3020f423..e60065e4 100644 --- a/cmd/genbindings/emitcabi.go +++ b/cmd/genbindings/emitcabi.go @@ -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(malloc(sizeof(struct miqt_array)));\n" - afterCall += indent + "" + namePrefix + "_out->len = " + namePrefix + "_ret.length();\n" - afterCall += indent + "" + namePrefix + "_out->data = static_cast(" + 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(" + 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(malloc(sizeof(struct miqt_array)));\n" - afterCall += indent + "" + namePrefix + "_out->len = " + namePrefix + "_ret.size();\n" - afterCall += indent + "" + namePrefix + "_out->data = static_cast(" + 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(" + namePrefix + "_arr);\n" afterCall += indent + assignExpression + "" + namePrefix + "_out;\n" diff --git a/cmd/genbindings/emitgo.go b/cmd/genbindings/emitgo.go index 6e0ac66e..073cb62c 100644 --- a/cmd/genbindings/emitgo.go +++ b/cmd/genbindings/emitgo.go @@ -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