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