93{
94 R__ASSERT(IsReading());
95
96
97 InitMap();
98
99
100 UInt_t startpos = UInt_t(fBufCur-fBuffer);
101
102
104 TClass *clRef = ReadClass(clCast, &tag);
105 TClass *clOnfile = 0;
106 Int_t baseOffset = 0;
107 if (clRef && (clRef!=invalidPtr) && clCast) {
108
109 baseOffset = clRef->GetBaseClassOffset(clCast);
110 if (baseOffset == -1) {
111
112
113 if (!clCast->GetSchemaRules() ||
114 !clCast->GetSchemaRules()->HasRuleWithSourceClass(clRef->GetName()))
115 {
116
117 Error(
"ReadObject",
"got object of wrong class! requested %s but got %s",
118 clCast->GetName(), clRef->GetName());
119
120 CheckByteCount(startpos, tag, (TClass*)0);
121 return 0;
122 }
123 baseOffset = 0;
124
125
126 clOnfile = clRef;
127 clRef = const_cast<TClass*>(clCast);
128
129 }
130 if (clCast->GetState() > TClass::kEmulated && clRef->GetState() <= TClass::kEmulated) {
131
132 Error(
"ReadObject",
"trying to read an emulated class (%s) to store in a compiled pointer (%s)",
133 clRef->GetName(),clCast->GetName());
134 CheckByteCount(startpos, tag, (TClass*)0);
135 return 0;
136 }
137 }
138
139
140
142 if (fVersion > 0) {
144 if (obj == (
void*) -1)
obj = 0;
145 if (obj) {
146 CheckByteCount(startpos, tag, (TClass*)0);
147 return (obj+baseOffset);
148 }
149 }
150
151
152 if (clRef == invalidPtr) {
153 if (fBufCur >= fBufMax) return 0;
154 if (fVersion > 0)
155 MapObject((TObject*) -1, startpos+
kMapOffset);
156 else
157 MapObject((void*)0, 0, fMapCount);
158 CheckByteCount(startpos, tag, (TClass*)0);
159 return 0;
160 }
161
162 if (!clRef) {
163
164
165 if (fVersion > 0) {
166 tag += fDisplacement;
167 tag = CheckObject(tag, clCast);
168 } else {
169 if (tag > (UInt_t)fMap->GetSize()) {
170 Error(
"ReadObject",
"object tag too large, I/O buffer corrupted");
171 return 0;
172
173 }
174 }
175 obj = (
char *) (Long_t)fMap->GetValue(tag);
176 clRef = (TClass*) (Long_t)fClassMap->GetValue(tag);
177
178 if (clRef && (clRef!=invalidPtr) && clCast) {
179
180 baseOffset = clRef->GetBaseClassOffset(clCast);
181 if (baseOffset == -1) {
182 Error(
"ReadObject",
"Got object of wrong class (Got %s while expecting %s)",
183 clRef->GetName(),clCast->GetName());
184
185 baseOffset = 0;
186 }
187 }
188
189
190
191
192
193
194
195
196
197 } else {
198
199
200 obj = (
char*)clRef->New();
201 if (!obj) {
202 Error(
"ReadObject",
"could not create object of class %s",
203 clRef->GetName());
204
205 return 0;
206 }
207
208
209 if (fVersion > 0)
211 else
212 MapObject(obj, clRef, fMapCount);
213
214
215 clRef->Streamer( obj, *this, clOnfile );
216
217 CheckByteCount(startpos, tag, clRef);
218 }
219
220 return obj+baseOffset;
221}
Error
The different types of error that can be flagged in the L1TopoRDO.