detecting polymorphic virtual methods properly
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5511 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
634b973f31
commit
833b2f7f0a
6 changed files with 206 additions and 3 deletions
|
|
@ -111,6 +111,7 @@ CPP_TEST_CASES += \
|
|||
director_abstract \
|
||||
director_basic \
|
||||
director_exception \
|
||||
director_detect \
|
||||
director_finalizer \
|
||||
director_unroll \
|
||||
director_wombat \
|
||||
|
|
|
|||
65
Examples/test-suite/director_detect.i
Normal file
65
Examples/test-suite/director_detect.i
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
%module(directors="1") director_detect
|
||||
|
||||
%{
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
%}
|
||||
|
||||
%include "std_string.i"
|
||||
|
||||
%feature("director") Bar;
|
||||
|
||||
%newobject Foo::cloner();
|
||||
%newobject Bar::cloner();
|
||||
|
||||
|
||||
%inline {
|
||||
namespace foo { typedef int Int; }
|
||||
|
||||
struct A
|
||||
{
|
||||
};
|
||||
|
||||
typedef A B;
|
||||
|
||||
struct Foo {
|
||||
virtual ~Foo() {}
|
||||
virtual Foo* cloner() = 0;
|
||||
virtual int get_value() = 0;
|
||||
virtual A* get_class() = 0;
|
||||
|
||||
virtual void just_do_it() = 0;
|
||||
};
|
||||
|
||||
class Bar : public Foo
|
||||
{
|
||||
public:
|
||||
Foo* base()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
Bar* cloner()
|
||||
{
|
||||
return new Bar();
|
||||
}
|
||||
|
||||
|
||||
foo::Int get_value()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
B* get_class()
|
||||
{
|
||||
return new B();
|
||||
}
|
||||
|
||||
void just_do_it()
|
||||
{
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
36
Examples/test-suite/python/director_detect_runme.py
Normal file
36
Examples/test-suite/python/director_detect_runme.py
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
import director_detect
|
||||
|
||||
class MyBar(director_detect.Bar):
|
||||
def __init__(self, val = 2):
|
||||
director_detect.Bar.__init__(self)
|
||||
self.val = val
|
||||
|
||||
def get_value(self):
|
||||
self.val += 1
|
||||
return self.val
|
||||
|
||||
def get_class(self):
|
||||
self.val += 1
|
||||
return director_detect.A()
|
||||
|
||||
def just_do_it(self):
|
||||
self.val += 1
|
||||
|
||||
def clone(self):
|
||||
return MyBar(self.val)
|
||||
pass
|
||||
|
||||
|
||||
b = MyBar()
|
||||
|
||||
f = b.base()
|
||||
|
||||
v = f.get_value()
|
||||
a = f.get_class()
|
||||
f.just_do_it()
|
||||
|
||||
c = b.clone()
|
||||
vc = c.get_value()
|
||||
|
||||
if (v != 3) or (b.val != 5) or (vc != 6):
|
||||
raise RuntimeError,"Bad virtual detection"
|
||||
43
Examples/test-suite/ruby/director_detect_runme.rb
Normal file
43
Examples/test-suite/ruby/director_detect_runme.rb
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
require 'director_detect'
|
||||
|
||||
class MyBar < Director_detect::Bar
|
||||
def initialize(v)
|
||||
@val = v
|
||||
end
|
||||
|
||||
def get_value
|
||||
@val = @val + 1
|
||||
end
|
||||
|
||||
def get_class
|
||||
@val = @val + 1
|
||||
Director_detect::A
|
||||
end
|
||||
|
||||
def just_do_it
|
||||
@val = @val + 1
|
||||
end
|
||||
|
||||
def clone
|
||||
MyBar.new(@val)
|
||||
end
|
||||
|
||||
def val
|
||||
@val
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
b = MyBar.new(2)
|
||||
|
||||
f = b
|
||||
|
||||
v = f.get_value
|
||||
a = f.get_class
|
||||
f.just_do_it
|
||||
|
||||
c = b.clone
|
||||
vc = c.get_value
|
||||
|
||||
raise RuntimeError if (v != 3) || (b.val != 5) || (vc != 6)
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue