33#include <unordered_map>
39#define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
40#define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
47 const static bool foundSymbol = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
55 TNamed(*cl), fBase(cl->GetListOfBases()),
56 fEnums(cl->GetListOfEnums()), fSizeof(cl->Size()), fCheckSum(cl->fCheckSum),
57 fCanSplit(cl->fCanSplit), fStreamerType(cl->fStreamerType), fProperty(cl->fProperty),
58 fClassProperty(cl->fClassProperty)
74 if (dataMembers && dataMembers->
GetSize() > 0) {
76 for (
auto * obj : *dataMembers) {
84 std::vector<TString> &fDepClasses;
85 std::unordered_map<std::string, int> fDepClassIdx;
87 DepClassDedup(std::vector<TString> &depClasses): fDepClasses(depClasses)
89 R__ASSERT(fDepClasses.empty() &&
"Expected fDepClasses to be empty before fililng it!");
94 if (fDepClasses.size() != fDepClassIdx.size())
95 ::Error(
"TProtoClass::DepClassDedup::~DepClassDedup",
96 "Mismatching size of fDepClasses and index map! Please report.");
99 int GetIdx(
const char *
name) {
100 auto itins = fDepClassIdx.insert({
name, fDepClasses.size()});
102 fDepClasses.emplace_back(
name);
104 return itins.first->second;
121 protoRealData.
fClassIndex = depClassDedup.GetIdx(clRD->GetName());
173 for (
auto dm:
fData) {
217 Info(
"FillTClass",
"Returning w/o doing anything. %s is a STL collection.",cl->
GetName());
222 Info(
"FillTClass",
"Returning w/o doing anything. %s is a namespace.",cl->
GetName());
225 Error(
"FillTClass",
"TClass %s already initialized!", cl->
GetName());
229 Fatal(
"FillTClass",
"Filling TClass %s a second time but none of the info is in the TClass instance ... ", cl->
GetName());
242 if (element.IsAClass() ) {
286 temp->Add((
TEnum*) enumAsTObj);
298 "For %s the sizeof provided by GenerateInitInstance (%d) is different from the one provided by TProtoClass (%d)",
309 if (cl->
fBase.load()) {
310 for (
auto base: *cl->
fBase) {
315 for (
auto dm: *cl->
fData) {
321 for (
auto en: *cl->
fEnums) {
322 ((
TEnum*)en)->SetClass(cl);
328 TClass* currentRDClass = cl;
333 size_t element_next_idx = 0;
337 if (element.IsAClass() ) {
345 const char *classname =
GetClassName(element.fClassIndex);
354 size_t hint_offset =
fPRealData[element_next_idx].fOffset - element.fOffset;
355 size_t hint_size = 0;
357 size_t end = element_next_idx + 1;
361 hint_size =
fPRealData[end].fOffset - element.fOffset;
363 hint_size =
fSizeof - element.fOffset;
365 currentRDClass =
TClass::GetClass(classname,
true,
false, hint_offset, hint_size);
367 if (!currentRDClass) {
370 "Cannot find TClass for %s; Creating an empty one in the kForwardDeclared state.", classname);
376 if (!currentRDClass)
continue;
380 if (
TRealData* rd = element.CreateRealData(currentRDClass, cl,prevRealData, prevLevel)) {
384 Info(
"FillTClass",
"Real data for class %s is not empty - make a new one",cl->
GetName() );
393 prevLevel = element.fLevel;
401 Info(
"FillTClas",
"Real data for class %s is not empty - make a new one. Class has no Proto-realdata",cl->
GetName() );
432 fOffset(rd->GetThisOffset()),
475 "Cannot find data member # %d of class %s for parent %s!", fDMIndex, dmClass->
GetName(),
484 if (dm) realMemberName = dm->
GetName();
486 realMemberName = (fDMIndex == 0) ?
"first" :
"second";
489 realMemberName =
TString(
"*")+realMemberName;
494 for (
int idim = 0; idim < dm->
GetArrayDim(); ++idim)
497 std::string typeNameBuf;
499 std::array<Int_t, 5> maxIndices;
504 for (
Int_t idim = 0; idim < ndim; ++idim) {
510 if (prevData && fLevel > 0 ) {
511 if (fLevel-prevLevel == 1)
513 else if (fLevel <= prevLevel) {
515 std::string prevName = prevData->
GetName();
517 std::string parentName;
518 for (
int i = 0; i < prevLevel-fLevel+1; ++i) {
519 parentName = prevName.substr(0, prevName.find_last_of(
".") );
520 prevName = parentName;
531 if (TestFlag(kIsTransient)) {
546 for (
auto * obj : *dmList) {
554 ::Error(
"TProtoClass::DataMemberIndex",
"data member %s is not found in class %s",
name, cl->
GetName());
566 for (
auto * obj : *dmList) {
575 ::Error(
"TProtoClass::FindDataMember",
"data member with index %d is not found in class %s",index,cl->
GetName());
static bool IsFromRootCling()
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
R__EXTERN Int_t gErrorIgnoreLevel
R__EXTERN TInterpreter * gCling
static bool IsFromRootCling()
Each class (see TClass) has a linked list of its base class(es).
TClass instances represent classes, structs and namespaces in the ROOT type system.
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
EState fState
cached of the streaming method to use
Int_t fStreamerType
saved info to call Streamer
void BuildRealData(void *pointer=0, Bool_t isTransient=kFALSE)
Build a full list of persistent data members.
std::atomic< TList * > fBase
Bool_t fIsSyntheticPair
Indicates whether this class can be split or not. Values are -1, 0, 1, 2.
std::atomic< UInt_t > fCheckSum
std::atomic< TListOfEnums * > fEnums
Bool_t HasInterpreterInfo() const
std::atomic< Long_t > fProperty
TList * GetListOfDataMembers(Bool_t load=kTRUE)
Return list containing the TDataMembers of a class.
TList * GetListOfRealData() const
std::atomic< TListOfDataMembers * > fData
ClassInfo_t * GetClassInfo() const
Long_t Property() const
Returns the properties of the TClass as a bit field stored as a Long_t value.
Long_t fOffsetStreamer
Properties that can only be evaluated at run-time.
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
void SetStreamerImpl()
Internal routine to set fStreamerImpl based on the value of fStreamerType.
void CalculateStreamerOffset() const
Calculate the offset between an object of this class to its base class TObject.
Long_t fClassProperty
Property See TClass::Property() for details.
std::atomic< Bool_t > fHasRootPcmInfo
C++ Property of the class (is abstract, has virtual table, etc.)
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
virtual void ls(Option_t *option="") const
List (ls) all objects in this collection.
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
All ROOT classes may have RTTI (run time type identification) support added.
Int_t GetMaxIndex(Int_t dim) const
Return maximum index for array dimension "dim".
Int_t GetArrayDim() const
Return number of array dimensions.
const char * GetTypeName() const
Get type of data member, e,g.: "class TDirectory*" -> "TDirectory".
Long_t Property() const
Get property description word. For meaning of bits see EProperty.
TClass * GetClass() const
The TEnum class implements the enum type.
virtual int ClassInfo_Size(ClassInfo_t *) const
A collection of TDataMember objects designed for fast access given a DeclId_t and for keep track of T...
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
Bool_t fIsLoaded
Holder of TEnum for unloaded Enums.
void Load()
Load all the DataMembers known to the interpreter for the scope 'fClass' into this collection.
virtual void Delete(Option_t *option="")
Remove all objects from the list AND delete all heap based objects.
virtual void AddLast(TObject *obj)
Add object at the end of the list.
virtual void Clear(Option_t *option="")
Remove all objects from the list.
The TNamed class is the base class for all named ROOT classes.
virtual const char * GetName() const
Returns name of object.
Mother of all ROOT objects.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
Int_t TestBits(UInt_t f) const
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Bool_t FillTClass(TClass *pcl)
Move data from this TProtoClass into cl.
virtual ~TProtoClass()
Destructor.
const char * GetClassName(Int_t index) const
std::vector< TDataMember * > fData
void Delete(Option_t *opt="")
Delete the containers that are usually owned by their TClass.
std::vector< TProtoRealData > fPRealData
std::vector< TString > fDepClasses
static Int_t DataMemberIndex(TClass *cl, const char *name)
static TDataMember * FindDataMember(TClass *cl, Int_t index)
The TRealData class manages the effective list of all data members for a given class.
TDataMember * GetDataMember() const
virtual const char * GetName() const
Returns name of object.
void SetIsObject(Bool_t isObject)
const char * Data() const
Int_t CountChar(Int_t c) const
Return number of times character c occurs in the string.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
virtual Int_t GetProperties() const
bool IsStdArray(std::string_view name)
bool IsStdPair(std::string_view name)
bool GetStdArrayProperties(const char *typeName, std::string &typeNameBuf, std::array< int, 5 > &maxIndices, int &ndim)
void SetFlag(UInt_t f, Bool_t on=kTRUE)
TRealData * CreateRealData(TClass *currentClass, TClass *parent, TRealData *parentData, int prevLevel) const
Create a TRealData from this, with its data member coming from dmClass.
virtual ~TProtoRealData()
Destructor to pin vtable.