Skip to content

Commit 2d71246

Browse files
Fix Enums (#114)
* handle `std::byte` as a special case * fix BuildScopeProxyDict to handle enum constants decl as static
1 parent ed33ef1 commit 2d71246

File tree

3 files changed

+4
-13
lines changed

3 files changed

+4
-13
lines changed

src/Converters.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3488,7 +3488,8 @@ CPyCppyy::Converter* CPyCppyy::CreateConverter(Cppyy::TCppType_t type, cdims_t d
34883488
// converters for known C++ classes and default (void*)
34893489
Converter* result = nullptr;
34903490
Cppyy::TCppScope_t klass = Cppyy::GetScopeFromType(realType);
3491-
if (klass || (klass = Cppyy::GetFullScope(realTypeStr))) {
3491+
// std::byte is a special enum class used to access raw memory
3492+
if ((realTypeStr != "std::byte") && (klass || (klass = Cppyy::GetFullScope(realTypeStr)))) {
34923493
Cppyy::TCppType_t raw{0};
34933494
if (Cppyy::GetSmartPtrInfo(realTypeStr, &raw, nullptr)) {
34943495
if (cpd == "") {

src/ProxyWrappers.cxx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ void AddPropertyToClass(PyObject* pyclass,
9999
PyType_Type.tp_setattro(pyclass, pname, (PyObject*)property);
100100

101101
// allow access at the class level (always add after setting instance level)
102-
if (Cppyy::IsStaticDatamember(data))
102+
if (Cppyy::IsStaticDatamember(data) || Cppyy::IsEnumConstant(data))
103103
PyType_Type.tp_setattro((PyObject*)Py_TYPE(pyclass), pname, (PyObject*)property);
104104

105105
// cleanup
@@ -378,11 +378,7 @@ static int BuildScopeProxyDict(Cppyy::TCppScope_t scope, PyObject* pyclass, cons
378378
continue;
379379

380380
// enum datamembers (this in conjunction with previously collected enums above)
381-
if (Cppyy::IsEnumType(Cppyy::GetDatamemberType(datamember)) && Cppyy::IsStaticDatamember(datamember)) {
382-
// some implementation-specific data members have no address: ignore them
383-
if (!Cppyy::GetDatamemberOffset(datamember))
384-
continue;
385-
381+
if (Cppyy::IsEnumType(Cppyy::GetDatamemberType(datamember)) && Cppyy::IsEnumConstant(datamember)) {
386382
// two options: this is a static variable, or it is the enum value, the latter
387383
// already exists, so check for it and move on if set
388384
PyObject* eset = PyObject_GetAttrString(pyclass,

src/Utility.cxx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,13 +1244,7 @@ std::string CPyCppyy::Utility::MapOperatorName(const std::string& name, bool bTa
12441244
if (gOpRemove.find(op) != gOpRemove.end())
12451245
return "";
12461246

1247-
// check first if none, to prevent spurious deserializing downstream
12481247
TC2POperatorMapping_t::iterator pop = gC2POperatorMapping.find(op);
1249-
if (pop == gC2POperatorMapping.end() && gOpSkip.find(op) == gOpSkip.end()) {
1250-
op = Cppyy::ResolveName(op);
1251-
pop = gC2POperatorMapping.find(op);
1252-
}
1253-
12541248
// map C++ operator to python equivalent, or made up name if no equivalent exists
12551249
if (pop != gC2POperatorMapping.end()) {
12561250
return pop->second;

0 commit comments

Comments
 (0)