455 if (!TPython::CPPInstance_Check(pyobj)) {
465 void *
obj = TPython::CPPInstance_AsVoidPtr(pyobj);
467 if (!strcmp(tcls->GetName(),
"string")) {
468 std::string *
str = (std::string*)
obj;
469 return PyUnicode_FromString(
str->c_str());
472 TString tstring = tcls->GetName();
473 if (tstring.BeginsWith(
"pair<") ||
474 tstring.BeginsWith(
"std::pair<")) {
476 PyObject *
v0 = PyObject_GetAttrString(pyobj,
"first");
477 PyObject *v1 = PyObject_GetAttrString(pyobj,
"second");
486 if (is_sequence(pyobj)) {
487 if (!strcmp(tcls->GetName(),
"CLHEP::Hep3Vector")) {
496 TList *members = tcls->GetListOfDataMembers();
497 const Int_t nmembers = members->GetEntries();
499 PyObject *py_members = PyList_New(nmembers+hdr);
500 #if PYROOT_INSPECTOR_DBG
501 std::cerr <<
"==[" << tcls->GetName() <<
"]== (#mbrs:"
504 <<
" #py-sz:" << PyList_Size(py_members)
510 const Py_ssize_t nelems = PySequence_Size(pyobj);
511 #if PYROOT_INSPECTOR_DBG
512 std::cerr <<
"== sequence (" << nelems <<
")...\n";
514 PyObject *py_elems = PyList_New(nelems);
515 for (Py_ssize_t
i = 0;
i < nelems; ++
i) {
516 PyObject *itr = PySequence_GetItem(pyobj,
i);
518 PyList_SET_ITEM(py_elems,
i, itr_pyroot);
523 PyList_SET_ITEM(py_members, 0, py_elems);
524 #if PYROOT_INSPECTOR_DBG
525 std::cerr <<
"== sequence (" << nelems <<
")... content:\n"
526 << ::to_str(py_elems)
528 std::cerr <<
"== sequence (" << nelems <<
")... [done]\n";
533 for (Int_t j = 0; j<nmembers; ++j) {
534 TDataMember *mbr = (TDataMember*)(members->At(j));
535 Int_t
offset = mbr->GetOffset();
538 #if PYROOT_INSPECTOR_DBG
539 TClass *mbr_cls = TClass::GetClass(mbr->GetTypeName());
540 std::cerr <<
"==[" << j <<
"] - [" << mbr->GetTypeName() <<
"] "
541 <<
"[" << mbr->GetName()
543 <<
"[" << (mbr_cls ? mbr_cls->GetName() :
"N/A") <<
"]\n";
548 if (persistentOnly && !mbr->IsPersistent())
550 if (mbr->IsaPointer())
552 if (mbr->IsBasic()) {
553 TDataType * mbr_type = mbr->GetDataType();
554 EDataType mbr_dtype = (EDataType)mbr_type->GetType();
555 py_mbr = to_pyobj(
ptr, mbr_dtype);
556 }
else if (mbr->IsEnum()) {
557 #if PYROOT_INSPECTOR_DBG
558 std::cerr <<
"==[" << mbr->GetTypeName() <<
"]["
559 << mbr->GetDataType()->GetType() <<
"][val="
560 << (*(
int*)
ptr) <<
"]["
561 << mbr->GetName() <<
"] is an enum !!\n";
563 py_mbr = to_pyobj(
ptr, kInt_t);
565 PyObject *pyroot_obj = TPython::CPPInstance_FromVoidPtr
571 Py_XDECREF(pyroot_obj);
574 std::cerr <<
"could not create py-object of type ["
575 << mbr->GetTypeName() <<
"] !\n";
576 Py_DECREF(py_members);
581 PyTuple_SET_ITEM(py_item, 0,
582 PyUnicode_FromString(mbr->GetName()));
583 PyTuple_SET_ITEM(py_item, 1, py_mbr);
584 PyList_SET_ITEM(py_members, j+hdr, py_item);
586 #if PYROOT_INSPECTOR_DBG
587 std::cerr <<
"==[" << tcls->GetName() <<
"]== (#mbrs:"
588 << nmembers <<
")... [done]\n";