From fdc9ec760ff3ddd9ab90b4b46f4edf3a8e4aa7bc Mon Sep 17 00:00:00 2001 From: Nikita Kniazev Date: Sat, 30 Mar 2019 17:42:34 +0300 Subject: [PATCH 01/10] Fixed module tests fail Since recently lightweight_test introduced a sanitation to ensure that `boost::report_errors()` is called, and it does not in module tests. The problem could be fixed by exporting the function and calling it from these python tests, but as it already done in other module tests I just turned those usages lightweight_test to a regular assertation. --- test/test_class.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_class.hpp b/test/test_class.hpp index 5404fdba..a9324e9c 100644 --- a/test/test_class.hpp +++ b/test/test_class.hpp @@ -4,17 +4,17 @@ // http://www.boost.org/LICENSE_1_0.txt) #ifndef TEST_CLASS_DWA2002326_HPP # define TEST_CLASS_DWA2002326_HPP -# include +# include template struct test_class { explicit test_class(int x) : x(x), magic(7654321 + n) { ++counter; } test_class(test_class const& rhs) : x(rhs.x), magic(7654321 + n) { ++counter; } - virtual ~test_class() { BOOST_TEST(magic == 7654321 + n); magic = 6666666; x = 9999; --counter; } + virtual ~test_class() { BOOST_ASSERT(magic == 7654321 + n); magic = 6666666; x = 9999; --counter; } - void set(int _x) { BOOST_TEST(magic == 7654321 + n); this->x = _x; } - int value() const { BOOST_TEST(magic == 7654321 + n); return x; } + void set(int _x) { BOOST_ASSERT(magic == 7654321 + n); this->x = _x; } + int value() const { BOOST_ASSERT(magic == 7654321 + n); return x; } operator int() const { return x; } static int count() { return counter; } From 8c8b0dc2152efb2706a782ff1c0fdd2e0705ce69 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Thu, 18 Apr 2019 00:02:52 +0300 Subject: [PATCH 02/10] Only boost-install boost_numpy when it's being built --- build/Jamfile | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/build/Jamfile b/build/Jamfile index 34f99dde..d03d4dd0 100644 --- a/build/Jamfile +++ b/build/Jamfile @@ -30,8 +30,6 @@ else ; } -if [ python.configured ] -{ project boost/python : source-location ../src ; @@ -123,7 +121,7 @@ lib boost_numpy boost_python on:BOOST_DEBUG_PYTHON -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag - @$(__name__).python-tag + @$(__name__).python-tag @python.require-py : # default build @@ -142,8 +140,16 @@ lib boost_numpy # `install` installs the two libraries and their dependencies and is similar # to issuing `b2 --with-python install` from top level -boost-install boost_python boost_numpy ; - +if [ python.configured ] +{ + if [ python.numpy ] + { + boost-install boost_python boost_numpy ; + } + else + { + boost-install boost_python ; + } } else { From 1727b67a5a92c8c3564d4ee244fffd758e54d7cc Mon Sep 17 00:00:00 2001 From: Julien Schueller Date: Sat, 1 Jun 2019 11:07:30 +0200 Subject: [PATCH 03/10] detail/caller.hpp:127:2: error: extra ';' [-Wpedantic] --- include/boost/python/detail/caller.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/boost/python/detail/caller.hpp b/include/boost/python/detail/caller.hpp index 557359f5..2834d6da 100644 --- a/include/boost/python/detail/caller.hpp +++ b/include/boost/python/detail/caller.hpp @@ -124,7 +124,7 @@ template const signature_element* get_ret() }; return &ret; -}; +} #endif From 15115eb1f844e9ac8ed5dd454d46a4e7b5ae5b48 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Thu, 19 Mar 2020 17:47:06 -0400 Subject: [PATCH 04/10] Fix appveyor build failures. --- .appveyor.yml | 60 ++++++++++++++++++++++++++++---------------------- .travis.yml | 35 ++++++++++++----------------- fabscript | 6 ++--- test/fabscript | 4 ++-- 4 files changed, 53 insertions(+), 52 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 05d2480d..c8205eae 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -4,7 +4,6 @@ environment: # /E:ON and /V:ON options are not enabled in the batch script intepreter # See: http://stackoverflow.com/a/13751649/163740 CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci\\run_with_env.cmd" - BOOST_PREFIX: C:\Libraries\boost_1_66_0 matrix: @@ -12,24 +11,28 @@ environment: # a later point release. # See: http://www.appveyor.com/docs/installed-software#python - - PYTHON: "C:\\Python27" - PYTHON_VERSION: "2.7.x" # currently 2.7.9 - PYTHON_ARCH: "32" - MSVC: "14.0" - ARCH: x86 - - - PYTHON: "C:\\Python36-x64" - PYTHON_VERSION: "3.6.x" - PYTHON_ARCH: "64" - MSVC: "12.0" + - PYTHON: C:\\Python36-x64 + PYTHON_VERSION: 3.6.x + PYTHON_ARCH: 64 + MSVC: 12.0 ARCH: x86_64 + BOOST_PREFIX: C:\Libraries\boost_1_66_0 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - PYTHON: "C:\\Python36-x64" - PYTHON_VERSION: "3.6.x" - PYTHON_ARCH: "64" - MSVC: "14.13.26128" + PYTHON: C:\\Python36-x64 + PYTHON_VERSION: 3.6.x + PYTHON_ARCH: 64 + MSVC: 15.9.19 ARCH: x86_64 + BOOST_PREFIX: C:\Libraries\boost_1_69_0 + + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 + PYTHON: C:\\Python36-x64 + PYTHON_VERSION: 3.6.x + PYTHON_ARCH: 64 + MSVC: 16.6.5 + ARCH: x86_64 + BOOST_PREFIX: C:\Libraries\boost_1_73_0 install: # If there is a newer build queued for the same PR, cancel this one. @@ -64,28 +67,33 @@ install: # Upgrade to the latest version of pip to avoid it displaying warnings # about it being out of date. - - "pip install --disable-pip-version-check --user --upgrade pip" + - "python -m pip install --disable-pip-version-check --user --upgrade pip" # Install the build dependencies of the project. If some dependencies contain # compiled extensions and are not provided as pre-built wheel packages, # pip will build them from source using the MSVC compiler matching the # target Python version and architecture - - | - curl -LfsS -o faber.tar.gz https://github.com/stefanseefeld/faber/archive/snapshot/2018-04-08.tar.gz - tar xf faber.tar.gz - CD faber-snapshot-2018-04-08 - python setup.py install - CD .. + + - curl -LfsS -o vswhere.exe https://github.com/Microsoft/vswhere/releases/download/2.8.4/vswhere.exe + #- | + # curl -LfsS -o faber.tar.gz https://github.com/stefanseefeld/faber/archive/snapshot/2020-08-01.tar.gz + # tar xf faber.tar.gz + # CD faber-snapshot-2020-08-01 + # python setup.py install + # CD .. + - python -m pip install faber # report the available MSVC compilers - - faber --info=tools cxx + - faber --log=tools --info=tools cxx - easy_install sphinx - - pip install numpy + - python -m pip install numpy + - set FARGS=--log=summary --log=output --log=actions --log=commands --with-boost-include=%BOOST_PREFIX% target.arch=%ARCH% cxx.name=msvc cxx.version=%MSVC% build_script: - - faber --with-boost-include=%BOOST_PREFIX% target.arch=%ARCH% msvc.version=%MSVC% + - faber %FARGS% config || type config.log + - faber %FARGS% -j8 test_script: - - faber --with-boost-include=%BOOST_PREFIX% test.report target.arch=%ARCH% msvc.version=%MSVC% + - faber %FARGS% -j8 test.report after_test: # If tests are successful, create binary packages for the project. diff --git a/.travis.yml b/.travis.yml index 5d37070b..ef7828c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,7 @@ # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -sudo: required -dist: trusty +dist: bionic language: cpp @@ -15,7 +14,7 @@ env: global: - secure: BRNUkxN3p8f+uYKWC3Hr0VPqZA0PxbWr1DJlcI4hbiZtzKhMCWjDmd9UW9CzzexqeOxpd+9s0G87qvOur+wMSVxugDxtTesZrh1czXHeSVxgQrYD783XJtQJ9aYypbChkiboRD6Xpmbq7itwMuHBJMFtCuDxMynpU1jWwkyTf2Y= -matrix: +jobs: include: - os: linux env: CXX=g++ PYTHON=python CXXFLAGS=-std=c++98 @@ -40,9 +39,10 @@ addons: sources: - ubuntu-toolchain-r-test packages: - - gcc-4.8 - - g++-4.8 + - gcc + - g++ - clang + - python3-pip - python-numpy - python-sphinx - python3-dev @@ -57,12 +57,6 @@ cache: directories: - $HOME/Boost -before_install: - # The Trusty image has several Python versions pre-installed compiled with - # conflicting UCS2 and UCS4 unicode. Modify the PATH to skip the TravisCI python. - # See https://github.com/travis-ci/travis-ci/issues/4948 for details. - - export PATH=$(echo $PATH | tr ':' "\n" | sed '/\/opt\/python/d' | tr "\n" ":" | sed "s|::|:|g") - install: # Install our own version of Boost (the subset we need) as the system version is # too old (for C++11 support). @@ -83,15 +77,14 @@ install: echo "using cached Boost prerequisites." fi # Install Faber, the build tool. - date=2018-04-08 - wget https://github.com/stefanseefeld/faber/archive/snapshot/$date.tar.gz - tar xf $date.tar.gz - pushd faber-snapshot-$date - #wget https://github.com/stefanseefeld/faber/archive/release/0.2.tar.gz - #tar xf 0.2.tar.gz - #pushd faber-release-0.2 - sudo python setup.py install - popd + python3 -m pip install setuptools + python3 -m pip install faber + #date=2020-08-01 + #wget https://github.com/stefanseefeld/faber/archive/snapshot/$date.tar.gz + #tar xf $date.tar.gz + #pushd faber-snapshot-$date + #sudo python3 setup.py install + #popd before_script: - sed -e "s/\$PYTHON/$PYTHON/g" .ci/faber > ~/.faber @@ -104,7 +97,7 @@ script: if [ "$DOC" ]; then BOOST_ROOT=$HOME/Boost faber --builddir=build doc.html else - faber --with-boost-include=$HOME/Boost --builddir=build test.report cxx.name=$CXX cxxflags=$CXXFLAGS + faber --with-boost-include=$HOME/Boost --builddir=build test.report cxx.name=$CXX cxxflags=$CXXFLAGS -j8 fi after_success: diff --git a/fabscript b/fabscript index 054ed90e..8188779f 100644 --- a/fabscript +++ b/fabscript @@ -75,8 +75,8 @@ checks = [cxx_checks.has_cxx11(features, define('HAS_CXX11')), has_numpy(features)] config = report('config', checks) -src = module('src', features=config.use) -test = module('test', features=config.use) -doc = module('doc', features=config.use) +src = module('src', features=features|config.use) +test = module('test', features=features|config.use) +doc = module('doc', features=features|config.use) default = src.default diff --git a/test/fabscript b/test/fabscript index 1989cc0d..61a5a1ca 100644 --- a/test/fabscript +++ b/test/fabscript @@ -123,9 +123,9 @@ tests.append(extension_test('auto_ptr', import_ = binary('import_', ['import_.cpp', src.bpl], features=features|python_libs) if platform.os == 'Windows': command = """set PATH=$(runpath);%PATH% -$(>[1]) $(>[2])""" +$(>[0]) $(>[1])""" else: - command = 'LD_LIBRARY_PATH=$(runpath) $(>[1]) $(>[2])' + command = 'LD_LIBRARY_PATH=$(runpath) $(>[0]) $(>[1])' tests.append(test('import', [import_, 'import_.py'], run=action('run', command), From 17886fc2960d8e69eaa6f20f1d5c93a5477d1719 Mon Sep 17 00:00:00 2001 From: Edward Diener Date: Tue, 31 Mar 2020 16:11:07 -0400 Subject: [PATCH 05/10] Change __BORLANDC__ to BOOST_BORLANDC, which is defined in Boost config for the Embarcadero non-clang-based compilers. --- include/boost/python/def_visitor.hpp | 4 ++-- include/boost/python/detail/msvc_typeinfo.hpp | 2 +- include/boost/python/detail/wrap_python.hpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/boost/python/def_visitor.hpp b/include/boost/python/def_visitor.hpp index 9c8907cd..18dd9286 100644 --- a/include/boost/python/def_visitor.hpp +++ b/include/boost/python/def_visitor.hpp @@ -16,7 +16,7 @@ template class class_; class def_visitor_access { # if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \ - || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) + || BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x551)) // Tasteless as this may seem, making all members public allows member templates // to work in the absence of member template friends. public: @@ -52,7 +52,7 @@ class def_visitor friend class def_visitor_access; # if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \ - || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) + || BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x551)) // Tasteless as this may seem, making all members public allows member templates // to work in the absence of member template friends. public: diff --git a/include/boost/python/detail/msvc_typeinfo.hpp b/include/boost/python/detail/msvc_typeinfo.hpp index bfc84164..2c5f6e57 100644 --- a/include/boost/python/detail/msvc_typeinfo.hpp +++ b/include/boost/python/detail/msvc_typeinfo.hpp @@ -47,7 +47,7 @@ inline typeinfo typeid_ref(type*, ...) return detail::typeid_ref_1((T(*)())0); } -#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32)) +#if defined(BOOST_MSVC) || (defined(BOOST_BORLANDC) && !defined(BOOST_DISABLE_WIN32)) # define BOOST_PYTT_DECL __cdecl #else # define BOOST_PYTT_DECL /**/ diff --git a/include/boost/python/detail/wrap_python.hpp b/include/boost/python/detail/wrap_python.hpp index 13679dbb..9d5f5422 100644 --- a/include/boost/python/detail/wrap_python.hpp +++ b/include/boost/python/detail/wrap_python.hpp @@ -146,7 +146,7 @@ typedef int pid_t; # undef hypot // undo the evil #define left by Python. -# elif defined(__BORLANDC__) +# elif defined(__BORLANDC__) && !defined(__clang__) # undef HAVE_HYPOT # define HAVE_HYPOT 1 # endif From 5e2d55d801632fc8ecaf12840382962cb6480931 Mon Sep 17 00:00:00 2001 From: Edward Diener Date: Sun, 19 Apr 2020 16:25:56 -0400 Subject: [PATCH 06/10] Revert back to original, as __cdecl is fine with the Embarcadero C++ clang-based compilers. --- include/boost/python/detail/msvc_typeinfo.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/boost/python/detail/msvc_typeinfo.hpp b/include/boost/python/detail/msvc_typeinfo.hpp index 2c5f6e57..bfc84164 100644 --- a/include/boost/python/detail/msvc_typeinfo.hpp +++ b/include/boost/python/detail/msvc_typeinfo.hpp @@ -47,7 +47,7 @@ inline typeinfo typeid_ref(type*, ...) return detail::typeid_ref_1((T(*)())0); } -#if defined(BOOST_MSVC) || (defined(BOOST_BORLANDC) && !defined(BOOST_DISABLE_WIN32)) +#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32)) # define BOOST_PYTT_DECL __cdecl #else # define BOOST_PYTT_DECL /**/ From 01ab5105851b1d59c0f8012dbeea07a0500e0f65 Mon Sep 17 00:00:00 2001 From: Andrey Semashev Date: Mon, 11 May 2020 19:36:44 +0300 Subject: [PATCH 07/10] Removed usage of deprecated header boost/detail/iterator.hpp. The header is deprecated in favor of . It generates compiler warnings and will be removed in a future release. --- include/boost/python/object/iterator.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/boost/python/object/iterator.hpp b/include/boost/python/object/iterator.hpp index e2f65721..87495036 100644 --- a/include/boost/python/object/iterator.hpp +++ b/include/boost/python/object/iterator.hpp @@ -25,7 +25,7 @@ # include -# include +# include namespace boost { namespace python { namespace objects { @@ -42,7 +42,7 @@ struct iterator_range { iterator_range(object sequence, Iterator start, Iterator finish); - typedef boost::detail::iterator_traits traits_t; + typedef std::iterator_traits traits_t; struct next { From bf824c1b98d1d523f4239063b073afdf086fa741 Mon Sep 17 00:00:00 2001 From: Tyler Kieft Date: Thu, 19 Mar 2020 16:21:15 -0400 Subject: [PATCH 08/10] Ensure all doctests run --- test/args.py | 27 +++++++++++++++++---------- test/dict.cpp | 14 +++++++------- test/dict.py | 7 ++++--- test/fabscript | 28 ++++++++++++++-------------- test/iterator.py | 10 ++++++---- test/list.py | 9 +++++---- test/long.py | 7 ++++--- test/map_indexing_suite.py | 23 +++++++++-------------- test/object.py | 13 +++++++------ test/pickle2.py | 5 +++-- test/pickle3.py | 5 +++-- test/str.py | 7 ++++--- test/test_builtin_converters.py | 9 ++------- test/tuple.py | 5 +++-- 14 files changed, 88 insertions(+), 81 deletions(-) diff --git a/test/args.py b/test/args.py index e884c06b..5d899214 100644 --- a/test/args.py +++ b/test/args.py @@ -1,15 +1,19 @@ # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -from __future__ import print_function """ >>> from args_ext import * ->>> raw(3, 4, foo = 'bar', baz = 42) -((3, 4), {'foo': 'bar', 'baz': 42}) +>>> args, kwargs = raw(3, 4, foo = 'bar', baz = 42) +>>> args +(3, 4) +>>> kwargs['foo'] +'bar' +>>> kwargs['baz'] +42 Prove that we can handle empty keywords and non-keywords - + >>> raw(3, 4) ((3, 4), {}) @@ -76,7 +80,7 @@ from __future__ import print_function ... else: print('expected an exception: unknown keyword') Exercise member functions using default stubs - + >>> q.f1(z = 'nix', y = .125, x = 2) (2, 0.125, 'nix') >>> q.f1(y = .125, x = 2) @@ -123,10 +127,16 @@ from __future__ import print_function 1 >>> y = Y(value = 33) ->>> y.raw(this = 1, that = 'the other')[1] -{'this': 1, 'that': 'the other'} +>>> _, kwargs = y.raw(this = 1, that = 'the other') +>>> kwargs['this'] +1 +>>> kwargs['that'] +'the other' """ + +from __future__ import print_function + def run(args = None): import sys import doctest @@ -143,6 +153,3 @@ if __name__ == '__main__': import args_ext help(args_ext) sys.exit(status) - - - diff --git a/test/dict.cpp b/test/dict.cpp index 375905d6..4f3490a4 100644 --- a/test/dict.cpp +++ b/test/dict.cpp @@ -21,11 +21,13 @@ object new_dict() object data_dict() { dict tmp1; - tmp1["key1"] = "value1"; dict tmp2; tmp2["key2"] = "value2"; tmp1[1] = tmp2; + + tmp1["key1"] = "value1"; + return tmp1; } @@ -60,22 +62,20 @@ void work_with_dict(dict data1, dict data2) void test_templates(object print) { std::string key = "key"; - + dict tmp; - tmp[1] = "a test string"; - print(tmp.get(1)); - //print(tmp[1]); tmp[1.5] = 13; print(tmp.get(1.5)); + tmp[1] = "a test string"; + print(tmp.get(1)); print(tmp.get(44)); print(tmp); print(tmp.get(2,"default")); print(tmp.setdefault(3,"default")); BOOST_ASSERT(!tmp.has_key(key)); - //print(tmp[3]); } - + BOOST_PYTHON_MODULE(dict_ext) { def("new_dict", new_dict); diff --git a/test/dict.py b/test/dict.py index 72c37d99..9b1149ae 100644 --- a/test/dict.py +++ b/test/dict.py @@ -1,7 +1,6 @@ # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -from __future__ import print_function """ >>> from dict_ext import * >>> def printer(*args): @@ -22,14 +21,16 @@ from __future__ import print_function >>> print(dict_from_sequence([(1,1),(2,2),(3,3)])) {1: 1, 2: 2, 3: 3} >>> test_templates(printer) #doctest: +NORMALIZE_WHITESPACE -a test string 13 +a test string None {1.5: 13, 1: 'a test string'} default default """ +from __future__ import print_function + def run(args = None): import sys import doctest @@ -37,7 +38,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/fabscript b/test/fabscript index 61a5a1ca..03e4c6f9 100644 --- a/test/fabscript +++ b/test/fabscript @@ -21,14 +21,14 @@ src = module('..src') python_libs=python.instance().libs features |= runpath(src.bpl.path, base='') -def extension_test(name, ext=[], script=None, np=False, +def extension_test(name, exts=[], script=None, numpy=False, features=features, condition=None): """Create a Python extension test `name`. Arguments: * name: the name of the test. - * ext: extensions to be compiled, if none are given. + * exts: extensions to be compiled, if none are given. * script: the test script to execute, .py if none is given. - * np: if true, add boost_numpy to sources + * numpy: if true, add boost_numpy to sources * features: pre-defined features * condition: any condition under which to run the test Return: @@ -36,17 +36,17 @@ def extension_test(name, ext=[], script=None, np=False, features=features.copy() extensions = [] - libs = [src.bnl, src.bpl] if np else [src.bpl] - for e in ext or [name]: - if type(e) is str: # build from a single source file - n = e if e != name else e + '_ext' - s = [e + '.cpp'] + libs = [src.bnl, src.bpl] if numpy else [src.bpl] + for ext in exts or [name]: + if type(ext) is str: # build from a single source file + ext_name = ext if ext != name else ext + '_ext' + sources = [ext + '.cpp'] else: # build from a list of source files - n = e[0] if e[0] != name else e[0] + '_ext' - s = [n + '.cpp' for n in e] - e = extension(n, s + libs, features=features) - features |= pythonpath(e.path, base='') - extensions.append(e) + ext_name = ext[0] if ext[0] != name else ext[0] + '_ext' + sources = [source + '.cpp' for source in ext] + ext = extension(ext_name, sources + libs, features=features) + features |= pythonpath(ext.path, base='') + extensions.append(ext) if not script: script = name+'.py' return test(name, script, run=python.run, dependencies=extensions, @@ -167,7 +167,7 @@ for t in ['numpy/dtype', 'numpy/ndarray', 'numpy/indexing', 'numpy/shapes']: - tests.append(extension_test(t, np=True, + tests.append(extension_test(t, numpy=True, condition=set.define.contains('HAS_NUMPY'))) default = report('report', tests, fail_on_failures=True) diff --git a/test/iterator.py b/test/iterator.py index 314a3567..0d75100a 100644 --- a/test/iterator.py +++ b/test/iterator.py @@ -1,7 +1,6 @@ # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -from __future__ import print_function ''' >>> from iterator_ext import * >>> from input_iterator import * @@ -25,7 +24,7 @@ from __future__ import print_function Range2 wraps a transform_iterator which doubles the elements it traverses. This proves we can wrap input iterators - + >>> z2 = range2(x) >>> for y in z2: ... print(y) @@ -56,12 +55,15 @@ from __future__ import print_function >>> ll.push_back(x) >>> for a in ll: #doctest: +NORMALIZE_WHITESPACE ... for b in a: -... print(b, end='') +... print(b, end=' ') ... print('') ... 1 3 5 1 3 5 7 ''' + +from __future__ import print_function + def run(args = None): import sys import doctest @@ -69,7 +71,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/list.py b/test/list.py index 913032db..f6cf8709 100644 --- a/test/list.py +++ b/test/list.py @@ -1,7 +1,6 @@ # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -from __future__ import print_function ''' >>> from list_ext import * @@ -41,7 +40,7 @@ X(22) ['h', 'e', 'l', 'l', 'o', '.'] tuples do not automatically convert to lists when passed as arguments - + >>> try: append_list(letters, (1,2)) ... except TypeError: pass ... else: print('expected an exception') @@ -51,7 +50,7 @@ X(22) ['h', 'e', 'l', 'l', 'o', '.', [1, 2]] Check that subclass functions are properly called - + >>> class mylist(list): ... def append(self, o): ... list.append(self, o) @@ -103,6 +102,8 @@ reverse sorted: ['y', 'x', 'o', 'l', 'l', 'h', 'e', '.'] ''' +from __future__ import print_function + def run(args = None): import sys import doctest @@ -110,7 +111,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/long.py b/test/long.py index f6392363..157dc57a 100644 --- a/test/long.py +++ b/test/long.py @@ -1,9 +1,6 @@ # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -import sys -if (sys.version_info.major >= 3): - long = int ''' >>> from long_ext import * >>> print(new_long()) @@ -20,6 +17,10 @@ if (sys.version_info.major >= 3): >>> x = Y(long(4294967295)) ''' +import sys +if (sys.version_info.major >= 3): + long = int + def run(args = None): import sys import doctest diff --git a/test/map_indexing_suite.py b/test/map_indexing_suite.py index a5750a83..e772bb53 100644 --- a/test/map_indexing_suite.py +++ b/test/map_indexing_suite.py @@ -1,7 +1,6 @@ # Copyright Joel de Guzman 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -from __future__ import print_function ''' ##################################################################### @@ -25,7 +24,7 @@ foo # test that a string is implicitly convertible # to an X ->>> x_value('bochi bochi') +>>> x_value('bochi bochi') 'gotya bochi bochi' ##################################################################### @@ -33,9 +32,9 @@ foo ##################################################################### >>> def print_xmap(xmap): ... s = '[ ' -... for x in xmap: +... for x in xmap: ... s += repr(x) -... s += ' ' +... s += ' ' ... s += ']' ... print(s) @@ -135,7 +134,7 @@ foo >>> assert not 12345 in xm ##################################################################### -# Some references to the container elements +# Some references to the container elements ##################################################################### >>> z0 = xm['joel'] @@ -156,7 +155,7 @@ banana kiwi ##################################################################### -# Delete some container element +# Delete some container element ##################################################################### >>> del xm['tenji'] @@ -168,7 +167,7 @@ kiwi [ (joel, apple) (kim, kiwi) (mariel, grape) ] ##################################################################### -# Show that the references are still valid +# Show that the references are still valid ##################################################################### >>> z0 # proxy apple @@ -199,7 +198,7 @@ kiwi >>> print_xmap(tm) [ (joel, aaa) (kimpo, bbb) ] >>> for el in tm: #doctest: +NORMALIZE_WHITESPACE -... print(el.key(), end='') +... print(el.key(), end=' ') ... dom = el.data() joel kimpo @@ -216,11 +215,12 @@ joel kimpo 4 ##################################################################### -# END.... +# END.... ##################################################################### ''' +from __future__ import print_function def run(args = None): import sys @@ -236,8 +236,3 @@ if __name__ == '__main__': status = run()[0] if (status == 0): print("Done.") sys.exit(status) - - - - - diff --git a/test/object.py b/test/object.py index 67a46d93..cf6c2de0 100644 --- a/test/object.py +++ b/test/object.py @@ -1,7 +1,6 @@ # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -from __future__ import print_function ''' >>> from object_ext import * @@ -130,14 +129,14 @@ from __future__ import print_function 1 Slices - + >>> assert check_string_slice() Operators ->>> def print_args(*args, **kwds): +>>> def print_args(*args, **kwds): ... print(args, kwds) ->>> test_call(print_args, (0, 1, 2, 3), {'a':'A'}) +>>> test_call(print_args, (0, 1, 2, 3), {'a':'A'}) (0, 1, 2, 3) {'a': 'A'} @@ -149,7 +148,7 @@ from __future__ import print_function Now make sure that object is actually managing reference counts - + >>> import weakref >>> class Z: pass ... @@ -164,6 +163,8 @@ from __future__ import print_function death ''' +from __future__ import print_function + def run(args = None): import sys import doctest @@ -171,7 +172,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/pickle2.py b/test/pickle2.py index f4788d3b..4c11ef3a 100644 --- a/test/pickle2.py +++ b/test/pickle2.py @@ -1,7 +1,6 @@ # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -from __future__ import print_function r'''>>> import pickle2_ext >>> import pickle >>> pickle2_ext.world.__module__ @@ -35,6 +34,8 @@ r'''>>> import pickle2_ext Incomplete pickle support (__getstate_manages_dict__ not set) ''' +from __future__ import print_function + def run(args = None): import sys import doctest @@ -42,7 +43,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/pickle3.py b/test/pickle3.py index 932e30f3..391e3d00 100644 --- a/test/pickle3.py +++ b/test/pickle3.py @@ -1,7 +1,6 @@ # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -from __future__ import print_function r'''>>> import pickle3_ext >>> import pickle >>> pickle3_ext.world.__module__ @@ -30,6 +29,8 @@ r'''>>> import pickle3_ext Hello from California! 0 84 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 126.0 ''' +from __future__ import print_function + def run(args = None): import sys import doctest @@ -37,7 +38,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/str.py b/test/str.py index 4eba0e87..bfb49949 100644 --- a/test/str.py +++ b/test/str.py @@ -1,11 +1,10 @@ # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -from __future__ import print_function """ >>> from str_ext import * >>> def printer(*args): -... for x in args: print(x, end='') +... for x in args: print(x, end=' ') ... print('') ... >>> work_with_string(printer) #doctest: +NORMALIZE_WHITESPACE @@ -38,6 +37,8 @@ this is a blabla string aaaaaaaaaaaaaaaaaaaaa """ +from __future__ import print_function + def run(args = None): import sys import doctest @@ -45,7 +46,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys diff --git a/test/test_builtin_converters.py b/test/test_builtin_converters.py index e612ed23..0f1b4ded 100644 --- a/test/test_builtin_converters.py +++ b/test/test_builtin_converters.py @@ -1,9 +1,7 @@ +# -*- coding: utf-8 -*- # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -import sys -if (sys.version_info.major >= 3): - long = int r""" >>> from builtin_converters_ext import * @@ -17,7 +15,7 @@ r""" # Wrappers to simplify tests >>> def should_pass(method, values): -... result = map(method, values[0]) +... result = list(map(method, values[0])) ... if result != values[0]: ... print("Got %s but expected %s" % (result, values[0])) >>> def test_overflow(method, values): @@ -136,9 +134,6 @@ True >>> print(rewrap_value_wstring(u'yo, wassup?')) yo, wassup? ->>> print(rewrap_value_wstring(u'\U0001f4a9')) -\U0001f4a9 - test that overloading on unicode works: >>> print(rewrap_value_string(u'yo, wassup?')) diff --git a/test/tuple.py b/test/tuple.py index 1aec5fde..e2cd5eb1 100644 --- a/test/tuple.py +++ b/test/tuple.py @@ -1,7 +1,6 @@ # Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -from __future__ import print_function """ >>> from tuple_ext import * >>> def printer(*args): @@ -22,6 +21,8 @@ from __future__ import print_function ('hello', 42) """ +from __future__ import print_function + def run(args = None): import sys import doctest @@ -29,7 +30,7 @@ def run(args = None): if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) - + if __name__ == '__main__': print("running...") import sys From 9e1132f4f58c45e79365d9ad1ca8e7b9ea981dc4 Mon Sep 17 00:00:00 2001 From: Austin Maliszewski Date: Tue, 28 Jan 2020 17:33:53 -0600 Subject: [PATCH 09/10] Handle NULL from call to PyLong_Type PyLong_Type raises an exception if the argument is not convertible to long, therefore, this has to be handled as new_reference and not new_non_null_reference, otherwise a segfault will occur. --- include/boost/python/long.hpp | 4 ++-- src/long.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/boost/python/long.hpp b/include/boost/python/long.hpp index 129c61f9..c15604c9 100644 --- a/include/boost/python/long.hpp +++ b/include/boost/python/long.hpp @@ -24,8 +24,8 @@ namespace detail BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(long_base, object) private: - static detail::new_non_null_reference call(object const&); - static detail::new_non_null_reference call(object const&, object const&); + static detail::new_reference call(object const&); + static detail::new_reference call(object const&, object const&); }; } diff --git a/src/long.cpp b/src/long.cpp index 1ec8ebc0..6aa2965e 100644 --- a/src/long.cpp +++ b/src/long.cpp @@ -6,16 +6,16 @@ namespace boost { namespace python { namespace detail { -new_non_null_reference long_base::call(object const& arg_) +new_reference long_base::call(object const& arg_) { - return (detail::new_non_null_reference)PyObject_CallFunction( + return (detail::new_reference)PyObject_CallFunction( (PyObject*)&PyLong_Type, const_cast("(O)"), arg_.ptr()); } -new_non_null_reference long_base::call(object const& arg_, object const& base) +new_reference long_base::call(object const& arg_, object const& base) { - return (detail::new_non_null_reference)PyObject_CallFunction( + return (detail::new_reference)PyObject_CallFunction( (PyObject*)&PyLong_Type, const_cast("(OO)"), arg_.ptr(), base.ptr()); } From 60405cc48cf8cc2f7b32d85942b47cc39aa27b4f Mon Sep 17 00:00:00 2001 From: David Seifert Date: Wed, 25 Dec 2019 12:37:35 +0100 Subject: [PATCH 10/10] Remove Boost.Python-specific python-tag code --- Jamfile | 68 --------------------------------------------------- build/Jamfile | 4 +-- 2 files changed, 2 insertions(+), 70 deletions(-) delete mode 100644 Jamfile diff --git a/Jamfile b/Jamfile deleted file mode 100644 index 32e87d80..00000000 --- a/Jamfile +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright (c) 2018 Stefan Seefeld -# All rights reserved. -# -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -import option ; -import regex ; -import python ; - -# -# The `version-suffix` rule really belongs into python.jam, and -# should be moved there. `split-version` is only duplicated here -# as a prerequisite. (See https://github.com/boostorg/build/pull/290) -# - - -# Validate the version string and extract the major/minor part we care about. -# -local rule split-version ( version ) -{ - local major-minor = [ MATCH "^([0-9]+)\.([0-9]+)(.*)$" : $(version) : 1 2 3 ] ; - if ! $(major-minor[2]) || $(major-minor[3]) - { - ECHO "Warning: \"using python\" expects a two part (major, minor) version number; got" $(version) instead ; - - # Add a zero to account for the missing digit if necessary. - major-minor += 0 ; - } - - return $(major-minor[1]) $(major-minor[2]) ; -} - -# Define a version suffix for libraries depending on Python. -# For example, Boost.Python built for Python 2.7 uses the suffix "27" -rule version-suffix ( version ) -{ - local major-minor = [ split-version $(version) ] ; - local suffix = $(major-minor:J="") ; - return $(suffix) ; -} - - -# Python build id (for Python libraries only). -python-id = [ option.get "python-buildid" ] ; -if $(python-id) -{ - PYTHON_ID = [ regex.replace $(python-id) "[*\\/:.\"\']" _ ] ; -} - -rule python-tag ( name : type ? : property-set ) -{ - local result = $(name) ; - if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB - { - local version = [ $(property-set).get ] ; - local lib-suffix = [ version-suffix $(version) ] ; - result = $(result)$(lib-suffix) ; - } - if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB && $(PYTHON_ID) - { - result = $(result)-$(PYTHON_ID) ; - } - - # forward to the boost tagging rule - return [ tag $(result) : $(type) : $(property-set) ] ; -} diff --git a/build/Jamfile b/build/Jamfile index d03d4dd0..dbc9fb20 100644 --- a/build/Jamfile +++ b/build/Jamfile @@ -93,7 +93,7 @@ lib boost_python config-warning on:BOOST_DEBUG_PYTHON -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag - @$(__name__).python-tag + @python-tag @python.require-py : # default build @@ -121,7 +121,7 @@ lib boost_numpy boost_python on:BOOST_DEBUG_PYTHON -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag - @$(__name__).python-tag + @python-tag @python.require-py : # default build