@@ -19,9 +19,9 @@ static PyObject* pytype_from_enum_type(const std::string& enum_type)
1919}
2020
2121// ----------------------------------------------------------------------------
22- static PyObject* pyval_from_enum (const std::string& enum_type, PyObject* pytype,
23- PyObject* btype, Cppyy::TCppEnum_t etype, Cppyy::TCppIndex_t idata ) {
24- long long llval = Cppyy::GetEnumDataValue (etype, idata );
22+ PyObject* CPyCppyy:: pyval_from_enum (const std::string& enum_type, PyObject* pytype,
23+ PyObject* btype, Cppyy::TCppScope_t enum_constant ) {
24+ long long llval = Cppyy::GetEnumDataValue (enum_constant );
2525
2626 if (enum_type == " bool" ) {
2727 PyObject* result = (bool )llval ? Py_True : Py_False;
@@ -38,14 +38,15 @@ static PyObject* pyval_from_enum(const std::string& enum_type, PyObject* pytype,
3838 else
3939 bval = PyLong_FromLongLong (llval);
4040
41+ if (pytype && btype) {
4142 PyObject* args = PyTuple_New (1 );
4243 PyTuple_SET_ITEM (args, 0 , bval);
43- PyObject* result = ((PyTypeObject*)btype)->tp_new ((PyTypeObject*)pytype, args, nullptr );
44+ bval = ((PyTypeObject*)btype)->tp_new ((PyTypeObject*)pytype, args, nullptr );
4445 Py_DECREF (args);
45- return result;
46+ }
47+ return bval;
4648}
4749
48-
4950// - enum methods -------------------------------------------------------------
5051static int enum_setattro (PyObject* /* pyclass */ , PyObject* /* pyname */ , PyObject* /* pyval */ )
5152{
@@ -59,6 +60,8 @@ static PyObject* enum_repr(PyObject* self)
5960{
6061 using namespace CPyCppyy ;
6162
63+ PyObject* kls_scope = PyObject_GetAttr ((PyObject*)Py_TYPE (self), PyStrings::gThisModule );
64+ if (!kls_scope) PyErr_Clear ();
6265 PyObject* kls_cppname = PyObject_GetAttr ((PyObject*)Py_TYPE (self), PyStrings::gCppName );
6366 if (!kls_cppname) PyErr_Clear ();
6467 PyObject* obj_cppname = PyObject_GetAttr (self, PyStrings::gCppName );
@@ -67,7 +70,7 @@ static PyObject* enum_repr(PyObject* self)
6770
6871 PyObject* repr = nullptr ;
6972 if (kls_cppname && obj_cppname && obj_str) {
70- const std::string resolved = Cppyy::ResolveEnum (CPyCppyy_PyText_AsString (kls_cppname ));
73+ const std::string resolved = Cppyy::ResolveEnum (PyLong_AsVoidPtr (kls_scope ));
7174 repr = CPyCppyy_PyText_FromFormat (" (%s::%s) : (%s) %s" ,
7275 CPyCppyy_PyText_AsString (kls_cppname), CPyCppyy_PyText_AsString (obj_cppname),
7376 resolved.c_str (), CPyCppyy_PyText_AsString (obj_str));
@@ -137,12 +140,12 @@ CPyCppyy::CPPEnum* CPyCppyy::CPPEnum_New(const std::string& name, Cppyy::TCppSco
137140
138141 CPPEnum* pyenum = nullptr ;
139142
140- const std::string& ename = scope == Cppyy:: gGlobalScope ? name : Cppyy::GetScopedFinalName (scope)+ " :: " +name ;
141- Cppyy::TCppEnum_t etype = Cppyy::GetEnum (scope, name );
143+ Cppyy::TCppScope_t etype = scope;
144+ const std::string& ename = Cppyy::GetScopedFinalName (scope);
142145 if (etype) {
143146 // create new enum type with labeled values in place, with a meta-class
144147 // to make sure the enum values are read-only
145- const std::string& resolved = Cppyy::ResolveEnum (ename );
148+ const std::string& resolved = Cppyy::ResolveEnum (etype );
146149 PyObject* pyside_type = pytype_from_enum_type (resolved);
147150 PyObject* pymetabases = PyTuple_New (1 );
148151 PyObject* btype = (PyObject*)Py_TYPE (pyside_type);
@@ -169,7 +172,7 @@ CPyCppyy::CPPEnum* CPyCppyy::CPPEnum_New(const std::string& name, Cppyy::TCppSco
169172 PyObject* pyresolved = CPyCppyy_PyText_FromString (resolved.c_str ());
170173 PyDict_SetItem (dct, PyStrings::gUnderlying , pyresolved);
171174 Py_DECREF (pyresolved);
172-
175+
173176 // add the __module__ to allow pickling
174177 std::string modname = TypeManip::extract_namespace (ename);
175178 TypeManip::cppscope_to_pyscope (modname); // :: -> .
@@ -191,10 +194,10 @@ CPyCppyy::CPPEnum* CPyCppyy::CPPEnum_New(const std::string& name, Cppyy::TCppSco
191194 ((PyTypeObject*)pyenum)->tp_str = ((PyTypeObject*)pyside_type)->tp_repr ;
192195
193196 // collect the enum values
194- Cppyy::TCppIndex_t ndata = Cppyy::GetNumEnumData (etype);
195- for (Cppyy::TCppIndex_t idata = 0 ; idata < ndata; ++idata ) {
196- PyObject* val = pyval_from_enum (resolved, pyenum, pyside_type, etype, idata );
197- PyObject* pydname = CPyCppyy_PyText_FromString (Cppyy::GetEnumDataName (etype, idata ).c_str ());
197+ std::vector< Cppyy::TCppScope_t> econstants = Cppyy::GetEnumConstants (etype);
198+ for (auto *econstant : econstants ) {
199+ PyObject* val = pyval_from_enum (resolved, pyenum, pyside_type, econstant );
200+ PyObject* pydname = CPyCppyy_PyText_FromString (Cppyy::GetFinalName (econstant ).c_str ());
198201 PyObject_SetAttr (pyenum, pydname, val);
199202 PyObject_SetAttr (val, PyStrings::gCppName , pydname);
200203 Py_DECREF (pydname);
@@ -215,4 +218,4 @@ CPyCppyy::CPPEnum* CPyCppyy::CPPEnum_New(const std::string& name, Cppyy::TCppSco
215218 }
216219
217220 return pyenum;
218- }
221+ }
0 commit comments