示例#1
0
        private static void SerializeTupleElementNames(
            ref CustomDebugInfoEncoder encoder,
            IMethodBody methodBody
            )
        {
            var locals = GetLocalInfoToSerialize(
                methodBody,
                local => !local.TupleElementNames.IsEmpty,
                (scope, local) =>
                (
                    local.Name,
                    local.SlotIndex,
                    scope.StartOffset,
                    scope.EndOffset,
                    local.TupleElementNames
                )
                );

            if (locals == null)
            {
                return;
            }

            encoder.AddTupleElementNames(locals);

            locals.Free();
        }
示例#2
0
        private static void SerializeDynamicLocalInfo(
            ref CustomDebugInfoEncoder encoder,
            IMethodBody methodBody
            )
        {
            if (!methodBody.HasDynamicLocalVariables)
            {
                return;
            }

            byte[] GetDynamicFlags(ILocalDefinition local)
            {
                var dynamicTransformFlags = local.DynamicTransformFlags;
                var flags = new byte[CustomDebugInfoEncoder.DynamicAttributeSize];

                for (int k = 0; k < dynamicTransformFlags.Length; k++)
                {
                    if (dynamicTransformFlags[k])
                    {
                        flags[k] = 1;
                    }
                }

                return(flags);
            }

            var dynamicLocals = GetLocalInfoToSerialize(
                methodBody,
                local =>
            {
                var dynamicTransformFlags = local.DynamicTransformFlags;
                return(!dynamicTransformFlags.IsEmpty &&
                       dynamicTransformFlags.Length
                       <= CustomDebugInfoEncoder.DynamicAttributeSize &&
                       local.Name.Length < CustomDebugInfoEncoder.IdentifierSize);
            },
                (scope, local) =>
                (
                    local.Name,
                    GetDynamicFlags(local),
                    local.DynamicTransformFlags.Length,
                    (local.SlotIndex < 0) ? 0 : local.SlotIndex
                )
                );

            if (dynamicLocals == null)
            {
                return;
            }

            encoder.AddDynamicLocals(dynamicLocals);
            dynamicLocals.Free();
        }