Skip to content

Commit 41bc371

Browse files
committed
Patching in snapshot of (already closed) PR #4316
1 parent c204c9b commit 41bc371

10 files changed

+127
-0
lines changed

include/pybind11/detail/internals.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,11 @@ struct internals {
209209
PYBIND11_TLS_FREE(tstate);
210210
}
211211
#endif
212+
213+
std::unordered_map<std::type_index, std::vector<std::string>>
214+
std_type_index_registry_unnamed_namespace;
215+
std::unordered_map<std::type_index, std::vector<std::string>>
216+
std_type_index_registry_named_namespace;
212217
};
213218

214219
/// Additional type information which does not fit into the PyTypeObject.

tests/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ set(PYBIND11_TEST_FILES
133133
test_eigen_tensor_avoid_stl_array.cpp
134134
test_enum
135135
test_eval
136+
test_exc_named_namespace_a.py
137+
test_exc_named_namespace_b.py
136138
test_exceptions
137139
test_factory_constructors
138140
test_gil_scoped
@@ -156,6 +158,8 @@ set(PYBIND11_TEST_FILES
156158
test_tagbased_polymorphic
157159
test_thread
158160
test_union
161+
test_unnamed_namespace_a
162+
test_unnamed_namespace_b
159163
test_virtual_functions)
160164

161165
# Invoking cmake with something like:
@@ -219,6 +223,8 @@ tests_extra_targets("test_exceptions.py;test_local_bindings.py;test_stl.py;test_
219223
# And add additional targets for other tests.
220224
tests_extra_targets("test_exceptions.py" "cross_module_interleaved_error_already_set")
221225
tests_extra_targets("test_gil_scoped.py" "cross_module_gil_utils")
226+
tests_extra_targets("test_exc_named_namespace_a.py" "named_namespace_a")
227+
tests_extra_targets("test_exc_named_namespace_b.py" "named_namespace_b")
222228

223229
set(PYBIND11_EIGEN_REPO
224230
"https://gitlab.com/libeigen/eigen.git"

tests/named_namespace_a.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include <pybind11/stl.h>
2+
3+
#include "pybind11_tests.h"
4+
5+
namespace test_named_namespace {
6+
struct any_struct {};
7+
} // namespace test_named_namespace
8+
9+
PYBIND11_MODULE(named_namespace_a, m) {
10+
m.attr("name") = "NA";
11+
12+
py::detail::get_internals()
13+
.std_type_index_registry_named_namespace[std::type_index(
14+
typeid(test_named_namespace::any_struct))]
15+
.push_back("NA");
16+
17+
m.def("std_type_index_registry_dump", []() {
18+
py::list items;
19+
for (const auto &it :
20+
py::detail::get_internals().std_type_index_registry_named_namespace) {
21+
items.append(py::make_tuple(it.first.name(), it.second));
22+
}
23+
return items;
24+
});
25+
}

tests/named_namespace_b.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "pybind11_tests.h"
2+
3+
namespace test_named_namespace {
4+
struct any_struct {};
5+
} // namespace test_named_namespace
6+
7+
PYBIND11_MODULE(named_namespace_b, m) {
8+
m.attr("name") = "NB";
9+
10+
py::detail::get_internals()
11+
.std_type_index_registry_named_namespace[std::type_index(
12+
typeid(test_named_namespace::any_struct))]
13+
.push_back("NB");
14+
}

tests/test_exc_named_namespace_a.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import named_namespace_a as m
2+
import pytest
3+
4+
5+
def test_inspect():
6+
assert m.name == "NA"
7+
reg = m.std_type_index_registry_dump()
8+
if len(reg) == 1:
9+
assert tuple(sorted(reg[0][1])) == ("NA", "NB")
10+
pytest.skip("std::type_index-EQ-GOOD")
11+
if len(reg) == 2:
12+
assert reg[0][0] == reg[1][0]
13+
assert tuple(sorted(reg[0][1] + reg[1][1])) == ("NA", "NB")
14+
pytest.skip("std::type_index-NE-BAD")
15+
assert reg is None # Sure to fail.

tests/test_exc_named_namespace_b.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import named_namespace_b as m
2+
3+
4+
def test_inspect():
5+
assert m.name == "NB"

tests/test_unnamed_namespace_a.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include <pybind11/stl.h>
2+
3+
#include "pybind11_tests.h"
4+
5+
namespace {
6+
struct any_struct {};
7+
} // namespace
8+
9+
TEST_SUBMODULE(unnamed_namespace_a, m) {
10+
m.attr("name") = "UA";
11+
12+
py::detail::get_internals()
13+
.std_type_index_registry_unnamed_namespace[std::type_index(typeid(any_struct))]
14+
.push_back("UA");
15+
16+
m.def("std_type_index_registry_dump", []() {
17+
py::list items;
18+
for (const auto &it :
19+
py::detail::get_internals().std_type_index_registry_unnamed_namespace) {
20+
items.append(py::make_tuple(it.first.name(), it.second));
21+
}
22+
return items;
23+
});
24+
}

tests/test_unnamed_namespace_a.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import pytest
2+
3+
from pybind11_tests import unnamed_namespace_a as m
4+
5+
6+
def test_inspect():
7+
assert m.name == "UA"
8+
reg = m.std_type_index_registry_dump()
9+
if len(reg) == 1:
10+
assert tuple(sorted(reg[0][1])) == ("UA", "UB")
11+
pytest.skip("std::type_index-EQ-BAD")
12+
if len(reg) == 2:
13+
assert tuple(sorted([reg[0][1][0], reg[1][1][0]])) == ("UA", "UB")
14+
pytest.skip("std::type_index-NE-GOOD")
15+
assert reg is None # Sure to fail.

tests/test_unnamed_namespace_b.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include "pybind11_tests.h"
2+
3+
namespace {
4+
struct any_struct {};
5+
} // namespace
6+
7+
TEST_SUBMODULE(unnamed_namespace_b, m) {
8+
m.attr("name") = "UB";
9+
10+
py::detail::get_internals()
11+
.std_type_index_registry_unnamed_namespace[std::type_index(typeid(any_struct))]
12+
.push_back("UB");
13+
}

tests/test_unnamed_namespace_b.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from pybind11_tests import unnamed_namespace_b as m
2+
3+
4+
def test_inspect():
5+
assert m.name == "UB"

0 commit comments

Comments
 (0)