Merge branch 'tomhenderson-castxml'
This commit is contained in:
commit
ef30ba23dd
11 files changed
+2578
-75
No files matched your search
@@ -17,4 +17,8 @@ doc/figures/work-flow-gccxml.png
|
||||
.eggs/
|
||||
PyBindGen.egg-info/
|
||||
dist/
|
||||
.venv/
|
||||
/foomodulegen3.pstat
|
||||
/foomodulegen4.pstat
|
||||
/hellomodulegen.pstat
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -33,7 +33,7 @@ class CodeSink(object):
|
||||
if (true) {
|
||||
bar();
|
||||
zbr();
|
||||
|
||||
|
||||
>>> sink = MemoryCodeSink()
|
||||
>>> sink.writeln("foo();")
|
||||
>>> sink.writeln()
|
||||
@@ -97,6 +97,10 @@ class FileCodeSink(CodeSink):
|
||||
self.file.write('\n'.join(self._format_code(line)))
|
||||
self.file.write('\n')
|
||||
|
||||
def __lt__(self, other):
|
||||
if isinstance(other, FileCodeSink):
|
||||
return self.file.name < other.file.name
|
||||
|
||||
class MemoryCodeSink(CodeSink):
|
||||
"""A code sink that keeps the code in memory,
|
||||
and can later flush the code to another code sink"""
|
||||
|
||||
@@ -5,7 +5,7 @@ import re
|
||||
|
||||
import pybindgen
|
||||
from pybindgen import FileCodeSink
|
||||
from pybindgen.gccxmlparser import ModuleParser
|
||||
|
||||
|
||||
constructor_rx = re.compile("hello_foo_new(_.*)?")
|
||||
method_rx = re.compile("hello_foo(_.*)?")
|
||||
@@ -39,13 +39,18 @@ def pre_scan_hook(dummy_module_parser,
|
||||
|
||||
|
||||
|
||||
def my_module_gen(out_file):
|
||||
def my_module_gen(out_file, pygccxml_mode):
|
||||
if pygccxml_mode == 'castxml':
|
||||
from pybindgen.castxmlparser import ModuleParser
|
||||
else:
|
||||
from pybindgen.gccxmlparser import ModuleParser
|
||||
|
||||
out = FileCodeSink(out_file)
|
||||
#pybindgen.write_preamble(out)
|
||||
out.writeln("#include \"hello.h\"")
|
||||
module_parser = ModuleParser('hello')
|
||||
module_parser.add_pre_scan_hook(pre_scan_hook)
|
||||
module = module_parser.parse(sys.argv[1:])
|
||||
module = module_parser.parse(sys.argv[2:])
|
||||
module.generate(out)
|
||||
|
||||
|
||||
@@ -53,7 +58,7 @@ if __name__ == '__main__':
|
||||
try:
|
||||
import cProfile as profile
|
||||
except ImportError:
|
||||
my_module_gen(sys.stdout)
|
||||
my_module_gen(sys.stdout, sys.argv[1])
|
||||
else:
|
||||
sys.stderr.write("** running under profiler\n")
|
||||
profile.run('my_module_gen(sys.stdout)', 'hellomodulegen.pstat')
|
||||
profile.run('my_module_gen(sys.stdout, sys.argv[1])', 'hellomodulegen.pstat')
|
||||
@@ -19,7 +19,7 @@ def build(bld):
|
||||
features='command',
|
||||
source='hellomodulegen.py hello.h',
|
||||
target='hellomodule.c',
|
||||
command='${PYTHON} %s ${SRC[0]} ${SRC[1]} > ${TGT[0]}' % (DEPRECATION_ERRORS,))
|
||||
command='${PYTHON} %s ${SRC[0]} ${PYGCCXML_MODE} ${SRC[1]} > ${TGT[0]}' % (DEPRECATION_ERRORS,))
|
||||
|
||||
os.environ["PYTHONPATH"] = os.pathsep.join([os.environ.get("PYTHONPATH", ''), bindgen.path.get_bld().abspath()])
|
||||
|
||||
|
||||
+10
-10
@@ -48,8 +48,8 @@ struct PointerHolder
|
||||
};
|
||||
|
||||
|
||||
class Foo
|
||||
// -#- automatic_type_narrowing=True -#-
|
||||
class Foo
|
||||
{
|
||||
std::string m_datum;
|
||||
bool m_initialized;
|
||||
@@ -92,8 +92,8 @@ inline bool is_unique(const Foo& foo)
|
||||
return foo.instance_count == 1;
|
||||
}
|
||||
|
||||
class Zoo
|
||||
// -#- automatic_type_narrowing=True -#-
|
||||
class Zoo
|
||||
{
|
||||
std::string m_datum;
|
||||
public:
|
||||
@@ -137,8 +137,8 @@ public:
|
||||
// -#- @return(caller_owns_return=true) -#-
|
||||
Foo* get_hidden_subclass_pointer ();
|
||||
|
||||
class Zbr
|
||||
// -#- incref_method=Ref; decref_method=Unref; peekref_method=GetReferenceCount -#-
|
||||
class Zbr
|
||||
{
|
||||
int m_refcount;
|
||||
std::string m_datum;
|
||||
@@ -185,8 +185,8 @@ int invoke_zbr (int x);
|
||||
void delete_stored_zbr (void);
|
||||
|
||||
|
||||
class Foobar
|
||||
// -#- allow_subclassing=true -#-
|
||||
class Foobar
|
||||
{
|
||||
Foobar (const Foobar &);
|
||||
Foobar& operator= (const Foobar &);
|
||||
@@ -215,8 +215,8 @@ public:
|
||||
|
||||
|
||||
// A nested class
|
||||
class NestedClass
|
||||
// -#- automatic_type_narrowing=True -#-
|
||||
class NestedClass
|
||||
{
|
||||
std::string m_datum;
|
||||
public:
|
||||
@@ -522,8 +522,8 @@ namespace xpto
|
||||
|
||||
struct XptoClass
|
||||
{
|
||||
SomeClass* GetSomeClass()
|
||||
// -#- @return(caller_owns_return=true) -#-
|
||||
SomeClass* GetSomeClass()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@@ -540,8 +540,8 @@ void set_foobar_with_other_as_custodian(Foobar *foobar, SomeObject *other);
|
||||
// -#- @foobar(custodian=-1, transfer_ownership=true); @return(caller_owns_return=true) -#-
|
||||
SomeObject * set_foobar_with_return_as_custodian(Foobar *foobar);
|
||||
|
||||
class SingletonClass
|
||||
// -#- is_singleton=true -#-
|
||||
class SingletonClass
|
||||
{
|
||||
private:
|
||||
static SingletonClass *m_instance;
|
||||
@@ -719,8 +719,8 @@ private:
|
||||
AbstractBaseClass2 (const AbstractBaseClass2 &other) { other.invoke_protected_virtual(0); }
|
||||
};
|
||||
|
||||
class AbstractXpto
|
||||
// -#- allow_subclassing=true -#-
|
||||
class AbstractXpto
|
||||
{
|
||||
public:
|
||||
AbstractXpto () {}
|
||||
@@ -1171,14 +1171,14 @@ public:
|
||||
};
|
||||
|
||||
|
||||
struct Error
|
||||
// -#- exception -#-
|
||||
struct Error
|
||||
{
|
||||
std::string message;
|
||||
};
|
||||
|
||||
struct DomainError : public Error
|
||||
// -#- exception -#-
|
||||
struct DomainError : public Error
|
||||
{
|
||||
};
|
||||
|
||||
|
||||
@@ -8,22 +8,27 @@ import pybindgen
|
||||
from pybindgen.typehandlers import base as typehandlers
|
||||
from pybindgen import (ReturnValue, Parameter, Module, Function, FileCodeSink)
|
||||
from pybindgen import (CppMethod, CppConstructor, CppClass, Enum)
|
||||
from pybindgen.gccxmlparser import ModuleParser, PygenClassifier, PygenSection
|
||||
from pybindgen.function import CustomFunctionWrapper
|
||||
from pybindgen.cppmethod import CustomCppMethodWrapper
|
||||
|
||||
import foomodulegen_common
|
||||
|
||||
|
||||
class MyPygenClassifier(PygenClassifier):
|
||||
def classify(self, pygccxml_definition):
|
||||
if pygccxml_definition.name and pygccxml_definition.name.lower() <= 'l':
|
||||
return 'foomodulegen_module1'
|
||||
else:
|
||||
return 'foomodulegen_module2'
|
||||
|
||||
|
||||
def my_module_gen():
|
||||
if sys.argv[6] == 'castxml':
|
||||
from pybindgen.castxmlparser import ModuleParser, PygenClassifier, PygenSection
|
||||
else:
|
||||
from pybindgen.gccxmlparser import ModuleParser, PygenClassifier, PygenSection
|
||||
|
||||
class MyPygenClassifier(PygenClassifier):
|
||||
def classify(self, pygccxml_definition):
|
||||
if pygccxml_definition.name and pygccxml_definition.name.lower() <= 'l':
|
||||
return 'foomodulegen_module1'
|
||||
else:
|
||||
return 'foomodulegen_module2'
|
||||
|
||||
pygen = [
|
||||
PygenSection('__main__', FileCodeSink(open(sys.argv[3], "wt"))),
|
||||
PygenSection('foomodulegen_module1', FileCodeSink(open(sys.argv[4], "wt")),
|
||||
|
||||
@@ -3,30 +3,38 @@ from __future__ import unicode_literals, print_function, absolute_import
|
||||
|
||||
import sys
|
||||
import os
|
||||
import logging
|
||||
|
||||
import pybindgen
|
||||
from pybindgen.typehandlers import base as typehandlers
|
||||
from pybindgen import (ReturnValue, Parameter, Module, Function, FileCodeSink)
|
||||
from pybindgen import (CppMethod, CppConstructor, CppClass, Enum)
|
||||
from pybindgen.gccxmlparser import ModuleParser
|
||||
from pybindgen.function import CustomFunctionWrapper
|
||||
from pybindgen.cppmethod import CustomCppMethodWrapper
|
||||
|
||||
import foomodulegen_common
|
||||
|
||||
|
||||
def my_module_gen():
|
||||
pygccxml_mode = sys.argv[4]
|
||||
if pygccxml_mode == 'castxml':
|
||||
from pybindgen.castxmlparser import ModuleParser
|
||||
else:
|
||||
from pybindgen.gccxmlparser import ModuleParser
|
||||
|
||||
out = FileCodeSink(sys.stdout)
|
||||
pygen_file = open(sys.argv[3], "wt")
|
||||
module_parser = ModuleParser('foo2', '::')
|
||||
module_parser.enable_anonymous_containers = True
|
||||
|
||||
print("PYTHON_INCLUDES:", repr(sys.argv[2]), file=sys.stderr)
|
||||
gccxml_options = dict(
|
||||
include_paths=eval(sys.argv[2]),
|
||||
)
|
||||
|
||||
kwargs = {
|
||||
"{mode}_options".format(mode=pygccxml_mode): dict(
|
||||
include_paths=eval(sys.argv[2]),
|
||||
)
|
||||
}
|
||||
module_parser.parse_init([sys.argv[1]], includes=['"foo.h"'], pygen_sink=FileCodeSink(pygen_file),
|
||||
gccxml_options=gccxml_options)
|
||||
**kwargs)
|
||||
module = module_parser.module
|
||||
foomodulegen_common.customize_module_pre(module)
|
||||
|
||||
@@ -44,6 +52,7 @@ def my_module_gen():
|
||||
|
||||
|
||||
def main():
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
if sys.argv[1] == '-d':
|
||||
del sys.argv[1]
|
||||
import pdb
|
||||
|
||||
+40
-35
@@ -21,6 +21,9 @@ elif which == 4:
|
||||
else:
|
||||
raise AssertionError("bad command line arguments")
|
||||
|
||||
gccxml_mode = sys.argv.pop(1)
|
||||
print("gccxml_mode:", gccxml_mode)
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
@@ -51,7 +54,7 @@ class TestFoo(unittest.TestCase):
|
||||
del f
|
||||
f2 = obj.get_foo_ptr()
|
||||
self.assertEqual(f2.get_datum(), "hello")
|
||||
|
||||
|
||||
def test_pass_foo_shared_ptr(self):
|
||||
obj = foo.SomeObject("")
|
||||
f = foo.Foo("hello")
|
||||
@@ -59,7 +62,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.assertEqual(f.get_datum(), "hello")
|
||||
f2 = obj.get_foo_shared_ptr()
|
||||
self.assertEqual(f2.get_datum(), "hello")
|
||||
|
||||
|
||||
def test_pass_by_reference(self):
|
||||
obj = foo.SomeObject("")
|
||||
f = foo.Foo("hello")
|
||||
@@ -67,7 +70,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.assertEqual(f.get_datum(), "hello")
|
||||
f2 = obj.get_foo_by_ref()
|
||||
self.assertEqual(f2.get_datum(), "hello")
|
||||
|
||||
|
||||
def test_refcounting(self):
|
||||
obj = foo.SomeObject("")
|
||||
z = foo.Zbr("hello")
|
||||
@@ -93,7 +96,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.assertEqual(zz2.get_datum(), "world")
|
||||
zz3 = obj.peek_zbr()
|
||||
self.assertEqual(zz3.get_datum(), "world")
|
||||
|
||||
|
||||
def test_instance_get_attribute(self):
|
||||
obj = foo.SomeObject("Hello")
|
||||
self.assertEqual(obj.m_prefix, "Hello")
|
||||
@@ -128,7 +131,7 @@ class TestFoo(unittest.TestCase):
|
||||
|
||||
def test_overloaded_methods(self):
|
||||
obj = foo.SomeObject("zbr")
|
||||
|
||||
|
||||
v1 = obj.get_int(123.0)
|
||||
self.assertEqual(v1, 123)
|
||||
|
||||
@@ -136,7 +139,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.assertEqual(v2, 123)
|
||||
|
||||
self.assertRaises(TypeError, obj.get_int, [123])
|
||||
|
||||
|
||||
if which == 1: # there is no gccxml way to do this
|
||||
def test_custom_instance_attribute(self):
|
||||
obj = foo.Foo()
|
||||
@@ -158,7 +161,7 @@ class TestFoo(unittest.TestCase):
|
||||
obj.set_foo_ptr(foo.Foo())
|
||||
foo1 = obj.get_foo_ptr()
|
||||
self.assertEqual(type(foo1), foo.Foo)
|
||||
|
||||
|
||||
bar2 = foo.Bar()
|
||||
self.assertEqual(type(bar2), foo.Bar)
|
||||
obj.set_foo_ptr(bar2)
|
||||
@@ -265,7 +268,7 @@ class TestFoo(unittest.TestCase):
|
||||
pass
|
||||
## check that SomeObject was finally deleted
|
||||
self.assertEqual(foo.SomeObject.instance_count, count_before)
|
||||
|
||||
|
||||
|
||||
def test_subclass_with_virtual_transfer_ptr(self):
|
||||
class Test(foo.SomeObject):
|
||||
@@ -296,7 +299,7 @@ class TestFoo(unittest.TestCase):
|
||||
|
||||
## check that SomeObject was finally deleted
|
||||
self.assertEqual(foo.SomeObject.instance_count, count_before)
|
||||
|
||||
|
||||
|
||||
def test_subclassed_store_and_take_back(self):
|
||||
class Test(foo.SomeObject):
|
||||
@@ -330,7 +333,7 @@ class TestFoo(unittest.TestCase):
|
||||
|
||||
def test_implicit_conversion_method_value(self):
|
||||
obj = foo.SomeObject("xxx")
|
||||
|
||||
|
||||
zoo1 = foo.Zoo("zpto")
|
||||
try:
|
||||
obj.set_foo_value(zoo1)
|
||||
@@ -339,7 +342,7 @@ class TestFoo(unittest.TestCase):
|
||||
foo1 = obj.get_foo_value()
|
||||
self.assertEqual(foo1.get_datum(), "zpto")
|
||||
|
||||
|
||||
|
||||
def test_implicit_conversion_function_value(self):
|
||||
zoo1 = foo.Zoo("zpto")
|
||||
try:
|
||||
@@ -349,7 +352,7 @@ class TestFoo(unittest.TestCase):
|
||||
foo1 = foo.function_that_returns_foo()
|
||||
self.assertEqual(foo1.get_datum(), "zpto")
|
||||
|
||||
|
||||
|
||||
def test_implicit_conversion_constructor_value(self):
|
||||
zoo1 = foo.Zoo("zpto")
|
||||
try:
|
||||
@@ -625,7 +628,7 @@ class TestFoo(unittest.TestCase):
|
||||
def get_something(self, arg=None):
|
||||
self.arg = arg
|
||||
return str(arg)
|
||||
|
||||
|
||||
obj = MyObject("")
|
||||
s1 = obj.get_something()
|
||||
self.assertEqual(s1, "None")
|
||||
@@ -678,7 +681,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.y = y
|
||||
def get_int(self, x):
|
||||
return getattr(self, 'y', 0) + x
|
||||
|
||||
|
||||
while gc.collect():
|
||||
pass
|
||||
count_before = foo.Zbr.instance_count
|
||||
@@ -861,7 +864,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.assertEqual(len(values), 10)
|
||||
for i, value in enumerate(values):
|
||||
self.assertEqual(value.xpto, i)
|
||||
|
||||
|
||||
rv = foo.set_simple_list(l)
|
||||
self.assertEqual(rv, sum(range(10)))
|
||||
|
||||
@@ -893,7 +896,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.assertEqual(count, 5)
|
||||
|
||||
|
||||
## set
|
||||
## set
|
||||
l = []
|
||||
for i in range(5):
|
||||
simple = foo.simple_struct_t()
|
||||
@@ -908,7 +911,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.assertEqual(simple.xpto, i)
|
||||
count += 1
|
||||
self.assertEqual(count, 5)
|
||||
|
||||
|
||||
|
||||
def test_container_param_by_ref(self):
|
||||
l = []
|
||||
@@ -971,7 +974,7 @@ class TestFoo(unittest.TestCase):
|
||||
s3.xpto = 456
|
||||
self.assertEqual(s3.xpto, 456)
|
||||
self.assertEqual(s1.xpto, 123)
|
||||
|
||||
|
||||
|
||||
def test_refcounting_v2(self):
|
||||
while gc.collect():
|
||||
@@ -996,14 +999,14 @@ class TestFoo(unittest.TestCase):
|
||||
|
||||
def test_refcounting_v3(self):
|
||||
zbr_count_before = foo.Zbr.instance_count
|
||||
|
||||
|
||||
class MyZbr(foo.Zbr):
|
||||
pass
|
||||
z_in = MyZbr()
|
||||
obj = foo.SomeObject("")
|
||||
obj.set_zbr_transfer(z_in)
|
||||
del z_in
|
||||
|
||||
|
||||
z1 = obj.get_zbr()
|
||||
z2 = obj.get_zbr()
|
||||
self.assertTrue(z1 is z2)
|
||||
@@ -1018,14 +1021,14 @@ class TestFoo(unittest.TestCase):
|
||||
|
||||
def test_refcounting_v4(self): # same as v3 but using peek_zbr instead of get_zbr
|
||||
zbr_count_before = foo.Zbr.instance_count
|
||||
|
||||
|
||||
class MyZbr(foo.Zbr):
|
||||
pass
|
||||
z_in = MyZbr()
|
||||
obj = foo.SomeObject("")
|
||||
obj.set_zbr_transfer(z_in)
|
||||
del z_in
|
||||
|
||||
|
||||
z1 = obj.peek_zbr()
|
||||
z2 = obj.peek_zbr()
|
||||
self.assertTrue(z1 is z2)
|
||||
@@ -1084,7 +1087,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.assertTrue(t2 < t3)
|
||||
self.assertTrue(t2 != t3)
|
||||
self.assertTrue(not(t2 == t3))
|
||||
|
||||
|
||||
def test_numeric_operators(self):
|
||||
t1 = foo.Tupl()
|
||||
|
||||
@@ -1163,6 +1166,7 @@ class TestFoo(unittest.TestCase):
|
||||
retval = manip.manipulate_object()
|
||||
self.assertEqual(retval, 12345)
|
||||
|
||||
@unittest.skipIf(gccxml_mode == 'castxml', "TODO")
|
||||
def test_sequence_protocol(self):
|
||||
vec1 = foo.VectorLike()
|
||||
vec1.append(1)
|
||||
@@ -1181,7 +1185,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.assertEqual(len(vec3), len(vec1) + len(vec2))
|
||||
for (x, xcheck) in zip(list(vec3), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 6]):
|
||||
self.assertEqual(x, xcheck)
|
||||
|
||||
|
||||
# iadd
|
||||
vec2 = foo.VectorLike()
|
||||
for i in range(10):
|
||||
@@ -1190,7 +1194,7 @@ class TestFoo(unittest.TestCase):
|
||||
self.assertEqual(len(vec2), 13)
|
||||
for (x, xcheck) in zip(list(vec3), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 6]):
|
||||
self.assertEqual(x, xcheck)
|
||||
|
||||
|
||||
# mul
|
||||
vec2 = 2 * vec1
|
||||
self.assertEqual(len(vec2), 2*len(vec1))
|
||||
@@ -1331,6 +1335,7 @@ class TestFoo(unittest.TestCase):
|
||||
def test_bug450255(self):
|
||||
c = foo.ProtectedConstructor()
|
||||
|
||||
@unittest.skipIf(gccxml_mode == 'castxml', "TODO")
|
||||
def test_bug455689(self):
|
||||
p = foo.Property__StdString()
|
||||
|
||||
@@ -1346,9 +1351,9 @@ class TestFoo(unittest.TestCase):
|
||||
f2 = box.getFoobarInternalPtr()
|
||||
self.assertEqual(foo.Foobar.instance_count, Foobar_count1+1)
|
||||
self.assertTrue(f2 is f1)
|
||||
|
||||
|
||||
del f1, f2, box
|
||||
|
||||
|
||||
while gc.collect():
|
||||
pass
|
||||
|
||||
@@ -1366,14 +1371,14 @@ class TestFoo(unittest.TestCase):
|
||||
f2 = box.m_internalFoobar
|
||||
self.assertEqual(foo.Foobar.instance_count, Foobar_count1+1)
|
||||
self.assertTrue(f2 is f1)
|
||||
|
||||
|
||||
del f1, f2, box
|
||||
|
||||
|
||||
while gc.collect():
|
||||
pass
|
||||
|
||||
self.assertEqual(foo.Foobar.instance_count, Foobar_count1)
|
||||
|
||||
|
||||
|
||||
def test_reference_existing_object_ref(self):
|
||||
while gc.collect():
|
||||
@@ -1387,9 +1392,9 @@ class TestFoo(unittest.TestCase):
|
||||
f2 = box.getFoobarInternalRef()
|
||||
self.assertEqual(foo.Foobar.instance_count, Foobar_count1+1)
|
||||
self.assertTrue(f2 is f1)
|
||||
|
||||
|
||||
del f1, f2, box
|
||||
|
||||
|
||||
while gc.collect():
|
||||
pass
|
||||
|
||||
@@ -1411,7 +1416,7 @@ class TestFoo(unittest.TestCase):
|
||||
f2 = box.getFoobarInternalPtr2()
|
||||
self.assertEqual(foo.Foobar.instance_count, Foobar_count1+1)
|
||||
self.assertTrue(f2 is f1)
|
||||
|
||||
|
||||
del f2, box
|
||||
while gc.collect():
|
||||
pass
|
||||
@@ -1427,7 +1432,7 @@ class TestFoo(unittest.TestCase):
|
||||
|
||||
self.assertEqual(foo.Foobar.instance_count, Foobar_count1)
|
||||
self.assertEqual(foo.Box.instance_count, Box_count1)
|
||||
|
||||
|
||||
|
||||
def test_reference_existing_object_ref2(self):
|
||||
while gc.collect():
|
||||
@@ -1444,7 +1449,7 @@ class TestFoo(unittest.TestCase):
|
||||
f2 = box.getFoobarInternalRef2()
|
||||
self.assertEqual(foo.Foobar.instance_count, Foobar_count1+1)
|
||||
self.assertTrue(f2 is f1)
|
||||
|
||||
|
||||
del f2, box
|
||||
while gc.collect():
|
||||
pass
|
||||
|
||||
+4
-5
@@ -37,8 +37,8 @@ def build(bld):
|
||||
obj.source = 'test.cc'
|
||||
if env['CXX_NAME'] == 'gcc':
|
||||
obj.env.append_value('CXXFLAGS', ['-Werror', '-Wno-unused'])
|
||||
|
||||
## manual code generation using simple pybindgen API calls
|
||||
|
||||
# manual code generation using simple pybindgen API calls
|
||||
bindgen = bld(
|
||||
features='command',
|
||||
source='foomodulegen.py',
|
||||
@@ -63,7 +63,7 @@ def build(bld):
|
||||
features='command',
|
||||
source='foomodulegen-auto.py foo.h',
|
||||
target='foomodule2.cc foomodulegen_generated.py',
|
||||
command='${PYTHON} %s ${SRC[0]} ${SRC[1]} ${cpp_path_repr} ${TGT[1]} > ${TGT[0]}' % (DEPRECATION_ERRORS,),
|
||||
command='${PYTHON} %s ${SRC[0]} ${SRC[1]} ${cpp_path_repr} ${TGT[1]} ${PYGCCXML_MODE} > ${TGT[0]}' % (DEPRECATION_ERRORS,),
|
||||
variables=dict(cpp_path_repr=repr(bindgen.env['INCLUDES']+bindgen.env['INCLUDES_PYEXT'])))
|
||||
|
||||
obj = bld(features='cxx cxxshlib pyext')
|
||||
@@ -102,7 +102,7 @@ def build(bld):
|
||||
features='command',
|
||||
source='foomodulegen-auto-split.py foo.h',
|
||||
target='foomodulegen_split.py foomodulegen_module1.py foomodulegen_module2.py',
|
||||
command='${PYTHON} %s ${SRC[0]} ${SRC[1]} ${cpp_path_repr} ${TGT[0]} ${TGT[1]} ${TGT[2]}' % (DEPRECATION_ERRORS,),
|
||||
command='${PYTHON} %s ${SRC[0]} ${SRC[1]} ${cpp_path_repr} ${TGT[0]} ${TGT[1]} ${TGT[2]} ${PYGCCXML_MODE}' % (DEPRECATION_ERRORS,),
|
||||
variables=dict(cpp_path_repr=repr(bindgen.env['INCLUDES']+bindgen.env['INCLUDES_PYEXT'])))
|
||||
|
||||
bld(
|
||||
@@ -121,7 +121,6 @@ def build(bld):
|
||||
],
|
||||
command='${PYTHON} %s ${SRC[0]} ${TGT[0]}' % (DEPRECATION_ERRORS,))
|
||||
|
||||
|
||||
obj = bld(features='cxx cxxshlib pyext')
|
||||
obj.source = [
|
||||
'foo.cc',
|
||||
|
||||
@@ -161,8 +161,9 @@ def configure(conf):
|
||||
conf.check_python_headers()
|
||||
|
||||
if not Options.options.disable_pygccxml:
|
||||
castxml = conf.find_program('castxml', mandatory=False)
|
||||
gccxml = conf.find_program('gccxml', mandatory=False)
|
||||
if not gccxml:
|
||||
if not (gccxml or castxml):
|
||||
conf.env['ENABLE_PYGCCXML'] = False
|
||||
else:
|
||||
try:
|
||||
@@ -171,6 +172,10 @@ def configure(conf):
|
||||
conf.env['ENABLE_PYGCCXML'] = False
|
||||
else:
|
||||
conf.env['ENABLE_PYGCCXML'] = True
|
||||
if castxml:
|
||||
conf.env['PYGCCXML_MODE'] = 'castxml'
|
||||
else:
|
||||
conf.env['PYGCCXML_MODE'] = 'gccxml'
|
||||
|
||||
# -fvisibility=hidden optimization
|
||||
if (conf.env['CXX_NAME'] == 'gcc' and [int(x) for x in conf.env['CC_VERSION']] >= [4,0,0]
|
||||
@@ -258,19 +263,19 @@ class CheckContext(Context.Context):
|
||||
|
||||
if env['CXX']:
|
||||
print("Running manual module generation unit tests (module foo)...")
|
||||
retvals.append(subprocess.Popen(valgrind + [python, 'tests/footest.py', '1'] + verbosity).wait())
|
||||
retvals.append(subprocess.Popen(valgrind + [python, 'tests/footest.py', '1', 'none'] + verbosity).wait())
|
||||
else:
|
||||
print("Skipping manual module generation unit tests (no C/C++ compiler)...")
|
||||
|
||||
if env['ENABLE_PYGCCXML']:
|
||||
print("Running automatically scanned module generation unit tests (module foo2)...")
|
||||
retvals.append(subprocess.Popen(valgrind + [python, 'tests/footest.py', '2'] + verbosity).wait())
|
||||
retvals.append(subprocess.Popen(valgrind + [python, 'tests/footest.py', '2', env['PYGCCXML_MODE']] + verbosity).wait())
|
||||
|
||||
print("Running module generated by automatically generated python script unit tests (module foo3)...")
|
||||
retvals.append(subprocess.Popen(valgrind + [python, 'tests/footest.py', '3'] + verbosity).wait())
|
||||
retvals.append(subprocess.Popen(valgrind + [python, 'tests/footest.py', '3', env['PYGCCXML_MODE']] + verbosity).wait())
|
||||
|
||||
print("Running module generated by generated and split python script unit tests (module foo4)...")
|
||||
retvals.append(subprocess.Popen(valgrind + [python, 'tests/footest.py', '4'] + verbosity).wait())
|
||||
retvals.append(subprocess.Popen(valgrind + [python, 'tests/footest.py', '4', env['PYGCCXML_MODE']] + verbosity).wait())
|
||||
|
||||
print("Running semi-automatically scanned c-hello module ('hello')...")
|
||||
retvals.append(subprocess.Popen(valgrind + [python, 'tests/c-hello/hellotest.py'] + verbosity).wait())
|
||||
|
||||
Reference in new issue
Block a user