/// <summary> /// Reads <see cref="Compile2Symbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static Compile2Symbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { var result = new Compile2Symbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Flags = (CompileSymbolFlags)reader.ReadUint(), Machine = (CpuType)reader.ReadUshort(), VersionFrontendMajor = reader.ReadUshort(), VersionFrontendMinor = reader.ReadUshort(), VersionFrontendBuild = reader.ReadUshort(), VersionBackendMajor = reader.ReadUshort(), VersionBackendMinor = reader.ReadUshort(), VersionBackendBuild = reader.ReadUshort(), Version = reader.ReadCString(), }; List <string> strings = new List <string>(); for (string s = reader.ReadCString().String; !string.IsNullOrEmpty(s); s = reader.ReadCString().String) { strings.Add(s); } result.ExtraStrings = strings; return(result); }
public void Execute() { ResolveEventHandler assemblyResolve = CurrentDomain_AssemblyResolve; try { SplitUpReferences(); GetSymbolProviders(); assemblyResolver = new AssemblyResolver(ReferenceDictionary, Logger, SplitReferences); ReadModule(); AppDomain.CurrentDomain.AssemblyResolve += assemblyResolve; InitialiseWeavers(); ExecuteWeavers(); AddWeavingInfo(); FindStrongNameKey(); WriteModule(); ModuleDefinition?.Dispose(); SymbolStream?.Dispose(); ExecuteAfterWeavers(); DisposeWeavers(); } catch (Exception exception) { AppDomain.CurrentDomain.AssemblyResolve -= assemblyResolve; Logger.LogException(exception); } finally { ModuleDefinition?.Dispose(); SymbolStream?.Dispose(); assemblyResolver?.Dispose(); } }
int lettersInterval; // интервальный коэффициент между буквами /// <summary> /// Конструктор /// </summary> /// <param name="lang">Язык</param> /// <param name="difficulty">Сложность</param> /// <param name="result_handler">Указатель на переменную результата</param> public SymbolStreamControl(Language lang, Difficulty difficulty, SymbolStreamControlResultProc result_handler) { InitializeComponent(); this.lang = lang; // Текст приветствия lTaskText.Text = welcome_text; // Текущий режим работы элемента управления - "запущен" CurControlMode = ControlMode.ControlStarted; // Создаём статистику curStatistic = new SymbolStreamStatistic(); symbolStream = new SymbolStream(lang, difficulty); OnControlResultChanged += result_handler; // Подписываемся на события SymbolQueueControl symbolQueueControl.LetterMissedEvt += OnLetterMissed; symbolQueueControl.QueueEndEvt += OnQueueEnd; // Заполняем Queue нужными символами с нужным интервалом int symbolCount = (int)symbolStream.SymbolsCount; lettersInterval = symbolStream.LettersInterval; symbols = new char[symbolCount]; for (int i = 0; i < symbolCount; i++) { symbols[i] = symbolStream.getRandomSymbol(); } }
/// <summary> /// Reads <see cref="FunctionListSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> /// <param name="dataLength">Record data length.</param> public static FunctionListSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind, uint dataLength) { long start = reader.Position; var symbol = new FunctionListSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Count = reader.ReadUint(), }; symbol.Functions = new TypeIndex[symbol.Count]; symbol.Invocations = new uint[symbol.Count]; for (int i = 0; i < symbol.Functions.Length; i++) { symbol.Functions[i] = TypeIndex.Read(reader); } int remaining = (int)(dataLength - (reader.Position - start)) / 4; // 4 = sizeof(uint) if (remaining > symbol.Invocations.Length) { remaining = symbol.Invocations.Length; } for (int i = 0; i < remaining; i++) { symbol.Invocations[i] = reader.ReadUint(); } return(symbol); }
/// <summary> /// Reads <see cref="EndSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static EndSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new EndSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, }); }
/// <summary> /// Reads <see cref="NamespaceSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static NamespaceSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new NamespaceSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Namespace = reader.ReadCString(), }); }
/// <summary> /// Gets the parent symbol record if exists. /// </summary> /// <returns></returns> private SymbolRecord GetParent() { long parentPosition = GetParentPosition(); if (parentPosition <= 0) { return(null); } return(SymbolStream.GetSymbolRecordByOffset(parentPosition)); }
/// <summary> /// Reads <see cref="BuildInfoSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static BuildInfoSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new BuildInfoSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, BuildId = TypeIndex.Read(reader), }); }
private static ManagedProcedureSymbol[] GetManagedProcedures(SymbolStream symbolStream) { List <ManagedProcedureSymbol> managedProcedures = new List <ManagedProcedureSymbol>(); foreach (var kind in ManagedProcedureSymbol.Kinds) { managedProcedures.AddRange(symbolStream[kind].OfType <ManagedProcedureSymbol>()); } return(managedProcedures.ToArray()); }
private void Test(SymbolStream symbolStream) { // Check that getting symbols by kind works correctly SymbolRecordKind[] kinds = symbolStream.references.Select(r => r.Kind).Distinct().ToArray(); foreach (SymbolRecordKind kind in kinds) { Assert.Equal(symbolStream.references.Count(r => r.Kind == kind), symbolStream[kind].Length); } }
/// <summary> /// Reads <see cref="ObjectNameSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static ObjectNameSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new ObjectNameSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Signature = reader.ReadUint(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="UdtSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static UdtSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new UdtSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Type = TypeIndex.Read(reader), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ExportSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static ExportSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new ExportSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Ordinal = reader.ReadUshort(), Flags = (ExportFlags)reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="LocalSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static LocalSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new LocalSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Type = TypeIndex.Read(reader), Flags = (LocalVariableFlags)reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ConstantSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static ConstantSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new ConstantSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, TypeIndex = TypeIndex.Read(reader), Value = reader.ReadEncodedConstant(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="AnnotationReferenceSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static AnnotationReferenceSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new AnnotationReferenceSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, SumName = reader.ReadUint(), SymbolIndex = reader.ReadUint(), Module = reader.ReadUshort(), }); }
/// <summary> /// Reads <see cref="CallSiteInfoSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static CallSiteInfoSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new CallSiteInfoSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Offset = reader.ReadUint(), Segment = reader.ReadUshort(), Padding = reader.ReadUshort(), Type = TypeIndex.Read(reader), }); }
/// <summary> /// Reads <see cref="LabelSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static LabelSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new LabelSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Offset = reader.ReadUint(), Segment = reader.ReadUshort(), Flags = (ProcedureFlags)reader.ReadByte(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="RegisterRelativeSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static RegisterRelativeSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new RegisterRelativeSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Offset = reader.ReadUint(), Type = TypeIndex.Read(reader), Register = (RegisterId)reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="DataSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static DataSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new DataSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Type = TypeIndex.Read(reader), Offset = reader.ReadUint(), Segment = reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="ProcedureReferenceSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static ProcedureReferenceSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new ProcedureReferenceSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Checksum = reader.ReadUint(), Offset = reader.ReadUint(), Module = reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="HeapAllocationSiteSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static HeapAllocationSiteSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new HeapAllocationSiteSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Offset = reader.ReadUint(), Segment = reader.ReadUshort(), CallInstructionSize = reader.ReadUshort(), Type = TypeIndex.Read(reader), }); }
/// <summary> /// Reads <see cref="Public32Symbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static Public32Symbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new Public32Symbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Flags = (PublicSymbolFlags)reader.ReadUint(), Offset = reader.ReadUint(), Segment = reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="FrameCookieSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static FrameCookieSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new FrameCookieSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, CodeOffset = reader.ReadUint(), Register = (RegisterId)reader.ReadUshort(), CookieKind = (FrameCookieKind)reader.ReadByte(), Flags = reader.ReadByte(), }); }
/// <summary> /// Reads <see cref="CoffGroupSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static CoffGroupSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new CoffGroupSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Size = reader.ReadUint(), Characteristics = (ImageSectionCharacteristics)reader.ReadUint(), Offset = reader.ReadUint(), Segment = reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="BlockSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static BlockSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new BlockSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, ParentOffset = reader.ReadUint(), End = reader.ReadUint(), CodeSize = reader.ReadUint(), CodeOffset = reader.ReadUint(), Segment = reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="AttributeSlotSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static AttributeSlotSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new AttributeSlotSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Index = reader.ReadUint(), TypeIndex = TypeIndex.Read(reader), CodeOffset = reader.ReadUint(), Segment = reader.ReadUshort(), Flags = (LocalVariableFlags)reader.ReadUshort(), Name = reader.ReadCString(), }); }
/// <summary> /// Reads <see cref="TrampolineSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static TrampolineSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new TrampolineSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, Type = (TrampolineType)reader.ReadUshort(), Size = reader.ReadUshort(), ThunkOffset = reader.ReadUint(), TargetOffset = reader.ReadUint(), ThunkSection = reader.ReadUshort(), TargetSection = reader.ReadUshort(), }); }
/// <summary> /// Reads <see cref="InlineSiteSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> /// <param name="dataLength">Record data length.</param> public static InlineSiteSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind, uint dataLength) { long start = reader.Position; return(new InlineSiteSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, ParentOffset = reader.ReadUint(), End = reader.ReadUint(), Inlinee = TypeIndex.Read(reader), AnnotationData = reader.ReadByteArray((int)(dataLength - (reader.Position - start))), }); }
/// <summary> /// Reads <see cref="SectionSymbol"/> from the stream. /// </summary> /// <param name="reader">Stream binary reader.</param> /// <param name="symbolStream">Symbol stream that contains this symbol record.</param> /// <param name="symbolStreamIndex">Index in symbol stream <see cref="SymbolStream.References"/> array.</param> /// <param name="kind">Symbol record kind.</param> public static SectionSymbol Read(IBinaryReader reader, SymbolStream symbolStream, int symbolStreamIndex, SymbolRecordKind kind) { return(new SectionSymbol { SymbolStream = symbolStream, SymbolStreamIndex = symbolStreamIndex, Kind = kind, SectionNumber = reader.ReadUshort(), Alignment = reader.ReadByte(), Padding = reader.ReadByte(), RelativeVirtualAddress = reader.ReadUint(), Length = reader.ReadUint(), Characteristics = (ImageSectionCharacteristics)reader.ReadUint(), Name = reader.ReadCString(), }); }