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:
Marcelo Matus 2003-12-09 10:36:15 +00:00
commit 833b2f7f0a
6 changed files with 206 additions and 3 deletions

View file

@ -111,6 +111,7 @@ CPP_TEST_CASES += \
director_abstract \
director_basic \
director_exception \
director_detect \
director_finalizer \
director_unroll \
director_wombat \

View 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()
{
}
};
}

View 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"

View 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)