Пример #1
0
        protected virtual void ComputeValueTypeFieldPadding()
        {
            // All objects that can have appreciable which can be derived from size compute ValueTypeFieldPadding.
            // Unfortunately, the name ValueTypeFieldPadding is now wrong to avoid integration conflicts.

            // Interfaces, sealed types, and non-DefTypes cannot be derived from
            if (_type.IsInterface || !_type.IsDefType || (_type.IsSealed() && !_type.IsValueType))
            {
                return;
            }

            DefType defType = _type as DefType;

            Debug.Assert(defType != null);

            uint valueTypeFieldPaddingEncoded;

            if (defType.InstanceByteCount.IsIndeterminate)
            {
                valueTypeFieldPaddingEncoded = EETypeBuilderHelpers.ComputeValueTypeFieldPaddingFieldValue(0, 1);
            }
            else
            {
                uint valueTypeFieldPadding = checked ((uint)(defType.InstanceByteCount.AsInt - defType.InstanceByteCountUnaligned.AsInt));
                valueTypeFieldPaddingEncoded = EETypeBuilderHelpers.ComputeValueTypeFieldPaddingFieldValue(valueTypeFieldPadding, (uint)defType.InstanceFieldAlignment.AsInt);
            }

            if (valueTypeFieldPaddingEncoded != 0)
            {
                _optionalFieldsBuilder.SetFieldValue(EETypeOptionalFieldTag.ValueTypeFieldPadding, valueTypeFieldPaddingEncoded);
            }
        }
Пример #2
0
        protected internal override void ComputeOptionalEETypeFields(NodeFactory factory, bool relocsOnly)
        {
            if (_type.IsCanonicalDefinitionType(CanonicalFormKind.Universal))
            {
                // Value types should have at least 1 byte of size to avoid zero-length structures
                // Add pointer-size to the number of instance field bytes to consistently represents the boxed size.
                uint numInstanceFieldBytes = 1 + (uint)factory.Target.PointerSize;

                uint valueTypeFieldPadding        = (uint)(MinimumObjectSize - factory.Target.PointerSize) - numInstanceFieldBytes;
                uint valueTypeFieldPaddingEncoded = EETypeBuilderHelpers.ComputeValueTypeFieldPaddingFieldValue(valueTypeFieldPadding, 1, _type.Context.Target.PointerSize);
                Debug.Assert(valueTypeFieldPaddingEncoded != 0);

                _optionalFieldsBuilder.SetFieldValue(EETypeOptionalFieldTag.ValueTypeFieldPadding, valueTypeFieldPaddingEncoded);
            }
        }
Пример #3
0
        void ComputeValueTypeFieldPadding()
        {
            if (!_type.IsValueType)
            {
                return;
            }

            DefType defType = _type as DefType;

            Debug.Assert(defType != null);

            uint valueTypeFieldPadding        = checked ((uint)(defType.InstanceByteCount - defType.InstanceByteCountUnaligned));
            uint valueTypeFieldPaddingEncoded = EETypeBuilderHelpers.ComputeValueTypeFieldPaddingFieldValue(valueTypeFieldPadding, (uint)defType.InstanceFieldAlignment);

            if (valueTypeFieldPaddingEncoded != 0)
            {
                _optionalFieldsBuilder.SetFieldValue(EETypeOptionalFieldsElement.ValueTypeFieldPadding, valueTypeFieldPaddingEncoded);
            }
        }