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_nested \
|
||||||
director_protected \
|
director_protected \
|
||||||
director_redefined \
|
director_redefined \
|
||||||
|
director_string \
|
||||||
director_unroll \
|
director_unroll \
|
||||||
director_wombat \
|
director_wombat \
|
||||||
dynamic_cast \
|
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;
|
$result = *ptr;
|
||||||
if (res == SWIG_NEWOBJ) delete 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;
|
__VA_ARGS__ *ptr = 0;
|
||||||
int res = asptr_meth($input, &ptr);
|
int res = asptr_meth($input, &ptr);
|
||||||
if (!res || !ptr)
|
if (!res || !ptr)
|
||||||
throw Swig::DirectorTypeMismatchException("Error converting Python object using asptr_meth");
|
throw Swig::DirectorTypeMismatchException("Error converting Python object using asptr_meth");
|
||||||
temp = *ptr;
|
static $*1_ltype temp = *ptr;
|
||||||
$result = &temp;
|
$result = &temp;
|
||||||
if (res == SWIG_NEWOBJ) delete ptr;
|
if (res == SWIG_NEWOBJ) delete ptr;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -69,9 +69,9 @@ namespace std {
|
||||||
throw Swig::DirectorTypeMismatchException("string expected");
|
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) {
|
if (TYPE($input) == T_STRING) {
|
||||||
temp = std::string(StringValuePtr($input));
|
static std::string temp = std::string(StringValuePtr($input));
|
||||||
$result = &temp;
|
$result = &temp;
|
||||||
} else {
|
} else {
|
||||||
throw Swig::DirectorTypeMismatchException("string expected");
|
throw Swig::DirectorTypeMismatchException("string expected");
|
||||||
|
|
|
||||||
|
|
@ -146,7 +146,8 @@
|
||||||
#define WARN_TYPEMAP_VAR_UNDEF 466
|
#define WARN_TYPEMAP_VAR_UNDEF 466
|
||||||
#define WARN_TYPEMAP_TYPECHECK 467
|
#define WARN_TYPEMAP_TYPECHECK 467
|
||||||
#define WARN_TYPEMAP_THROW 468
|
#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 -- */
|
/* -- General code generation -- */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue