@@ -161,7 +161,6 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
161
161
pTemplateEEType = pTemplateEEType ->DynamicTemplateType ;
162
162
}
163
163
164
- uint valueTypeFieldPaddingEncoded = 0 ;
165
164
int baseSize = 0 ;
166
165
167
166
bool isValueType ;
@@ -171,68 +170,32 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
171
170
bool isGeneric ;
172
171
uint flags ;
173
172
ushort runtimeInterfacesLength = 0 ;
174
- bool isAbstractClass ;
175
- bool isByRefLike ;
176
173
IntPtr typeManager = IntPtr . Zero ;
177
174
178
175
if ( state . RuntimeInterfaces != null )
179
176
{
180
177
runtimeInterfacesLength = checked ( ( ushort ) state . RuntimeInterfaces . Length ) ;
181
178
}
182
179
183
- valueTypeFieldPaddingEncoded = EETypeBuilderHelpers . ComputeValueTypeFieldPaddingFieldValue (
184
- pTemplateEEType ->ValueTypeFieldPadding ,
185
- ( uint ) pTemplateEEType ->FieldAlignmentRequirement ,
186
- IntPtr . Size ) ;
187
180
baseSize = ( int ) pTemplateEEType ->BaseSize ;
188
181
isValueType = pTemplateEEType ->IsValueType ;
189
182
hasFinalizer = pTemplateEEType ->IsFinalizable ;
190
183
isNullable = pTemplateEEType ->IsNullable ;
191
184
flags = pTemplateEEType ->Flags ;
192
185
isArray = pTemplateEEType ->IsArray ;
193
186
isGeneric = pTemplateEEType ->IsGeneric ;
194
- isAbstractClass = pTemplateEEType ->IsAbstract && ! pTemplateEEType ->IsInterface ;
195
- isByRefLike = pTemplateEEType ->IsByRefLike ;
196
187
typeManager = pTemplateEEType ->PointerToTypeManager ;
197
188
Debug . Assert ( pTemplateEEType ->NumInterfaces == runtimeInterfacesLength ) ;
198
189
199
190
flags |= ( uint ) EETypeFlags . IsDynamicTypeFlag ;
200
191
201
- // TODO! Change to if template is Universal or non-Existent
202
-
203
- // FEATURE_UNIVERSAL_GENERICS?
204
- if ( state . TypeSize . HasValue )
192
+ if ( state . TypeBeingBuilt . IsMdArray )
205
193
{
206
- baseSize = state . TypeSize . Value ;
207
-
208
- int baseSizeBeforeAlignment = baseSize ;
209
-
210
- baseSize = MemoryHelpers . AlignUp ( baseSize , IntPtr . Size ) ;
211
-
212
- if ( isValueType )
213
- {
214
- // Compute the valuetype padding size based on size before adding the object type pointer field to the size
215
- uint cbValueTypeFieldPadding = ( uint ) ( baseSize - baseSizeBeforeAlignment ) ;
216
-
217
- // Add Object type pointer field to base size
218
- baseSize += IntPtr . Size ;
219
-
220
- valueTypeFieldPaddingEncoded = ( uint ) EETypeBuilderHelpers . ComputeValueTypeFieldPaddingFieldValue ( cbValueTypeFieldPadding , ( uint ) state . FieldAlignment . Value , IntPtr . Size ) ;
221
- }
222
-
223
- // Minimum base size is 3 pointers, and requires us to bump the size of an empty class type
224
- if ( baseSize <= IntPtr . Size )
225
- {
226
- // ValueTypes should already have had their size bumped up by the normal type layout process
227
- Debug . Assert ( ! isValueType ) ;
228
- baseSize += IntPtr . Size ;
229
- }
230
-
231
- // Add sync block skew
232
- baseSize += IntPtr . Size ;
233
-
234
- // Minimum basesize is 3 pointers
235
- Debug . Assert ( baseSize >= ( IntPtr . Size * 3 ) ) ;
194
+ // If we're building an MDArray, the template is object[,] and we
195
+ // need to recompute the base size.
196
+ baseSize = IntPtr . Size + // sync block
197
+ 2 * IntPtr . Size + // EETypePtr + Length
198
+ state . ArrayRank . Value * sizeof ( int ) * 2 ; // 2 ints per rank for bounds
236
199
}
237
200
238
201
// Optional fields encoding
@@ -241,7 +204,11 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
241
204
242
205
uint rareFlags = optionalFields . GetFieldValue ( EETypeOptionalFieldTag . RareFlags , 0 ) ;
243
206
244
- if ( state . NonGcDataSize != 0 )
207
+ int allocatedNonGCDataSize = state . NonGcDataSize ;
208
+ if ( state . HasStaticConstructor )
209
+ allocatedNonGCDataSize += - TypeBuilder . ClassConstructorOffset ;
210
+
211
+ if ( allocatedNonGCDataSize != 0 )
245
212
rareFlags |= ( uint ) EETypeRareFlags . IsDynamicTypeWithNonGcStatics ;
246
213
247
214
if ( state . GcDataSize != 0 )
@@ -250,60 +217,11 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
250
217
if ( state . ThreadDataSize != 0 )
251
218
rareFlags |= ( uint ) EETypeRareFlags . IsDynamicTypeWithThreadStatics ;
252
219
253
- #if TARGET_ARM
254
- if ( state . FieldAlignment == 8 )
255
- rareFlags |= ( uint ) EETypeRareFlags . RequiresAlign8Flag ;
256
- else
257
- rareFlags &= ~ ( uint ) EETypeRareFlags . RequiresAlign8Flag ;
258
- #endif
259
-
260
- #if TARGET_ARM || TARGET_ARM64
261
- if ( state . IsHFA )
262
- rareFlags |= ( uint ) EETypeRareFlags . IsHFAFlag ;
263
- else
264
- rareFlags &= ~ ( uint ) EETypeRareFlags . IsHFAFlag ;
265
- #endif
266
- if ( state . HasStaticConstructor )
267
- rareFlags |= ( uint ) EETypeRareFlags . HasCctorFlag ;
268
- else
269
- rareFlags &= ~ ( uint ) EETypeRareFlags . HasCctorFlag ;
270
-
271
- if ( isAbstractClass )
272
- rareFlags |= ( uint ) EETypeRareFlags . IsAbstractClassFlag ;
273
- else
274
- rareFlags &= ~ ( uint ) EETypeRareFlags . IsAbstractClassFlag ;
275
-
276
- if ( isByRefLike )
277
- rareFlags |= ( uint ) EETypeRareFlags . IsByRefLikeFlag ;
278
- else
279
- rareFlags &= ~ ( uint ) EETypeRareFlags . IsByRefLikeFlag ;
280
-
281
- if ( isNullable )
282
- {
283
- uint nullableValueOffset = state . NullableValueOffset ;
284
-
285
- // The stored offset is never zero (Nullable has a boolean there indicating whether the value is valid).
286
- // If the real offset is one, then the field isn't set. Otherwise the offset is encoded - 1 to save space.
287
- if ( nullableValueOffset == 1 )
288
- optionalFields . ClearField ( EETypeOptionalFieldTag . NullableValueOffset ) ;
289
- else
290
- optionalFields . SetFieldValue ( EETypeOptionalFieldTag . NullableValueOffset , checked ( nullableValueOffset - 1 ) ) ;
291
- }
292
- else
293
- {
294
- optionalFields . ClearField ( EETypeOptionalFieldTag . NullableValueOffset ) ;
295
- }
296
-
297
220
optionalFields . SetFieldValue ( EETypeOptionalFieldTag . RareFlags , rareFlags ) ;
298
221
299
222
// Dispatch map is fetched from template type
300
223
optionalFields . ClearField ( EETypeOptionalFieldTag . DispatchMap ) ;
301
224
302
- optionalFields . ClearField ( EETypeOptionalFieldTag . ValueTypeFieldPadding ) ;
303
-
304
- if ( valueTypeFieldPaddingEncoded != 0 )
305
- optionalFields . SetFieldValue ( EETypeOptionalFieldTag . ValueTypeFieldPadding , valueTypeFieldPaddingEncoded ) ;
306
-
307
225
// Compute size of optional fields encoding
308
226
cbOptionalFieldsSize = optionalFields . Encode ( ) ;
309
227
Debug . Assert ( cbOptionalFieldsSize > 0 ) ;
@@ -328,7 +246,7 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
328
246
true ,
329
247
( rareFlags & ( int ) EETypeRareFlags . HasSealedVTableEntriesFlag ) != 0 ,
330
248
isGeneric ,
331
- state . NonGcDataSize != 0 ,
249
+ allocatedNonGCDataSize != 0 ,
332
250
state . GcDataSize != 0 ,
333
251
state . ThreadDataSize != 0 ) ;
334
252
@@ -401,19 +319,19 @@ private static void CreateEETypeWorker(MethodTable* pTemplateEEType, uint hashCo
401
319
nonGCStaticDataOffset = state . HasStaticConstructor ? - TypeBuilder . ClassConstructorOffset : 0 ;
402
320
403
321
// If we have a class constructor, our NonGcDataSize MUST be non-zero
404
- Debug . Assert ( ! state . HasStaticConstructor || ( state . NonGcDataSize != 0 ) ) ;
322
+ Debug . Assert ( ! state . HasStaticConstructor || ( allocatedNonGCDataSize != 0 ) ) ;
405
323
}
406
324
407
325
if ( isGeneric )
408
326
{
409
327
genericComposition = MemoryHelpers . AllocateMemory ( MethodTable . GetGenericCompositionSize ( arity , pEEType ->HasGenericVariance ) ) ;
410
328
pEEType ->SetGenericComposition ( genericComposition ) ;
411
329
412
- if ( state . NonGcDataSize > 0 )
330
+ if ( allocatedNonGCDataSize > 0 )
413
331
{
414
- nonGcStaticData = MemoryHelpers . AllocateMemory ( state . NonGcDataSize ) ;
415
- MemoryHelpers . Memset ( nonGcStaticData , state . NonGcDataSize , 0 ) ;
416
- Debug . Assert ( nonGCStaticDataOffset <= state . NonGcDataSize ) ;
332
+ nonGcStaticData = MemoryHelpers . AllocateMemory ( allocatedNonGCDataSize ) ;
333
+ MemoryHelpers . Memset ( nonGcStaticData , allocatedNonGCDataSize , 0 ) ;
334
+ Debug . Assert ( nonGCStaticDataOffset <= allocatedNonGCDataSize ) ;
417
335
pEEType ->DynamicNonGcStaticsData = ( IntPtr ) ( ( byte * ) nonGcStaticData + nonGCStaticDataOffset ) ;
418
336
}
419
337
}
0 commit comments