443{
444
445 if (!TPython::CPPInstance_Check(pyobj)) {
446 Py_XINCREF(pyobj);
447 return pyobj;
448 }
449
451 if (0 == tcls) {
452 Py_INCREF(Py_None);
453 return Py_None;
454 }
455 void *
obj = TPython::CPPInstance_AsVoidPtr(pyobj);
456
457 if (!strcmp(tcls->GetName(), "string")) {
458 std::string *
str = (std::string*)obj;
459 return PyUnicode_FromString(
str->c_str());
460 }
461
462 TString tstring = tcls->GetName();
463 if (tstring.BeginsWith("pair<") ||
464 tstring.BeginsWith("std::pair<")) {
466 PyObject *
v0 = PyObject_GetAttrString(pyobj,
"first");
467 PyObject *v1 = PyObject_GetAttrString(pyobj,
"second");
470 Py_DECREF(v0);
471 Py_DECREF(v1);
473 }
474
475 Int_t hdr = 0;
476 if (CPyCppyy::Sequence_Check(pyobj)) {
477 if (!strcmp(tcls->GetName(), "CLHEP::Hep3Vector")) {
478 hdr = 0;
479 } else {
480 hdr = 1;
481 }
482 } else {
483 hdr = 0;
484 }
485
486 TList *members = tcls->GetListOfDataMembers();
487 const Int_t nmembers = members->GetEntries();
488
489 PyObject *py_members = PyList_New(nmembers+hdr);
490#if PYROOT_INSPECTOR_DBG
491 std::println (std::cerr, "==[{}]== (#mbrs:{} #stl:{} #py-sz:{})...",
492 tcls->GetName(), nmembers, hdr, PyList_Size(py_members));
493#endif
494
495 if (hdr) {
496
497 const Py_ssize_t nelems = PySequence_Size(pyobj);
498#if PYROOT_INSPECTOR_DBG
499 std::println (std::cerr, "== sequence ({})...", nelems);
500#endif
501 PyObject *py_elems = PyList_New(nelems);
502 for (Py_ssize_t i = 0;
i < nelems; ++
i) {
503 PyObject *itr = PySequence_GetItem(pyobj, i);
505 PyList_SET_ITEM(py_elems, i, itr_pyroot);
506 Py_DECREF(itr);
507
508 }
509
510 PyList_SET_ITEM(py_members, 0, py_elems);
511#if PYROOT_INSPECTOR_DBG
512 std::println (std::cerr, "== sequence ({})... content:\n{}",
513 nelems, ::to_str(py_elems));
514 std::println (std::cerr, "== sequence ({})... [done]", nelems);
515#endif
516 }
517
518
519 for (Int_t j = 0;
j<nmembers; ++
j) {
520 TDataMember *mbr = (TDataMember*)(members->At(j));
521 Int_t
offset = mbr->GetOffset();
522 char *
ptr = (
char*)obj + offset;
523
524#if PYROOT_INSPECTOR_DBG
525 TClass *mbr_cls = TClass::GetClass(mbr->GetTypeName());
526 std::println (std::cerr, "==[{}] - [{}] [{}][{}]",
527 j, mbr->GetTypeName(), mbr->GetName(),
528 (mbr_cls ? mbr_cls->GetName() : "N/A"));
529#endif
530
532
533 if (persistentOnly && !mbr->IsPersistent())
534 continue;
535 if (mbr->IsaPointer())
536 continue;
537 if (mbr->IsBasic()) {
538 TDataType * mbr_type = mbr->GetDataType();
539 EDataType mbr_dtype = (EDataType)mbr_type->GetType();
540 py_mbr = to_pyobj(ptr, mbr_dtype);
541 } else if (mbr->IsEnum()) {
542#if PYROOT_INSPECTOR_DBG
543 std::println (std::cerr, "==[{}][{}][val=][{}] is an enum !!",
544 mbr->GetTypeName(), mbr->GetDataType()->GetType(),
545 *reinterpret_cast<int*>(ptr), mbr->GetName());
546#endif
547 py_mbr = to_pyobj(ptr, kInt_t);
548 } else {
549 PyObject *pyroot_obj = TPython::CPPInstance_FromVoidPtr
550 ((void*)ptr,
551 mbr->GetTypeName());
552 if (pyroot_obj) {
554 }
555 Py_XDECREF(pyroot_obj);
556 }
557 if (!py_mbr) {
558 std::println (std::cerr, "could not create py-object of type [{}] !",
559 mbr->GetTypeName());
560 Py_DECREF(py_members);
562 }
563
565 PyTuple_SET_ITEM(py_item, 0,
566 PyUnicode_FromString(mbr->GetName()));
567 PyTuple_SET_ITEM(py_item, 1, py_mbr);
568 PyList_SET_ITEM(py_members, j+hdr, py_item);
569 }
570#if PYROOT_INSPECTOR_DBG
571 std::println (std::cerr, "==[{}]== (#mbrs:{})... [done]",
572 tcls->GetName(), nmembers);
573#endif
574 return py_members;
575}
static PyObject * pyroot_inspect(PyObject *obj, bool persistentOnly=false)
CPyCppyy::PyException PyException
TClass * objectIsA(PyObject *obj)
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)