longer as of Go 1.5. In Go 1.5 or later user calls to _swig_makegostring will fail at link time. Instead, use goout and godirectorin typemaps to allocate strings in Go code. Change the Go typemaps support to ignore empty strings, so that we can define empty strings for regular types so that %apply will override the definitions for string types. Fix the gccgo code to wrap SwigCgoCallback around all godirectorin typemaps. Add a few newlines after typemap code so that the typemaps don't have to include them.
29 lines
851 B
Text
29 lines
851 B
Text
/* ------------------------------------------------------------
|
|
* gostring.swg
|
|
*
|
|
* Support for returning strings from C to Go.
|
|
* ------------------------------------------------------------ */
|
|
|
|
// C/C++ code to convert a memory buffer into a Go string allocated in
|
|
// C/C++ memory.
|
|
%fragment("AllocateString", "runtime") %{
|
|
static _gostring_ Swig_AllocateString(const char *p, size_t l) {
|
|
_gostring_ ret;
|
|
ret.p = (char*)malloc(l);
|
|
memcpy(ret.p, p, l);
|
|
ret.n = l;
|
|
return ret;
|
|
}
|
|
%}
|
|
|
|
// Go code to convert a string allocated in C++ memory to one
|
|
// allocated in Go memory.
|
|
%fragment("CopyString", "go_runtime") %{
|
|
type swig_gostring struct { p uintptr; n int }
|
|
func swigCopyString(s string) string {
|
|
p := *(*swig_gostring)(unsafe.Pointer(&s))
|
|
r := string((*[0x7fffffff]byte)(unsafe.Pointer(p.p))[:p.n])
|
|
Swig_free(p.p)
|
|
return r
|
|
}
|
|
%}
|