swig -go: treat non-const references as pointers

Also clean up the handling of int* and int& to convert between the C
type int and the Go type int, which are often different sizes.

Fixes #2210
This commit is contained in:
Ian Lance Taylor 2022-03-05 21:57:36 -08:00
commit 27bdbc1f05
4 changed files with 115 additions and 19 deletions

View file

@ -2,6 +2,8 @@
%module(directors="1") go_director_inout
%include <std_string.i>
%{
#include <string>
%}
@ -108,6 +110,25 @@ type GoRetStruct struct {
$1.str.assign($input.p, $input.n);
%}
%typemap(directorin) std::string & (_gostring_ temp) {
$input = &temp;
temp.p = (char *) $1.data();
temp.n = $1.size();
}
%typemap(directorargout) std::string & {
_gostring_ *tmp = $input;
$1.assign(tmp->p, tmp->p + tmp->n);
}
%typemap(directorin) std::string * (_gostring_ temp) {
$input = &temp;
$input->p = (char *) $1->data();
$input->n = $1->size();
}
%typemap(directorargout) std::string * {
$1->assign($input->p, $input->p + $input->n);
}
%feature("director") MyClass;
%inline
@ -121,6 +142,10 @@ class MyClass {
r.str = s.str;
return r;
}
virtual void S1(std::string s) = 0;
virtual void S2(std::string& s) = 0;
virtual void S3(std::string* s) = 0;
};
%}