fix directorout typemap for const std::string&. Adding warning about the new typemap, which is not thread safe

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6872 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2004-12-13 20:22:19 +00:00
commit c98340f0a7
7 changed files with 73 additions and 5 deletions

View file

@ -119,6 +119,7 @@ CPP_TEST_CASES += \
director_nested \
director_protected \
director_redefined \
director_string \
director_unroll \
director_wombat \
dynamic_cast \

View file

@ -0,0 +1,36 @@
%module(directors="1") director_string;
%include stl.i
%include std_vector.i
%include std_string.i
// Using thread unsafe wrapping
%warnfilter(470) A;
%{
#include <vector>
#include <string>
%}
%feature("director") A;
%inline %{
struct A
{
A(const std::string& first)
: m_strings(1, first)
{}
virtual ~A() {}
virtual const std::string& get_first() const
{ return get(0); }
virtual const std::string& get(int n) const
{ return m_strings.at(n); }
std::vector<std::string> m_strings;
};
%}
%template(StringVector) std::vector<std::string>;

View file

@ -0,0 +1,12 @@
from director_string import *
class B(A):
def __init__(self,string):
A.__init__(self,string)
b = B("hello")
b.get(0)
b.get_first()

View file

@ -0,0 +1,18 @@
require 'director_string'
require 'test/unit'
include Director_string
class B < A
def initialize(some_string)
super(some_string)
end
end
b = B.new("hello")
b.get_first
b.get(0)

View file

@ -77,12 +77,12 @@
$result = *ptr;
if (res == SWIG_NEWOBJ) delete ptr;
}
%typemap(directorout,fragment=pyfrag) const __VA_ARGS__& ($*1_ltype temp) {
%typemap(directorout,fragment=pyfrag,warning="470:Using thread unsafe wrapping, consider using a lvalue return type.") const __VA_ARGS__& {
__VA_ARGS__ *ptr = 0;
int res = asptr_meth($input, &ptr);
if (!res || !ptr)
throw Swig::DirectorTypeMismatchException("Error converting Python object using asptr_meth");
temp = *ptr;
static $*1_ltype temp = *ptr;
$result = &temp;
if (res == SWIG_NEWOBJ) delete ptr;
}

View file

@ -69,9 +69,9 @@ namespace std {
throw Swig::DirectorTypeMismatchException("string expected");
}
%typemap(directorout) const string & (std::string temp) {
%typemap(directorout,warning="470:Using thread unsafe wrapping, consider using a lvalue return type.") const string & {
if (TYPE($input) == T_STRING) {
temp = std::string(StringValuePtr($input));
static std::string temp = std::string(StringValuePtr($input));
$result = &temp;
} else {
throw Swig::DirectorTypeMismatchException("string expected");

View file

@ -146,7 +146,8 @@
#define WARN_TYPEMAP_VAR_UNDEF 466
#define WARN_TYPEMAP_TYPECHECK 467
#define WARN_TYPEMAP_THROW 468
#define WARN_TYPEMAP_DIRECTORIN_UNDEF 469
#define WARN_TYPEMAP_DIRECTORIN_UNDEF 469
#define WARN_TYPEMAP_THREAD_UNSAFE 470
/* -- General code generation -- */