21 __author__ =
"Sebastien Binet"
31 'char',
'unsigned char',
'signed char',
32 'short',
'unsigned short',
33 'int',
'unsigned int',
34 'long',
'unsigned long',
35 'long long',
'unsigned long long',
'ulonglong',
60 print (
"## initializing...")
63 self.
Type = cppyy.gbl.RootType
69 klassNames = [klassName]
70 print (
"## loading dictionary... [%s]" % klassName)
73 if klassName.startswith(
"std::_"):
78 if klassName
in _cpp_builtins:
83 loaded = getattr (self.
gbl, klassName)
84 except Exception
as e:
85 print (
"Error loading dict. for [%s]" % klassName)
88 print (
"Failed to load dict for [%s]" % klassName)
90 klass = self.
Type.ByName(klassName)
92 if not klass.IsStruct()
and not klass.IsClass():
95 for i
in range(klass.BaseSize()):
96 baseKlassName = klass.BaseAt(i).Name()
97 klassNames.extend (self.
loadDicts(baseKlassName))
106 for i
in range(klass.DataMemberSize()):
107 d = klass.DataMemberAt(i)
109 offset =
'<s>' if d.IsStatic()
else d.Offset()
110 fullname =
'::'.
join([scope, d.Name(SFQ)])
111 typename = d.TypeOf().Name(SFQ)
112 dataMembers.append(
DataMember(offset, fullname, typename) )
117 for i
in range(klass.FunctionMemberSize()):
118 f = klass.FunctionMemberAt(i)
119 fctMembers.append(
FctMember( f.Name(SFQ),
120 f.TypeOf().Name(SFQ) ) )
128 print (
"## loading all relevant dictionaries...")
130 klassNames = self.loadDicts(klassName)
132 except Exception
as err:
135 print (
"## ERROR while trying to load dict for [%s]" % klassName)
136 print (
"## -Most probably you DIDN'T give a fully qualified name !")
137 print (
"## Ex: try 'Analysis::Muon' instead of 'Muon'")
139 print (
"## -Could also mean that you are missing a dictionary ")
140 print (
"## of one of the base classes...")
148 print (
"## infos for class [%s]:" % klassName)
149 print (
"## sizeof(%s) = %i" % \
151 self.Type.SizeOf(self.Type.ByName(klassName))))
153 print (
"## (offset, data member name, data member type)")
157 for klass
in klassNames:
158 line =
"%s %s %s" % (
159 "-" * (40-len(klass)//2-1),
161 "-" * (40-len(klass)//2-1) )
165 dataMembers = self.dumpDataMembers( self.Type.ByName(klass) )
166 for i
in dataMembers:
167 line =
"%3s %s %-50s %s %s" % (
str(i.offset),
176 def save(self, fileName = "./columbo.out" ):
177 file =
open(os.path.expandvars(os.path.expanduser(fileName)),
179 for line
in self.report:
180 file.writelines(line + os.linesep)
187 if __name__ ==
'__main__':
188 if len(sys.argv) > 1:
189 klassName = sys.argv[1]
191 klassName =
"xAOD::TruthParticle_v1"
195 columbo.inspect(klassName)