[Go] Fixes for Go 1.6: avoid returning Go pointers from

directors that return string values; add a trailing 0 byte
when treating Go string as C char*.
This commit is contained in:
Ian Lance Taylor 2016-04-17 17:52:09 -07:00
commit 223c2a4835
7 changed files with 81 additions and 7 deletions

View file

@ -435,10 +435,22 @@
%typemap(in)
char *, char[ANY], char[]
%{ $1 = ($1_ltype)$input.p; %}
%{
$1 = ($1_ltype)malloc($input.n + 1);
memcpy($1, $input.p, $input.n);
$1[$input.n] = '\0';
%}
%typemap(in) char *&
%{ $1 = ($1_ltype)$input.p; %}
%{
$1 = ($1_ltype)malloc($input.n + 1);
memcpy($1, $input.p, $input.n);
$1[$input.n] = '\0';
%}
%typemap(freearg)
char *, char *&, char[ANY], char[]
%{ free($1); %}
%typemap(out,fragment="AllocateString")
char *, char *&, char[ANY], char[]
@ -460,7 +472,19 @@
$result = swigCopyString($input)
%}
%typemap(directorout)
%typemap(godirectorout)
char *, char *&, char[ANY], char[]
%{
{
p := Swig_malloc(len($input) + 1)
s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input) + 1]
copy(s, $input)
s[len($input)] = 0
$result = *(*string)(unsafe.Pointer(&s))
}
%}
%typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG)
char *, char *&, char[ANY], char[]
%{ $result = ($1_ltype)$input.p; %}

View file

@ -8,6 +8,10 @@
static void Swig_free(void* p) {
free(p);
}
static void* Swig_malloc(int c) {
return malloc(c);
}
%}
%insert(runtime) %{

View file

@ -24,8 +24,21 @@ class string;
%typemap(in) string
%{ $1.assign($input.p, $input.n); %}
%typemap(godirectorout) string
%{
{
p := Swig_malloc(len($input))
s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input)]
copy(s, $input)
$result = *(*string)(unsafe.Pointer(&s))
}
%}
%typemap(directorout) string
%{ $result.assign($input.p, $input.n); %}
%{
$result.assign($input.p, $input.n);
free($input.p);
%}
%typemap(out,fragment="AllocateString") string
%{ $result = Swig_AllocateString($1.data(), $1.length()); %}
@ -45,10 +58,21 @@ class string;
$1 = &$1_str;
%}
%typemap(godirectorout) const string &
%{
{
p := Swig_malloc(len($input))
s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input)]
copy(s, $input)
$result = *(*string)(unsafe.Pointer(&s))
}
%}
%typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string &
%{
static $*1_ltype $1_str;
$1_str.assign($input.p, $input.n);
free($input.p);
$result = &$1_str;
%}