28 if (enum_type ==
"bool" && !(pytype && btype)) {
36 if (enum_type ==
"char") {
37 char val = (char)llval;
38 bval = PyUnicode_FromOrdinal((
int)val);
39 }
else if (enum_type ==
"int" || enum_type ==
"unsigned int")
40 bval = PyLong_FromLong((
long)llval);
42 bval = PyLong_FromLongLong(llval);
47 if (pytype && btype) {
49 PyTuple_SET_ITEM(args, 0, bval);
50 bval = ((PyTypeObject*)btype)->tp_new((PyTypeObject*)pytype, args,
nullptr);
69 PyObject_GetAttr((
PyObject*)Py_TYPE(self), PyStrings::gThisModule);
73 PyObject_GetAttr((
PyObject*)Py_TYPE(self), PyStrings::gCppName);
76 PyObject* obj_cppname = PyObject_GetAttr(self, PyStrings::gCppName);
79 PyObject* obj_str = Py_TYPE(self)->tp_str(self);
82 if (kls_cppname && obj_cppname && obj_str) {
83 const std::string resolved =
85 repr = PyUnicode_FromFormat(
"(%s::%s) : (%s) %s",
86 PyUnicode_AsUTF8(kls_cppname),
87 PyUnicode_AsUTF8(obj_cppname), resolved.c_str(),
88 PyUnicode_AsUTF8(obj_str));
90 Py_XDECREF(obj_cppname);
91 Py_XDECREF(kls_cppname);
170 PyObject* pymetabases = PyTuple_New(1);
173 PyTuple_SET_ITEM(pymetabases, 0, btype);
176 Py_BuildValue((
char*)
"sO{}", (
name +
"_meta").c_str(), pymetabases);
177 Py_DECREF(pymetabases);
178 PyObject* pymeta = PyType_Type.tp_new(Py_TYPE(pyside_type), args,
nullptr);
183 Py_INCREF(pyside_type);
184 PyTuple_SET_ITEM(pybases, 0, (
PyObject*)pyside_type);
188 PyObject* pycppname = PyUnicode_FromString(ename.c_str());
189 PyObject* pycppscope = PyLong_FromVoidPtr(etype.data);
190 PyDict_SetItem(dct, PyStrings::gCppName, pycppname);
191 PyDict_SetItem(dct, PyStrings::gThisModule, pycppscope);
192 Py_DECREF(pycppname);
193 PyObject* pyresolved = PyUnicode_FromString(resolved.c_str());
194 PyDict_SetItem(dct, PyStrings::gUnderlying, pyresolved);
195 Py_DECREF(pyresolved);
198 std::string modname = TypeManip::extract_namespace(ename);
199 TypeManip::cppscope_to_pyscope(modname);
200 if (!modname.empty())
201 modname =
"." + modname;
203 PyUnicode_FromString((
"cppjit.gbl" + modname).c_str());
204 PyDict_SetItem(dct, PyStrings::gModule, pymodname);
205 Py_DECREF(pymodname);
208 args = Py_BuildValue((
char*)
"sOO",
name.c_str(), pybases, dct);
212 ((PyTypeObject*)pymeta)->tp_new((PyTypeObject*)pymeta, args,
nullptr);
215 Utility::AddToClass((
PyObject*)Py_TYPE(pyenum),
"__ctype__",
216 (PyCFunction)
enum_ctype, METH_VARARGS | METH_KEYWORDS);
217 ((PyTypeObject*)pyenum)->tp_repr =
enum_repr;
218 ((PyTypeObject*)pyenum)->tp_str = ((PyTypeObject*)pyside_type)->tp_repr;
221 std::vector<interop::TCppScope_t> econstants =
223 bool values_ok =
true;
224 for (
auto econstant : econstants) {
231 PyObject* pydname = PyUnicode_FromString(dname.c_str());
232 PyObject_SetAttr(pyenum, pydname, val);
234 PyObject* pydcppname = PyUnicode_FromString(
235 (ename.empty() ? dname : (ename +
"::" + dname)).c_str());
236 PyObject_SetAttr(val, PyStrings::gCppName, pydcppname);
237 Py_DECREF(pydcppname);
249 if (!PyErr_Occurred())
250 PyErr_SetString(PyExc_ValueError,
251 "could not set some of the enum values");
258 Py_INCREF(&PyLong_Type);