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:
parent
89bdd6f63b
commit
c98340f0a7
7 changed files with 73 additions and 5 deletions
|
|
@ -119,6 +119,7 @@ CPP_TEST_CASES += \
|
|||
director_nested \
|
||||
director_protected \
|
||||
director_redefined \
|
||||
director_string \
|
||||
director_unroll \
|
||||
director_wombat \
|
||||
dynamic_cast \
|
||||
|
|
|
|||
36
Examples/test-suite/director_string.i
Normal file
36
Examples/test-suite/director_string.i
Normal 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>;
|
||||
12
Examples/test-suite/python/director_string_runme.py
Normal file
12
Examples/test-suite/python/director_string_runme.py
Normal 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()
|
||||
18
Examples/test-suite/ruby/director_string_runme.rb
Normal file
18
Examples/test-suite/ruby/director_string_runme.rb
Normal 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)
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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 -- */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue