private static void ValidateCopyTo(byte[] dynamicFlags, params bool[] expectedFlags) { var builder = ArrayBuilder <bool> .GetInstance(); DynamicFlagsCustomTypeInfo.CopyTo(new ReadOnlyCollection <byte>(dynamicFlags), builder); var actualFlags = builder.ToArrayAndFree(); Assert.Equal(expectedFlags, actualFlags); }
private static TypeSymbol DecodeDynamicTypes(TypeSymbol type, AssemblySymbol sourceAssembly, ReadOnlyCollection <byte> bytes) { var builder = ArrayBuilder <bool> .GetInstance(); DynamicFlagsCustomTypeInfo.CopyTo(bytes, builder); var dynamicType = DynamicTypeDecoder.TransformTypeWithoutCustomModifierFlags( type, sourceAssembly, RefKind.None, builder.ToImmutableAndFree(), checkLength: false); Debug.Assert((object)dynamicType != null); Debug.Assert(dynamicType != type); return(dynamicType); }
internal static LocalSymbol Create( TypeNameDecoder <PEModuleSymbol, TypeSymbol> typeNameDecoder, MethodSymbol containingMethod, AssemblySymbol sourceAssembly, Alias alias) { var typeName = alias.Type; Debug.Assert(typeName.Length > 0); var type = typeNameDecoder.GetTypeSymbolForSerializedType(typeName); Debug.Assert((object)type != null); ReadOnlyCollection <byte> dynamicFlags; ReadOnlyCollection <string> tupleElementNames; CustomTypeInfo.Decode(alias.CustomTypeInfoId, alias.CustomTypeInfo, out dynamicFlags, out tupleElementNames); // Preserve tuple element names. See https://github.com/dotnet/roslyn/issues/13589. if (dynamicFlags != null) { var flagsBuilder = ArrayBuilder <bool> .GetInstance(); DynamicFlagsCustomTypeInfo.CopyTo(dynamicFlags, flagsBuilder); var dynamicType = DynamicTypeDecoder.TransformTypeWithoutCustomModifierFlags( type, sourceAssembly, RefKind.None, flagsBuilder.ToImmutableAndFree(), checkLength: false); Debug.Assert(dynamicType != null); Debug.Assert(dynamicType != type); type = dynamicType; } var name = alias.FullName; var displayName = alias.Name; switch (alias.Kind) { case DkmClrAliasKind.Exception: return(new ExceptionLocalSymbol(containingMethod, name, displayName, type, ExpressionCompilerConstants.GetExceptionMethodName)); case DkmClrAliasKind.StowedException: return(new ExceptionLocalSymbol(containingMethod, name, displayName, type, ExpressionCompilerConstants.GetStowedExceptionMethodName)); case DkmClrAliasKind.ReturnValue: { int index; PseudoVariableUtilities.TryParseReturnValueIndex(name, out index); Debug.Assert(index >= 0); return(new ReturnValueLocalSymbol(containingMethod, name, displayName, type, index)); } case DkmClrAliasKind.ObjectId: return(new ObjectIdLocalSymbol(containingMethod, type, name, displayName, isWritable: false)); case DkmClrAliasKind.Variable: return(new ObjectIdLocalSymbol(containingMethod, type, name, displayName, isWritable: true)); default: throw ExceptionUtilities.UnexpectedValue(alias.Kind); } }