using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Threading; // ReSharper disable InconsistentNaming // ReSharper disable UnusedMember.Local // ReSharper disable UnusedParameter.Local // ReSharper disable MemberCanBePrivate.Global // ReSharper disable EmptyGeneralCatchClause // ReSharper disable RedundantCast // ReSharper disable PossibleNullReferenceException // ReSharper disable AssignNullToNotNullAttribute // ReSharper disable UnusedMember.Global namespace UnitTestProject.RefVm { // Token: 0x02000032 RID: 50 public class VmExecutor // \u0006\u2007 { #region subclasses // Token: 0x02000033 RID: 51 [Serializable] private sealed class CatchBlockComparer // \u0002 { // Token: 0x060002B0 RID: 688 RVA: 0x00012EB4 File Offset: 0x000110B4 internal int Compare(CatchBlock v1, CatchBlock v2) // \u0002 { if (v1.ExcTypeId == v2.ExcTypeId) { return v2.Start.CompareTo(v1.Start); } return v1.ExcTypeId.CompareTo(v2.ExcTypeId); } // Token: 0x04000155 RID: 341 public static readonly CatchBlockComparer Instance = new CatchBlockComparer(); // \u0002 // Token: 0x04000156 RID: 342 public static Comparison MyComparison; // \u0003 } // Token: 0x02000038 RID: 56 private sealed class StringTypePair // \u0006 { // Token: 0x060002C0 RID: 704 RVA: 0x00013020 File Offset: 0x00011220 // Token: 0x060002C1 RID: 705 RVA: 0x00013028 File Offset: 0x00011228 // Token: 0x0400015D RID: 349 public string Str { get; set; } // \u0002 // Token: 0x060002C3 RID: 707 RVA: 0x0001303C File Offset: 0x0001123C // Token: 0x060002C2 RID: 706 RVA: 0x00013034 File Offset: 0x00011234 // Token: 0x0400015E RID: 350 public Type T { get; set; } // \u0002 } // Token: 0x02000039 RID: 57 // (Invoke) Token: 0x060002C5 RID: 709 private delegate object DynamicExecutor(object obj, object[] args); // \u0008 // Token: 0x0200003A RID: 58 // (Invoke) Token: 0x060002C9 RID: 713 internal delegate void VmInstrImpl(VariantBase t); // \u000E // Token: 0x0200003B RID: 59 private sealed class VmInstr // \u000F { // Token: 0x060002CC RID: 716 RVA: 0x00013048 File Offset: 0x00011248 public VmInstr(VmInstrInfo id, VmInstrImpl func) { Id = id; Func = func; } // Token: 0x0400015F RID: 351 public readonly VmInstrInfo Id; // \u0002 // Token: 0x04000160 RID: 352 public readonly VmInstrImpl Func; // \u0003 } // Token: 0x02000037 RID: 55 private sealed class ExcHandlerFrame // \u0005 { // Token: 0x060002BB RID: 699 RVA: 0x00012FF0 File Offset: 0x000111F0 // Token: 0x060002BC RID: 700 RVA: 0x00012FF8 File Offset: 0x000111F8 // Token: 0x0400015B RID: 347 public uint Pos { get; set; } // Token: 0x060002BD RID: 701 RVA: 0x00013004 File Offset: 0x00011204 // Token: 0x060002BE RID: 702 RVA: 0x0001300C File Offset: 0x0001120C // Token: 0x0400015C RID: 348 public object Exception { get; set; } } // Token: 0x02000034 RID: 52 internal struct MethodBaseAndVirtual : IEquatable // \u0002\u2000 { public MethodBaseAndVirtual(MethodBase mb, bool isVirtual) { Val = mb; IsVirtual = isVirtual; } // Token: 0x060002B1 RID: 689 RVA: 0x00012EF8 File Offset: 0x000110F8 // Token: 0x060002B2 RID: 690 RVA: 0x00012F00 File Offset: 0x00011100 // Token: 0x04000157 RID: 343 public MethodBase Val /* \u0002 */ { get; } // Token: 0x060002B3 RID: 691 RVA: 0x00012F0C File Offset: 0x0001110C // Token: 0x060002B4 RID: 692 RVA: 0x00012F14 File Offset: 0x00011114 // Token: 0x04000158 RID: 344 public bool IsVirtual /* \u0003 */ { get; } // Token: 0x060002B5 RID: 693 RVA: 0x00012F20 File Offset: 0x00011120 public override int GetHashCode() { return Val.GetHashCode() ^ IsVirtual.GetHashCode(); } // Token: 0x060002B6 RID: 694 RVA: 0x00012F48 File Offset: 0x00011148 public override bool Equals(object o) { if (o is MethodBaseAndVirtual) { return Equals((MethodBaseAndVirtual)o); } return false; } // Token: 0x060002B7 RID: 695 RVA: 0x00012F70 File Offset: 0x00011170 public bool Equals(MethodBaseAndVirtual val) { return IsVirtual == val.IsVirtual && Val == val.Val; } } // Token: 0x02000035 RID: 53 private struct BoolHolder // \u0003 { // Token: 0x04000159 RID: 345 public bool Val; // \u0002 } // Token: 0x02000036 RID: 54 private sealed class IntToTypeComparer : IComparer> // \u0003\u2000 { // Token: 0x060002B8 RID: 696 RVA: 0x00012F94 File Offset: 0x00011194 public IntToTypeComparer(Comparison c) { _c = c; } // Token: 0x060002B9 RID: 697 RVA: 0x00012FA4 File Offset: 0x000111A4 public int Compare(KeyValuePair v1, KeyValuePair v2) { var num = _c(v1.Value, v2.Value); if (num == 0) { return v2.Key.CompareTo(v1.Key); } return num; } // Token: 0x0400015A RID: 346 private readonly Comparison _c; } // Token: 0x0200000B RID: 11 private static class HiByte // \u0002\u2008 { // Token: 0x06000056 RID: 86 RVA: 0x00003154 File Offset: 0x00001354 public static int Extract(int src) // \u0002 { return src & -16777216; // 0xFF000000 } } #endregion #region members // Token: 0x04000132 RID: 306 private static readonly Type MethodBaseType = typeof(MethodBase); // \u0002\u2001 // Token: 0x04000133 RID: 307 private VmMethodHeader _methodHeader; // \u000E // Token: 0x04000134 RID: 308 private readonly MyCollection _evalStack = new MyCollection(); // \u0003\u2003 // Token: 0x04000135 RID: 309 private readonly Dictionary AllMetadataById = new Dictionary(); // \u0006\u2003 // Token: 0x04000136 RID: 310 private readonly VmInstrCodesDb _instrCodesDb; // \u0006\u2001 // Token: 0x04000137 RID: 311 private object _exception; // \u0006\u2002 // Token: 0x04000138 RID: 312 private readonly Dictionary _mbDynamicLock = new Dictionary(); // \u0008\u2002 // Token: 0x04000139 RID: 313 private BinaryReader _srcVirtualizedStreamReader; // \u0002\u2000 // Token: 0x0400013A RID: 314 private Type _currentClass; // \u000F\u2001 // Token: 0x0400013B RID: 315 private static readonly Type AssemblyType = typeof(Assembly); // \u0002\u2003 // Token: 0x0400013C RID: 316 private readonly Dictionary _mbCallCnt = new Dictionary(256); // \u0006 // Token: 0x0400013D RID: 317 private Stream _srcVirtualizedStream; // \u000F\u2000 // Token: 0x0400013E RID: 318 private object[] _callees; // \u0005\u2000 // Token: 0x0400013F RID: 319 private readonly MyCollection _ehStack = new MyCollection(); // \u000F // Token: 0x04000140 RID: 320 private VariantBase[] _localVariables; // \u0003\u2002 // Token: 0x04000141 RID: 321 private readonly Dictionary _dynamicExecutors = new Dictionary(256); // \u0002\u2002 // Token: 0x04000142 RID: 322 private bool _retFound; // \u0005\u2003 // Token: 0x04000143 RID: 323 private MyBufferReader _myBufferReader; // \u0002 // Token: 0x04000144 RID: 324 private Type[] _classGenericArgs; // \u0003 // Token: 0x04000145 RID: 325 private readonly Module _module; // \u0008\u2001 // Token: 0x04000146 RID: 326 private long _myBufferPos; // \u0005 // Token: 0x04000147 RID: 327 private byte[] _methodBody; // \u0008 // Token: 0x04000148 RID: 328 private static readonly Type ObjectArrayType = typeof(object[]); // \u000E\u2001 // Token: 0x04000149 RID: 329 private static readonly Dictionary DynamicMethods = new Dictionary(); // \u000E\u2003 // Token: 0x0400014A RID: 330 private bool _wasException; // \u0008\u2000 // Token: 0x0400014B RID: 331 private Type[] _methodGenericArgs; // \u0005\u2001 // Token: 0x0400014C RID: 332 private CatchBlock[] _catchBlocks; // \u000F\u2003 // Token: 0x0400014D RID: 333 private static readonly object InterlockedLock = new object(); // \u0008\u2003 // Token: 0x0400014E RID: 334 private uint? _storedPos; // \u000E\u2000 // Token: 0x0400014F RID: 335 private const bool _alwaysFalse = false; // \u000F\u2002 // Token: 0x04000150 RID: 336 private Dictionary _vmInstrDb; // \u000E\u2002 // Token: 0x04000151 RID: 337 private VariantBase[] _variantOutputArgs; // \u0005\u2002 // Token: 0x04000152 RID: 338 private const bool _alwaysTrue = true; // \u0003\u2001 // Token: 0x04000153 RID: 339 private static readonly Type IntPtrType = typeof(IntPtr); // \u0003\u2000 // Token: 0x04000154 RID: 340 private static readonly Type VoidType = typeof(void); // \u0006\u2000 #endregion // Token: 0x0600016C RID: 364 RVA: 0x00007958 File Offset: 0x00005B58 public VmExecutor(VmInstrCodesDb instrCodesDb, Module m) { _instrCodesDb = instrCodesDb; _module = m; Init(); } // Token: 0x060001B6 RID: 438 RVA: 0x000092E0 File Offset: 0x000074E0 private void Init() // \u000F { if (!_instrCodesDb.IsInitialized()) { lock (_instrCodesDb) { if (!_instrCodesDb.IsInitialized()) { _vmInstrDb = CreateVmInstrDb(); DoNothing(); _instrCodesDb.SetInitialized(true); } } } if (_vmInstrDb == null) { _vmInstrDb = CreateVmInstrDb(); } } // Token: 0x060001BD RID: 445 RVA: 0x00009534 File Offset: 0x00007734 private void DoNothing() // \u0006 {} // Token: 0x06000239 RID: 569 RVA: 0x0000F9C4 File Offset: 0x0000DBC4 private VariantBase PopVariant() // \u0002 { return _evalStack.PopBack(); } // Token: 0x060002A0 RID: 672 RVA: 0x000127D8 File Offset: 0x000109D8 private long PopLong() // \u0002 { var top = PopVariant(); switch (top.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: return VariantBase.SignedLongFromEnum((EnumVariant)top); // bug was fixed and unit tested (Convert.ToInt64(((EnumVariant)top).GetValue());) case VariantBase.Vtc.Tc13UIntPtr: return (long)((UIntPtrVariant)top).GetValue().ToUInt64(); case VariantBase.Vtc.Tc17IntPtr: return ((IntPtrVariant)top).GetValue().ToInt64(); case VariantBase.Vtc.Tc19Int: return ((IntVariant)top).GetValue(); } throw new Exception(StringDecryptor.GetString(-1550345551) /* Unexpected value on the stack. */); } // Token: 0x060001A1 RID: 417 RVA: 0x00008CC4 File Offset: 0x00006EC4 private void Ldelem(Type t) // \u0002 { var index = PopLong(); var array = (Array)PopVariant().GetValueAbstract(); PushVariant(VariantFactory.Convert(array.GetValue(index), t)); } // Token: 0x0600020C RID: 524 RVA: 0x0000C528 File Offset: 0x0000A728 private void Ldelem_(VariantBase vTypeId) // \u0006\u200A\u2000 { var typeId = ((IntVariant)vTypeId).GetValue(); var type = GetTypeById(typeId); Ldelem(type); } // Token: 0x060002A5 RID: 677 RVA: 0x00012A80 File Offset: 0x00010C80 private void PushVariant(VariantBase obj) // \u0008\u2000\u2001 { if (obj == null) { throw new ArgumentNullException(StringDecryptor.GetString(-1550345950) /* obj */); } VariantBase push; if (obj.GetVariantType() != null) { push = obj; } else { switch (obj.GetTypeCode()) { case VariantBase.Vtc.Tc1Bool: { var tmp = new IntVariant(); tmp.SetValue(((BoolVariant)obj).GetValue() ? 1 : 0); tmp.SetVariantType(obj.GetVariantType()); push = tmp; break; } case VariantBase.Vtc.Tc6Char: { var tmp = new IntVariant(); tmp.SetValue(((CharVariant)obj).GetValue()); tmp.SetVariantType(obj.GetVariantType()); push = tmp; break; } case VariantBase.Vtc.Tc7Ulong: { var tmp = new LongVariant(); tmp.SetValue((long)((UlongVariant)obj).GetValue()); tmp.SetVariantType(obj.GetVariantType()); push = tmp; break; } case VariantBase.Vtc.Tc8Float: { var tmp = new FloatVariant(); tmp.SetValue(((FloatVariant)obj).GetValue()); tmp.SetVariantType(obj.GetVariantType()); push = tmp; break; } case VariantBase.Vtc.Tc9Uint: { var tmp = new IntVariant(); tmp.SetValue((int)((UintVariant)obj).GetValue()); tmp.SetVariantType(obj.GetVariantType()); push = tmp; break; } case VariantBase.Vtc.Tc10Ushort: { var tmp = new IntVariant(); tmp.SetValue(((UshortVariant)obj).GetValue()); tmp.SetVariantType(obj.GetVariantType()); push = tmp; break; } case VariantBase.Vtc.Tc12Sbyte: { var tmp = new IntVariant(); tmp.SetValue(((SbyteVariant)obj).GetValue()); tmp.SetVariantType(obj.GetVariantType()); push = tmp; break; } case VariantBase.Vtc.Tc14Byte: { var tmp = new IntVariant(); tmp.SetValue(((ByteVariant)obj).GetValue()); tmp.SetVariantType(obj.GetVariantType()); push = tmp; break; } case VariantBase.Vtc.Tc15Short: { var tmp = new IntVariant(); tmp.SetValue(((ShortVariant)obj).GetValue()); tmp.SetVariantType(obj.GetVariantType()); push = tmp; break; } case VariantBase.Vtc.Tc18Object: { var abs = obj.GetValueAbstract(); if (abs == null) { push = obj; break; } var type = abs.GetType(); if (type.HasElementType && !type.IsArray) { type = type.GetElementType(); } if (type != null && !type.IsValueType && !type.IsEnum) { push = obj; break; } push = VariantFactory.Convert(abs, type); break; } case VariantBase.Vtc.Tc17IntPtr: case VariantBase.Vtc.Tc13UIntPtr: if(IntPtr.Size == 4) { var tmp = new IntVariant(); tmp.CopyFrom(obj); tmp.SetVariantType(obj.GetVariantType()); push = tmp; } else { var tmp = new LongVariant(); tmp.CopyFrom(obj); tmp.SetVariantType(obj.GetVariantType()); push = tmp; } break; default: push = obj; break; } } _evalStack.PushBack(push); } // Token: 0x0600027D RID: 637 RVA: 0x00011C24 File Offset: 0x0000FE24 private void Conv_ovf_i4_un_(VariantBase dummy) // \u0003\u200B { Conv_i4(true, false); } // Token: 0x06000283 RID: 643 RVA: 0x00011E9C File Offset: 0x0001009C public static void Sort(T[] arr, Comparison c) // \u0002 { var array = new KeyValuePair[arr.Length]; for (var i = 0; i < arr.Length; i++) { array[i] = new KeyValuePair(i, arr[i]); } Array.Sort(array, arr, new IntToTypeComparer(c)); } // Token: 0x060001BE RID: 446 RVA: 0x00009538 File Offset: 0x00007738 private void SortCatchBlocks() // \u0003\u2000 { if (CatchBlockComparer.MyComparison == null) { CatchBlockComparer.MyComparison = CatchBlockComparer.Instance.Compare; } Sort(_catchBlocks, CatchBlockComparer.MyComparison); } // Token: 0x0600016D RID: 365 RVA: 0x000079C8 File Offset: 0x00005BC8 public VmExecutor(VmInstrCodesDb instrCodesDb, Stream virtualizedStream = null) : this(instrCodesDb, typeof(VmExecutor).Module) // \u0006\u2007 { _srcVirtualizedStream = virtualizedStream; } // Token: 0x0600023C RID: 572 RVA: 0x0000FA0C File Offset: 0x0000DC0C public object Invoke(Stream virtualizedStream, string pos, object[] args) // \u0002 { // ReSharper disable once IntroduceOptionalParameters.Global return Invoke(virtualizedStream, pos, args, null, null, null); } // Token: 0x0600017A RID: 378 RVA: 0x00007DCC File Offset: 0x00005FCC public object Invoke(Stream virtualizedStream, string pos, object[] args, Type[] methodGenericArgs, Type[] classGenericArgs, object[] callees) // \u0002 { _srcVirtualizedStream = virtualizedStream; Seek(pos, virtualizedStream); return Invoke(args, methodGenericArgs, classGenericArgs, callees); } // Token: 0x060001C5 RID: 453 RVA: 0x00009A34 File Offset: 0x00007C34 private Type GetTypeById(int id) // \u0002 { Type result; lock (AllMetadataById) { var flag = true; object o; if (AllMetadataById.TryGetValue(id, out o)) { result = (Type)o; } else { var token = ReadToken(id); if (token.IsVm == 0) { var type = _module.ResolveType(token.MetadataToken); AllMetadataById.Add(id, type); result = type; } else { var vmToken = (VmClassTokenInfo)token.VmToken; if (vmToken.IsOuterClassGeneric) { if (vmToken.OuterClassGenericMethodIdx!= -1) { result = _methodGenericArgs[vmToken.OuterClassGenericMethodIdx]; } else { if (vmToken.OuterClassGenericClassIdx== -1) { throw new Exception(); } result = _classGenericArgs[vmToken.OuterClassGenericClassIdx]; } result = ElementedTypeHelper.PopType(result, ElementedTypeHelper.NestedElementTypes(vmToken.ClassName)); } else { var className = vmToken.ClassName.Replace("\u0005 ,", "forms_cil.Trial,"); //TODO: в общем случае это лишнее result = Type.GetType(className); if (result == null) { var num = className.IndexOf(','); var shortClassName = className.Substring(0, num); var asmName = className.Substring(num + 1, className.Length - num - 1).Trim(); var assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (var assembly in assemblies) { string value = null; try { value = assembly.Location; } catch (NotSupportedException) { } if (string.IsNullOrEmpty(value) && assembly.FullName.Equals(asmName, StringComparison.Ordinal)) { result = assembly.GetType(shortClassName); if (result != null) { break; } } } if (result == null && shortClassName.StartsWith(StringDecryptor.GetString(-1550345235) /* < */, StringComparison.Ordinal) && shortClassName.Contains(StringDecryptor.GetString(-1550345325) /* . */)) { try { var types = Assembly.Load(asmName).GetTypes(); foreach (var t in types.Where(type3 => type3.FullName == shortClassName)) { result = t; break; } } // ReSharper disable once EmptyGeneralCatchClause catch { } } } if (vmToken.IsGeneric) { var array = new Type[vmToken.GenericArguments.Length]; for (var j = 0; j < vmToken.GenericArguments.Length; j++) { array[j] = GetTypeById(vmToken.GenericArguments[j].MetadataToken); } var genericTypeDefinition = ElementedTypeHelper.TryGoToElementType(result).GetGenericTypeDefinition(); var c = ElementedTypeHelper.NestedElementTypes(result); result = ElementedTypeHelper.PopType(genericTypeDefinition.MakeGenericType(array), c); flag = false; } if (flag) { AllMetadataById.Add(id, result); } } } } } return result; } // Token: 0x060001A6 RID: 422 RVA: 0x00008DAC File Offset: 0x00006FAC public object Invoke(object[] args, Type[] methodGenericArgs, Type[] classGenericArgs, object[] callees) // \u0002 { if (args == null) { args = EmptyArray.Data; } if (methodGenericArgs == null) { methodGenericArgs = Type.EmptyTypes; } if (classGenericArgs == null) { classGenericArgs = Type.EmptyTypes; } _callees = callees; _methodGenericArgs = methodGenericArgs; _classGenericArgs = classGenericArgs; _variantOutputArgs = ArgsToVariantOutputArgs(args); _localVariables = CreateLocalVariables(); object result; try { using (var b = new MyBuffer(_methodBody)) { using (_myBufferReader = new MyBufferReader(b)) { _retFound = false; _storedPos = null; _evalStack.Clear(); InternalInvoke(); } } var retType = GetTypeById(_methodHeader.ReturnTypeId); if (retType != VoidType && _evalStack.Count > 0) { var pop = PopVariant(); try { result = VariantFactory.Convert(null, retType).CopyFrom(pop).GetValueAbstract(); } catch (Exception) { result = pop.GetValueAbstract(); // example: ckfinite with no numeric //throw; } } else { result = null; } } finally { for (var i = 0; i < _methodHeader.ArgsTypeToOutput.Length; i++) { var argTypeToOutput = _methodHeader.ArgsTypeToOutput[i]; if (argTypeToOutput.IsOutput) { var argOutValue = (VariantBaseHolder)_variantOutputArgs[i]; var argType = GetTypeById(argTypeToOutput.TypeId); args[i] = VariantFactory.Convert(null, argType.GetElementType()).CopyFrom(argOutValue.GetValue()).GetValueAbstract(); } } _callees = null; _variantOutputArgs = null; _localVariables = null; } return result; } // Token: 0x06000269 RID: 617 RVA: 0x00010F7C File Offset: 0x0000F17C private void Seek(string pos, Stream virtualizedStream) // \u0002 { Seek(0L, virtualizedStream, pos); } // Token: 0x0600025C RID: 604 RVA: 0x00010B38 File Offset: 0x0000ED38 private void DoNothing(BinaryReader dummy) // \u0002 { } // Token: 0x06000250 RID: 592 RVA: 0x000106EC File Offset: 0x0000E8EC private static CatchBlock ReadCatchBlock(BinaryReader r) // \u0002 { return new CatchBlock { Kind = r.ReadByte(), ExcTypeId = r.ReadInt32(), Pos = r.ReadUInt32(), PosKind4 = r.ReadUInt32(), Start = r.ReadUInt32(), Len = r.ReadUInt32() }; } // Token: 0x060001FC RID: 508 RVA: 0x0000BD50 File Offset: 0x00009F50 private static CatchBlock[] ReadCatchBlocks(BinaryReader r) // \u0002 { var num = (int)r.ReadInt16(); var array = new CatchBlock[num]; for (var i = 0; i < num; i++) { array[i] = ReadCatchBlock(r); } return array; } // Token: 0x060001BF RID: 447 RVA: 0x00009564 File Offset: 0x00007764 private static byte[] ReadByteArray(BinaryReader r) // \u0002 { var num = r.ReadInt32(); var array = new byte[num]; r.Read(array, 0, num); return array; } // Token: 0x060001C1 RID: 449 RVA: 0x000096E4 File Offset: 0x000078E4 public void Seek(long parsedPos, Stream virtualizedStream, string pos) // \u0002 { var input = new VmStreamWrapper(virtualizedStream, VmXorKey()); _srcVirtualizedStreamReader = new BinaryReader(input); var baseStream = _srcVirtualizedStreamReader.BaseStream; lock (baseStream) { if (pos != null) { parsedPos = ParsePos(pos); } _srcVirtualizedStreamReader.BaseStream.Seek(parsedPos, SeekOrigin.Begin); DoNothing(_srcVirtualizedStreamReader); _methodHeader = ReadMethodHeader(_srcVirtualizedStreamReader); _catchBlocks = ReadCatchBlocks(_srcVirtualizedStreamReader); SortCatchBlocks(); _methodBody = ReadByteArray(_srcVirtualizedStreamReader); } } // Token: 0x06000203 RID: 515 RVA: 0x0000C164 File Offset: 0x0000A364 private long ParsePos(string pos) // \u0002 { using (var memoryStream = new MemoryStream(VmPosParser.Parse(pos))) { return new BinaryReader(new VmStreamWrapper(memoryStream, PosXorKey())).ReadInt64(); } } // Token: 0x060001B5 RID: 437 RVA: 0x000092D8 File Offset: 0x000074D8 private int PosXorKey() // \u0002 { return -2023764088; } // Token: 0x0600017B RID: 379 RVA: 0x00007DEC File Offset: 0x00005FEC public static int VmXorKey() // \u0003 { return 1783652397; } // Token: 0x060001E7 RID: 487 RVA: 0x0000B0F8 File Offset: 0x000092F8 private LocalVarType ReadLocalVarType(BinaryReader r) // \u0002 { return new LocalVarType { TypeId = r.ReadInt32() }; } // Token: 0x060001AB RID: 427 RVA: 0x00008FF8 File Offset: 0x000071F8 private LocalVarType[] ReadLocalVarTypes(BinaryReader r) // \u0002 { var array = new LocalVarType[r.ReadInt16()]; for (var i = 0; i < array.Length; i++) { array[i] = ReadLocalVarType(r); } return array; } // Token: 0x0600023B RID: 571 RVA: 0x0000F9E0 File Offset: 0x0000DBE0 private ArgTypeToOutput ReadArgTypeToOutput(BinaryReader r) // \u0002 { var ret = new ArgTypeToOutput { TypeId = r.ReadInt32(), IsOutput = r.ReadBoolean() }; return ret; } // Token: 0x06000287 RID: 647 RVA: 0x00012138 File Offset: 0x00010338 private ArgTypeToOutput[] ReadArgsTypeToOutput(BinaryReader r) // \u0002 { var array = new ArgTypeToOutput[r.ReadInt16()]; for (var i = 0; i < array.Length; i++) { array[i] = ReadArgTypeToOutput(r); } return array; } // Token: 0x06000216 RID: 534 RVA: 0x0000C790 File Offset: 0x0000A990 private VmMethodHeader ReadMethodHeader(BinaryReader src) // \u0002 { var ret = new VmMethodHeader { ClassId = src.ReadInt32(), ReturnTypeId = src.ReadInt32(), LocalVarTypes = ReadLocalVarTypes(src), Flags = src.ReadByte(), Name = src.ReadString(), ArgsTypeToOutput = ReadArgsTypeToOutput(src) }; return ret; } // Token: 0x06000266 RID: 614 RVA: 0x00010C54 File Offset: 0x0000EE54 private void Shr_un_(VariantBase dummy) // \u000F\u2001 { PushVariant(Shift(false, false)); } // Token: 0x06000176 RID: 374 RVA: 0x00007CAC File Offset: 0x00005EAC private void Shr_(VariantBase dummy) // \u0005\u2007\u2000 { PushVariant(Shift(false, true)); } private VariantBase Xor(VariantBase org_v1, VariantBase org_v2) { VariantBase v1, v2; var tc = CommonType(org_v1, org_v2, out v1, out v2, true); VariantBase ret; switch (tc) { case VariantBase.Vtc.Tc9Uint: uint uv1 = ((UintVariant)v1).GetValue(), uv2 = ((UintVariant)v2).GetValue(); var uvret = new UintVariant(); ret = uvret; uvret.SetValue(uv1 ^ uv2); break; case VariantBase.Vtc.Tc19Int: int iv1 = ((IntVariant)v1).GetValue(), iv2 = ((IntVariant)v2).GetValue(); var ivret = new IntVariant(); ret = ivret; ivret.SetValue(iv1 ^ iv2); break; case VariantBase.Vtc.Tc21Double: { /*double dv1 = ((DoubleVariant)v1).GetValue(), dv2 = ((DoubleVariant)v2).GetValue(); // естественный алгоритм long lv1 = (dv1 < 0) ? (long)dv1 : (long)(ulong)dv1; long lv2 = (dv2 < 0) ? (long)dv2 : (long)(ulong)dv2; var dvret = new DoubleVariant(); ret = dvret; var l64 = (ulong) lv1 ^ (ulong) lv2; if (l64 >> 32 == UInt32.MaxValue) l64 &= UInt32.MaxValue; dvret.SetValue(l64);*/ var dvret = new DoubleVariant(); ret = dvret; dvret.SetValue((4 == IntPtr.Size) ? Double.NaN : (double)0); // иногда у фреймворка бывает мусор, но чаще эти значения... } break; case VariantBase.Vtc.Tc8Float: { /*float fv1 = ((FloatVariant) v1).GetValue(), fv2 = ((FloatVariant) v2).GetValue(); // естественный алгоритм long lv1 = (fv1 < 0) ? (long)fv1 : (long)(ulong)fv1; long lv2 = (fv2 < 0) ? (long)fv2 : (long)(ulong)fv2; var fvret = new FloatVariant(); ret = fvret; var l64 = (ulong)lv1 ^ (ulong)lv2; if (l64 >> 32 == UInt32.MaxValue) l64 &= UInt32.MaxValue; fvret.SetValue(l64);*/ var fvret = new FloatVariant(); ret = fvret; fvret.SetValue((4 == IntPtr.Size) ? float.NaN : (float)0.0); // иногда у фреймворка бывает мусор, но чаще эти значения... } break; case VariantBase.Vtc.Tc24Long: { long lv1 = ((LongVariant)v1).GetValue(), lv2 = ((LongVariant)v2).GetValue(); var lvret = new LongVariant(); ret = lvret; lvret.SetValue(lv1 ^ lv2); } break; case VariantBase.Vtc.Tc7Ulong: ulong ulv1 = ((UlongVariant)v1).GetValue(), ulv2 = ((UlongVariant)v2).GetValue(); var ulvret = new UlongVariant(); ret = ulvret; ulvret.SetValue(ulv1 ^ ulv2); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object), typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Xor); gen.Emit(OpCodes.Ret); ret = new IntPtrVariant(); ((IntPtrVariant)ret).SetValue(((IntPtr)dyn.Invoke(null, new[] { org_v1.GetValueAbstract(), org_v2.GetValueAbstract() }))); break; } return ret; } // Token: 0x0600026C RID: 620 RVA: 0x00010FC8 File Offset: 0x0000F1C8 private void Xor_(VariantBase dummy) // \u0008\u2001\u2000 { var v1 = PopVariant(); var v2 = PopVariant(); PushVariant(Xor(v2, v1)); } // Token: 0x06000189 RID: 393 RVA: 0x00008244 File Offset: 0x00006444 private void Shl_(VariantBase dummy) // \u0006\u2002\u2001 { PushVariant(Shift(true, true)); } VariantBase.Vtc CommonTypeShift(VariantBase org_val, VariantBase org_shift, out VariantBase val, out VariantBase shift, bool signed) { val = org_val.Clone(); shift = org_shift.Clone(); var tcval = UnderlyingTypeCode(ref val); var tcsh = UnderlyingTypeCode(ref shift); if (tcval == VariantBase.Vtc.Tc18Object || tcsh == VariantBase.Vtc.Tc18Object) return VariantBase.Vtc.Tc18Object; shift = new LongVariant(); long lsh = 0; switch (org_shift.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: lsh = VariantBase.SignedLongFromEnum((EnumVariant) org_shift); break; case VariantBase.Vtc.Tc13UIntPtr: lsh = (long)((UIntPtrVariant)org_shift).GetValue().ToUInt64(); break; case VariantBase.Vtc.Tc17IntPtr: lsh = ((IntPtrVariant)org_shift).GetValue().ToInt64(); break; case VariantBase.Vtc.Tc19Int: lsh = ((IntVariant)org_shift).GetValue(); break; case VariantBase.Vtc.Tc24Long: lsh = ((LongVariant)org_shift).GetValue(); break; } shift.SetValueAbstract(lsh); VariantBase.Vtc ret = tcval; if (!signed) { val = AsUnsigned(val); } if (!signed) switch (ret) { case VariantBase.Vtc.Tc19Int: return VariantBase.Vtc.Tc9Uint; case VariantBase.Vtc.Tc24Long: return VariantBase.Vtc.Tc7Ulong; } return ret; } private VariantBase Shift(bool left, bool signed) { VariantBase val, shift; var org_shift = PopVariant(); var org_val = PopVariant(); var tc = CommonTypeShift(org_val, org_shift, out val, out shift, signed); var sh = (int)(long)shift.GetValueAbstract(); VariantBase ret; switch (tc) { case VariantBase.Vtc.Tc9Uint: uint uv1 = ((UintVariant)val).GetValue(); var uvret = new UintVariant(); ret = uvret; if (left) { uvret.SetValue(uv1 << sh); } else { uvret.SetValue(uv1 >> sh); } break; case VariantBase.Vtc.Tc19Int: int iv1 = ((IntVariant)val).GetValue(); var ivret = new IntVariant(); ret = ivret; if (left) { ivret.SetValue(iv1 << sh); } else { ivret.SetValue(iv1 >> sh); } break; case VariantBase.Vtc.Tc21Double: /*double dv1 = ((DoubleVariant)val).GetValue(), dv2 = ((DoubleVariant)shift).GetValue(); var dvret = new DoubleVariant(); ret = dvret; var dmul = left ? 2 : 0.5; dvret.SetValue(dv1 * Math.Pow(dmul, dv2)); break;*/ case VariantBase.Vtc.Tc8Float: /*float fv1 = ((FloatVariant)val).GetValue(), fv2 = ((FloatVariant)shift).GetValue(); var fvret = new FloatVariant(); ret = fvret; var fmul = left ? 2f : 0.5f; fvret.SetValue(fv1 * (float)Math.Pow(fmul, fv2)); break;*/ throw new InvalidProgramException(); case VariantBase.Vtc.Tc24Long: long lv1 = ((LongVariant)val).GetValue(); var lvret = new LongVariant(); ret = lvret; if (left) { lvret.SetValue(lv1 << sh); } else { lvret.SetValue(lv1 >> sh); } break; case VariantBase.Vtc.Tc7Ulong: ulong ulv1 = ((UlongVariant)val).GetValue(); var ulvret = new UlongVariant(); ret = ulvret; if (left) { ulvret.SetValue(ulv1 << sh); } else { ulvret.SetValue(ulv1 >> sh); } break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object), typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (left ? OpCodes.Shl : OpCodes.Shr) : OpCodes.Shr_Un); gen.Emit(OpCodes.Ret); ret = new IntPtrVariant(); ((IntPtrVariant)ret).SetValue(((IntPtr)dyn.Invoke(null, new[] { org_val.GetValueAbstract(), org_shift.GetValueAbstract() }))); break; } return ret; } // Token: 0x06000173 RID: 371 RVA: 0x00007BE0 File Offset: 0x00005DE0 private void Initblk_(VariantBase dummy) // \u0002\u2002\u2000 { throw new NotSupportedException(StringDecryptor.GetString(-1550345287) /* Initblk not supported. */); } // Token: 0x0600020A RID: 522 RVA: 0x0000C508 File Offset: 0x0000A708 private void Localloc_(VariantBase dummy) // \u0008\u200A\u2000 { throw new NotSupportedException(StringDecryptor.GetString(-1550345866) /* Localloc not supported. */); } // Token: 0x06000212 RID: 530 RVA: 0x0000C73C File Offset: 0x0000A93C private void Refanyval_(VariantBase dummy) // \u0005\u200A\u2000 { throw new NotSupportedException(StringDecryptor.GetString(-1550345900) /* Refanyval is not supported. */); } // Token: 0x06000237 RID: 567 RVA: 0x0000F984 File Offset: 0x0000DB84 private void Refanytype_(VariantBase dummy) // \u000F\u2005 { throw new NotSupportedException(StringDecryptor.GetString(-1550345460) /* Refanytype is not supported. */); } // Token: 0x0600029C RID: 668 RVA: 0x000126CC File Offset: 0x000108CC private void Cpblk_(VariantBase dummy) // \u0002\u2006 { throw new NotSupportedException(StringDecryptor.GetString(-1550345423) /* Cpblk not supported. */); } // Token: 0x060001CA RID: 458 RVA: 0x00009E68 File Offset: 0x00008068 private void Cpobj_(VariantBase dummy) // \u0008\u2009 { throw new NotSupportedException(StringDecryptor.GetString(-1550345317) /* Cpobj is not supported. */); } // Token: 0x060001D2 RID: 466 RVA: 0x0000A338 File Offset: 0x00008538 private void Arglist_(VariantBase dummy) // \u000F\u2002\u2001 { throw new NotSupportedException(StringDecryptor.GetString(-1550345940) /* Arglist is not supported. */); } // Token: 0x06000187 RID: 391 RVA: 0x00008224 File Offset: 0x00006424 private void Mkrefany_(VariantBase dummy) // \u0002\u2007 { throw new NotSupportedException(StringDecryptor.GetString(-1550345270) /* Mkrefany is not supported. */); } // Token: 0x0600017E RID: 382 RVA: 0x00007ECC File Offset: 0x000060CC private static BindingFlags BF(bool isStatic) // \u0002 { var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic; if (isStatic) { bindingFlags |= BindingFlags.Static; } else { bindingFlags |= BindingFlags.Instance; } return bindingFlags; } // Token: 0x06000192 RID: 402 RVA: 0x000084F4 File Offset: 0x000066F4 private void Ldc_i4_0_(VariantBase dummy) // \u0005\u2001 { var iv = new IntVariant(); iv.SetValue(0); PushVariant(iv); } // Token: 0x0600028F RID: 655 RVA: 0x0001235C File Offset: 0x0001055C private void Ldc_i4_1_(VariantBase dummy) // \u0002\u2005\u2000 { var iv = new IntVariant(); iv.SetValue(1); PushVariant(iv); } // Token: 0x0600022F RID: 559 RVA: 0x0000F8C8 File Offset: 0x0000DAC8 private void Ldc_i4_2_(VariantBase dummy) // \u0005 { var iv = new IntVariant(); iv.SetValue(2); PushVariant(iv); } // Token: 0x06000174 RID: 372 RVA: 0x00007BF4 File Offset: 0x00005DF4 private void Ldc_i4_3_(VariantBase dummy) // \u0008\u2006\u2000 { var iv = new IntVariant(); iv.SetValue(3); PushVariant(iv); } // Token: 0x06000262 RID: 610 RVA: 0x00010BEC File Offset: 0x0000EDEC private void Ldc_i4_4_(VariantBase dummy) // \u000F\u2009\u2000 { var iv = new IntVariant(); iv.SetValue(4); PushVariant(iv); } // Token: 0x060001B3 RID: 435 RVA: 0x000092B4 File Offset: 0x000074B4 private void Ldc_i4_5_(VariantBase dummy) // \u0008\u2004\u2000 { var iv = new IntVariant(); iv.SetValue(5); PushVariant(iv); } // Token: 0x06000231 RID: 561 RVA: 0x0000F900 File Offset: 0x0000DB00 private void Ldc_i4_6_(VariantBase dummy) // \u0006\u2009\u2000 { var iv = new IntVariant(); iv.SetValue(6); PushVariant(iv); } // Token: 0x0600026A RID: 618 RVA: 0x00010F88 File Offset: 0x0000F188 private void Ldc_i4_7_(VariantBase dummy) // \u0003\u2003\u2000 { var iv = new IntVariant(); iv.SetValue(7); PushVariant(iv); } // Token: 0x060001A9 RID: 425 RVA: 0x00008FA8 File Offset: 0x000071A8 private void Ldc_i4_8_(VariantBase dummy) // \u000E\u2001 { var iv = new IntVariant(); iv.SetValue(8); PushVariant(iv); } // Token: 0x0600016F RID: 367 RVA: 0x00007A58 File Offset: 0x00005C58 private void Unbox_(VariantBase vTypeId) // \u0005\u2003\u2000 { var type = GetTypeById(((IntVariant)vTypeId).GetValue()); var val = VariantFactory.Convert(PopVariant().GetValueAbstract(), type); PushVariant(val); } // Token: 0x06000207 RID: 519 RVA: 0x0000C228 File Offset: 0x0000A428 private VmTokenInfo ReadVmToken(BinaryReader reader) // \u0002 { switch (reader.ReadByte()) { case (byte)VmTokenInfo.Kind.Class0: { var ret = new VmClassTokenInfo { OuterClassGenericMethodIdx = reader.ReadInt32(), OuterClassGenericClassIdx = reader.ReadInt32(), IsOuterClassGeneric = reader.ReadBoolean(), ClassName = reader.ReadString(), IsGeneric = reader.ReadBoolean(), GenericArguments = new UniversalTokenInfo[(int) reader.ReadInt16()] }; for (var i = 0; i < ret.GenericArguments.Length; i++) { ret.GenericArguments[i] = new UniversalTokenInfo { IsVm = 1, MetadataToken = reader.ReadInt32() }; } return ret; } case (byte)VmTokenInfo.Kind.Field1: return new VmFieldTokenInfo { Class = new UniversalTokenInfo { IsVm = 1, MetadataToken = reader.ReadInt32() }, Name = reader.ReadString(), IsStatic = reader.ReadBoolean() }; case (byte)VmTokenInfo.Kind.Method2: { var ret = new VmMethodTokenInfo { Class = new UniversalTokenInfo { IsVm = 1, MetadataToken = reader.ReadInt32() }, Flags = reader.ReadByte(), Name = reader.ReadString(), ReturnType = new UniversalTokenInfo { IsVm = 1, MetadataToken = reader.ReadInt32() }, Parameters = new UniversalTokenInfo[(int)reader.ReadInt16()] }; for (var j = 0; j < ret.Parameters.Length; j++) { ret.Parameters[j] = new UniversalTokenInfo { IsVm = 1, MetadataToken = reader.ReadInt32() }; } var gaCnt = (int)reader.ReadInt16(); ret.GenericArguments = new UniversalTokenInfo[gaCnt]; for (var k = 0; k < gaCnt; k++) { ret.GenericArguments[k] = new UniversalTokenInfo { IsVm = 1, MetadataToken = reader.ReadInt32() }; } return ret; } case (byte)VmTokenInfo.Kind.String3: return new VmStringTokenInfo { Value = reader.ReadString() }; case (byte)VmTokenInfo.Kind.MethodRef4: return new VmMethodRefTokenInfo { Flags = reader.ReadInt32(), Pos = reader.ReadInt32() }; default: throw new ArgumentOutOfRangeException(); } } // Token: 0x06000175 RID: 373 RVA: 0x00007C08 File Offset: 0x00005E08 private UniversalTokenInfo ReadToken(int pos) // u0002 { if (_srcVirtualizedStreamReader == null) { throw new InvalidOperationException(); } var baseStream = _srcVirtualizedStreamReader.BaseStream; UniversalTokenInfo result; lock (baseStream) { _srcVirtualizedStreamReader.BaseStream.Seek(pos, SeekOrigin.Begin); result = new UniversalTokenInfo {IsVm = _srcVirtualizedStreamReader.ReadByte()}; if (result.IsVm == 0) { result.MetadataToken = _srcVirtualizedStreamReader.ReadInt32(); } else { result.VmToken = ReadVmToken(_srcVirtualizedStreamReader); } } return result; } // Token: 0x06000248 RID: 584 RVA: 0x000102AC File Offset: 0x0000E4AC private string Ldstr(int strToken) // \u0002 { string result; lock (AllMetadataById) { object stored; if (AllMetadataById.TryGetValue(strToken, out stored)) { result = (string)stored; } else { var tokenInfo = ReadToken(strToken); if (tokenInfo.IsVm == 0) { result = _module.ResolveString(tokenInfo.MetadataToken); } else { var text = ((VmStringTokenInfo)tokenInfo.VmToken).Value; AllMetadataById.Add(strToken, text); result = text; } } } return result; } // Token: 0x0600019C RID: 412 RVA: 0x00008B34 File Offset: 0x00006D34 private void Ldstr_(VariantBase strToken) // \u000E\u2000\u2001 { var tok = ((IntVariant)strToken).GetValue(); var text = Ldstr(tok); var val = new StringVariant(); val.SetValue(text); PushVariant(val); } // Token: 0x06000170 RID: 368 RVA: 0x00007A94 File Offset: 0x00005C94 private VariantBase ReadOperand(MyBufferReader r, VmOperandType operandType) // \u0002 { switch (operandType) { case VmOperandType.Ot0UInt: { var ret = new UintVariant(); ret.SetValue(r.ReadUint()); return ret; } case VmOperandType.Ot1UShort: case VmOperandType.Ot3UShort: { var ret = new UshortVariant(); ret.SetValue(r.ReadUshort()); return ret; } case VmOperandType.Ot2Byte: case VmOperandType.Ot8Byte: { var ret = new ByteVariant(); ret.SetValue(r.ReadByte()); return ret; } case VmOperandType.Ot4Double: { var ret = new DoubleVariant(); ret.SetValue(r.ReadDouble()); return ret; } case VmOperandType.Ot5Int: case VmOperandType.Ot12Int: { var ret = new IntVariant(); ret.SetValue(r.ReadInt32()); return ret; } case VmOperandType.Ot6SByte: { var ret = new SbyteVariant(); ret.SetValue(r.ReadSbyte()); return ret; } case VmOperandType.Ot7Long: { var ret = new LongVariant(); ret.SetValue(r.ReadLong()); return ret; } case VmOperandType.Ot9IntArr: { var num = r.ReadInt32(); var array = new IntVariant[num]; for (var i = 0; i < num; i++) { var item = new IntVariant(); item.SetValue(r.ReadInt32()); array[i] = item; } var ret = new ArrayVariant(); ret.SetValue(array); return ret; } case VmOperandType.Ot10Float: { var ret = new FloatVariant(); ret.SetValue(r.ReadFloat()); return ret; } case VmOperandType.Ot11Nope: return null; default: throw new Exception(StringDecryptor.GetString(-1550347123) /* Unknown operand type. */); } } // Token: 0x06000279 RID: 633 RVA: 0x0001184C File Offset: 0x0000FA4C enum ComparisonKind { EQ, NEQ, GT, LE, LT, GE } private static bool UniCompare(VariantBase v1, VariantBase v2, ComparisonKind ck, bool unsignedNanBranch) // \u0008 - bug fixed (метод переписан) { // from stack: enum double single long int var t1 = v1.GetTypeCode(); if (t1 == VariantBase.Vtc.Tc5Enum) { var vv1 = VariantBase.SignedVariantFromEnum((EnumVariant)v1); return UniCompare(vv1, v2, ck, unsignedNanBranch); } var t2 = v2.GetTypeCode(); if (t2 == VariantBase.Vtc.Tc5Enum) { var vv2 = VariantBase.SignedVariantFromEnum((EnumVariant)v2); return UniCompare(v1, vv2, ck, unsignedNanBranch); } if (t1 == VariantBase.Vtc.Tc18Object || t2 == VariantBase.Vtc.Tc18Object) { if (ck == ComparisonKind.EQ) return v1.GetValueAbstract().Equals(v2.GetValueAbstract()); if (ck == ComparisonKind.NEQ) return !v1.GetValueAbstract().Equals(v2.GetValueAbstract()); return false; } if (t1 == VariantBase.Vtc.Tc21Double || t2 == VariantBase.Vtc.Tc21Double) { var d1 = (t1 == VariantBase.Vtc.Tc21Double) ? ((DoubleVariant)v1).GetValue() : Convert.ToDouble(v1.GetValueAbstract()); var d2 = (t2 == VariantBase.Vtc.Tc21Double) ? ((DoubleVariant)v2).GetValue() : Convert.ToDouble(v2.GetValueAbstract()); if (unsignedNanBranch) unsignedNanBranch = (double.IsNaN(d1) || double.IsNaN(d2)); switch (ck) { case ComparisonKind.EQ: // ReSharper disable once CompareOfFloatsByEqualityOperator return (d1 == d2) || unsignedNanBranch; case ComparisonKind.GT: return (d1 > d2) || unsignedNanBranch; case ComparisonKind.NEQ: // ReSharper disable once CompareOfFloatsByEqualityOperator return (d1 != d2) || unsignedNanBranch; case ComparisonKind.LE: return (d1 <= d2) || unsignedNanBranch; case ComparisonKind.LT: return (d1 < d2) || unsignedNanBranch; case ComparisonKind.GE: return (d1 >= d2) || unsignedNanBranch; } } if (t1 == VariantBase.Vtc.Tc8Float || t2 == VariantBase.Vtc.Tc8Float) { var d1 = (t1 == VariantBase.Vtc.Tc8Float) ? ((FloatVariant)v1).GetValue() : Convert.ToSingle(v1.GetValueAbstract()); var d2 = (t2 == VariantBase.Vtc.Tc8Float) ? ((FloatVariant)v2).GetValue() : Convert.ToSingle(v2.GetValueAbstract()); if (unsignedNanBranch) unsignedNanBranch = (float.IsNaN(d1) || float.IsNaN(d2)); switch (ck) { case ComparisonKind.EQ: // ReSharper disable once CompareOfFloatsByEqualityOperator return (d1 == d2) || unsignedNanBranch; case ComparisonKind.GT: return (d1 > d2) || unsignedNanBranch; case ComparisonKind.NEQ: // ReSharper disable once CompareOfFloatsByEqualityOperator return (d1 != d2) || unsignedNanBranch; case ComparisonKind.LE: return (d1 <= d2) || unsignedNanBranch; case ComparisonKind.LT: return (d1 < d2) || unsignedNanBranch; case ComparisonKind.GE: return (d1 >= d2) || unsignedNanBranch; } } if (t1 == VariantBase.Vtc.Tc24Long || t2 == VariantBase.Vtc.Tc24Long) { var d1 = (t1 == VariantBase.Vtc.Tc24Long) ? ((LongVariant)v1).GetValue() : (unsignedNanBranch ? Convert.ToInt64((uint)(int)v1.GetValueAbstract()) : Convert.ToInt64(v1.GetValueAbstract())); var d2 = (t2 == VariantBase.Vtc.Tc24Long) ? ((LongVariant)v2).GetValue() : (unsignedNanBranch ? Convert.ToInt64((uint)(int)v2.GetValueAbstract()) : Convert.ToInt64(v2.GetValueAbstract())); switch (ck) { case ComparisonKind.EQ: return d1 == d2; case ComparisonKind.GT: if(unsignedNanBranch) return (ulong)d1 > (ulong)d2; return d1 > d2; case ComparisonKind.NEQ: if (unsignedNanBranch) return (ulong)d1 != (ulong)d2; return d1 != d2; case ComparisonKind.LE: if (unsignedNanBranch) return (ulong)d1 <= (ulong)d2; return d1 <= d2; case ComparisonKind.LT: if (unsignedNanBranch) return (ulong)d1 < (ulong)d2; return d1 < d2; case ComparisonKind.GE: if (unsignedNanBranch) return (ulong)d1 >= (ulong)d2; return d1 >= d2; } } if (t1 == VariantBase.Vtc.Tc19Int || t2 == VariantBase.Vtc.Tc19Int) { switch (ck) { case ComparisonKind.EQ: // ReSharper disable once CompareOfFloatsByEqualityOperator return ((IntVariant)v1).GetValue() == ((IntVariant)v2).GetValue(); case ComparisonKind.GT: if (unsignedNanBranch) return (uint)((IntVariant)v1).GetValue() > (uint)((IntVariant)v2).GetValue(); return ((IntVariant)v1).GetValue() > ((IntVariant)v2).GetValue(); case ComparisonKind.NEQ: if (unsignedNanBranch) return (uint)((IntVariant)v1).GetValue() != (uint)((IntVariant)v2).GetValue(); return ((IntVariant)v1).GetValue() != ((IntVariant)v2).GetValue(); case ComparisonKind.LE: if (unsignedNanBranch) return (uint)((IntVariant)v1).GetValue() <= (uint)((IntVariant)v2).GetValue(); return ((IntVariant)v1).GetValue() <= ((IntVariant)v2).GetValue(); case ComparisonKind.LT: if (unsignedNanBranch) return (uint)((IntVariant)v1).GetValue() < (uint)((IntVariant)v2).GetValue(); return ((IntVariant)v1).GetValue() < ((IntVariant)v2).GetValue(); //case ComparisonKind.GE: default: if (unsignedNanBranch) return (uint)((IntVariant)v1).GetValue() >= (uint)((IntVariant)v2).GetValue(); return ((IntVariant)v1).GetValue() >= ((IntVariant)v2).GetValue(); } } return false; } // Token: 0x0600017F RID: 383 RVA: 0x00007EEC File Offset: 0x000060EC private void Ldelema_(VariantBase vTypeId) // \u000F\u2002 { var type = GetTypeById(((IntVariant)vTypeId).GetValue()); var idx = PopLong(); var array = (Array)PopVariant().GetValueAbstract(); var val = new SdArrayValueVariant(); val.SetArray(array); val.SetHeldType(type); val.SetIndex(idx); PushVariant(val); } // Token: 0x06000252 RID: 594 RVA: 0x00010780 File Offset: 0x0000E980 private void Ldelem_ref_(VariantBase dummy) // \u000F\u2003\u2000 { Ldelem(SimpleTypeHelper.ObjectType); } // Token: 0x06000178 RID: 376 RVA: 0x00007D38 File Offset: 0x00005F38 private static void SerializeCrossDomain(Exception ex) // \u0002 { if (ex == null) { return; } try { var type = ex.GetType(); if (type.IsSerializable) { var context = new StreamingContext(StreamingContextStates.CrossAppDomain); var om = new ObjectManager(null, context); var info = new SerializationInfo(type, new FormatterConverter()); ex.GetObjectData(info, context); om.RegisterObject(ex, 1L, info); om.DoFixups(); } } catch { } } // Token: 0x060001DF RID: 479 RVA: 0x0000ABCC File Offset: 0x00008DCC private static void Throw(object ex) // \u0003 { throw (Exception)ex; } // Token: 0x0600024D RID: 589 RVA: 0x000105A0 File Offset: 0x0000E7A0 private static void ThrowStoreCrossDomain(object ex) // \u0002 { SerializeCrossDomain(ex as Exception); Throw(ex); } // Token: 0x06000293 RID: 659 RVA: 0x00012398 File Offset: 0x00010598 private static VariantBase SubLong(VariantBase v1, VariantBase v2, bool bChecked, bool bUnsigned) // \u0005 { var lvret = new LongVariant(); if (!bUnsigned) { var l1 = ((LongVariant)v1).GetValue(); var l2 = ((LongVariant)v2).GetValue(); long lret; if (bChecked) { lret = checked(l1 - l2); } else { lret = l1 - l2; } lvret.SetValue(lret); return lvret; } var u1 = (ulong)((LongVariant)v1).GetValue(); var u2 = (ulong)((LongVariant)v2).GetValue(); ulong uret; if (bChecked) { uret = checked(u1 - u2); } else { uret = u1 - u2; } lvret.SetValue((long)uret); return lvret; } private VariantBase Sub(bool ovf, bool signed) { VariantBase v1, v2; var org_v2 = PopVariant(); var org_v1 = PopVariant(); var tc = CommonType(org_v1, org_v2, out v1, out v2, signed); VariantBase ret; switch (tc) { case VariantBase.Vtc.Tc9Uint: uint uv1 = ((UintVariant)v1).GetValue(), uv2 = ((UintVariant)v2).GetValue(); var uvret = new UintVariant(); ret = uvret; if (ovf) { uint uiv; checked { uiv = uv1 - uv2; } uvret.SetValue(uiv); } else { uvret.SetValue(uv1 - uv2); } break; case VariantBase.Vtc.Tc19Int: int iv1 = ((IntVariant)v1).GetValue(), iv2 = ((IntVariant)v2).GetValue(); var ivret = new IntVariant(); ret = ivret; if (ovf) { checked { ivret.SetValue(iv1 - iv2); } } else { ivret.SetValue(iv1 - iv2); } break; case VariantBase.Vtc.Tc21Double: double dv1 = ((DoubleVariant)v1).GetValue(), dv2 = ((DoubleVariant)v2).GetValue(); var dvret = new DoubleVariant(); ret = dvret; dvret.SetValue(dv1 - dv2); break; case VariantBase.Vtc.Tc8Float: float fv1 = ((FloatVariant)v1).GetValue(), fv2 = ((FloatVariant)v2).GetValue(); var fvret = new FloatVariant(); ret = fvret; fvret.SetValue(fv1 - fv2); break; case VariantBase.Vtc.Tc24Long: long lv1 = ((LongVariant)v1).GetValue(), lv2 = ((LongVariant)v2).GetValue(); var lvret = new LongVariant(); ret = lvret; if (ovf) { checked { lvret.SetValue(lv1 - lv2); } } else { lvret.SetValue(lv1 - lv2); } break; case VariantBase.Vtc.Tc7Ulong: ulong ulv1 = ((UlongVariant)v1).GetValue(), ulv2 = ((UlongVariant)v2).GetValue(); var ulvret = new UlongVariant(); ret = ulvret; if (ovf) { ulong ulv; checked { ulv = ulv1 - ulv2; } ulvret.SetValue(ulv); } else { ulvret.SetValue(ulv1 - ulv2); } break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object), typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Sub_Ovf : OpCodes.Sub) : OpCodes.Sub_Ovf_Un); gen.Emit(OpCodes.Ret); ret = new IntPtrVariant(); ((IntPtrVariant)ret).SetValue(((IntPtr)dyn.Invoke(null, new[] { org_v1.GetValueAbstract(), org_v2.GetValueAbstract() }))); break; } return ret; } // Token: 0x0600026B RID: 619 RVA: 0x00010F9C File Offset: 0x0000F19C private void Sub_ovf_un_(VariantBase dummy) // \u0005\u2006\u2000 { PushVariant(Sub(true, false)); } // Token: 0x060001A8 RID: 424 RVA: 0x00008F7C File Offset: 0x0000717C private void Sub_ovf_(VariantBase dummy) // \u0005\u2008 { PushVariant(Sub(true, true)); } // Token: 0x0600021C RID: 540 RVA: 0x0000C84C File Offset: 0x0000AA4C private void Sub_(VariantBase dummy) // \u0006\u200A { PushVariant(Sub(false, true)); } // Token: 0x06000271 RID: 625 RVA: 0x00011144 File Offset: 0x0000F344 private static VariantBase MulLong(VariantBase v1, VariantBase v2, bool bChecked, bool bUnsigned) // \u0003 { var lvret = new LongVariant(); if (!bUnsigned) { var l1 = ((LongVariant)v1).GetValue(); var l2 = ((LongVariant)v2).GetValue(); long lret; if (bChecked) { lret = checked(l1 * l2); } else { lret = l1 * l2; } lvret.SetValue(lret); return lvret; } var u1 = (ulong)((LongVariant)v1).GetValue(); var u2 = (ulong)((LongVariant)v2).GetValue(); ulong uret; if (bChecked) { uret = checked(u1 * u2); } else { uret = u1 * u2; } lvret.SetValue((long)uret); return lvret; } private VariantBase Mul(bool ovf, bool signed) { VariantBase v1, v2; var org_v2 = PopVariant(); var org_v1 = PopVariant(); var tc = CommonType(org_v1, org_v2, out v1, out v2, signed); VariantBase ret; switch (tc) { case VariantBase.Vtc.Tc9Uint: uint uv1 = ((UintVariant)v1).GetValue(), uv2 = ((UintVariant)v2).GetValue(); var uvret = new UintVariant(); ret = uvret; if (ovf) { uint uiv; checked { uiv = uv1 * uv2; } uvret.SetValue(uiv); } else { uvret.SetValue(uv1 * uv2); } break; case VariantBase.Vtc.Tc19Int: int iv1 = ((IntVariant)v1).GetValue(), iv2 = ((IntVariant)v2).GetValue(); var ivret = new IntVariant(); ret = ivret; if (ovf) { checked { ivret.SetValue(iv1 * iv2); } } else { ivret.SetValue(iv1 * iv2); } break; case VariantBase.Vtc.Tc21Double: double dv1 = ((DoubleVariant)v1).GetValue(), dv2 = ((DoubleVariant)v2).GetValue(); var dvret = new DoubleVariant(); ret = dvret; dvret.SetValue(dv1 * dv2); break; case VariantBase.Vtc.Tc8Float: float fv1 = ((FloatVariant)v1).GetValue(), fv2 = ((FloatVariant)v2).GetValue(); var fvret = new FloatVariant(); ret = fvret; fvret.SetValue(fv1 * fv2); break; case VariantBase.Vtc.Tc24Long: long lv1 = ((LongVariant)v1).GetValue(), lv2 = ((LongVariant)v2).GetValue(); var lvret = new LongVariant(); ret = lvret; if (ovf) { checked { lvret.SetValue(lv1 * lv2); } } else { lvret.SetValue(lv1 * lv2); } break; case VariantBase.Vtc.Tc7Ulong: ulong ulv1 = ((UlongVariant)v1).GetValue(), ulv2 = ((UlongVariant)v2).GetValue(); var ulvret = new UlongVariant(); ret = ulvret; if (ovf) { ulong ulv; checked { ulv = ulv1 * ulv2; } ulvret.SetValue(ulv); } else { ulvret.SetValue(ulv1 * ulv2); } break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object), typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Mul_Ovf : OpCodes.Mul) : OpCodes.Mul_Ovf_Un); gen.Emit(OpCodes.Ret); ret = new IntPtrVariant(); ((IntPtrVariant)ret).SetValue(((IntPtr)dyn.Invoke(null, new[] { org_v1.GetValueAbstract(), org_v2.GetValueAbstract() }))); break; } return ret; } // Token: 0x06000181 RID: 385 RVA: 0x00007F88 File Offset: 0x00006188 private void Mul_ovf_un_(VariantBase dummy) // \u0005\u2007 { PushVariant(Mul(true, false)); } // Token: 0x060001E1 RID: 481 RVA: 0x0000ABDC File Offset: 0x00008DDC private void Mul_(VariantBase dummy) // \u0006\u2001\u2001 { PushVariant(Mul(false, true)); } // Token: 0x060001A0 RID: 416 RVA: 0x00008C98 File Offset: 0x00006E98 private void Mul_ovf_(VariantBase dummy) // \u0008\u2000\u2000 { PushVariant(Mul(true, true)); } VariantBase.Vtc CommonType(VariantBase org_v1, VariantBase org_v2, out VariantBase v1, out VariantBase v2, bool signed) { v1 = org_v1.Clone(); v2 = org_v2.Clone(); var tc1 = UnderlyingTypeCode(ref v1); var tc2 = UnderlyingTypeCode(ref v2); if (tc1 == VariantBase.Vtc.Tc18Object || tc2 == VariantBase.Vtc.Tc18Object) return VariantBase.Vtc.Tc18Object; VariantBase.Vtc ret = tc1; if (!signed) { v1 = AsUnsigned(v1); v2 = AsUnsigned(v2); } if(tc1 != tc2) switch (tc1) { case VariantBase.Vtc.Tc19Int: switch (tc2) { case VariantBase.Vtc.Tc24Long: { ret = tc2; var new_v1 = signed ? (VariantBase)new LongVariant() : new UlongVariant(); new_v1.CopyFrom(v1); v1 = new_v1; } break; case VariantBase.Vtc.Tc21Double: { ret = tc2; var new_v1 = new DoubleVariant(); new_v1.CopyFrom(v1); v1 = new_v1; } break; case VariantBase.Vtc.Tc8Float: { ret = tc2; var new_v1 = new FloatVariant(); new_v1.CopyFrom(v1); v1 = new_v1; } break; } break; case VariantBase.Vtc.Tc24Long: switch (tc2) { case VariantBase.Vtc.Tc19Int: { var new_v2 = signed ? (VariantBase)new LongVariant() : new UlongVariant(); new_v2.CopyFrom(v2); v2 = new_v2; } break; case VariantBase.Vtc.Tc21Double: { ret = tc2; var new_v1 = new DoubleVariant(); new_v1.CopyFrom(v1); v1 = new_v1; } break; case VariantBase.Vtc.Tc8Float: { ret = tc2; var new_v1 = new FloatVariant(); new_v1.CopyFrom(v1); v1 = new_v1; } break; } break; case VariantBase.Vtc.Tc21Double: switch (tc2) { case VariantBase.Vtc.Tc19Int: case VariantBase.Vtc.Tc24Long: case VariantBase.Vtc.Tc8Float: { var new_v2 = new DoubleVariant(); new_v2.CopyFrom(v2); v2 = new_v2; } break; } break; case VariantBase.Vtc.Tc8Float: switch (tc2) { case VariantBase.Vtc.Tc19Int: case VariantBase.Vtc.Tc24Long: { var new_v2 = new FloatVariant(); new_v2.CopyFrom(v2); v2 = new_v2; } break; case VariantBase.Vtc.Tc21Double: { ret = tc2; var new_v1 = new DoubleVariant(); new_v1.CopyFrom(v1); v1 = new_v1; } break; } break; } if(!signed) switch (ret) { case VariantBase.Vtc.Tc19Int: return VariantBase.Vtc.Tc9Uint; case VariantBase.Vtc.Tc24Long: return VariantBase.Vtc.Tc7Ulong; } return ret; } private VariantBase.Vtc UnderlyingTypeCode(ref VariantBase v) { var ret = v.GetTypeCode(); if (ret == VariantBase.Vtc.Tc5Enum) { v = VariantBase.SignedVariantFromEnum((EnumVariant) v); ret = Marshal.SizeOf(v.GetValueAbstract()) == 4 ? VariantBase.Vtc.Tc19Int : VariantBase.Vtc.Tc24Long; } return ret; } private VariantBase AsUnsigned(VariantBase v) { var tc = v.GetTypeCode(); var ret = v; switch (tc) { case VariantBase.Vtc.Tc19Int: ret = new UintVariant(); break; case VariantBase.Vtc.Tc24Long: ret = new UlongVariant(); break; } ret.CopyFrom(v); return ret; } private VariantBase Add(bool ovf, bool signed) { VariantBase v1, v2; var org_v2 = PopVariant(); var org_v1 = PopVariant(); var tc = CommonType(org_v1, org_v2, out v1, out v2, signed); VariantBase ret; switch (tc) { case VariantBase.Vtc.Tc9Uint: uint uv1 = ((UintVariant)v1).GetValue(), uv2 = ((UintVariant)v2).GetValue(); var uvret = new UintVariant(); ret = uvret; if (ovf) { uint uiv; checked { uiv = uv1 + uv2; } uvret.SetValue(uiv); } else { uvret.SetValue(uv1 + uv2); } break; case VariantBase.Vtc.Tc19Int: int iv1 = ((IntVariant)v1).GetValue(), iv2 = ((IntVariant)v2).GetValue(); var ivret = new IntVariant(); ret = ivret; if (ovf) { checked { ivret.SetValue(iv1 + iv2); } } else { ivret.SetValue(iv1 + iv2); } break; case VariantBase.Vtc.Tc21Double: double dv1 = ((DoubleVariant)v1).GetValue(), dv2 = ((DoubleVariant)v2).GetValue(); var dvret = new DoubleVariant(); ret = dvret; dvret.SetValue(dv1 + dv2); break; case VariantBase.Vtc.Tc8Float: float fv1 = ((FloatVariant)v1).GetValue(), fv2 = ((FloatVariant)v2).GetValue(); var fvret = new FloatVariant(); ret = fvret; fvret.SetValue(fv1 + fv2); break; case VariantBase.Vtc.Tc24Long: long lv1 = ((LongVariant)v1).GetValue(), lv2 = ((LongVariant)v2).GetValue(); var lvret = new LongVariant(); ret = lvret; if (ovf) { checked { lvret.SetValue(lv1 + lv2); } } else { lvret.SetValue(lv1 + lv2); } break; case VariantBase.Vtc.Tc7Ulong: ulong ulv1 = ((UlongVariant)v1).GetValue(), ulv2 = ((UlongVariant)v2).GetValue(); var ulvret = new UlongVariant(); ret = ulvret; if (ovf) { ulong ulv; checked { ulv = ulv1 + ulv2; } ulvret.SetValue(ulv); } else { ulvret.SetValue(ulv1 + ulv2); } break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object), typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Add_Ovf : OpCodes.Add) : OpCodes.Add_Ovf_Un); gen.Emit(OpCodes.Ret); ret = new IntPtrVariant(); ((IntPtrVariant)ret).SetValue(((IntPtr)dyn.Invoke(null, new[] { org_v1.GetValueAbstract(), org_v2.GetValueAbstract() }))); break; } return ret; } // Token: 0x0600022D RID: 557 RVA: 0x0000F880 File Offset: 0x0000DA80 private void Add_ovf_(VariantBase dummy) // \u0008\u2001 { PushVariant(Add(true, true)); } // Token: 0x06000238 RID: 568 RVA: 0x0000F998 File Offset: 0x0000DB98 private void Add_(VariantBase dummy) // \u0002\u2004 { PushVariant(Add(false, true)); } // Token: 0x0600029B RID: 667 RVA: 0x000126A0 File Offset: 0x000108A0 private void Add_ovf_un_(VariantBase dummy) // \u0002\u2004\u2000 { PushVariant(Add(true, false)); } private VariantBase Or(VariantBase org_v1, VariantBase org_v2) { VariantBase v1, v2; var tc = CommonType(org_v1, org_v2, out v1, out v2, true); VariantBase ret; switch (tc) { case VariantBase.Vtc.Tc9Uint: uint uv1 = ((UintVariant)v1).GetValue(), uv2 = ((UintVariant)v2).GetValue(); var uvret = new UintVariant(); ret = uvret; uvret.SetValue(uv1 | uv2); break; case VariantBase.Vtc.Tc19Int: int iv1 = ((IntVariant)v1).GetValue(), iv2 = ((IntVariant)v2).GetValue(); var ivret = new IntVariant(); ret = ivret; ivret.SetValue(iv1 | iv2); break; case VariantBase.Vtc.Tc21Double: { /*double dv1 = ((DoubleVariant)v1).GetValue(), dv2 = ((DoubleVariant)v2).GetValue(); // естественный алгоритм long lv1 = (dv1 < 0) ? (long)dv1 : (long)(ulong)dv1; long lv2 = (dv2 < 0) ? (long)dv2 : (long)(ulong)dv2; var dvret = new DoubleVariant(); ret = dvret; var l64 = (ulong) lv1 | (ulong) lv2; if (l64 >> 32 == UInt32.MaxValue) l64 &= UInt32.MaxValue; dvret.SetValue(l64);*/ var dvret = new DoubleVariant(); ret = dvret; dvret.SetValue((4 == IntPtr.Size) ? Double.NaN : (double)0); // иногда у фреймворка бывает мусор, но чаще эти значения... } break; case VariantBase.Vtc.Tc8Float: { /*float fv1 = ((FloatVariant) v1).GetValue(), fv2 = ((FloatVariant) v2).GetValue(); // естественный алгоритм long lv1 = (fv1 < 0) ? (long)fv1 : (long)(ulong)fv1; long lv2 = (fv2 < 0) ? (long)fv2 : (long)(ulong)fv2; var fvret = new FloatVariant(); ret = fvret; var l64 = (ulong)lv1 | (ulong)lv2; if (l64 >> 32 == UInt32.MaxValue) l64 &= UInt32.MaxValue; fvret.SetValue(l64);*/ var fvret = new FloatVariant(); ret = fvret; fvret.SetValue((4 == IntPtr.Size) ? float.NaN : (float)0.0); // иногда у фреймворка бывает мусор, но чаще эти значения... } break; case VariantBase.Vtc.Tc24Long: { long lv1 = ((LongVariant)v1).GetValue(), lv2 = ((LongVariant)v2).GetValue(); var lvret = new LongVariant(); ret = lvret; lvret.SetValue(lv1 | lv2); } break; case VariantBase.Vtc.Tc7Ulong: ulong ulv1 = ((UlongVariant)v1).GetValue(), ulv2 = ((UlongVariant)v2).GetValue(); var ulvret = new UlongVariant(); ret = ulvret; ulvret.SetValue(ulv1 | ulv2); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object), typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Or); gen.Emit(OpCodes.Ret); ret = new IntPtrVariant(); ((IntPtrVariant)ret).SetValue(((IntPtr)dyn.Invoke(null, new[] { org_v1.GetValueAbstract(), org_v2.GetValueAbstract() }))); break; } return ret; } // Token: 0x0600020F RID: 527 RVA: 0x0000C598 File Offset: 0x0000A798 private void Or_(VariantBase dummy) // \u0006\u2002\u2000 { var v2 = PopVariant(); var v1 = PopVariant(); PushVariant(Or(v1, v2)); } // Token: 0x060001D8 RID: 472 RVA: 0x0000A718 File Offset: 0x00008918 private void Throw_(VariantBase dummy) // \u0006\u2005\u2000 { ThrowStoreCrossDomain(PopVariant().GetValueAbstract()); } private VariantBase Rem(bool signed) { VariantBase v1, v2; var org_v2 = PopVariant(); var org_v1 = PopVariant(); VariantBase ret; var tc = CommonType(org_v1, org_v2, out v1, out v2, signed); if (IsFloating(org_v1) && org_v1.GetType() == org_v2.GetType() && !signed) { if (IntPtr.Size == 8) throw new InvalidProgramException(); if (tc == VariantBase.Vtc.Tc21Double) { ret = new DoubleVariant(); ret.SetValueAbstract(double.NaN); } else /*if (tc == VariantBase.Vtc.Tc8Float)*/ { ret = new FloatVariant(); ret.SetValueAbstract(float.NaN); } } else switch (tc) { case VariantBase.Vtc.Tc9Uint: uint uv1 = ((UintVariant)v1).GetValue(), uv2 = ((UintVariant)v2).GetValue(); var uvret = new UintVariant(); ret = uvret; uvret.SetValue(uv1 % uv2); break; case VariantBase.Vtc.Tc19Int: int iv1 = ((IntVariant)v1).GetValue(), iv2 = ((IntVariant)v2).GetValue(); var ivret = new IntVariant(); ret = ivret; ivret.SetValue(iv1 % iv2); break; case VariantBase.Vtc.Tc21Double: double dv1 = ((DoubleVariant)v1).GetValue(), dv2 = ((DoubleVariant)v2).GetValue(); var dvret = new DoubleVariant(); ret = dvret; if (Math.Abs(dv2) < double.Epsilon && org_v1.GetType() != org_v2.GetType()) throw new DivideByZeroException(); dvret.SetValue(dv1 % dv2); break; case VariantBase.Vtc.Tc8Float: float fv1 = ((FloatVariant)v1).GetValue(), fv2 = ((FloatVariant)v2).GetValue(); var fvret = new FloatVariant(); ret = fvret; if (Math.Abs(fv2) < float.Epsilon && org_v1.GetType() != org_v2.GetType()) throw new DivideByZeroException(); fvret.SetValue(fv1 % fv2); break; case VariantBase.Vtc.Tc24Long: long lv1 = ((LongVariant)v1).GetValue(), lv2 = ((LongVariant)v2).GetValue(); var lvret = new LongVariant(); ret = lvret; lvret.SetValue(lv1 % lv2); break; case VariantBase.Vtc.Tc7Ulong: ulong ulv1 = ((UlongVariant)v1).GetValue(), ulv2 = ((UlongVariant)v2).GetValue(); var ulvret = new UlongVariant(); ret = ulvret; ulvret.SetValue(ulv1 % ulv2); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object), typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? OpCodes.Rem : OpCodes.Rem_Un); gen.Emit(OpCodes.Ret); ret = new IntPtrVariant(); ((IntPtrVariant)ret).SetValue(((IntPtr)dyn.Invoke(null, new[] { org_v1.GetValueAbstract(), org_v2.GetValueAbstract() }))); break; } return ret; } // Token: 0x060001CC RID: 460 RVA: 0x00009EAC File Offset: 0x000080AC private void Rem_(VariantBase dummy) // \u0006\u2000\u2001 { PushVariant(Rem(true)); } // Token: 0x060001FA RID: 506 RVA: 0x0000BC3C File Offset: 0x00009E3C private void Rem_un_(VariantBase dummy) // \u0006\u200B\u2000 { PushVariant(Rem(false)); } // Token: 0x06000254 RID: 596 RVA: 0x00010824 File Offset: 0x0000EA24 private static VariantBase Neg(VariantBase v) // \u0002 { if (v.GetTypeCode() == VariantBase.Vtc.Tc19Int) { var i = ((IntVariant)v).GetValue(); var ivret = new IntVariant(); ivret.SetValue(-i); return ivret; } if (v.GetTypeCode() == VariantBase.Vtc.Tc24Long) { var l = ((LongVariant)v).GetValue(); var lvret = new LongVariant(); lvret.SetValue(-l); return lvret; } if (v.GetTypeCode() == VariantBase.Vtc.Tc21Double) { var dvret = new DoubleVariant(); dvret.SetValue(-((DoubleVariant)v).GetValue()); return dvret; } if (v.GetTypeCode() != VariantBase.Vtc.Tc5Enum) { throw new InvalidOperationException(); } var underlyingType = Enum.GetUnderlyingType(v.GetValueAbstract().GetType()); if (underlyingType == typeof(long) || underlyingType == typeof(ulong)) { var lvret = new LongVariant(); lvret.SetValue(Convert.ToInt64(v.GetValueAbstract())); return Neg(lvret); } var ivret2 = new IntVariant(); ivret2.SetValue(Convert.ToInt32(v.GetValueAbstract())); return Neg(ivret2); } // Token: 0x060001F8 RID: 504 RVA: 0x0000BA00 File Offset: 0x00009C00 private void Neg_(VariantBase dummy) // \u0006\u2007 { var v = PopVariant(); PushVariant(Neg(v)); } // Token: 0x06000242 RID: 578 RVA: 0x0000FE38 File Offset: 0x0000E038 private static VariantBase DivLong(VariantBase v1, VariantBase v2, bool bUnsigned) // \u0003 { var lvret = new LongVariant(); if (!bUnsigned) { var l1 = ((LongVariant)v1).GetValue(); var l2 = ((LongVariant)v2).GetValue(); lvret.SetValue(l1 / l2); return lvret; } var u1 = (ulong)((LongVariant)v1).GetValue(); var u2 = (ulong)((LongVariant)v2).GetValue(); lvret.SetValue((long)(u1 / u2)); return lvret; } private VariantBase Div(bool signed) { VariantBase v1, v2; var org_v2 = PopVariant(); var org_v1 = PopVariant(); VariantBase ret; var tc = CommonType(org_v1, org_v2, out v1, out v2, signed); if (IsFloating(org_v1) && org_v1.GetType() == org_v2.GetType() && !signed) { if (IntPtr.Size == 8) throw new InvalidProgramException(); if(tc == VariantBase.Vtc.Tc21Double) { ret = new DoubleVariant(); ret.SetValueAbstract(double.NaN); } else /*if (tc == VariantBase.Vtc.Tc8Float)*/ { ret = new FloatVariant(); ret.SetValueAbstract(float.NaN); } } else switch (tc) { case VariantBase.Vtc.Tc9Uint: uint uv1 = ((UintVariant)v1).GetValue(), uv2 = ((UintVariant)v2).GetValue(); var uvret = new UintVariant(); ret = uvret; uvret.SetValue(uv1 / uv2); break; case VariantBase.Vtc.Tc19Int: int iv1 = ((IntVariant)v1).GetValue(), iv2 = ((IntVariant)v2).GetValue(); var ivret = new IntVariant(); ret = ivret; ivret.SetValue(iv1 / iv2); break; case VariantBase.Vtc.Tc21Double: double dv1 = ((DoubleVariant)v1).GetValue(), dv2 = ((DoubleVariant)v2).GetValue(); var dvret = new DoubleVariant(); ret = dvret; if(Math.Abs(dv2) < double.Epsilon && org_v1.GetType() != org_v2.GetType()) throw new DivideByZeroException(); dvret.SetValue(dv1 / dv2); break; case VariantBase.Vtc.Tc8Float: float fv1 = ((FloatVariant)v1).GetValue(), fv2 = ((FloatVariant)v2).GetValue(); var fvret = new FloatVariant(); ret = fvret; if (Math.Abs(fv2) < float.Epsilon && org_v1.GetType() != org_v2.GetType()) throw new DivideByZeroException(); fvret.SetValue(fv1 / fv2); break; case VariantBase.Vtc.Tc24Long: long lv1 = ((LongVariant)v1).GetValue(), lv2 = ((LongVariant)v2).GetValue(); var lvret = new LongVariant(); ret = lvret; lvret.SetValue(lv1 / lv2); break; case VariantBase.Vtc.Tc7Ulong: ulong ulv1 = ((UlongVariant)v1).GetValue(), ulv2 = ((UlongVariant)v2).GetValue(); var ulvret = new UlongVariant(); ret = ulvret; ulvret.SetValue(ulv1 / ulv2); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object), typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? OpCodes.Div : OpCodes.Div_Un); gen.Emit(OpCodes.Ret); ret = new IntPtrVariant(); ((IntPtrVariant)ret).SetValue(((IntPtr)dyn.Invoke(null, new[] { org_v1.GetValueAbstract(), org_v2.GetValueAbstract() }))); break; } return ret; } // Token: 0x060001F0 RID: 496 RVA: 0x0000B664 File Offset: 0x00009864 private void Div_(VariantBase dummy) // \u0002\u2009 { PushVariant(Div(true)); } // Token: 0x0600017C RID: 380 RVA: 0x00007DF4 File Offset: 0x00005FF4 private void Div_un_(VariantBase dummy) // \u000E\u200B { PushVariant(Div(false)); } // Token: 0x0600026D RID: 621 RVA: 0x00010FF4 File Offset: 0x0000F1F4 private static void EmitLdc(ILGenerator gen, int val) // \u0002 { switch (val) { case -1: gen.Emit(OpCodes.Ldc_I4_M1); return; case 0: gen.Emit(OpCodes.Ldc_I4_0); return; case 1: gen.Emit(OpCodes.Ldc_I4_1); return; case 2: gen.Emit(OpCodes.Ldc_I4_2); return; case 3: gen.Emit(OpCodes.Ldc_I4_3); return; case 4: gen.Emit(OpCodes.Ldc_I4_4); return; case 5: gen.Emit(OpCodes.Ldc_I4_5); return; case 6: gen.Emit(OpCodes.Ldc_I4_6); return; case 7: gen.Emit(OpCodes.Ldc_I4_7); return; case 8: gen.Emit(OpCodes.Ldc_I4_8); return; default: if (val > -129 && val < 128) { gen.Emit(OpCodes.Ldc_I4_S, (sbyte)val); return; } gen.Emit(OpCodes.Ldc_I4, val); return; } } // Token: 0x06000264 RID: 612 RVA: 0x00010C28 File Offset: 0x0000EE28 private static void EnsureClass(ILGenerator gen, Type t) // \u0003 { if (t == SimpleTypeHelper.ObjectType) { return; } gen.Emit(OpCodes.Castclass, t); } // Token: 0x06000277 RID: 631 RVA: 0x0001180C File Offset: 0x0000FA0C private static void EnsureType(ILGenerator gen, Type t) // \u0005 { if (t.IsValueType || ElementedTypeHelper.TryGoToElementType(t).IsGenericParameter) { gen.Emit(OpCodes.Unbox_Any, t); return; } EnsureClass(gen, t); } // Token: 0x06000217 RID: 535 RVA: 0x0000C7EC File Offset: 0x0000A9EC private static void EnsureBoxed(ILGenerator gen, Type t) // \u0002 { if (t.IsValueType || ElementedTypeHelper.TryGoToElementType(t).IsGenericParameter) { gen.Emit(OpCodes.Box, t); } } // Token: 0x0600023E RID: 574 RVA: 0x0000FA54 File Offset: 0x0000DC54 private DynamicExecutor DynamicFor(MethodBase mb, bool mayVirtual) // \u0002 { DynamicMethod dynamicMethod; /*= null; if (_alwaysFalse && (!mb.IsConstructor || !typeof(Delegate).IsAssignableFrom(mb.DeclaringType))) { dynamicMethod = new DynamicMethod(string.Empty, SimpleTypeHelper.ObjectType, new Type[] { SimpleTypeHelper.ObjectType, ObjectArrayType }, true); } if (dynamicMethod == null)*/ { dynamicMethod = new DynamicMethod(string.Empty, SimpleTypeHelper.ObjectType, new[] { SimpleTypeHelper.ObjectType, ObjectArrayType }, typeof(VmExecutor).Module, true); } var iLGenerator = dynamicMethod.GetILGenerator(); var parameters = mb.GetParameters(); var array = new Type[parameters.Length]; var flag = false; for (var i = 0; i < parameters.Length; i++) { var type = parameters[i].ParameterType; if (type.IsByRef) { flag = true; type = type.GetElementType(); } array[i] = type; } var array2 = new LocalBuilder[array.Length]; if (array2.Length != 0) { dynamicMethod.InitLocals = true; } for (var j = 0; j < array.Length; j++) { array2[j] = iLGenerator.DeclareLocal(array[j]); } for (var k = 0; k < array.Length; k++) { iLGenerator.Emit(OpCodes.Ldarg_1); EmitLdc(iLGenerator, k); iLGenerator.Emit(OpCodes.Ldelem_Ref); EnsureType(iLGenerator, array[k]); iLGenerator.Emit(OpCodes.Stloc, array2[k]); } if (flag) { iLGenerator.BeginExceptionBlock(); } if (!mb.IsStatic && !mb.IsConstructor) { iLGenerator.Emit(OpCodes.Ldarg_0); var declaringType = mb.DeclaringType; if (declaringType.IsValueType) { iLGenerator.Emit(OpCodes.Unbox, declaringType); mayVirtual = false; } else { EnsureClass(iLGenerator, declaringType); } } for (var l = 0; l < array.Length; l++) { iLGenerator.Emit(parameters[l].ParameterType.IsByRef ? OpCodes.Ldloca_S : OpCodes.Ldloc, array2[l]); } if (mb.IsConstructor) { iLGenerator.Emit(OpCodes.Newobj, (ConstructorInfo)mb); EnsureBoxed(iLGenerator, mb.DeclaringType); } else { var methodInfo = (MethodInfo)mb; if (!mayVirtual || mb.IsStatic) { iLGenerator.EmitCall(OpCodes.Call, methodInfo, null); } else { iLGenerator.EmitCall(OpCodes.Callvirt, methodInfo, null); } if (methodInfo.ReturnType == VoidType) { iLGenerator.Emit(OpCodes.Ldnull); } else { EnsureBoxed(iLGenerator, methodInfo.ReturnType); } } if (flag) { var local = iLGenerator.DeclareLocal(SimpleTypeHelper.ObjectType); iLGenerator.Emit(OpCodes.Stloc, local); iLGenerator.BeginFinallyBlock(); for (var m = 0; m < array.Length; m++) { if (parameters[m].ParameterType.IsByRef) { iLGenerator.Emit(OpCodes.Ldarg_1); EmitLdc(iLGenerator, m); iLGenerator.Emit(OpCodes.Ldloc, array2[m]); if (array2[m].LocalType.IsValueType || ElementedTypeHelper.TryGoToElementType(array2[m].LocalType).IsGenericParameter) { iLGenerator.Emit(OpCodes.Box, array2[m].LocalType); } iLGenerator.Emit(OpCodes.Stelem_Ref); } } iLGenerator.EndExceptionBlock(); iLGenerator.Emit(OpCodes.Ldloc, local); } iLGenerator.Emit(OpCodes.Ret); return (DynamicExecutor)dynamicMethod.CreateDelegate(typeof(DynamicExecutor)); } // Token: 0x06000209 RID: 521 RVA: 0x0000C4D0 File Offset: 0x0000A6D0 private static bool HasByRefParameter(MethodBase mb) // \u0002 { return mb.GetParameters().Any(t => t.ParameterType.IsByRef); } // Token: 0x060001D9 RID: 473 RVA: 0x0000A72C File Offset: 0x0000892C private object Invoke(MethodBase mb, object obj, object[] args) // \u0002 { if (mb.IsConstructor) { // ReSharper disable once AssignNullToNotNullAttribute return Activator.CreateInstance(mb.DeclaringType, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, args, null); } return mb.Invoke(obj, args); } // Token: 0x06000286 RID: 646 RVA: 0x00011EFC File Offset: 0x000100FC private object InvokeDynamic(MethodBase mb, object obj, object[] args, bool mayVirtual) // \u0002 { /*if (!_alwaysTrue) { return Invoke(mb, obj, args); }*/ var key = new MethodBaseAndVirtual(mb, mayVirtual); DynamicExecutor executor; lock (_dynamicExecutors) { _dynamicExecutors.TryGetValue(key, out executor); } if (executor == null) { bool needFaster; lock (_mbCallCnt) { int num; _mbCallCnt.TryGetValue(mb, out num); needFaster = num >= 50; if (!needFaster) { _mbCallCnt[mb] = num + 1; } } if (!needFaster && !mayVirtual && obj == null && !mb.IsStatic && !mb.IsConstructor) { needFaster = true; } if (!needFaster && HasByRefParameter(mb)) { needFaster = true; } if (!needFaster) { return Invoke(mb, obj, args); } lock (_mbDynamicLock) { while (_mbDynamicLock.ContainsKey(mb)) { Monitor.Wait(_mbDynamicLock); } _mbDynamicLock[mb] = null; } try { lock (_dynamicExecutors) { _dynamicExecutors.TryGetValue(key, out executor); } if (executor == null) { executor = DynamicFor(mb, mayVirtual); lock (_dynamicExecutors) { _dynamicExecutors[key] = executor; } } lock (_mbCallCnt) { _mbCallCnt.Remove(mb); } } finally { lock (_mbDynamicLock) { _mbDynamicLock.Remove(mb); Monitor.PulseAll(_mbDynamicLock); } } } return executor(obj, args); } // Token: 0x0600028D RID: 653 RVA: 0x000122A4 File Offset: 0x000104A4 private VariantBase FetchByAddr(VariantBase addr) // \u0003 { if (!addr.IsAddr()) { throw new ArgumentException(); } var num = addr.GetTypeCode(); if (num == VariantBase.Vtc.Tc0VariantBaseHolder) { return ((VariantBaseHolder)addr).GetValue(); } if (num != VariantBase.Vtc.Tc4FieldInfo) { switch (num) { case VariantBase.Vtc.Tc20MdArrayValue: case VariantBase.Vtc.Tc22SdArrayValue: { var avv = (ArrayValueVariantBase)addr; return VariantFactory.Convert(avv.GetValue(), avv.GetHeldType()); } case VariantBase.Vtc.Tc23LocalsIdxHolder: return _localVariables[((LocalsIdxHolderVariant)addr).GetValue()]; } throw new ArgumentOutOfRangeException(); } var fiv = (FieldInfoVariant)addr; return VariantFactory.Convert(fiv.GetValue().GetValue(fiv.GetObject()), null); } // Token: 0x06000186 RID: 390 RVA: 0x00008150 File Offset: 0x00006350 private FieldInfo ResolveField(int id) // \u0002 { FieldInfo result; lock (AllMetadataById) { object md; if (AllMetadataById.TryGetValue(id, out md)) { result = (FieldInfo)md; } else { var U0003U2008 = ReadToken(id); if (U0003U2008.IsVm == 0) { result = _module.ResolveField(U0003U2008.MetadataToken); } else { var u000Fu2006 = (VmFieldTokenInfo)U0003U2008.VmToken; var expr_70 = GetTypeById(u000Fu2006.Class.MetadataToken); var bindingAttr = BF(u000Fu2006.IsStatic); var field = expr_70.GetField(u000Fu2006.Name, bindingAttr); if (!expr_70.IsGenericType) { AllMetadataById.Add(id, field); } result = field; } } } return result; } // Token: 0x06000177 RID: 375 RVA: 0x00007CD8 File Offset: 0x00005ED8 private void Ldflda_(VariantBase vFieldId) // \u0003\u2009 { var fieldInfo = ResolveField(((IntVariant)vFieldId).GetValue()); var reference = PopVariant(); var obj = reference.IsAddr() ? FetchByAddr(reference).GetValueAbstract() : reference.GetValueAbstract(); var val = new FieldInfoVariant(); val.SetValue(fieldInfo); val.SetObject(obj); PushVariant(val); } // Token: 0x0600018F RID: 399 RVA: 0x0000840C File Offset: 0x0000660C private void Ldsflda_(VariantBase vFieldId) // \u000E\u2002 { var fieldInfo = ResolveField(((IntVariant)vFieldId).GetValue()); var val = new FieldInfoVariant(); val.SetValue(fieldInfo); PushVariant(val); } // Token: 0x0600017D RID: 381 RVA: 0x00007E20 File Offset: 0x00006020 private void Ldtoken_(VariantBase vToken) // \u0005\u2002\u2000 { var t = ReadToken(((IntVariant)vToken).GetValue()); object obj; if (t.IsVm == 0) { obj = ResolveNativeToken(t.MetadataToken); } else { switch (t.VmToken.TokenKind()) { case VmTokenInfo.Kind.Class0: obj = GetTypeById(((IntVariant)vToken).GetValue()).TypeHandle; break; case VmTokenInfo.Kind.Field1: obj = ResolveField(((IntVariant)vToken).GetValue()).FieldHandle; break; case VmTokenInfo.Kind.Method2: obj = FindMethodById(((IntVariant)vToken).GetValue()).MethodHandle; break; default: throw new InvalidOperationException(); } } var push = new ObjectVariant(); push.SetValue(obj); PushVariant(push); } // Token: 0x06000206 RID: 518 RVA: 0x0000C1C8 File Offset: 0x0000A3C8 private void Ldfld_(VariantBase vFieldId) // \u0005\u2003\u2001 { var fieldInfo = ResolveField(((IntVariant)vFieldId).GetValue()); var reference = PopVariant(); if (reference.IsAddr()) { reference = FetchByAddr(reference); } var obj = reference.GetValueAbstract(); if (obj == null) { throw new NullReferenceException(); } PushVariant(VariantFactory.Convert(fieldInfo.GetValue(obj), fieldInfo.FieldType)); } // Token: 0x06000225 RID: 549 RVA: 0x0000F2CC File Offset: 0x0000D4CC private void Ldsfld_(VariantBase vFieldId) // \u000F\u2004\u2000 { var fieldInfo = ResolveField(((IntVariant)vFieldId).GetValue()); PushVariant(VariantFactory.Convert(fieldInfo.GetValue(null), fieldInfo.FieldType)); } // Token: 0x0600024A RID: 586 RVA: 0x0001034C File Offset: 0x0000E54C private void Newobj_(VariantBase vCtrId) // \u0002\u200A { var num = ((IntVariant)vCtrId).GetValue(); var methodBase = FindMethodById(num); var declaringType = methodBase.DeclaringType; var parameters = methodBase.GetParameters(); var expr_2A = parameters.Length; var array = new object[expr_2A]; var dictionary = new Dictionary(); for (var i = expr_2A - 1; i >= 0; i--) { var u000F = PopVariant(); if (u000F.IsAddr()) { dictionary.Add(i, u000F); u000F = FetchByAddr(u000F); } if (u000F.GetVariantType() != null) { u000F = VariantFactory.Convert(null, u000F.GetVariantType()).CopyFrom(u000F); } var u000F2 = VariantFactory.Convert(null, parameters[i].ParameterType).CopyFrom(u000F); array[i] = u000F2.GetValueAbstract(); } object obj; try { obj = InvokeDynamic(methodBase, null, array, false); } catch (TargetInvocationException ex) { var expr_C2 = ex.InnerException ?? ex; SerializeCrossDomain(expr_C2); throw expr_C2; } foreach (var current in dictionary) { AssignByReference(current.Value, VariantFactory.Convert(array[current.Key], null)); } PushVariant(VariantFactory.Convert(obj, declaringType)); } // Token: 0x06000227 RID: 551 RVA: 0x0000F3B4 File Offset: 0x0000D5B4 private void AssignByReference(VariantBase refDest, VariantBase val) // \u0002 { switch (refDest.GetTypeCode()) { case VariantBase.Vtc.Tc0VariantBaseHolder: ((VariantBaseHolder)refDest).GetValue().CopyFrom(val); return; case VariantBase.Vtc.Tc4FieldInfo: var refFieldInfoDest = (FieldInfoVariant)refDest; var fieldInfo = refFieldInfoDest.GetValue(); fieldInfo.SetValue(refFieldInfoDest.GetObject(), VariantFactory.Convert(val.GetValueAbstract(), fieldInfo.FieldType).GetValueAbstract()); return; case VariantBase.Vtc.Tc20MdArrayValue: case VariantBase.Vtc.Tc22SdArrayValue: var refArrayValueDest = (ArrayValueVariantBase)refDest; refArrayValueDest.SetValue(VariantFactory.Convert(val.GetValueAbstract(), refArrayValueDest.GetHeldType()).GetValueAbstract()); return; case VariantBase.Vtc.Tc23LocalsIdxHolder: _localVariables[((LocalsIdxHolderVariant)refDest).GetValue()].CopyFrom(val); return; default: throw new ArgumentOutOfRangeException(); } } // Token: 0x060001E5 RID: 485 RVA: 0x0000AD10 File Offset: 0x00008F10 private void Invoke(MethodBase mb, bool mayVirtual) // \u0002 { if (!mayVirtual && IsCompatible(mb)) { mb = GenerateDynamicCall(mb, false); } var parameters = mb.GetParameters(); var num = parameters.Length; var poppedArgs = new VariantBase[num]; var args = new object[num]; var wasLocked = default(BoolHolder); try { LockIfInterlocked(ref wasLocked, mb, mayVirtual); for (var i = num - 1; i >= 0; i--) { var u000F = PopVariant(); poppedArgs[i] = u000F; if (u000F.IsAddr()) { u000F = FetchByAddr(u000F); } if (u000F.GetVariantType() != null) { u000F = VariantFactory.Convert(null, u000F.GetVariantType()).CopyFrom(u000F); } var u000F2 = VariantFactory.Convert(null, parameters[i].ParameterType).CopyFrom(u000F); args[i] = u000F2.GetValueAbstract(); } VariantBase u000F3 = null; if (!mb.IsStatic) { u000F3 = PopVariant(); if (u000F3?.GetVariantType() != null) { u000F3 = VariantFactory.Convert(null, u000F3.GetVariantType()).CopyFrom(u000F3); } } object obj = null; try { if (mb.IsConstructor) { obj = Activator.CreateInstance(mb.DeclaringType, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, args, null); if (u000F3 != null && !u000F3.IsAddr()) { throw new InvalidOperationException(); } AssignByReference(u000F3, VariantFactory.Convert(obj, mb.DeclaringType)); } else { object poppedThis = null; if (u000F3 != null) { var u000F4 = u000F3; if (u000F3.IsAddr()) { u000F4 = FetchByAddr(u000F3); } poppedThis = u000F4.GetValueAbstract(); } try { if (!InvokeFilter(mb, poppedThis, ref obj, args)) { if (mayVirtual && !mb.IsStatic && poppedThis == null) { throw new NullReferenceException(); } if (!AlwaysFalse(mb, poppedThis, poppedArgs, args, mayVirtual, ref obj)) { obj = InvokeDynamic(mb, poppedThis, args, mayVirtual); } } if (u000F3 != null && u000F3.IsAddr()) { AssignByReference(u000F3, VariantFactory.Convert(poppedThis, mb.DeclaringType)); } } catch (TargetInvocationException ex) { var cause = ex.InnerException ?? ex; SerializeCrossDomain(cause); throw cause; } } } finally { for (var j = 0; j < poppedArgs.Length; j++) { var u000F5 = poppedArgs[j]; if (u000F5.IsAddr()) { var obj3 = args[j]; AssignByReference(u000F5, VariantFactory.Convert(obj3, null)); } } } var methodInfo = mb as MethodInfo; if (methodInfo != null) { var returnType = methodInfo.ReturnType; if (returnType != VoidType) { PushVariant(VariantFactory.Convert(obj, returnType)); } } } finally { UnlockInterlockedIfAny(ref wasLocked); } } // Token: 0x060001FD RID: 509 RVA: 0x0000BD88 File Offset: 0x00009F88 private void DoJmp(int pos, Type[] methodGenericArgs, Type[] classGenericArgs, bool mayVirtual) // \u0002 { _srcVirtualizedStreamReader.BaseStream.Seek(pos, SeekOrigin.Begin); DoNothing(_srcVirtualizedStreamReader); var u0006 = ReadMethodHeader(_srcVirtualizedStreamReader); var num = u0006.ArgsTypeToOutput.Length; var array = new object[num]; var array2 = new VariantBase[num]; if (_currentClass != null & mayVirtual) { var num2 = u0006.IsStatic() ? 0 : 1; var array3 = new Type[num - num2]; for (var i = num - 1; i >= num2; i--) { array3[i] = GetTypeById(u0006.ArgsTypeToOutput[i].TypeId); } var method = _currentClass.GetMethod(u0006.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.GetProperty | BindingFlags.SetProperty, null, array3, null); _currentClass = null; if (method != null) { Invoke(method, true); return; } } for (var j = num - 1; j >= 0; j--) { var u000F = PopVariant(); array2[j] = u000F; if (u000F.IsAddr()) { u000F = FetchByAddr(u000F); } if (u000F.GetVariantType() != null) { u000F = VariantFactory.Convert(null, u000F.GetVariantType()).CopyFrom(u000F); } var u000F2 = VariantFactory.Convert(null, GetTypeById(u0006.ArgsTypeToOutput[j].TypeId)).CopyFrom(u000F); array[j] = u000F2.GetValueAbstract(); if (j == 0 & mayVirtual && !u0006.IsStatic() && array[j] == null) { throw new NullReferenceException(); } } var u0006u2007 = new VmExecutor(_instrCodesDb); var callees = new object[] { _module.Assembly }; object obj; try { obj = u0006u2007.Invoke(_srcVirtualizedStream, pos, array, methodGenericArgs, classGenericArgs, callees); } finally { for (var k = 0; k < array2.Length; k++) { var u000F3 = array2[k]; if (u000F3.IsAddr()) { var obj2 = array[k]; AssignByReference(u000F3, VariantFactory.Convert(obj2, null)); } } } var type = u0006u2007.GetTypeById(u0006u2007._methodHeader.ReturnTypeId); if (type != VoidType) { PushVariant(VariantFactory.Convert(obj, type)); } } // Token: 0x0600027A RID: 634 RVA: 0x00011994 File Offset: 0x0000FB94 private void JmpToRef(VmMethodRefTokenInfo mref) // \u0002 { //var arg_18_0 = (U0008U2007)U0003U2008.Get_u0005(); var methodBase = FindMethodById(mref.Pos, ReadToken(mref.Pos)); //methodBase.GetParameters(); var num = mref.Flags; var mayVirtual = (num & 1073741824) != 0; num &= -1073741825; var methodGenericArgs = _methodGenericArgs; var classGenericArgs = _classGenericArgs; try { _methodGenericArgs = methodBase is ConstructorInfo ? Type.EmptyTypes : methodBase.GetGenericArguments(); _classGenericArgs = methodBase.DeclaringType.GetGenericArguments(); DoJmp(num, _methodGenericArgs, _classGenericArgs, mayVirtual); } finally { _methodGenericArgs = methodGenericArgs; _classGenericArgs = classGenericArgs; } } // Token: 0x060001EE RID: 494 RVA: 0x0000B5FC File Offset: 0x000097FC private void Jmp_(VariantBase vPos) // \u0008\u200B\u2000 { var pos = ((IntVariant)vPos).GetValue(); var arg_29_0 = (pos & -2147483648) != 0; var mayVirtual = (pos & 1073741824) != 0; pos &= 1073741823; if (arg_29_0) { DoJmp(pos, null, null, mayVirtual); return; } JmpToRef((VmMethodRefTokenInfo)ReadToken(pos).VmToken); } // Token: 0x06000199 RID: 409 RVA: 0x00008660 File Offset: 0x00006860 private void Calli_(VariantBase dummy) // \u0003\u2002 { var methodBase = ((MethodVariant)PopVariant()).GetValue(); Invoke(methodBase, false); } // Token: 0x06000184 RID: 388 RVA: 0x000080F4 File Offset: 0x000062F4 private void Call_(VariantBase vMethodId) // \u000E\u2003 { var methodBase = FindMethodById(((IntVariant)vMethodId).GetValue()); foreach (var arg in _variantOutputArgs) { PushVariant(arg); } Invoke(methodBase, false); } // Token: 0x06000191 RID: 401 RVA: 0x0000845C File Offset: 0x0000665C private void Callvirt_(VariantBase vMethodId) // \u000E\u2005 { var methodBase = FindMethodById(((IntVariant)vMethodId).GetValue()); if (_currentClass != null) { var pars = methodBase.GetParameters(); var types = new Type[pars.Length]; var num = 0; foreach (var parameterInfo in pars) { types[num++] = parameterInfo.ParameterType; } var method = _currentClass.GetMethod(methodBase.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.GetProperty | BindingFlags.SetProperty, null, types, null); if (method != null) { methodBase = method; } _currentClass = null; } Invoke(methodBase, true); } // Token: 0x060001CE RID: 462 RVA: 0x0000A1A0 File Offset: 0x000083A0 private void Invoke(VariantBase vMethodId) // \u000E\u200A { var methodBase = FindMethodById(((IntVariant)vMethodId).GetValue()); Invoke(methodBase, false); } // Token: 0x06000205 RID: 517 RVA: 0x0000C1A8 File Offset: 0x0000A3A8 [DebuggerNonUserCode] private MethodBase FindMethodById(int methodId) // \u0002 { return FindMethodById(methodId, ReadToken(methodId)); } // Token: 0x06000171 RID: 369 RVA: 0x00007BBC File Offset: 0x00005DBC private object Invoke(Stream srcVirtualizedStream, int pos, object[] args, Type[] methodGenericArgs, Type[] classGenericArgs, object[] callees) // \u0002 { _srcVirtualizedStream = srcVirtualizedStream; Seek(pos, srcVirtualizedStream, null); return Invoke(args, methodGenericArgs, classGenericArgs, callees); } // Token: 0x06000172 RID: 370 RVA: 0x00007BDC File Offset: 0x00005DDC private bool AlwaysFalse(MethodBase mb, object poppedThis, VariantBase[] poppedArgs, object[] args, bool mayVirtual, ref object obj) // \u0002 { return false; } // Token: 0x06000179 RID: 377 RVA: 0x00007DA8 File Offset: 0x00005FA8 private void Leave_(VariantBase vTarget) // \u0006\u200B { OnException(null, ((UintVariant)vTarget).GetValue()); } // Token: 0x06000180 RID: 384 RVA: 0x00007F48 File Offset: 0x00006148 private void Castclass_(VariantBase vTypeId) // \u0005\u2003 { var type = GetTypeById(((IntVariant)vTypeId).GetValue()); var obj = PopVariant(); if (Isinst(obj, type)) { PushVariant(obj); return; } throw new InvalidCastException(); } // Token: 0x06000185 RID: 389 RVA: 0x00008144 File Offset: 0x00006344 private void Ldc_i4_s_(VariantBase val) // \u000E\u2003\u2000 { PushVariant(val); } // Token: 0x0600018B RID: 395 RVA: 0x0000827C File Offset: 0x0000647C private void Stelem_i2_(VariantBase dummy) // \u000E\u200A\u2000 { var obj = PopVariant().GetValueAbstract(); var idx = PopLong(); var array = (Array)PopVariant().GetValueAbstract(); var elementType = array.GetType().GetElementType(); checked { if (elementType == typeof(short)) { ((short[])array)[(int)(IntPtr)idx] = (short)VariantFactory.Convert(obj, typeof(short)).GetValueAbstract(); return; } if (elementType == typeof(ushort)) { ((ushort[])array)[(int)(IntPtr)idx] = (ushort)VariantFactory.Convert(obj, typeof(ushort)).GetValueAbstract(); return; } if (elementType == typeof(char)) { ((char[])array)[(int)(IntPtr)idx] = (char)VariantFactory.Convert(obj, typeof(char)).GetValueAbstract(); return; } if (elementType.IsEnum) { Stelem(elementType, obj, idx, array); return; } Stelem(typeof(short), obj, idx, array); } } // Token: 0x0600018E RID: 398 RVA: 0x00008404 File Offset: 0x00006604 private void Stind_i_(VariantBase dummy) // \u000F\u2006 { Stind(); } // Token: 0x06000190 RID: 400 RVA: 0x00008440 File Offset: 0x00006640 private void Ldloc_0_(VariantBase dummy) // \u0006 { PushVariant(_localVariables[0].Clone()); } // Token: 0x06000193 RID: 403 RVA: 0x00008508 File Offset: 0x00006708 private void And_(VariantBase dummy) // \u000F\u200B\u2000 { PushVariant(And(PopVariant(), PopVariant())); } // Token: 0x06000194 RID: 404 RVA: 0x00008534 File Offset: 0x00006734 private void Bge_un_(VariantBase vpos) // \u0006\u2009 { var v2 = PopVariant(); if (UniCompare(PopVariant(), v2, ComparisonKind.GE, true)) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x06000198 RID: 408 RVA: 0x00008628 File Offset: 0x00006828 private void Blt_un_(VariantBase vpos) // \u0006\u2006\u2000 { var v2 = PopVariant(); if (UniCompare(PopVariant(), v2, ComparisonKind.LT, true)) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x06000234 RID: 564 RVA: 0x0000F934 File Offset: 0x0000DB34 private void Bge_(VariantBase vpos) // \u0002\u200B { var v2 = PopVariant(); if (UniCompare(PopVariant(), v2, ComparisonKind.GE, false)) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x060002AB RID: 683 RVA: 0x00012D80 File Offset: 0x00010F80 private void Blt_(VariantBase vpos) // \u0003\u2001 { var v2 = PopVariant(); if (UniCompare(PopVariant(), v2, ComparisonKind.LT, false)) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x0600023D RID: 573 RVA: 0x0000FA1C File Offset: 0x0000DC1C private void Bgt_(VariantBase vpos) // \u000F\u2000\u2001 { var v2 = PopVariant(); if (UniCompare(PopVariant(), v2, ComparisonKind.GT, false)) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x060001A3 RID: 419 RVA: 0x00008D10 File Offset: 0x00006F10 private void Bgt_un_(VariantBase vpos) // \u0005\u2004 { var v2 = PopVariant(); if (UniCompare(PopVariant(), v2, ComparisonKind.GT, true)) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x06000261 RID: 609 RVA: 0x00010BB4 File Offset: 0x0000EDB4 private void Bne_un_(VariantBase vpos) // \u000F\u2007 { var v2 = PopVariant(); if (UniCompare(PopVariant(), v2, ComparisonKind.NEQ, true)) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x0600029D RID: 669 RVA: 0x000126E0 File Offset: 0x000108E0 private void Beq_(VariantBase vpos) // \u0002\u2007\u2000 { var v2 = PopVariant(); if (UniCompare(PopVariant(), v2, ComparisonKind.EQ, false)) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x060001B9 RID: 441 RVA: 0x000093F8 File Offset: 0x000075F8 private void Ble_un_(VariantBase vpos) // \u0003\u2007\u2000 { var v2 = PopVariant(); var v1 = PopVariant(); if (UniCompare(v1, v2, ComparisonKind.LE, true)) { JumpToPos(((UintVariant)vpos).GetValue()); } } private static bool IsFloating(VariantBase v) { return v.GetTypeCode() == VariantBase.Vtc.Tc21Double || v.GetTypeCode() == VariantBase.Vtc.Tc8Float; } // Token: 0x06000297 RID: 663 RVA: 0x0001253C File Offset: 0x0001073C private void Ble_(VariantBase vpos) // \u0002\u2003\u2000 { var v2 = PopVariant(); var v1 = PopVariant(); if (UniCompare(v1, v2, ComparisonKind.LE, false)) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x06000228 RID: 552 RVA: 0x0000F480 File Offset: 0x0000D680 private void Brfalse_(VariantBase vpos) // \u0002\u2002 { var val = PopVariant(); var num = val.GetTypeCode(); bool flag; switch (num) { case VariantBase.Vtc.Tc5Enum: flag = !Convert.ToBoolean(((EnumVariant)val).GetValue()); break; case VariantBase.Vtc.Tc13UIntPtr: flag = ((UIntPtrVariant)val).GetValue() == UIntPtr.Zero; break; case VariantBase.Vtc.Tc17IntPtr: flag = ((IntPtrVariant)val).GetValue() == IntPtr.Zero; break; case VariantBase.Vtc.Tc18Object: flag = ((ObjectVariant)val).GetValue() == null; break; case VariantBase.Vtc.Tc19Int: flag = ((IntVariant)val).GetValue() == 0; break; case VariantBase.Vtc.Tc24Long: flag = ((LongVariant)val).GetValue() == 0L; break; default: flag = val.GetValueAbstract() == null; break; } if (flag) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x06000274 RID: 628 RVA: 0x00011488 File Offset: 0x0000F688 private void ExecuteExceptionHandler() // \u0005 { if (_ehStack.Count == 0) { if (_wasException) { _myBufferPos = _myBufferReader.GetBuffer().GetPos(); ThrowStoreCrossDomain(_exception); } return; } var ehFrame = _ehStack.PopBack(); if (ehFrame.Exception != null) { var toStack = new ObjectVariant(); toStack.SetValueAbstract(ehFrame.Exception); PushVariant(toStack); } else { _evalStack.Clear(); } JumpToPos(ehFrame.Pos); } // Token: 0x060001F2 RID: 498 RVA: 0x0000B6C8 File Offset: 0x000098C8 private void Switch_(VariantBase vSwitchPosArray) // \u0002\u200A\u2000 { var vidx = PopVariant(); uint idx; switch (vidx.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: idx = (uint)Convert.ToInt64(vidx.GetValueAbstract()); break; case VariantBase.Vtc.Tc19Int: idx = (uint)((IntVariant)vidx).GetValue(); break; case VariantBase.Vtc.Tc24Long: idx = (uint)((LongVariant)vidx).GetValue(); break; default: throw new InvalidOperationException(); } var switchPosArray = (IntVariant[])((ArrayVariant)vSwitchPosArray).GetValue(); if (idx >= (ulong)switchPosArray.Length) { return; } JumpToPos((uint)switchPosArray[(int)idx].GetValue()); } // Token: 0x060001FB RID: 507 RVA: 0x0000BC68 File Offset: 0x00009E68 private void Brtrue_(VariantBase vpos) // \u0008\u2007 { var val = PopVariant(); var num = val.GetTypeCode(); bool flag; switch (num) { case VariantBase.Vtc.Tc5Enum: flag = Convert.ToBoolean(((EnumVariant)val).GetValue()); break; case VariantBase.Vtc.Tc13UIntPtr: flag = ((UIntPtrVariant)val).GetValue() != UIntPtr.Zero; break; case VariantBase.Vtc.Tc17IntPtr: flag = ((IntPtrVariant)val).GetValue() != IntPtr.Zero; break; case VariantBase.Vtc.Tc18Object: flag = ((ObjectVariant)val).GetValue() != null; break; case VariantBase.Vtc.Tc19Int: flag = ((IntVariant)val).GetValue() != 0; break; case VariantBase.Vtc.Tc24Long: flag = ((LongVariant)val).GetValue() != 0L; break; default: flag = val.GetValueAbstract() != null; break; } if (flag) { JumpToPos(((UintVariant)vpos).GetValue()); } } // Token: 0x06000214 RID: 532 RVA: 0x0000C764 File Offset: 0x0000A964 private void Br_(VariantBase vpos) // \u0005\u2008\u2000 { JumpToPos(((UintVariant)vpos).GetValue()); } private void Conv_r_un_(VariantBase dummy) { var pop = PopVariant(); double val; switch (pop.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); if (Marshal.SizeOf(v) < 8) val = (double)(uint)Convert.ToInt32(v); else val = (double)(ulong)Convert.ToInt64(v); break; case VariantBase.Vtc.Tc19Int: val = (double)(uint)((IntVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc21Double: val = ((DoubleVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc8Float: val = (double)((FloatVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc24Long: val = (double)(ulong)((LongVariant)pop).GetValue(); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(double), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Conv_R_Un); gen.Emit(OpCodes.Ret); val = (double)dyn.Invoke(null, new[] { pop.GetValueAbstract() }); break; } var push = new DoubleVariant(); push.SetValue(val); PushVariant(push); } private void Conv_r(OpCode oc, Func F) { var pop = PopVariant(); double val; switch (pop.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); val = F(Marshal.SizeOf(v) < 8 ? Convert.ToInt32(v) : Convert.ToInt64(v)); break; case VariantBase.Vtc.Tc19Int: val = F(((IntVariant)pop).GetValue()); break; case VariantBase.Vtc.Tc21Double: val = F(((DoubleVariant)pop).GetValue()); break; case VariantBase.Vtc.Tc8Float: val = F(((FloatVariant)pop).GetValue()); break; case VariantBase.Vtc.Tc24Long: val = F(((LongVariant)pop).GetValue()); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(double), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(oc); gen.Emit(OpCodes.Ret); val = (double)dyn.Invoke(null, new[] { pop.GetValueAbstract() }); break; } var push = new DoubleVariant(); push.SetValue(val); PushVariant(push); } private void Conv_r4_(VariantBase dummy) { Conv_r(OpCodes.Conv_R4, o => (double)(float)Convert.ChangeType(o, typeof(float))); } private void Conv_r8_(VariantBase dummy) { Conv_r(OpCodes.Conv_R8, o => (double)Convert.ChangeType(o, typeof(double))); } // Token: 0x06000196 RID: 406 RVA: 0x00008600 File Offset: 0x00006800 private void Ldind_i4_(VariantBase dummy) // \u0002\u2001\u2000 { Ldind(typeof(int)); } // Token: 0x06000197 RID: 407 RVA: 0x00008614 File Offset: 0x00006814 private void Ldind_u1_(VariantBase dummy) // \u000E { Ldind(typeof(byte)); } // Token: 0x0600019A RID: 410 RVA: 0x00008688 File Offset: 0x00006888 private void Isinst_(VariantBase vTypeId) // \u000F\u2007\u2000 { var type = GetTypeById(((IntVariant)vTypeId).GetValue()); var obj = PopVariant(); if (Isinst(obj, type)) { PushVariant(obj); return; } PushVariant(new ObjectVariant()); } // Token: 0x0600019D RID: 413 RVA: 0x00008B68 File Offset: 0x00006D68 private void Initobj_(VariantBase vTypeId) // \u0005\u2005\u2000 { var type = GetTypeById(((IntVariant)vTypeId).GetValue()); var dest = PopVariant(); if (!type.IsValueType) { AssignByReference(dest, new ObjectVariant()); return; } var obj = FetchByAddr(dest).GetValueAbstract(); if (SimpleTypeHelper.IsNullableGeneric(type)) { var val = new ObjectVariant(); val.SetVariantType(type); AssignByReference(dest, val); return; } var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); foreach (var fieldInfo in fields) { fieldInfo.SetValue(obj, CreateValueTypeInstance(fieldInfo.FieldType)); } } // Token: 0x0600019E RID: 414 RVA: 0x00008C08 File Offset: 0x00006E08 private void Ldarg_s_(VariantBase vidx) // \u000E\u2000 { var idx = (ByteVariant)vidx; PushVariant(_variantOutputArgs[idx.GetValue()].Clone()); } // Token: 0x06000244 RID: 580 RVA: 0x00010160 File Offset: 0x0000E360 private void Ldarga_s_(VariantBase vidx) // \u0008\u2001\u2001 { var idx = (ByteVariant)vidx; var push = new VariantBaseHolder(); push.SetValue(_variantOutputArgs[idx.GetValue()]); PushVariant(push); } // Token: 0x06000255 RID: 597 RVA: 0x00010910 File Offset: 0x0000EB10 private void Ldarga_(VariantBase vidx) // \u0006\u2001 { var idx = (UshortVariant)vidx; var push = new VariantBaseHolder(); push.SetValue(_variantOutputArgs[idx.GetValue()]); PushVariant(push); } // Token: 0x0600019F RID: 415 RVA: 0x00008C38 File Offset: 0x00006E38 private void Endfilter_(VariantBase dummy) // \u000F\u2001\u2000 { if (((IntVariant)PopVariant()).GetValue() != 0) { _ehStack.PushBack(new ExcHandlerFrame { Pos = (uint)_myBufferReader.GetBuffer().GetPos(), Exception = _exception }); _wasException = false; } ExecuteExceptionHandler(); } // Token: 0x060001A2 RID: 418 RVA: 0x00008CFC File Offset: 0x00006EFC private void Ldind_r4_(VariantBase dummy) // \u0008\u2009\u2000 { Ldind(typeof(float)); } // Token: 0x060001A4 RID: 420 RVA: 0x00008D48 File Offset: 0x00006F48 private void Stsfld_(VariantBase vFieldId) // \u000F\u2008 { var fieldInfo = ResolveField(((IntVariant)vFieldId).GetValue()); var val = VariantFactory.Convert(PopVariant().GetValueAbstract(), fieldInfo.FieldType); fieldInfo.SetValue(null, val.GetValueAbstract()); } // Token: 0x060001A5 RID: 421 RVA: 0x00008D90 File Offset: 0x00006F90 private void Ldloc_3_(VariantBase dummy) // \u0003\u2001\u2001 { PushVariant(_localVariables[3].Clone()); } // Token: 0x060001A7 RID: 423 RVA: 0x00008F68 File Offset: 0x00007168 private void Stelem_r8_(VariantBase dummy) // \u000E\u2006\u2000 { Stelem(typeof(double)); } // Token: 0x060001AA RID: 426 RVA: 0x00008FBC File Offset: 0x000071BC private void Ceq_(VariantBase dummy) // \u0006\u2008 { var iv = new IntVariant(); iv.SetValue(UniCompare(PopVariant(), PopVariant(), ComparisonKind.EQ, false) ? 1 : 0); PushVariant(iv); } // Token: 0x060001AC RID: 428 RVA: 0x00009030 File Offset: 0x00007230 private void Stelem_i4_(VariantBase dummy) // \u000E\u2001\u2000 { var obj = PopVariant().GetValueAbstract(); var idx = PopLong(); var array = (Array)PopVariant().GetValueAbstract(); var elementType = array.GetType().GetElementType(); checked { if (elementType == typeof(int)) { ((int[])array)[(int)(IntPtr)idx] = (int)VariantFactory.Convert(obj, typeof(int)).GetValueAbstract(); return; } if (elementType == typeof(uint)) { ((uint[])array)[(int)(IntPtr)idx] = (uint)VariantFactory.Convert(obj, typeof(uint)).GetValueAbstract(); return; } if (elementType.IsEnum) { Stelem(elementType, obj, idx, array); return; } Stelem(typeof(int), obj, idx, array); } } // Token: 0x060001AD RID: 429 RVA: 0x00009100 File Offset: 0x00007300 private void Stind_i1_(VariantBase dummy) // \u0005\u2000\u2000 { Stind(); } // Token: 0x060001AF RID: 431 RVA: 0x00009114 File Offset: 0x00007314 private object ResolveNativeToken(int token) // \u0002 { var num = HiByte.Extract(token); object result; if (num > 67108864) { if (num <= 167772160) { if (num != 100663296) { if (num != 167772160) { throw new InvalidOperationException(); } try { result = _module.ModuleHandle.ResolveFieldHandle(token); return result; } catch { try { result = _module.ModuleHandle.ResolveMethodHandle(token); } catch { throw new InvalidOperationException(); } return result; } } } else { if (num == 452984832) { result = _module.ModuleHandle.ResolveTypeHandle(token); return result; } if (num != 721420288) { throw new InvalidOperationException(); } } result = _module.ModuleHandle.ResolveMethodHandle(token); return result; } if (num != 16777216 && num != 33554432) { if (num != 67108864) { throw new InvalidOperationException(); } result = _module.ModuleHandle.ResolveFieldHandle(token); return result; } result = _module.ModuleHandle.ResolveTypeHandle(token); return result; } // Token: 0x060001B0 RID: 432 RVA: 0x0000923C File Offset: 0x0000743C private void Ldloc_2_(VariantBase dummy) // \u0008\u2008 { PushVariant(_localVariables[2].Clone()); } // Token: 0x060001B1 RID: 433 RVA: 0x00009258 File Offset: 0x00007458 private void Constrained_(VariantBase vTypeId) // \u0002\u2000\u2000 { _currentClass = GetTypeById(((IntVariant)vTypeId).GetValue()); } // Token: 0x060001B2 RID: 434 RVA: 0x00009280 File Offset: 0x00007480 private void Ldftn_(VariantBase vMethodId) // \U0003\U2008 { var methodBase = FindMethodById(((IntVariant)vMethodId).GetValue()); var push = new MethodVariant(); push.SetValue(methodBase); PushVariant(push); } // Token: 0x060001B4 RID: 436 RVA: 0x000092C8 File Offset: 0x000074C8 private void Ldnull_(VariantBase dummy) // \u0005\u2002\u2001 { PushVariant(new ObjectVariant()); } private void Conv_ovf_u8_un_(VariantBase dummy) { Conv_u8(true, false); } // Token: 0x060001B8 RID: 440 RVA: 0x000093F0 File Offset: 0x000075F0 private void Stind_i2_(VariantBase dummy) // \u0003\u2000\u2000 { Stind(); } private void Conv_ovf_u2_un_(VariantBase dummy) { Conv_u2(true, false); } private void Conv_u2(bool ovf, bool signed) { var pop = PopVariant(); ushort val; switch (pop.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: if (ovf) { var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); if (signed) val = Convert.ToUInt16(v); else val = Convert.ToUInt16((ulong)Convert.ToInt64(v)); break; } val = (ushort)VariantBase.SignedLongFromEnum((EnumVariant)pop); break; case VariantBase.Vtc.Tc19Int: if (ovf && !signed) { val = Convert.ToUInt16((uint)((IntVariant)pop).GetValue()); break; } val = ovf ? Convert.ToUInt16(((IntVariant)pop).GetValue()) : (ushort)((IntVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc21Double: if (ovf) { val = checked((ushort) ((DoubleVariant) pop).GetValue()); break; } val = (ushort)((DoubleVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc8Float: if (ovf) { val = checked((ushort)((FloatVariant)pop).GetValue()); break; } val = (ushort)((FloatVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc24Long: if (ovf) { if (signed) val = checked((ushort)((LongVariant)pop).GetValue()); else val = Convert.ToUInt16((ulong)((LongVariant)pop).GetValue()); break; } val = (ushort)((LongVariant)pop).GetValue(); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(ushort), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Conv_Ovf_U2 : OpCodes.Conv_U2) : OpCodes.Conv_Ovf_U2_Un); gen.Emit(OpCodes.Ret); val = (ushort)dyn.Invoke(null, new[] { pop.GetValueAbstract() }); break; } var push = new UshortVariant(); push.SetValue(val); PushVariant(push); } // Token: 0x060001AE RID: 430 RVA: 0x00009108 File Offset: 0x00007308 private void Conv_ovf_u2_(VariantBase dummy) // \u0008\u2005\u2000 { Conv_u2(true, true); } // Token: 0x06000292 RID: 658 RVA: 0x0001238C File Offset: 0x0001058C private void Conv_u2_(VariantBase dummy) // \u000F\u2002\u2000 { Conv_u2(false, true); } private void Conv_u1(bool ovf, bool signed) { var pop = PopVariant(); byte val; switch (pop.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: if (ovf) { var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); val = signed ? Convert.ToByte(v) : Convert.ToByte((ulong)Convert.ToInt64(v)); break; } val = (byte)VariantBase.SignedLongFromEnum((EnumVariant)pop); break; case VariantBase.Vtc.Tc19Int: if (ovf && !signed) { val = Convert.ToByte((uint)((IntVariant)pop).GetValue()); break; } val = ovf ? Convert.ToByte(((IntVariant)pop).GetValue()) : (byte)((IntVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc21Double: if (ovf) { val = signed ? checked((byte)((DoubleVariant)pop).GetValue()) : Convert.ToByte(((DoubleVariant)pop).GetValue()); break; } val = (byte)((DoubleVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc8Float: if (ovf) { val = checked((byte)((FloatVariant)pop).GetValue()); break; } val = (byte)((FloatVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc24Long: if (ovf) { val = checked((byte)((LongVariant)pop).GetValue()); break; } val = (byte)((LongVariant)pop).GetValue(); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(byte), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Conv_Ovf_U1 : OpCodes.Conv_U1) : OpCodes.Conv_Ovf_U1_Un); gen.Emit(OpCodes.Ret); val = (byte)dyn.Invoke(null, new[] { pop.GetValueAbstract() }); break; } var push = new ByteVariant(); push.SetValue(val); PushVariant(push); } // Token: 0x06000182 RID: 386 RVA: 0x00007FB4 File Offset: 0x000061B4 private void Conv_ovf_i1_(VariantBase dummy) // \u0008\u2004 { Conv_i1(true, true); } // Token: 0x06000188 RID: 392 RVA: 0x00008238 File Offset: 0x00006438 private void Conv_u4_(VariantBase dummy) // \u0008\u2003\u2001 { Conv_u4(false, true); } // Token: 0x0600018A RID: 394 RVA: 0x00008270 File Offset: 0x00006470 private void Conv_ovf_i_(VariantBase dummy) // \u0008\u2003\u2000 { Conv_i(true, true); } // Token: 0x060001CF RID: 463 RVA: 0x0000A1CC File Offset: 0x000083CC private void Conv_i_(VariantBase dummy) // \u0008\u2005 { Conv_i(false, true); } // Token: 0x060001FF RID: 511 RVA: 0x0000BFC8 File Offset: 0x0000A1C8 private void Conv_u4(bool ovf, bool signed) // \u0005 { var pop = PopVariant(); uint val; switch (pop.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: if (ovf) { var v = VariantBase.SignedVariantFromEnum((EnumVariant) pop).GetValueAbstract(); if (signed || Marshal.SizeOf(v) < 8) val = signed ? Convert.ToUInt32(v) : (uint)Convert.ToInt32(v); else val = Convert.ToUInt32(Convert.ToUInt64(v)); break; } val = (uint)VariantBase.SignedLongFromEnum((EnumVariant)pop); break; case VariantBase.Vtc.Tc19Int: if (ovf && signed) { val = checked((uint)((IntVariant)pop).GetValue()); break; } val = (uint)((IntVariant)pop).GetValue(); // err fixed and unit tested by ursoft (was ushort) break; case VariantBase.Vtc.Tc21Double: if (ovf) { val = checked((uint)((DoubleVariant)pop).GetValue()); break; } val = (uint)((DoubleVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc8Float: if (ovf) { val = checked((uint)((FloatVariant)pop).GetValue()); break; } val = (uint)((FloatVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc24Long: if (ovf) { val = checked((uint)((LongVariant)pop).GetValue()); break; } val = (uint)((LongVariant)pop).GetValue(); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(UInt32), new []{ typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Conv_Ovf_U4 : OpCodes.Conv_U4) : OpCodes.Conv_Ovf_U4_Un); gen.Emit(OpCodes.Ret); val = (uint) dyn.Invoke(null, new[] {pop.GetValueAbstract()}); break; } var push = new IntVariant(); push.SetValue((int)val); PushVariant(push); } private void Conv_i4(bool ovf, bool signed) { var pop = PopVariant(); int val; switch (pop.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: if (ovf) { var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); if (signed) val = Convert.ToInt32(v); else val = Convert.ToInt32((ulong)Convert.ToInt64(v)); break; } val = (int)VariantBase.SignedLongFromEnum((EnumVariant)pop); break; case VariantBase.Vtc.Tc19Int: if (ovf && !signed) { val = Convert.ToInt32((uint)((IntVariant)pop).GetValue()); break; } val = ((IntVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc21Double: if (ovf) { val = checked((int)((DoubleVariant)pop).GetValue()); break; } val = (int)((DoubleVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc8Float: if (ovf) { val = checked((int)((FloatVariant)pop).GetValue()); break; } val = (int)((FloatVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc24Long: if (ovf) { if(signed) val = checked((int)((LongVariant)pop).GetValue()); else val = Convert.ToInt32((ulong)((LongVariant)pop).GetValue()); break; } val = (int)((LongVariant)pop).GetValue(); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(Int32), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Conv_Ovf_I4 : OpCodes.Conv_I4) : OpCodes.Conv_Ovf_I4_Un); gen.Emit(OpCodes.Ret); val = (int)dyn.Invoke(null, new[] { pop.GetValueAbstract() }); break; } var push = new IntVariant(); push.SetValue(val); PushVariant(push); } // Token: 0x06000294 RID: 660 RVA: 0x00012414 File Offset: 0x00010614 private void Conv_ovf_u4_(VariantBase dummy) // \u000F\u200A { Conv_u4(true, true); } // Token: 0x06000200 RID: 512 RVA: 0x0000C0B0 File Offset: 0x0000A2B0 private void Conv_ovf_u1_(VariantBase dummy) // \u0008\u2007\u2000 { Conv_u1(true, true); } private void Conv_ovf_i2_un_(VariantBase dummy) { Conv_i2(true, false); } private void Conv_i2(bool ovf, bool signed) { var pop = PopVariant(); short val; switch (pop.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: if (ovf) { var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); if (signed) val = Convert.ToInt16(v); else val = Convert.ToInt16((ulong)Convert.ToInt64(v)); break; } val = (short)VariantBase.SignedLongFromEnum((EnumVariant)pop); break; case VariantBase.Vtc.Tc19Int: if (ovf && !signed) { val = Convert.ToInt16((uint)((IntVariant)pop).GetValue()); break; } val = ovf ? Convert.ToInt16(((IntVariant)pop).GetValue()) : (short)((IntVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc21Double: if (ovf) { val = signed ? checked((short)((DoubleVariant)pop).GetValue()) : (IntPtr.Size == 4 ? Convert.ToInt16(Convert.ToUInt16((long)((DoubleVariant)pop).GetValue())) : Convert.ToInt16((long)((DoubleVariant)pop).GetValue())); break; } val = (short)((DoubleVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc8Float: if (ovf) { val = signed ? checked((short)((FloatVariant)pop).GetValue()) : (IntPtr.Size == 4 ? Convert.ToInt16(Convert.ToUInt16((long)((FloatVariant)pop).GetValue())) : Convert.ToInt16((long)((FloatVariant)pop).GetValue())); break; } val = (short)((FloatVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc24Long: if (ovf) { if (signed) val = checked((short)((LongVariant)pop).GetValue()); else val = Convert.ToInt16((ulong)((LongVariant)pop).GetValue()); break; } val = (short)((LongVariant)pop).GetValue(); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(short), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Conv_Ovf_I2 : OpCodes.Conv_I2) : OpCodes.Conv_Ovf_I2_Un); gen.Emit(OpCodes.Ret); val = (short)dyn.Invoke(null, new[] { pop.GetValueAbstract() }); break; } var push = new ShortVariant(); push.SetValue(val); PushVariant(push); } // Token: 0x060001FE RID: 510 RVA: 0x0000BFBC File Offset: 0x0000A1BC private void Conv_i2_(VariantBase dummy) // \u0006\u2001\u2000 { Conv_i2(false, true); } // Token: 0x060002A8 RID: 680 RVA: 0x00012D2C File Offset: 0x00010F2C private void Conv_ovf_i4_(VariantBase dummy) // \u000F\u2000\u2000 { Conv_i4(true, true); } private void Conv_i8(bool ovf, bool signed) { var pop = PopVariant(); long val; switch (pop.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); if (!signed && ovf && Marshal.SizeOf(v) > 4) val = checked((long)(ulong)Convert.ToInt64(v)); else val = (signed || Marshal.SizeOf(v) > 4) ? Convert.ToInt64(v) : (uint)(ulong)Convert.ToInt64(v); break; case VariantBase.Vtc.Tc19Int: int iv = ((IntVariant)pop).GetValue(); if (signed) val = iv; else val = (long)(uint)iv; break; case VariantBase.Vtc.Tc21Double: if (ovf) { val = checked((long)((DoubleVariant)pop).GetValue()); break; } val = (long)((DoubleVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc8Float: if (ovf) { val = checked((long)((FloatVariant)pop).GetValue()); break; } val = (long)((FloatVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc24Long: if (ovf) { if (signed) val = ((LongVariant)pop).GetValue(); else val = Convert.ToInt64((ulong)((LongVariant)pop).GetValue()); break; } val = ((LongVariant)pop).GetValue(); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(long), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Conv_Ovf_I8 : OpCodes.Conv_I8) : OpCodes.Conv_Ovf_I8_Un); gen.Emit(OpCodes.Ret); val = (long)dyn.Invoke(null, new[] { pop.GetValueAbstract() }); break; } var push = new LongVariant(); push.SetValue(val); PushVariant(push); } // Token: 0x06000219 RID: 537 RVA: 0x0000C824 File Offset: 0x0000AA24 private void Conv_ovf_i8_(VariantBase dummy) // \u0008\u2002\u2000 { Conv_i8(true, true); } private void Conv_i1(bool ovf, bool signed) { var pop = PopVariant(); sbyte val; switch (pop.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: if (ovf) { var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); val = signed ? Convert.ToSByte(v) : Convert.ToSByte((ulong)Convert.ToInt64(v)); break; } val = (sbyte)VariantBase.SignedLongFromEnum((EnumVariant)pop); break; case VariantBase.Vtc.Tc19Int: if (ovf && !signed) { val = Convert.ToSByte((uint)((IntVariant)pop).GetValue()); break; } val = ovf ? Convert.ToSByte(((IntVariant)pop).GetValue()) : (sbyte)((IntVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc21Double: if (ovf) { val = signed ? checked((sbyte)((DoubleVariant)pop).GetValue()) : (IntPtr.Size == 4 ? Convert.ToSByte(Convert.ToByte(((DoubleVariant)pop).GetValue())) : Convert.ToSByte((long)((DoubleVariant)pop).GetValue())); break; } val = (sbyte)((DoubleVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc8Float: if (ovf) { val = signed ? checked((sbyte)((FloatVariant)pop).GetValue()) : (IntPtr.Size == 4 ? Convert.ToSByte(Convert.ToByte(((FloatVariant)pop).GetValue())) : Convert.ToSByte((long)((FloatVariant)pop).GetValue())); break; } val = (sbyte)((FloatVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc24Long: if (ovf) { if (signed) val = checked((sbyte)((LongVariant)pop).GetValue()); else val = Convert.ToSByte((ulong)((LongVariant)pop).GetValue()); break; } val = (sbyte)((LongVariant)pop).GetValue(); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(SByte), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Conv_Ovf_I1 : OpCodes.Conv_I1) : OpCodes.Conv_Ovf_I1_Un); gen.Emit(OpCodes.Ret); val = (sbyte)dyn.Invoke(null, new[] { pop.GetValueAbstract() }); break; } var push = new SbyteVariant(); push.SetValue(val); PushVariant(push); } // Token: 0x060002A6 RID: 678 RVA: 0x00012CD0 File Offset: 0x00010ED0 private void Conv_i1_(VariantBase dummy) // \u000E\u2006 { Conv_i1(false, true); } // Token: 0x06000285 RID: 645 RVA: 0x00011EF0 File Offset: 0x000100F0 private void Conv_ovf_i2_(VariantBase dummy) // \u0002\u2000\u2001 { Conv_i2(true, true); } // Token: 0x0600018D RID: 397 RVA: 0x000083F8 File Offset: 0x000065F8 private void Conv_u_(VariantBase dummy) // \u000F\u2003\u2001 { Conv_u(false, true); } // Token: 0x060001EF RID: 495 RVA: 0x0000B658 File Offset: 0x00009858 private void Conv_ovf_u_(VariantBase dummy) // \u0002\u2000 { Conv_u(true, true); } // Token: 0x06000215 RID: 533 RVA: 0x0000C784 File Offset: 0x0000A984 private void Conv_u1_(VariantBase dummy) // \u0008\u2002 { Conv_u1(false, true); } // Token: 0x06000211 RID: 529 RVA: 0x0000C690 File Offset: 0x0000A890 private void Conv_ovf_i_un_(VariantBase dummy) // \u000F { Conv_i(true, false); } // Token: 0x06000229 RID: 553 RVA: 0x0000F56C File Offset: 0x0000D76C private void Conv_i4_(VariantBase dummy) // \u0003\u2005\u2000 { Conv_i4(false, true); } private void Conv_ovf_i8_un_(VariantBase dummy) { Conv_i8(true, false); } // Token: 0x06000253 RID: 595 RVA: 0x00010790 File Offset: 0x0000E990 private void Conv_ovf_u4_un_(VariantBase dummy) // \u0002\u2009\u2000 { Conv_u4(true, false); } // Token: 0x06000284 RID: 644 RVA: 0x00011EE4 File Offset: 0x000100E4 private void Conv_i8_(VariantBase dummy) // \u0003\u2006\u2000 { Conv_i8(false, true); } // Token: 0x0600028A RID: 650 RVA: 0x000121B8 File Offset: 0x000103B8 private void Conv_ovf_u_un_(VariantBase dummy) // \u000F\u200B { Conv_u(true, false); } private unsafe void Conv_i(bool ovf, bool signed) { var pop = PopVariant(); var push = new IntPtrVariant(); long val; var tc = pop.GetTypeCode(); if (tc == VariantBase.Vtc.Tc21Double || tc == VariantBase.Vtc.Tc8Float) signed = true; long maxVal = long.MaxValue, minVal = signed ? long.MinValue : 0; if (IntPtr.Size == 4) { maxVal = signed ? Int32.MaxValue : UInt32.MaxValue; minVal = signed ? Int32.MinValue : 0; } switch (tc) { case VariantBase.Vtc.Tc5Enum: var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); if (IntPtr.Size == 4) { if (ovf) val = Convert.ToInt32(v); else val = (int)Convert.ToInt64(v); } else { val = (signed || Marshal.SizeOf(v) > 4 || !ovf) ? Convert.ToInt64(v) : (uint)(ulong)Convert.ToInt64(v); } break; case VariantBase.Vtc.Tc19Int: int iv = ((IntVariant) pop).GetValue(); if (IntPtr.Size == 4 || signed) val = iv; else val = (long)(uint)iv; break; case VariantBase.Vtc.Tc21Double: { double dv = ((DoubleVariant)pop).GetValue(); if (dv <= maxVal && dv >= minVal) val = (long)dv; else { if (ovf) throw new OverflowException(); val = (IntPtr.Size == 4) ? Int32.MinValue : Int64.MinValue; // не мусор ли? } } break; case VariantBase.Vtc.Tc8Float: { double dv = (double) ((FloatVariant) pop).GetValue(); if (dv <= maxVal && dv >= minVal) val = (long) dv; else { if (ovf) throw new OverflowException(); val = (IntPtr.Size == 4) ? Int32.MinValue : Int64.MinValue; // не мусор ли? } } break; case VariantBase.Vtc.Tc24Long: val = ((LongVariant)pop).GetValue(); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Conv_Ovf_I : OpCodes.Conv_I) : OpCodes.Conv_Ovf_I_Un); gen.Emit(OpCodes.Ret); push.SetValue(((IntPtr)dyn.Invoke(null, new[] { pop.GetValueAbstract() }))); PushVariant(push); return; } if ((ovf == false) || (val <= maxVal && val >= minVal)) { push.SetValue(new IntPtr((void*)val)); PushVariant(push); } else throw new OverflowException(); } private unsafe void Conv_u(bool ovf, bool signed) { var pop = PopVariant(); var push = new UIntPtrVariant(); ulong val, maxVal = (IntPtr.Size == 4) ? UInt32.MaxValue : UInt64.MaxValue; var tc = pop.GetTypeCode(); switch (tc) { case VariantBase.Vtc.Tc5Enum: var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); if (IntPtr.Size == 4) { if (ovf) val = signed ? Convert.ToUInt64(v) : (Marshal.SizeOf(v) > 4) ? (ulong)Convert.ToInt64(v) : (uint)Convert.ToInt32(v); else val = (uint)Convert.ToInt64(v); } else { val = (Marshal.SizeOf(v) > 4) ? ((ovf && signed) ? Convert.ToUInt64(Convert.ToInt64(v)) : (ulong)Convert.ToInt64(v)) : ((ovf && signed) ? Convert.ToUInt32(Convert.ToInt32(v)) : (uint)Convert.ToInt32(v)); } break; case VariantBase.Vtc.Tc19Int: int iv = ((IntVariant)pop).GetValue(); if (ovf && signed && iv < 0) throw new OverflowException(); val = (uint)iv; break; case VariantBase.Vtc.Tc21Double: { double dv = ((DoubleVariant)pop).GetValue(); if (ovf && signed && dv < 0) throw new OverflowException(); if (dv <= maxVal && (signed || dv >= 0)) val = (ulong)dv; else { if (ovf) throw new OverflowException(); val = 0; // мусор, индульгируем } } break; case VariantBase.Vtc.Tc8Float: { double dv = (double)((FloatVariant)pop).GetValue(); if (ovf && signed && dv < 0) throw new OverflowException(); if (dv <= maxVal && (signed || dv >= 0)) val = (ulong)dv; else { if (ovf) throw new OverflowException(); val = 0; // мусор, индульгируем } } break; case VariantBase.Vtc.Tc24Long: long lv = ((LongVariant)pop).GetValue(); if (ovf && signed && lv < 0) throw new OverflowException(); val = (ulong) lv; break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(UIntPtr), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Conv_Ovf_U : OpCodes.Conv_U) : OpCodes.Conv_Ovf_U_Un); gen.Emit(OpCodes.Ret); push.SetValue(((UIntPtr)dyn.Invoke(null, new[] { pop.GetValueAbstract() }))); PushVariant(push); return; } if ((ovf == false) || (val <= maxVal)) { push.SetValue(new UIntPtr((void*)val)); PushVariant(push); } else throw new OverflowException(); } private void Conv_u8(bool ovf, bool signed) { var pop = PopVariant(); ulong val; switch (pop.GetTypeCode()) { case VariantBase.Vtc.Tc5Enum: var v = VariantBase.SignedVariantFromEnum((EnumVariant)pop).GetValueAbstract(); if(ovf && signed) val = Convert.ToUInt64(v); else if (Marshal.SizeOf(v) > 4) val = (ulong)Convert.ToInt64(v); else val = (uint)(ulong)Convert.ToInt64(v); break; case VariantBase.Vtc.Tc19Int: int iv = ((IntVariant)pop).GetValue(); val = ovf ? (signed ? checked((uint)iv) : (uint)iv) : (uint)iv; break; case VariantBase.Vtc.Tc21Double: if (ovf) { val = checked((ulong)((DoubleVariant)pop).GetValue()); break; } val = (ulong)((DoubleVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc8Float: if (ovf) { val = checked((ulong)((FloatVariant)pop).GetValue()); break; } val = (ulong)((FloatVariant)pop).GetValue(); break; case VariantBase.Vtc.Tc24Long: if (ovf && signed) val = Convert.ToUInt64(((LongVariant)pop).GetValue()); else val = (ulong)((LongVariant)pop).GetValue(); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(ulong), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(signed ? (ovf ? OpCodes.Conv_Ovf_U8 : OpCodes.Conv_U8) : OpCodes.Conv_Ovf_U8_Un); gen.Emit(OpCodes.Ret); val = (ulong)dyn.Invoke(null, new[] { pop.GetValueAbstract() }); break; } var push = new UlongVariant(); push.SetValue(val); PushVariant(push); } // Token: 0x06000204 RID: 516 RVA: 0x0000C19C File Offset: 0x0000A39C private void Conv_u8_(VariantBase dummy) // \u0003\u2005 { Conv_u8(false, true); } // Token: 0x0600020E RID: 526 RVA: 0x0000C58C File Offset: 0x0000A78C private void Conv_ovf_u8_(VariantBase dummy) // \u0008\u2008\u2000 { Conv_u8(true, true); } // Token: 0x06000208 RID: 520 RVA: 0x0000C43C File Offset: 0x0000A63C private void Conv_ovf_i1_un_(VariantBase dummy) // \u0008 { Conv_i1(true, false); } private void Conv_ovf_u1_un_(VariantBase dummy) { Conv_u1(true, false); } // Token: 0x060001BB RID: 443 RVA: 0x000094E0 File Offset: 0x000076E0 private void _u0006u2003u2001(VariantBase dummy) // \u0006\u2003\u2001 { } // Token: 0x060001BC RID: 444 RVA: 0x000094E4 File Offset: 0x000076E4 private VariantBase[] CreateLocalVariables() // u0002 { var array = _methodHeader.LocalVarTypes; var num = array.Length; var ret = new VariantBase[num]; for (var i = 0; i < num; i++) { ret[i] = VariantFactory.Convert(null, GetTypeById(array[i].TypeId)); } return ret; } // Token: 0x060001C0 RID: 448 RVA: 0x0000958C File Offset: 0x0000778C private MethodBase FindGenericMethod(VmMethodTokenInfo what) // \u0002 { var type = GetTypeById(what.Class.MetadataToken); var bindingAttr = BF(what.IsStatic()); var arg_32_0 = type.GetMember(what.Name, bindingAttr); var array = arg_32_0; var methodInfo = (from MethodInfo methodInfo2 in array where methodInfo2.IsGenericMethodDefinition let parameters = methodInfo2.GetParameters() where parameters.Length == what.Parameters.Length && methodInfo2.GetGenericArguments().Length == what.GenericArguments.Length && AreCompatible(methodInfo2.ReturnType, what.ReturnType) where !parameters.Where((t1, j) => !AreCompatible(t1.ParameterType, what.Parameters[j])).Any() select methodInfo2).FirstOrDefault(); if (methodInfo == null) { throw new Exception(string.Format(StringDecryptor.GetString(-1550347247) /* Cannot bind method: {0}.{1} */, type.Name, what.Name)); } var array2 = new Type[what.GenericArguments.Length]; for (var k = 0; k < array2.Length; k++) { array2[k] = GetTypeById(what.GenericArguments[k].MetadataToken); } return methodInfo.MakeGenericMethod(array2); } // Token: 0x060001C2 RID: 450 RVA: 0x000097A0 File Offset: 0x000079A0 private bool InvokeFilter(MethodBase mb, object obj, ref object result, object[] args) // \u0002 { var declaringType = mb.DeclaringType; if (declaringType == null) { return false; } if (SimpleTypeHelper.IsNullableGeneric(declaringType)) { if (string.Equals(mb.Name, StringDecryptor.GetString(-1550345611) /* get_HasValue */, StringComparison.Ordinal)) { result = obj != null; } else if (string.Equals(mb.Name, StringDecryptor.GetString(-1550345722) /* get_Value */, StringComparison.Ordinal)) { if (obj == null) { //return ((bool?)null).Value; throw new InvalidOperationException(); } result = obj; } else if (mb.Name.Equals(StringDecryptor.GetString(-1550345706) /* GetValueOrDefault */, StringComparison.Ordinal)) { if (obj == null) { /*u0005 =*/ Activator.CreateInstance(Nullable.GetUnderlyingType(mb.DeclaringType)); } result = obj; } else { if (obj != null || mb.IsStatic) { return false; } result = null; } return true; } if (declaringType == SimpleTypeHelper.TypedReferenceType) { var name = mb.Name; var i = args.Length; if (i != 1) { if (i == 2) { if (name == StringDecryptor.GetString(-1550345495) /* SetTypedReference */) { TypedReference.SetTypedReference((TypedReference)args[0], args[1]); return true; } } } else { if (name == StringDecryptor.GetString(-1550345682) /* GetTargetType */) { result = TypedReference.GetTargetType((TypedReference)args[0]); return true; } if (name == StringDecryptor.GetString(-1550345534) /* TargetTypeToken */) { result = TypedReference.TargetTypeToken((TypedReference)args[0]); return true; } if (name == StringDecryptor.GetString(-1550345512) /* ToObject */) { result = TypedReference.ToObject((TypedReference)args[0]); return true; } } } else if (declaringType == AssemblyType) { if (_callees != null && mb.Name == StringDecryptor.GetString(-1550345599) /* GetCallingAssembly */) { var array = _callees; foreach (var t in array) { var assembly = t as Assembly; if (assembly != null) { result = assembly; return true; } } } } else if (declaringType == MethodBaseType) { if (mb.Name == StringDecryptor.GetString(-1550345576) /* GetCurrentMethod */) { if (_callees != null) { var array = _callees; foreach (var t in array) { var methodBase = t as MethodBase; if (methodBase != null) { result = methodBase; return true; } } } result = MethodBase.GetCurrentMethod(); return true; } } else if (declaringType.IsArray && declaringType.GetArrayRank() >= 2) { return RefToMdArrayItem(mb, obj, ref result, args); } return false; } // Token: 0x060001C3 RID: 451 RVA: 0x000099F8 File Offset: 0x00007BF8 private void Ldloca_s_(VariantBase vLocIdx) // \u0005\u2001\u2001 { var push = new LocalsIdxHolderVariant(); push.SetValue(((ByteVariant)vLocIdx).GetValue()); PushVariant(push); } // Token: 0x060001C4 RID: 452 RVA: 0x00009A24 File Offset: 0x00007C24 private void Ldind_i_(VariantBase dummy) // \u000E\u2004\u2000 { Ldind(IntPtrType); } // Token: 0x060001C6 RID: 454 RVA: 0x00009D14 File Offset: 0x00007F14 private void Stloc_(VariantBase vidx) // \u0008\u2006 { var idx = (UshortVariant)vidx; PopToLocal(idx.GetValue()); } // Token: 0x060001C7 RID: 455 RVA: 0x00009D34 File Offset: 0x00007F34 private void Stfld_(VariantBase vFieldId) // \u0005\u200B { var fieldInfo = ResolveField(((IntVariant)vFieldId).GetValue()); var val = PopVariant(); var objRef = PopVariant(); var obj = objRef.IsAddr() ? FetchByAddr(objRef).GetValueAbstract() : objRef.GetValueAbstract(); if (obj == null) { throw new NullReferenceException(); } fieldInfo.SetValue(obj, VariantFactory.Convert(val.GetValueAbstract(), fieldInfo.FieldType).GetValueAbstract()); if (objRef.IsAddr() && /*obj != null && */ obj.GetType().IsValueType) { AssignByReference(objRef, VariantFactory.Convert(obj, null)); } } // Token: 0x060001C8 RID: 456 RVA: 0x00009DD0 File Offset: 0x00007FD0 /*private void u000Fu2004(VariantBase dummy) // \u000F\u2004 { }*/ // Token: 0x060001CB RID: 459 RVA: 0x00009E7C File Offset: 0x0000807C private void Ldloc_s_(VariantBase vidx) // \u0002 { var idx = (ByteVariant)vidx; PushVariant(_localVariables[idx.GetValue()].Clone()); } // Token: 0x060001D1 RID: 465 RVA: 0x0000A328 File Offset: 0x00008528 private void Stelem_ref_(VariantBase dummy) // \u0008\u200A { Stelem(SimpleTypeHelper.ObjectType); } // Token: 0x060001D3 RID: 467 RVA: 0x0000A34C File Offset: 0x0000854C private void Ldelem_u2_(VariantBase dummy) // \u000E\u2003\u2001 { Ldelem(typeof(ushort)); } // Token: 0x060001D5 RID: 469 RVA: 0x0000A620 File Offset: 0x00008820 private void Stind_i4_(VariantBase dummy) // \u0006\u2003\u2000 { Stind(); } // Token: 0x060001D6 RID: 470 RVA: 0x0000A628 File Offset: 0x00008828 private void Stind_i8_(VariantBase dummy) // \u0003\u2002\u2000 { Stind(); } // Token: 0x060001DC RID: 476 RVA: 0x0000AAD8 File Offset: 0x00008CD8 private void Stelem_i8_(VariantBase dummy) // \u0002\u200B\u2000 { var obj = PopVariant().GetValueAbstract(); var idx = PopLong(); var array = (Array)PopVariant().GetValueAbstract(); var elementType = array.GetType().GetElementType(); checked { if (elementType == typeof(long)) { ((long[])array)[(int)(IntPtr)idx] = (long)VariantFactory.Convert(obj, typeof(long)).GetValueAbstract(); return; } if (elementType == typeof(ulong)) { ((ulong[])array)[(int)(IntPtr)idx] = (ulong)VariantFactory.Convert(obj, typeof(ulong)).GetValueAbstract(); return; } if (elementType.IsEnum) { Stelem(elementType, obj, idx, array); return; } Stelem(typeof(long), obj, idx, array); } } // Token: 0x060001DD RID: 477 RVA: 0x0000ABA8 File Offset: 0x00008DA8 private void Stelem_i_(VariantBase dummy) // \u000F\u2006\u2000 { Stelem(IntPtrType); } // Token: 0x060001DE RID: 478 RVA: 0x0000ABB8 File Offset: 0x00008DB8 private void Ldelem_i8_(VariantBase dummy) // \u0006\u2000 { Ldelem(typeof(long)); } // Token: 0x060001E0 RID: 480 RVA: 0x0000ABD0 File Offset: 0x00008DD0 private void Ldc_i4_(VariantBase val) // \u0006\u2000\u2000 { PushVariant(val); } // Token: 0x060001E2 RID: 482 RVA: 0x0000AC08 File Offset: 0x00008E08 private void Ldarg_1_(VariantBase dummy) // \u0002\u2003\u2001 { PushVariant(_variantOutputArgs[1].Clone()); } // Token: 0x060001E3 RID: 483 RVA: 0x0000AC24 File Offset: 0x00008E24 private void Ret_(VariantBase dummy) // \u000E\u2005\u2000 { Ret(); } // Token: 0x060001E8 RID: 488 RVA: 0x0000B10C File Offset: 0x0000930C private void Stelem(Type arrType, object val, long idx, Array array) // \u0002 { array.SetValue(VariantFactory.Convert(val, arrType).GetValueAbstract(), idx); } // Token: 0x060001E9 RID: 489 RVA: 0x0000B130 File Offset: 0x00009330 [DebuggerNonUserCode] private MethodBase FindMethodById(int methodId, UniversalTokenInfo methodToken) // \u0002 { MethodBase result = null; lock (AllMetadataById) { //var flag = true; object obj; if (/*flag &&*/ AllMetadataById.TryGetValue(methodId, out obj)) { result = (MethodBase)obj; } else if (methodToken.IsVm == 0) { var methodBase = _module.ResolveMethod(methodToken.MetadataToken); //if (flag) { AllMetadataById.Add(methodId, methodBase); } result = methodBase; } else { var mti = (VmMethodTokenInfo)methodToken.VmToken; if (mti.IsGeneric()) { result = FindGenericMethod(mti); } else { var clsType = GetTypeById(mti.Class.MetadataToken); var retType = GetTypeById(mti.ReturnType.MetadataToken); var paramArray = new Type[mti.Parameters.Length]; for (var i = 0; i < paramArray.Length; i++) { paramArray[i] = GetTypeById(mti.Parameters[i].MetadataToken); } /*if (type.IsGenericType) { flag = false; }*/ if (mti.Name == StringDecryptor.GetString(-1550347259) /* .ctor */) { var constructor = clsType.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, CallingConventions.Any, paramArray, null); if (constructor == null) { throw new Exception(); } if (!clsType.IsGenericType) { AllMetadataById.Add(methodId, constructor); } result = constructor; } else { var bindingAttr = BF(mti.IsStatic()); try { result = clsType.GetMethod(mti.Name, bindingAttr, null, CallingConventions.Any, paramArray, null); } catch (AmbiguousMatchException) { var methods = clsType.GetMethods(bindingAttr); foreach (var methodInfo in methods) { if (methodInfo.Name == mti.Name && methodInfo.ReturnType == retType) { var parameters = methodInfo.GetParameters(); if (parameters.Length == paramArray.Length) { if (!(bool)paramArray.Where((t, k) => parameters[k].ParameterType != t).Any()) { result = methodInfo; break; } } } } } if (result == null) { throw new Exception(string.Format(StringDecryptor.GetString(-1550347247) /* Cannot bind method: {0}.{1} */, clsType.Name, mti.Name)); } if (!clsType.IsGenericType) { AllMetadataById.Add(methodId, result); } } } } } return result; } // Token: 0x060001EA RID: 490 RVA: 0x0000B3B8 File Offset: 0x000095B8 private void Stloc_s_(VariantBase vidx) // \u000E\u2004 { var idx = (ByteVariant)vidx; PopToLocal(idx.GetValue()); } // Token: 0x060001EB RID: 491 RVA: 0x0000B3D8 File Offset: 0x000095D8 private void LockIfInterlocked(ref BoolHolder wasLocked, MethodBase mb, bool dummy) // \u0002 { if (mb.DeclaringType == typeof(Interlocked) && mb.IsStatic) { var name = mb.Name; if (name == StringDecryptor.GetString(-1550347213) /* Add */ || name == StringDecryptor.GetString(-1550347203) /* CompareExchange */ || name == StringDecryptor.GetString(-1550347053) /* Decrement */ || name == StringDecryptor.GetString(-1550347037) /* Exchange */ || name == StringDecryptor.GetString(-1550347024) /* Increment */ || name == StringDecryptor.GetString(-1550347136) /* Read*/) { Monitor.Enter(InterlockedLock); wasLocked.Val = true; } } } // Token: 0x060001EC RID: 492 RVA: 0x0000B4A0 File Offset: 0x000096A0 private void Box_(VariantBase vTypeId) // \u0003\u2009\u2000 { var type = GetTypeById(((IntVariant)vTypeId).GetValue()); var push = VariantFactory.Convert(PopVariant().GetValueAbstract(), type); push.SetVariantType(type); PushVariant(push); } // Token: 0x060001F1 RID: 497 RVA: 0x0000B690 File Offset: 0x00009890 private void Sizeof_(VariantBase vTypeId) // \u000E\u2001\u2001 { var t = GetTypeById(((IntVariant)vTypeId).GetValue()); var iv = new IntVariant(); iv.SetValue(Marshal.SizeOf(t)); PushVariant(iv); } // Token: 0x060001F3 RID: 499 RVA: 0x0000B758 File Offset: 0x00009958 private void Ldelem_i_(VariantBase dummy) // \u000F\u2000 { Ldelem(IntPtrType); } // Token: 0x060001F4 RID: 500 RVA: 0x0000B768 File Offset: 0x00009968 private void InternalInvoke() // \u0002 { try { LoopUntilRet(); } catch (Exception ex) { OnException(ex, 0u); LoopUntilRet(); } } // Token: 0x060001F5 RID: 501 RVA: 0x0000B7A0 File Offset: 0x000099A0 private MethodBase GenerateDynamicCall(MethodBase mb, bool mayVirtual) // \u0002 { MethodBase result; lock (DynamicMethods) { DynamicMethod dynamicMethod; if (DynamicMethods.TryGetValue(mb, out dynamicMethod)) { result = dynamicMethod; } else { var methodInfo = mb as MethodInfo; var returnType = methodInfo?.ReturnType ?? VoidType; var parameters = mb.GetParameters(); Type[] array; if (mb.IsStatic) { array = new Type[parameters.Length]; for (var i = 0; i < parameters.Length; i++) { array[i] = parameters[i].ParameterType; } } else { array = new Type[parameters.Length + 1]; var type = mb.DeclaringType; if (type.IsValueType) { type = type.MakeByRefType(); mayVirtual = false; } array[0] = type; for (var j = 0; j < parameters.Length; j++) { array[j + 1] = parameters[j].ParameterType; } } /*if (_alwaysFalse) { dynamicMethod = new DynamicMethod(string.Empty, returnType, array, true); } if (dynamicMethod == null)*/ { dynamicMethod = new DynamicMethod(string.Empty, returnType, array, GetTypeById(_methodHeader.ClassId), true); } var iLGenerator = dynamicMethod.GetILGenerator(); for (var k = 0; k < array.Length; k++) { iLGenerator.Emit(OpCodes.Ldarg, k); } var constructorInfo = mb as ConstructorInfo; if (constructorInfo != null) { iLGenerator.Emit(mayVirtual ? OpCodes.Callvirt : OpCodes.Call, constructorInfo); } else { iLGenerator.Emit(mayVirtual ? OpCodes.Callvirt : OpCodes.Call, (MethodInfo)mb); } iLGenerator.Emit(OpCodes.Ret); DynamicMethods.Add(mb, dynamicMethod); result = dynamicMethod; } } return result; } // Token: 0x060001F7 RID: 503 RVA: 0x0000B9EC File Offset: 0x00009BEC private void Ldelem_i4_(VariantBase dummy) // \u000E\u2007 { Ldelem(typeof(int)); } // Token: 0x060001FD RID: 509 RVA: 0x0000BD88 File Offset: 0x00009F88 private void Invoke(int pos, Type[] methodGenericArgs, Type[] classGenericArgs, bool mayVirtual) // \u0002 { _srcVirtualizedStreamReader.BaseStream.Seek(pos, SeekOrigin.Begin); DoNothing(_srcVirtualizedStreamReader); var u0006 = ReadMethodHeader(_srcVirtualizedStreamReader); var num = u0006.ArgsTypeToOutput.Length; var array = new object[num]; var array2 = new VariantBase[num]; if (_currentClass != null & mayVirtual) { var num2 = u0006.IsStatic() ? 0 : 1; var array3 = new Type[num - num2]; for (var i = num - 1; i >= num2; i--) { array3[i] = GetTypeById(u0006.ArgsTypeToOutput[i].TypeId); } var method = _currentClass.GetMethod(u0006.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.GetProperty | BindingFlags.SetProperty, null, array3, null); _currentClass = null; if (method != null) { GenerateDynamicCall(method, true); return; } } for (var j = num - 1; j >= 0; j--) { var u000F = PopVariant(); array2[j] = u000F; if (u000F.IsAddr()) { u000F = FetchByAddr(u000F); } if (u000F.GetVariantType() != null) { u000F = VariantFactory.Convert(null, u000F.GetVariantType()).CopyFrom(u000F); } var u000F2 = VariantFactory.Convert(null, GetTypeById(u0006.ArgsTypeToOutput[j].TypeId)).CopyFrom(u000F); array[j] = u000F2.GetValueAbstract(); if (j == 0 & mayVirtual && !u0006.IsStatic() && array[j] == null) { throw new NullReferenceException(); } } var executor = new VmExecutor(_instrCodesDb); var callees = new object[] { _module.Assembly }; object obj; try { obj = executor.Invoke(_srcVirtualizedStream, pos, array, methodGenericArgs, classGenericArgs, callees); } finally { for (var k = 0; k < array2.Length; k++) { var u000F3 = array2[k]; if (u000F3.IsAddr()) { var obj2 = array[k]; AssignByReference(u000F3, VariantFactory.Convert(obj2, null)); } } } var type = executor.GetTypeById(executor._methodHeader.ReturnTypeId); if (type != VoidType) { PushVariant(VariantFactory.Convert(obj, type)); } } // Token: 0x06000202 RID: 514 RVA: 0x0000C150 File Offset: 0x0000A350 public static object CreateValueTypeInstance(Type t) // \u0002 { if (t.IsValueType) { return Activator.CreateInstance(t); } return null; } // Token: 0x0600020B RID: 523 RVA: 0x0000C51C File Offset: 0x0000A71C private void Ldc_r4_(VariantBase val) // \u0003\u200B\u2000 { PushVariant(val); } // Token: 0x0600020D RID: 525 RVA: 0x0000C550 File Offset: 0x0000A750 private void Stelem(Type t) // \u0003 { var obj = PopVariant().GetValueAbstract(); var idx = PopLong(); var array = (Array)PopVariant().GetValueAbstract(); Stelem(t, obj, idx, array); } // Token: 0x06000210 RID: 528 RVA: 0x0000C5C4 File Offset: 0x0000A7C4 private void Ldvirtftn_(VariantBase vMethodId) // \u0003\u200A { var methodBase = FindMethodById(((IntVariant)vMethodId).GetValue()); var declaringType = methodBase.DeclaringType; var type = PopVariant().GetValueAbstract().GetType(); var parameters = methodBase.GetParameters(); var paramTypes = new Type[parameters.Length]; for (var i = 0; i < parameters.Length; i++) { paramTypes[i] = parameters[i].ParameterType; } while (type != null && type != declaringType) { var method = type.GetMethod(methodBase.Name, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.SetProperty | BindingFlags.ExactBinding, null, CallingConventions.Any, paramTypes, null); if (method != null && method.GetBaseDefinition() == methodBase) { methodBase = method; break; } type = type.BaseType; } var push = new MethodVariant(); push.SetValue(methodBase); PushVariant(push); } // Token: 0x06000213 RID: 531 RVA: 0x0000C750 File Offset: 0x0000A950 private void Ldind_u4_(VariantBase dummy) // \u000E\u2002\u2001 { Ldind(typeof(uint)); } // Token: 0x06000218 RID: 536 RVA: 0x0000C810 File Offset: 0x0000AA10 private void Ldind_i2_(VariantBase dummy) // \u0003\u2002\u2001 { Ldind(typeof(short)); } // Token: 0x0600021A RID: 538 RVA: 0x0000C830 File Offset: 0x0000AA30 private void Ldind_u2_(VariantBase dummy) // \u000F\u2001\u2001 { Ldind(typeof(ushort)); } // Token: 0x0600021B RID: 539 RVA: 0x0000C844 File Offset: 0x0000AA44 private void Break_(VariantBase dummy) // \u0005\u2002 { Debugger.Break(); } // Token: 0x0600021D RID: 541 RVA: 0x0000C878 File Offset: 0x0000AA78 private void Ldc_i4_m1_(VariantBase dummy) // \u0002\u2005 { var iv = new IntVariant(); iv.SetValue(-1); PushVariant(iv); } // Token: 0x0600021E RID: 542 RVA: 0x0000C88C File Offset: 0x0000AA8C private void ExecuteNextInstruction() // \u0002\u2000 { try { TryExecuteNextInstruction(); } catch (Exception ex) { OnException(ex, 0u); } } // Token: 0x06000220 RID: 544 RVA: 0x0000F07C File Offset: 0x0000D27C private void OnException(object ex, uint pos) // \u0002 { _wasException = ex != null; _exception = ex; if (_wasException) { _ehStack.Clear(); } if (!_wasException) { _ehStack.PushBack(new ExcHandlerFrame { Pos = pos }); } foreach (var catchBlock in _catchBlocks) { if (PosInRange(_myBufferPos, catchBlock.Start, catchBlock.Len)) { switch (catchBlock.Kind) { case 0: if (_wasException) { var type = ex.GetType(); var type2 = GetTypeById(catchBlock.ExcTypeId); if (type == type2 || type.IsSubclassOf(type2)) { _ehStack.PushBack(new ExcHandlerFrame { Pos = catchBlock.Pos, Exception = ex }); _wasException = false; } } break; case 1: if (_wasException) { _ehStack.PushBack(new ExcHandlerFrame { Pos = catchBlock.Pos }); } break; case 2: if (_wasException || !PosInRange((long)(ulong)pos, catchBlock.Start, catchBlock.Len)) { _ehStack.PushBack(new ExcHandlerFrame { Pos = catchBlock.Pos }); } break; case 4: if (_wasException) { _ehStack.PushBack(new ExcHandlerFrame { Pos = catchBlock.PosKind4, Exception = ex }); } break; } } } ExecuteExceptionHandler(); } // Token: 0x06000221 RID: 545 RVA: 0x0000F210 File Offset: 0x0000D410 private void Stloc_0_(VariantBase dummy) // \u0008\u2003 { PopToLocal(0); } // Token: 0x06000222 RID: 546 RVA: 0x0000F21C File Offset: 0x0000D41C private void Ldind_ref_(VariantBase dummy) // \u0003\u2003\u2001 { Ldind(SimpleTypeHelper.ObjectType); } // Token: 0x06000223 RID: 547 RVA: 0x0000F22C File Offset: 0x0000D42C private void Stind_r4_(VariantBase dummy) // \u0006\u2006 { Stind(); } // Token: 0x06000224 RID: 548 RVA: 0x0000F234 File Offset: 0x0000D434 private void Newarr_(VariantBase vTypeId) // \u0002\u2001\u2001 { var vLength = PopVariant(); var ivLength = vLength as IntVariant; int length; if (ivLength != null) { length = ivLength.GetValue(); } else { var ipvLength = vLength as IntPtrVariant; if (ipvLength != null) { length = ipvLength.GetValue().ToInt32(); } else { var uipvLength = vLength as UIntPtrVariant; if (uipvLength == null) { throw new Exception(); } length = (int)uipvLength.GetValue().ToUInt32(); } } var array = Array.CreateInstance(GetTypeById(((IntVariant)vTypeId).GetValue()), length); var push = new ArrayVariant(); push.SetValue(array); PushVariant(push); } // Token: 0x06000226 RID: 550 RVA: 0x0000F308 File Offset: 0x0000D508 private bool RefToMdArrayItem(MethodBase mb, object array, ref object result, object[] oidxs) // \u0003 { if (!mb.IsStatic && mb.Name == StringDecryptor.GetString(-1550345964) /* Address */) { var methodInfo = mb as MethodInfo; if (methodInfo != null) { var type = methodInfo.ReturnType; if (type.IsByRef) { type = type.GetElementType(); var num = oidxs.Length; if (num >= 1 && oidxs[0] is int) { var idxs = new int[num]; for (var i = 0; i < num; i++) { idxs[i] = (int)oidxs[i]; } var val = new MdArrayValueVariant(); val.SetArray((Array)array); val.SetIndexes(idxs); val.SetHeldType(type); result = val; return true; } } } } return false; } // Token: 0x0600022C RID: 556 RVA: 0x0000F86C File Offset: 0x0000DA6C private void Stelem_r4_(VariantBase dummy) // \u0005\u200A { Stelem(typeof(float)); } // Token: 0x0600022E RID: 558 RVA: 0x0000F8AC File Offset: 0x0000DAAC private void Ldarg_2_(VariantBase dummy) // \u0006\u2003 { PushVariant(_variantOutputArgs[2].Clone()); } // Token: 0x06000230 RID: 560 RVA: 0x0000F8DC File Offset: 0x0000DADC private void Not_(VariantBase dummy) // \u0008\u2002\u2001 { PushVariant(Not(PopVariant())); } // Token: 0x06000232 RID: 562 RVA: 0x0000F914 File Offset: 0x0000DB14 private void Ldind_i1_(VariantBase dummy) // \u000F\u2005\u2000 { Ldind(typeof(sbyte)); } // Token: 0x06000233 RID: 563 RVA: 0x0000F928 File Offset: 0x0000DB28 private void Stloc_2_(VariantBase dummy) // \u000F\u2009 { PopToLocal(2); } // Token: 0x06000235 RID: 565 RVA: 0x0000F96C File Offset: 0x0000DB6C private void Stloc_1_(VariantBase dummy) // \u000E\u2009\u2000 { PopToLocal(1); } // Token: 0x06000236 RID: 566 RVA: 0x0000F978 File Offset: 0x0000DB78 private void Pop_(VariantBase dummy) // \u0003 { PopVariant(); } // Token: 0x0600023A RID: 570 RVA: 0x0000F9D4 File Offset: 0x0000DBD4 private void Ldc_r8_(VariantBase val) // \u0005\u200B\u2000 { PushVariant(val); } // Token: 0x0600023F RID: 575 RVA: 0x0000FDF4 File Offset: 0x0000DFF4 private void Ldelem_r4_(VariantBase dummy) // \u0008\u200B { Ldelem(typeof(float)); } // Token: 0x06000240 RID: 576 RVA: 0x0000FE08 File Offset: 0x0000E008 private void UnlockInterlockedIfAny(ref BoolHolder wasLocked) // \u0002 { if (wasLocked.Val) { Monitor.Exit(InterlockedLock); } } // Token: 0x06000241 RID: 577 RVA: 0x0000FE1C File Offset: 0x0000E01C private void Ldarg_0_(VariantBase dummy) // \u0003\u2007 { PushVariant(_variantOutputArgs[0].Clone()); } // Token: 0x06000245 RID: 581 RVA: 0x00010198 File Offset: 0x0000E398 private VariantBase Not(VariantBase val) // \u0005 { switch (val.GetTypeCode()) { case VariantBase.Vtc.Tc19Int: var iv = new IntVariant(); iv.SetValue(~((IntVariant)val).GetValue()); return iv; case VariantBase.Vtc.Tc24Long: var lv = new LongVariant(); lv.SetValue(~((LongVariant)val).GetValue()); return lv; case VariantBase.Vtc.Tc5Enum: var underlyingType = Enum.GetUnderlyingType(val.GetValueAbstract().GetType()); if (underlyingType == typeof(ulong)) { var ret = new UlongVariant(); ret.SetValue(~Convert.ToUInt64(val.GetValueAbstract())); return ret; } if (underlyingType == typeof(long)) { var ret = new LongVariant(); ret.SetValue(~Convert.ToInt64(val.GetValueAbstract())); return ret; } if (underlyingType == typeof(uint)) { var ret = new UintVariant(); ret.SetValue(~Convert.ToUInt32(val.GetValueAbstract())); return ret; } var result = new IntVariant(); result.SetValue(~Convert.ToInt32(val.GetValueAbstract())); return result; case VariantBase.Vtc.Tc21Double: if (IntPtr.Size == 4) { var ret = new DoubleVariant(); ret.SetValue(double.NaN); return ret; } break; case VariantBase.Vtc.Tc8Float: if (IntPtr.Size == 4) { var ret = new FloatVariant(); ret.SetValue(float.NaN); return ret; } break; case VariantBase.Vtc.Tc18Object: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Not); gen.Emit(OpCodes.Ret); var oret = new IntPtrVariant(); ((IntPtrVariant)oret).SetValue(((IntPtr)dyn.Invoke(null, new[] { val.GetValueAbstract() }))); return oret; } throw new InvalidProgramException(); } // Token: 0x06000246 RID: 582 RVA: 0x0001025C File Offset: 0x0000E45C private void Ldind_i8_(VariantBase dummy) // \u0005\u2006 { Ldind(typeof(long)); } // Token: 0x06000247 RID: 583 RVA: 0x00010270 File Offset: 0x0000E470 private void Clt_(VariantBase dummy) // \u0002\u2004\u2001 { var v2 = PopVariant(); var v1 = PopVariant(); var push = new IntVariant(); push.SetValue(UniCompare(v1, v2, ComparisonKind.LT, false) ? 1 : 0); PushVariant(push); } // Token: 0x06000249 RID: 585 RVA: 0x00010348 File Offset: 0x0000E548 private void Nop_(VariantBase dummy) // \u0005\u2005 { } // Token: 0x0600024B RID: 587 RVA: 0x00010498 File Offset: 0x0000E698 private void TryExecuteNextInstruction() // \u000E { var key = _myBufferReader.ReadInt32(); VmInstr instr; if (!_vmInstrDb.TryGetValue(key, out instr)) { throw new InvalidOperationException(StringDecryptor.GetString(-1550345644) /* Unsupported instruction. */); } instr.Func(ReadOperand(_myBufferReader, instr.Id.OperandType)); _myBufferPos = _myBufferReader.GetBuffer().GetPos(); } // Token: 0x0600024E RID: 590 RVA: 0x000105B4 File Offset: 0x0000E7B4 private void Stelem_i1_(VariantBase dummy) // \u0002\u2003 { var obj = PopVariant().GetValueAbstract(); var idx = PopLong(); var array = (Array)PopVariant().GetValueAbstract(); var elementType = array.GetType().GetElementType(); checked { if (elementType == typeof(sbyte)) { ((sbyte[])array)[(int)(IntPtr)idx] = (sbyte)VariantFactory.Convert(obj, typeof(sbyte)).GetValueAbstract(); return; } if (elementType == typeof(byte)) { ((byte[])array)[(int)(IntPtr)idx] = (byte)VariantFactory.Convert(obj, typeof(byte)).GetValueAbstract(); return; } if (elementType == typeof(bool)) { ((bool[])array)[(int)(IntPtr)idx] = (bool)VariantFactory.Convert(obj, typeof(bool)).GetValueAbstract(); return; } if (elementType.IsEnum) { Stelem(elementType, obj, idx, array); return; } Stelem(typeof(sbyte), obj, idx, array); } } // Token: 0x0600024F RID: 591 RVA: 0x000106B8 File Offset: 0x0000E8B8 private void Starg_s_(VariantBase vidx) // \u000E\u2007\u2000 { var idx = (ByteVariant)vidx; _variantOutputArgs[idx.GetValue()].CopyFrom(PopVariant()); } // Token: 0x06000251 RID: 593 RVA: 0x00010748 File Offset: 0x0000E948 private void Ldlen_(VariantBase dummy) // \u000E\u200B\u2000 { var array = (Array)PopVariant().GetValueAbstract(); var len = new IntVariant(); len.SetValue(array.Length); PushVariant(len); } // Token: 0x06000256 RID: 598 RVA: 0x00010948 File Offset: 0x0000EB48 private void Ldelem_i2_(VariantBase dummy) // \u0008\u2000 { Ldelem(typeof(short)); } // Token: 0x06000257 RID: 599 RVA: 0x0001095C File Offset: 0x0000EB5C private void Ldarg_(VariantBase vidx) // \u000E\u2000\u2000 { var idx = (UshortVariant)vidx; PushVariant(_variantOutputArgs[idx.GetValue()].Clone()); } // Token: 0x06000258 RID: 600 RVA: 0x0001098C File Offset: 0x0000EB8C private void Clt_un_(VariantBase dummy) // \u0003\u2000\u2001 { var v2 = PopVariant(); var v1 = PopVariant(); var push = new IntVariant(); push.SetValue(UniCompare(v1, v2, ComparisonKind.LT, true) ? 1 : 0); PushVariant(push); } // Token: 0x06000259 RID: 601 RVA: 0x000109C8 File Offset: 0x0000EBC8 private void Dup_(VariantBase dummy) // \u0002\u2006\u2000 { var v = PopVariant(); PushVariant(v); PushVariant(v.Clone()); } // Token: 0x0600025A RID: 602 RVA: 0x000109F4 File Offset: 0x0000EBF4 [Conditional("DEBUG")] private void DoNothing(object dummy) // \u0002 { } // Token: 0x0600025B RID: 603 RVA: 0x000109F8 File Offset: 0x0000EBF8 private VariantBase[] ArgsToVariantOutputArgs(object[] args) // u0002 { var methodHeaderArgsTypeToOutput = _methodHeader.ArgsTypeToOutput; var num = methodHeaderArgsTypeToOutput.Length; var retArgs = new VariantBase[num]; for (var i = 0; i < num; i++) { var obj = args[i]; var type = GetTypeById(methodHeaderArgsTypeToOutput[i].TypeId); var type2 = ElementedTypeHelper.TryGoToPointerOrReferenceElementType(type); Type type3; if (type2 == SimpleTypeHelper.ObjectType || SimpleTypeHelper.IsNullableGeneric(type2)) { type3 = type; } else { type3 = obj?.GetType() ?? type; } if (obj != null && !type.IsAssignableFrom(type3) && type.IsByRef && !type.GetElementType().IsAssignableFrom(type3)) { throw new ArgumentException(string.Format(StringDecryptor.GetString(-1550345390) /* Object of type {0} cannot be converted to type {1}. */, type3, type)); } retArgs[i] = VariantFactory.Convert(obj, type3); } if (!_methodHeader.IsStatic() && GetTypeById(_methodHeader.ClassId).IsValueType) { var expr_EB = new VariantBaseHolder(); expr_EB.SetValue(retArgs[0]); retArgs[0] = expr_EB; } for (var j = 0; j < num; j++) { if (methodHeaderArgsTypeToOutput[j].IsOutput) { var expr_116 = new VariantBaseHolder(); expr_116.SetValue(retArgs[j]); retArgs[j] = expr_116; } } return retArgs; } // Token: 0x0600025D RID: 605 RVA: 0x00010B3C File Offset: 0x0000ED3C private void Stind() // \u0003 { var v2 = PopVariant(); var v1 = PopVariant(); AssignByReference(v1, v2); } // Token: 0x0600025E RID: 606 RVA: 0x00010B60 File Offset: 0x0000ED60 private void Endfinally_(VariantBase dummy) // \u0005\u2000\u2001 { ExecuteExceptionHandler(); } // Token: 0x0600025F RID: 607 RVA: 0x00010B68 File Offset: 0x0000ED68 private bool PosInRange(long pos, uint start, uint len) // \u0002 { return pos >= (long)(ulong)start && pos <= (long)(ulong)(start + len); } // Token: 0x06000260 RID: 608 RVA: 0x00010B7C File Offset: 0x0000ED7C private bool IsCompatible(MethodBase mb) // \u0002 { return mb.IsVirtual && GetTypeById(_methodHeader.ClassId).IsSubclassOf(mb.DeclaringType); } // Token: 0x06000263 RID: 611 RVA: 0x00010C00 File Offset: 0x0000EE00 private void Stelem_(VariantBase vTypeId) // \u0006\u2004\u2000 { Stelem(GetTypeById(((IntVariant)vTypeId).GetValue())); } // Token: 0x06000265 RID: 613 RVA: 0x00010C40 File Offset: 0x0000EE40 private void Ldelem_u1_(VariantBase dummy) // \u0006\u2004 { Ldelem(typeof(byte)); } // Token: 0x06000267 RID: 615 RVA: 0x00010C80 File Offset: 0x0000EE80 private void Cgt_(VariantBase dummy) // \u0005\u2001\u2000 { var v2 = PopVariant(); var v1 = PopVariant(); var push = new IntVariant(); push.SetValue(UniCompare(v1, v2, ComparisonKind.GT, false) ? 1 : 0); PushVariant(push); } private VariantBase And(VariantBase org_v1, VariantBase org_v2) { VariantBase v1, v2; var tc = CommonType(org_v1, org_v2, out v1, out v2, true); VariantBase ret; switch (tc) { case VariantBase.Vtc.Tc9Uint: uint uv1 = ((UintVariant)v1).GetValue(), uv2 = ((UintVariant)v2).GetValue(); var uvret = new UintVariant(); ret = uvret; uvret.SetValue(uv1 & uv2); break; case VariantBase.Vtc.Tc19Int: int iv1 = ((IntVariant)v1).GetValue(), iv2 = ((IntVariant)v2).GetValue(); var ivret = new IntVariant(); ret = ivret; ivret.SetValue(iv1 & iv2); break; case VariantBase.Vtc.Tc21Double: { /*double dv1 = ((DoubleVariant)v1).GetValue(), dv2 = ((DoubleVariant)v2).GetValue(); // естественный алгоритм long lv1 = (dv1 < 0) ? (long)dv1 : (long)(ulong)dv1; long lv2 = (dv2 < 0) ? (long)dv2 : (long)(ulong)dv2; var dvret = new DoubleVariant(); ret = dvret; var l64 = (ulong) lv1 & (ulong) lv2; if (l64 >> 32 == UInt32.MaxValue) l64 &= UInt32.MaxValue; dvret.SetValue(l64);*/ var dvret = new DoubleVariant(); ret = dvret; dvret.SetValue((4 == IntPtr.Size) ? Double.NaN : (double)0); // иногда у фреймворка бывает мусор, но чаще эти значения... } break; case VariantBase.Vtc.Tc8Float: { /*float fv1 = ((FloatVariant) v1).GetValue(), fv2 = ((FloatVariant) v2).GetValue(); // естественный алгоритм long lv1 = (fv1 < 0) ? (long)fv1 : (long)(ulong)fv1; long lv2 = (fv2 < 0) ? (long)fv2 : (long)(ulong)fv2; var fvret = new FloatVariant(); ret = fvret; var l64 = (ulong)lv1 & (ulong)lv2; if (l64 >> 32 == UInt32.MaxValue) l64 &= UInt32.MaxValue; fvret.SetValue(l64);*/ var fvret = new FloatVariant(); ret = fvret; fvret.SetValue((4 == IntPtr.Size) ? float.NaN : (float)0.0); // иногда у фреймворка бывает мусор, но чаще эти значения... } break; case VariantBase.Vtc.Tc24Long: { long lv1 = ((LongVariant)v1).GetValue(), lv2 = ((LongVariant)v2).GetValue(); var lvret = new LongVariant(); ret = lvret; lvret.SetValue(lv1 & lv2); } break; case VariantBase.Vtc.Tc7Ulong: ulong ulv1 = ((UlongVariant)v1).GetValue(), ulv2 = ((UlongVariant)v2).GetValue(); var ulvret = new UlongVariant(); ret = ulvret; ulvret.SetValue(ulv1 & ulv2); break; default: // это нужно будет заменить на соотв. msil-код var dyn = new DynamicMethod(String.Empty, typeof(IntPtr), new[] { typeof(object), typeof(object) }, typeof(void), true); var gen = dyn.GetILGenerator(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.And); gen.Emit(OpCodes.Ret); ret = new IntPtrVariant(); ((IntPtrVariant)ret).SetValue(((IntPtr)dyn.Invoke(null, new[] { org_v1.GetValueAbstract(), org_v2.GetValueAbstract() }))); break; } return ret; } // Token: 0x0600026E RID: 622 RVA: 0x000110D8 File Offset: 0x0000F2D8 private void Ldind(Type t) // \u0005 { PushVariant(VariantFactory.Convert(FetchByAddr(PopVariant()).GetValueAbstract(), t)); } // Token: 0x0600026F RID: 623 RVA: 0x00011104 File Offset: 0x0000F304 private void Starg_(VariantBase vidx) // \u000F\u2008\u2000 { var idx = (UshortVariant)vidx; _variantOutputArgs[idx.GetValue()].CopyFrom(PopVariant()); } // Token: 0x06000270 RID: 624 RVA: 0x00011138 File Offset: 0x0000F338 private void Ret() // \u0008 { _retFound = true; } // Token: 0x06000273 RID: 627 RVA: 0x00011480 File Offset: 0x0000F680 private void Stind_r8_(VariantBase dummy) // \u0005\u2004\u2000 { Stind(); } // Token: 0x06000275 RID: 629 RVA: 0x00011510 File Offset: 0x0000F710 private void Rethrow_(VariantBase dummy) // \u0003\u200A\u2000 { if (_exception == null) { throw new InvalidOperationException(); } _myBufferPos = _myBufferReader.GetBuffer().GetPos(); ThrowStoreCrossDomain(_exception); } // Token: 0x06000278 RID: 632 RVA: 0x00011838 File Offset: 0x0000FA38 private void Ldelem_u4_(VariantBase dummy) // \u0003\u2003 { Ldelem(typeof(uint)); } // Token: 0x0600027A RID: 634 RVA: 0x00011994 File Offset: 0x0000FB94 private void Invoke(VmMethodRefTokenInfo mref) // \u0002 { //var arg_18_0 = (U0008U2007)U0003U2008.Get_u0005(); var methodBase = FindMethodById(mref.Pos, ReadToken(mref.Pos)); //methodBase.GetParameters(); var pos = mref.Flags; var mayVirtual = (pos & 1073741824) != 0; pos &= -1073741825; var methodGenericArgs = _methodGenericArgs; var classGenericArgs = _classGenericArgs; try { _methodGenericArgs = methodBase is ConstructorInfo ? Type.EmptyTypes : methodBase.GetGenericArguments(); _classGenericArgs = methodBase.DeclaringType.GetGenericArguments(); Invoke(pos, _methodGenericArgs, _classGenericArgs, mayVirtual); } finally { _methodGenericArgs = methodGenericArgs; _classGenericArgs = classGenericArgs; } } // Token: 0x0600027B RID: 635 RVA: 0x00011A5C File Offset: 0x0000FC5C private void Ldc_i8_(VariantBase val) // \u0006\u2007\u2000 { PushVariant(val); } // Token: 0x0600027E RID: 638 RVA: 0x00011CB8 File Offset: 0x0000FEB8 private void Ldelem_r8_(VariantBase dummy) // \u000E\u2002\u2000 { Ldelem(typeof(double)); } // Token: 0x06000280 RID: 640 RVA: 0x00011DB4 File Offset: 0x0000FFB4 private void Stloc_3_(VariantBase dummy) // \u0003\u2004\u2000 { PopToLocal(3); } // Token: 0x06000281 RID: 641 RVA: 0x00011DC0 File Offset: 0x0000FFC0 private void Ckfinite_(VariantBase dummy) // \u000F\u2003 { var v = PopVariant(); if (v.GetTypeCode() == VariantBase.Vtc.Tc5Enum) { v = VariantBase.SignedVariantFromEnum((EnumVariant)v); } double val = double.NaN; bool con = v.GetValueAbstract() is IConvertible; if (con) { val = Convert.ToDouble(v.GetValueAbstract()); if (double.IsNaN(val) || double.IsInfinity(val)) { throw new OverflowException(StringDecryptor.GetString(-1550347095) /* The value is not finite real number. */); } } if (IsFloating(v)) { PushVariant(v); } else { var push = new DoubleVariant(); push.SetValue(val); PushVariant(push); } } // Token: 0x06000288 RID: 648 RVA: 0x00012170 File Offset: 0x00010370 private void Stind_ref_(VariantBase dummy) // \u0002\u2008 { Stind(); } // Token: 0x06000289 RID: 649 RVA: 0x00012178 File Offset: 0x00010378 private void PopToLocal(int idx) // \u0002 { var pop = PopVariant(); if (pop is ReferenceVariantBase) { _localVariables[idx] = pop; return; } _localVariables[idx].CopyFrom(pop); } // Token: 0x0600028B RID: 651 RVA: 0x00012260 File Offset: 0x00010460 private void Ldobj_(VariantBase vTypeId) // \u000E\u2008 { var type = GetTypeById(((IntVariant)vTypeId).GetValue()); Ldind(type); } // Token: 0x0600028C RID: 652 RVA: 0x00012288 File Offset: 0x00010488 private void Ldloc_1_(VariantBase dummy) // \u0003\u2008\u2000 { PushVariant(_localVariables[1].Clone()); } // Token: 0x0600028E RID: 654 RVA: 0x00012348 File Offset: 0x00010548 private void Ldelem_i1_(VariantBase dummy) // \u0005\u2009\u2000 { Ldelem(typeof(sbyte)); } // Token: 0x06000290 RID: 656 RVA: 0x00012370 File Offset: 0x00010570 private void JumpToPos(uint val) // \u0002 { _storedPos = val; } // Token: 0x06000291 RID: 657 RVA: 0x00012380 File Offset: 0x00010580 public void VoidInvoke(Stream virtualizedStream, string pos, object[] args) // \u0002 { Invoke(virtualizedStream, pos, args); } // Token: 0x06000295 RID: 661 RVA: 0x00012420 File Offset: 0x00010620 private void _u0002u2002u2001(VariantBase dummy) // \u0002\u2002\u2001 { } // Token: 0x06000298 RID: 664 RVA: 0x00012590 File Offset: 0x00010790 private void LoopUntilRet() // \u0005\u2000 { var usedSize = _myBufferReader.GetBuffer().UsedSize(); while (!_retFound) { if (_storedPos.HasValue) { _myBufferReader.GetBuffer().SetPos((long)(ulong)_storedPos.Value); _storedPos = null; } ExecuteNextInstruction(); if (_myBufferReader.GetBuffer().GetPos() >= usedSize && !_storedPos.HasValue) { break; } } } // Token: 0x06000299 RID: 665 RVA: 0x00012614 File Offset: 0x00010814 private VmInstrInfo GetInstrById(int id) // \u0002 { return _instrCodesDb.MyFieldsEnumerator().FirstOrDefault(current => current.Id == id); } // Token: 0x0600029A RID: 666 RVA: 0x00012670 File Offset: 0x00010870 private void Ldloc_(VariantBase val) // \u000F\u200A\u2000 { PushVariant(_localVariables[((UshortVariant)val).GetValue()].Clone()); } // Token: 0x0600029E RID: 670 RVA: 0x00012718 File Offset: 0x00010918 private bool Isinst(VariantBase obj, Type t) // \u0002 { if (obj.GetValueAbstract() == null) { return true; } var type = obj.GetVariantType() ?? obj.GetValueAbstract().GetType(); if (type == t || t.IsAssignableFrom(type)) { return true; } if (!type.IsValueType && !t.IsValueType && Marshal.IsComObject(obj.GetValueAbstract())) { IntPtr intPtr; try { intPtr = Marshal.GetComInterfaceForObject(obj.GetValueAbstract(), t); } catch (InvalidCastException) { intPtr = IntPtr.Zero; } if (intPtr != IntPtr.Zero) { try { Marshal.Release(intPtr); } catch { } return true; } } return false; } // Token: 0x0600029F RID: 671 RVA: 0x000127C4 File Offset: 0x000109C4 private void Ldind_r8_(VariantBase dummy) // \u000E\u2008\u2000 { Ldind(typeof(double)); } // Token: 0x060002A1 RID: 673 RVA: 0x00012870 File Offset: 0x00010A70 private void Stobj_(VariantBase dummy) // \u0005\u2009 { Stind(); } // Token: 0x060002A4 RID: 676 RVA: 0x00012A44 File Offset: 0x00010C44 private void Cgt_un_(VariantBase dummy) // \u0006\u2002 { var v2 = PopVariant(); var v1 = PopVariant(); var push = new IntVariant(); push.SetValue(UniCompare(v1, v2, ComparisonKind.GT, true) ? 1 : 0); PushVariant(push); } // Token: 0x060002A7 RID: 679 RVA: 0x00012CDC File Offset: 0x00010EDC private bool AreCompatible(Type t1, UniversalTokenInfo ut2) // \u0002 { var t2 = (VmClassTokenInfo)ut2.VmToken; if (ElementedTypeHelper.TryGoToElementType(t1).IsGenericParameter) { return t2 == null || t2.IsOuterClassGeneric; } return TypeCompatibility.Check(t1, GetTypeById(ut2.MetadataToken)); } // Token: 0x060002A9 RID: 681 RVA: 0x00012D38 File Offset: 0x00010F38 private void Ldloca_(VariantBase vLocIdx) // \u0006\u2005 { var push = new LocalsIdxHolderVariant(); push.SetValue(((UshortVariant)vLocIdx).GetValue()); PushVariant(push); } // Token: 0x060002AA RID: 682 RVA: 0x00012D64 File Offset: 0x00010F64 private void Ldarg_3_(VariantBase dummy) // \u000E\u2009 { PushVariant(_variantOutputArgs[3].Clone()); } // Token: 0x060002AC RID: 684 RVA: 0x00012DB8 File Offset: 0x00010FB8 /*[Conditional("DEBUG")] public static void DoNothing(string dummy) // \u0002 { }*/ // Token: 0x0600021F RID: 543 RVA: 0x0000C8BC File Offset: 0x0000AABC private Dictionary CreateVmInstrDb() // \u0002 { return new Dictionary(256) { { _instrCodesDb.Conv_ovf_i4_un_.Id, new VmInstr(_instrCodesDb.Conv_ovf_i4_un_, Conv_ovf_i4_un_) }, { _instrCodesDb.Shr_un_.Id, new VmInstr(_instrCodesDb.Shr_un_, Shr_un_) }, { _instrCodesDb.Conv_i_.Id, new VmInstr(_instrCodesDb.Conv_i_, Conv_i_) }, { _instrCodesDb.Conv_ovf_i_un_.Id, new VmInstr(_instrCodesDb.Conv_ovf_i_un_, Conv_ovf_i_un_) }, { _instrCodesDb.Stelem_i_.Id, new VmInstr(_instrCodesDb.Stelem_i_, Stelem_i_) }, { _instrCodesDb.Starg_s_.Id, new VmInstr(_instrCodesDb.Starg_s_, Starg_s_) }, { _instrCodesDb.Sizeof_.Id, new VmInstr(_instrCodesDb.Sizeof_, Sizeof_) }, { _instrCodesDb.Ldarg_s_.Id, new VmInstr(_instrCodesDb.Ldarg_s_, Ldarg_s_) }, { _instrCodesDb.Stelem_i4_.Id, new VmInstr(_instrCodesDb.Stelem_i4_, Stelem_i4_) }, { _instrCodesDb.Calli_.Id, new VmInstr(_instrCodesDb.Calli_, Calli_) }, { _instrCodesDb.Ldc_i4_7_.Id, new VmInstr(_instrCodesDb.Ldc_i4_7_, Ldc_i4_7_) }, { _instrCodesDb.Newobj_.Id, new VmInstr(_instrCodesDb.Newobj_, Newobj_) }, { _instrCodesDb.Ldind_u4_.Id, new VmInstr(_instrCodesDb.Ldind_u4_, Ldind_u4_) }, { _instrCodesDb.Cgt_un_.Id, new VmInstr(_instrCodesDb.Cgt_un_, Cgt_un_) }, { _instrCodesDb.Conv_u1_.Id, new VmInstr(_instrCodesDb.Conv_u1_, Conv_u1_) }, { _instrCodesDb.Ldelem_ref_.Id, new VmInstr(_instrCodesDb.Ldelem_ref_, Ldelem_ref_) }, { _instrCodesDb.U0006U2008U2000.Id, new VmInstr(_instrCodesDb.U0006U2008U2000, _u0002u2002u2001) }, { _instrCodesDb.Newarr_.Id, new VmInstr(_instrCodesDb.Newarr_, Newarr_) }, { _instrCodesDb.Ldarga_s_.Id, new VmInstr(_instrCodesDb.Ldarga_s_, Ldarga_s_) }, { _instrCodesDb.Bgt_.Id, new VmInstr(_instrCodesDb.Bgt_, Bgt_) }, { _instrCodesDb.Ldflda_.Id, new VmInstr(_instrCodesDb.Ldflda_, Ldflda_) }, { _instrCodesDb.Sub_.Id, new VmInstr(_instrCodesDb.Sub_, Sub_) }, { _instrCodesDb.Endfilter_.Id, new VmInstr(_instrCodesDb.Endfilter_, Endfilter_) }, { _instrCodesDb.Conv_ovf_u_un_.Id, new VmInstr(_instrCodesDb.Conv_ovf_u_un_, Conv_ovf_u_un_) }, { _instrCodesDb.Ldc_i4_1_.Id, new VmInstr(_instrCodesDb.Ldc_i4_1_, Ldc_i4_1_) }, { _instrCodesDb.Conv_ovf_i_.Id, new VmInstr(_instrCodesDb.Conv_ovf_i_, Conv_ovf_i_) }, { _instrCodesDb.Add_ovf_.Id, new VmInstr(_instrCodesDb.Add_ovf_, Add_ovf_) }, { _instrCodesDb.Ldftn_.Id, new VmInstr(_instrCodesDb.Ldftn_, Ldftn_) }, { _instrCodesDb.Stfld_.Id, new VmInstr(_instrCodesDb.Stfld_, Stfld_) }, { _instrCodesDb.Ldc_i4_5_.Id, new VmInstr(_instrCodesDb.Ldc_i4_5_, Ldc_i4_5_) }, { _instrCodesDb.Xor_.Id, new VmInstr(_instrCodesDb.Xor_, Xor_) }, { _instrCodesDb.Conv_u2_.Id, new VmInstr(_instrCodesDb.Conv_u2_, Conv_u2_) }, { _instrCodesDb.Div_un_.Id, new VmInstr(_instrCodesDb.Div_un_, Div_un_) }, { _instrCodesDb.Stloc_3_.Id, new VmInstr(_instrCodesDb.Stloc_3_, Stloc_3_) }, { _instrCodesDb.Ret_.Id, new VmInstr(_instrCodesDb.Ret_, Ret_) }, { _instrCodesDb.Ldc_i4_m1_.Id, new VmInstr(_instrCodesDb.Ldc_i4_m1_, Ldc_i4_m1_) }, { _instrCodesDb.Ldarg_1_.Id, new VmInstr(_instrCodesDb.Ldarg_1_, Ldarg_1_) }, { _instrCodesDb.Div_.Id, new VmInstr(_instrCodesDb.Div_, Div_) }, { _instrCodesDb.Ldnull_.Id, new VmInstr(_instrCodesDb.Ldnull_, Ldnull_) }, { _instrCodesDb.Break_.Id, new VmInstr(_instrCodesDb.Break_, Break_) }, { _instrCodesDb.Cgt_.Id, new VmInstr(_instrCodesDb.Cgt_, Cgt_) }, { _instrCodesDb.Arglist_.Id, new VmInstr(_instrCodesDb.Arglist_, Arglist_) }, { _instrCodesDb.Ldloc_.Id, new VmInstr(_instrCodesDb.Ldloc_, Ldloc_) }, { _instrCodesDb.Conv_u_.Id, new VmInstr(_instrCodesDb.Conv_u_, Conv_u_) }, { _instrCodesDb.Ldelem_i_.Id, new VmInstr(_instrCodesDb.Ldelem_i_, Ldelem_i_) }, { _instrCodesDb.Conv_ovf_i1_un_.Id, new VmInstr(_instrCodesDb.Conv_ovf_i1_un_, Conv_ovf_i1_un_) }, { _instrCodesDb.Cpblk_.Id, new VmInstr(_instrCodesDb.Cpblk_, Cpblk_) }, { _instrCodesDb.Add_.Id, new VmInstr(_instrCodesDb.Add_, Add_) }, { _instrCodesDb.Initblk_.Id, new VmInstr(_instrCodesDb.Initblk_, Initblk_) }, { _instrCodesDb.Ldind_i_.Id, new VmInstr(_instrCodesDb.Ldind_i_, Ldind_i_) }, { _instrCodesDb.Ldelem_u4_.Id, new VmInstr(_instrCodesDb.Ldelem_u4_, Ldelem_u4_) }, { _instrCodesDb.Stind_ref_.Id, new VmInstr(_instrCodesDb.Stind_ref_, Stind_ref_) }, { _instrCodesDb.Ldelem_i1_.Id, new VmInstr(_instrCodesDb.Ldelem_i1_, Ldelem_i1_) }, { _instrCodesDb.Ldloc_3_.Id, new VmInstr(_instrCodesDb.Ldloc_3_, Ldloc_3_) }, { _instrCodesDb.Stind_i8_.Id, new VmInstr(_instrCodesDb.Stind_i8_, Stind_i8_) }, { _instrCodesDb.Conv_i1_.Id, new VmInstr(_instrCodesDb.Conv_i1_, Conv_i1_) }, { _instrCodesDb.Ldelem_.Id, new VmInstr(_instrCodesDb.Ldelem_, Ldelem_) }, { _instrCodesDb.Clt_un_.Id, new VmInstr(_instrCodesDb.Clt_un_, Clt_un_) }, { _instrCodesDb.Ldelem_i4_.Id, new VmInstr(_instrCodesDb.Ldelem_i4_, Ldelem_i4_) }, { _instrCodesDb.Mkrefany_.Id, new VmInstr(_instrCodesDb.Mkrefany_, Mkrefany_) }, { _instrCodesDb.Neg_.Id, new VmInstr(_instrCodesDb.Neg_, Neg_) }, { _instrCodesDb.Leave_.Id, new VmInstr(_instrCodesDb.Leave_, Leave_) }, { _instrCodesDb.Ldc_i4_2_.Id, new VmInstr(_instrCodesDb.Ldc_i4_2_, Ldc_i4_2_) }, { _instrCodesDb.Conv_ovf_i2_.Id, new VmInstr(_instrCodesDb.Conv_ovf_i2_, Conv_ovf_i2_) }, { _instrCodesDb.Ldloc_2_.Id, new VmInstr(_instrCodesDb.Ldloc_2_, Ldloc_2_) }, { _instrCodesDb.Bgt_un_.Id, new VmInstr(_instrCodesDb.Bgt_un_, Bgt_un_) }, { _instrCodesDb.Stsfld_.Id, new VmInstr(_instrCodesDb.Stsfld_, Stsfld_) }, /*{ _instrCodesDb.Nop_.Id, new VmInstr(_instrCodesDb.Nop_, u000Fu2004) },*/ { _instrCodesDb.Shr_.Id, new VmInstr(_instrCodesDb.Shr_, Shr_) }, { _instrCodesDb.Ldind_ref_.Id, new VmInstr(_instrCodesDb.Ldind_ref_, Ldind_ref_) }, { _instrCodesDb.Ldfld_.Id, new VmInstr(_instrCodesDb.Ldfld_, Ldfld_) }, { _instrCodesDb.Ldlen_.Id, new VmInstr(_instrCodesDb.Ldlen_, Ldlen_) }, { _instrCodesDb.Stelem_ref_.Id, new VmInstr(_instrCodesDb.Stelem_ref_, Stelem_ref_) }, { _instrCodesDb.Ceq_.Id, new VmInstr(_instrCodesDb.Ceq_, Ceq_) }, { _instrCodesDb.Conv_ovf_u2_.Id, new VmInstr(_instrCodesDb.Conv_ovf_u2_, Conv_ovf_u2_) }, { _instrCodesDb.Add_ovf_un_.Id, new VmInstr(_instrCodesDb.Add_ovf_un_, Add_ovf_un_) }, { _instrCodesDb.Conv_ovf_i8_.Id, new VmInstr(_instrCodesDb.Conv_ovf_i8_, Conv_ovf_i8_) }, { _instrCodesDb.Stind_i2_.Id, new VmInstr(_instrCodesDb.Stind_i2_, Stind_i2_) }, { _instrCodesDb.Stelem_i1_.Id, new VmInstr(_instrCodesDb.Stelem_i1_, Stelem_i1_) }, { _instrCodesDb.Ldloca_.Id, new VmInstr(_instrCodesDb.Ldloca_, Ldloca_) }, { _instrCodesDb.Stind_r4_.Id, new VmInstr(_instrCodesDb.Stind_r4_, Stind_r4_) }, { _instrCodesDb.Stloc_s_.Id, new VmInstr(_instrCodesDb.Stloc_s_, Stloc_s_) }, { _instrCodesDb.Refanyval_.Id, new VmInstr(_instrCodesDb.Refanyval_, Refanyval_) }, { _instrCodesDb.Clt_.Id, new VmInstr(_instrCodesDb.Clt_, Clt_) }, { _instrCodesDb.Stelem_r4_.Id, new VmInstr(_instrCodesDb.Stelem_r4_, Stelem_r4_) }, { _instrCodesDb.Stelem_r8_.Id, new VmInstr(_instrCodesDb.Stelem_r8_, Stelem_r8_) }, { _instrCodesDb.Conv_u4_.Id, new VmInstr(_instrCodesDb.Conv_u4_, Conv_u4_) }, { _instrCodesDb.Ldc_i8_.Id, new VmInstr(_instrCodesDb.Ldc_i8_, Ldc_i8_) }, { _instrCodesDb.Ldind_r4_.Id, new VmInstr(_instrCodesDb.Ldind_r4_, Ldind_r4_) }, { _instrCodesDb.Conv_r_un_.Id, new VmInstr(_instrCodesDb.Conv_r_un_, Conv_r_un_) }, { _instrCodesDb.Ldtoken_.Id, new VmInstr(_instrCodesDb.Ldtoken_, Ldtoken_) }, { _instrCodesDb.Blt_un_.Id, new VmInstr(_instrCodesDb.Blt_un_, Blt_un_) }, { _instrCodesDb.Brtrue_.Id, new VmInstr(_instrCodesDb.Brtrue_, Brtrue_) }, { _instrCodesDb.Switch_.Id, new VmInstr(_instrCodesDb.Switch_, Switch_) }, { _instrCodesDb.Refanytype_.Id, new VmInstr(_instrCodesDb.Refanytype_, Refanytype_) }, { _instrCodesDb.Stobj_.Id, new VmInstr(_instrCodesDb.Stobj_, Stobj_) }, { _instrCodesDb.Ble_un_.Id, new VmInstr(_instrCodesDb.Ble_un_, Ble_un_) }, { _instrCodesDb.Conv_ovf_i8_un_.Id, new VmInstr(_instrCodesDb.Conv_ovf_i8_un_, Conv_ovf_i8_un_) }, { _instrCodesDb.Conv_ovf_u4_un_.Id, new VmInstr(_instrCodesDb.Conv_ovf_u4_un_, Conv_ovf_u4_un_) }, { _instrCodesDb.Ldind_i8_.Id, new VmInstr(_instrCodesDb.Ldind_i8_, Ldind_i8_) }, { _instrCodesDb.U000EU2006U2000.Id, new VmInstr(_instrCodesDb.U000EU2006U2000, Invoke) }, { _instrCodesDb.Endfinally_.Id, new VmInstr(_instrCodesDb.Endfinally_, Endfinally_) }, { _instrCodesDb.Conv_ovf_u8_un_.Id, new VmInstr(_instrCodesDb.Conv_ovf_u8_un_, Conv_ovf_u8_un_) }, { _instrCodesDb.Ldelem_i2_.Id, new VmInstr(_instrCodesDb.Ldelem_i2_, Ldelem_i2_) }, { _instrCodesDb.Ldc_i4_.Id, new VmInstr(_instrCodesDb.Ldc_i4_, Ldc_i4_) }, { _instrCodesDb.U000FU2001.Id, new VmInstr(_instrCodesDb.U000FU2001, _u0006u2003u2001) }, { _instrCodesDb.Conv_i4_.Id, new VmInstr(_instrCodesDb.Conv_i4_, Conv_i4_) }, { _instrCodesDb.Ldind_u1_.Id, new VmInstr(_instrCodesDb.Ldind_u1_, Ldind_u1_) }, { _instrCodesDb.Rethrow_.Id, new VmInstr(_instrCodesDb.Rethrow_, Rethrow_) }, { _instrCodesDb.Conv_ovf_i1_.Id, new VmInstr(_instrCodesDb.Conv_ovf_i1_, Conv_ovf_i1_) }, { _instrCodesDb.Box_.Id, new VmInstr(_instrCodesDb.Box_, Box_) }, { _instrCodesDb.Localloc_.Id, new VmInstr(_instrCodesDb.Localloc_, Localloc_) }, { _instrCodesDb.Ldelem_r8_.Id, new VmInstr(_instrCodesDb.Ldelem_r8_, Ldelem_r8_) }, { _instrCodesDb.Throw_.Id, new VmInstr(_instrCodesDb.Throw_, Throw_) }, { _instrCodesDb.Ldvirtftn_.Id, new VmInstr(_instrCodesDb.Ldvirtftn_, Ldvirtftn_) }, { _instrCodesDb.Mul_ovf_un_.Id, new VmInstr(_instrCodesDb.Mul_ovf_un_, Mul_ovf_un_) }, { _instrCodesDb.Conv_ovf_i4_.Id, new VmInstr(_instrCodesDb.Conv_ovf_i4_, Conv_ovf_i4_) }, { _instrCodesDb.Ldloc_0_.Id, new VmInstr(_instrCodesDb.Ldloc_0_, Ldloc_0_) }, { _instrCodesDb.Starg_.Id, new VmInstr(_instrCodesDb.Starg_, Starg_) }, { _instrCodesDb.Stind_i1_.Id, new VmInstr(_instrCodesDb.Stind_i1_, Stind_i1_) }, { _instrCodesDb.Ldind_i2_.Id, new VmInstr(_instrCodesDb.Ldind_i2_, Ldind_i2_) }, { _instrCodesDb.And_.Id, new VmInstr(_instrCodesDb.And_, And_) }, { _instrCodesDb.Ldc_i4_6_.Id, new VmInstr(_instrCodesDb.Ldc_i4_6_, Ldc_i4_6_) }, { _instrCodesDb.Nop_.Id, new VmInstr(_instrCodesDb.Nop_, Nop_) }, { _instrCodesDb.Ldind_i4_.Id, new VmInstr(_instrCodesDb.Ldind_i4_, Ldind_i4_) }, { _instrCodesDb.Dup_.Id, new VmInstr(_instrCodesDb.Dup_, Dup_) }, { _instrCodesDb.Mul_.Id, new VmInstr(_instrCodesDb.Mul_, Mul_) }, { _instrCodesDb.Stloc_2_.Id, new VmInstr(_instrCodesDb.Stloc_2_, Stloc_2_) }, { _instrCodesDb.Or_.Id, new VmInstr(_instrCodesDb.Or_, Or_) }, { _instrCodesDb.Conv_u8_.Id, new VmInstr(_instrCodesDb.Conv_u8_, Conv_u8_) }, { _instrCodesDb.Conv_ovf_u1_.Id, new VmInstr(_instrCodesDb.Conv_ovf_u1_, Conv_ovf_u1_) }, { _instrCodesDb.Sub_ovf_.Id, new VmInstr(_instrCodesDb.Sub_ovf_, Sub_ovf_) }, { _instrCodesDb.Conv_ovf_u1_un_.Id, new VmInstr(_instrCodesDb.Conv_ovf_u1_un_, Conv_ovf_u1_un_) }, { _instrCodesDb.Ldelem_r4_.Id, new VmInstr(_instrCodesDb.Ldelem_r4_, Ldelem_r4_) }, { _instrCodesDb.Conv_r8_.Id, new VmInstr(_instrCodesDb.Conv_r8_, Conv_r8_) }, { _instrCodesDb.Stloc_0_.Id, new VmInstr(_instrCodesDb.Stloc_0_, Stloc_0_) }, { _instrCodesDb.Conv_ovf_u8_.Id, new VmInstr(_instrCodesDb.Conv_ovf_u8_, Conv_ovf_u8_) }, { _instrCodesDb.Brfalse_.Id, new VmInstr(_instrCodesDb.Brfalse_, Brfalse_) }, { _instrCodesDb.Ldarg_3_.Id, new VmInstr(_instrCodesDb.Ldarg_3_, Ldarg_3_) }, { _instrCodesDb.Ldarg_.Id, new VmInstr(_instrCodesDb.Ldarg_, Ldarg_) }, { _instrCodesDb.Ldc_r4_.Id, new VmInstr(_instrCodesDb.Ldc_r4_, Ldc_r4_) }, { _instrCodesDb.Initobj_.Id, new VmInstr(_instrCodesDb.Initobj_, Initobj_) }, { _instrCodesDb.Stloc_.Id, new VmInstr(_instrCodesDb.Stloc_, Stloc_) }, { _instrCodesDb.Stind_i4_.Id, new VmInstr(_instrCodesDb.Stind_i4_, Stind_i4_) }, { _instrCodesDb.Callvirt_.Id, new VmInstr(_instrCodesDb.Callvirt_, Callvirt_) }, { _instrCodesDb.Stelem_i2_.Id, new VmInstr(_instrCodesDb.Stelem_i2_, Stelem_i2_) }, { _instrCodesDb.Conv_ovf_u_.Id, new VmInstr(_instrCodesDb.Conv_ovf_u_, Conv_ovf_u_) }, { _instrCodesDb.Cpobj_.Id, new VmInstr(_instrCodesDb.Cpobj_, Cpobj_) }, { _instrCodesDb.Rem_.Id, new VmInstr(_instrCodesDb.Rem_, Rem_) }, { _instrCodesDb.Stind_r8_.Id, new VmInstr(_instrCodesDb.Stind_r8_, Stind_r8_) }, { _instrCodesDb.Stloc_1_.Id, new VmInstr(_instrCodesDb.Stloc_1_, Stloc_1_) }, { _instrCodesDb.Conv_ovf_u4_.Id, new VmInstr(_instrCodesDb.Conv_ovf_u4_, Conv_ovf_u4_) }, { _instrCodesDb.Ldc_i4_0_.Id, new VmInstr(_instrCodesDb.Ldc_i4_0_, Ldc_i4_0_) }, { _instrCodesDb.Stind_i_.Id, new VmInstr(_instrCodesDb.Stind_i_, Stind_i_) }, { _instrCodesDb.Stelem_i8_.Id, new VmInstr(_instrCodesDb.Stelem_i8_, Stelem_i8_) }, { _instrCodesDb.Ldelema_.Id, new VmInstr(_instrCodesDb.Ldelema_, Ldelema_) }, { _instrCodesDb.Ldsflda_.Id, new VmInstr(_instrCodesDb.Ldsflda_, Ldsflda_) }, { _instrCodesDb.Ldsfld_.Id, new VmInstr(_instrCodesDb.Ldsfld_, Ldsfld_) }, { _instrCodesDb.Isinst_.Id, new VmInstr(_instrCodesDb.Isinst_, Isinst_) }, { _instrCodesDb.Conv_i2_.Id, new VmInstr(_instrCodesDb.Conv_i2_, Conv_i2_) }, { _instrCodesDb.Stelem_.Id, new VmInstr(_instrCodesDb.Stelem_, Stelem_) }, { _instrCodesDb.Ldind_r8_.Id, new VmInstr(_instrCodesDb.Ldind_r8_, Ldind_r8_) }, { _instrCodesDb.Ldc_r8_.Id, new VmInstr(_instrCodesDb.Ldc_r8_, Ldc_r8_) }, { _instrCodesDb.Bge_.Id, new VmInstr(_instrCodesDb.Bge_, Bge_) }, { _instrCodesDb.Ldind_i1_.Id, new VmInstr(_instrCodesDb.Ldind_i1_, Ldind_i1_) }, { _instrCodesDb.Ldelem_u1_.Id, new VmInstr(_instrCodesDb.Ldelem_u1_, Ldelem_u1_) }, { _instrCodesDb.Ldstr_.Id, new VmInstr(_instrCodesDb.Ldstr_, Ldstr_) }, { _instrCodesDb.Ldloca_s_.Id, new VmInstr(_instrCodesDb.Ldloca_s_, Ldloca_s_) }, { _instrCodesDb.Ldelem_i8_.Id, new VmInstr(_instrCodesDb.Ldelem_i8_, Ldelem_i8_) }, { _instrCodesDb.Ldc_i4_8_.Id, new VmInstr(_instrCodesDb.Ldc_i4_8_, Ldc_i4_8_) }, { _instrCodesDb.Blt_.Id, new VmInstr(_instrCodesDb.Blt_, Blt_) }, { _instrCodesDb.Unbox_.Id, new VmInstr(_instrCodesDb.Unbox_, Unbox_) }, { _instrCodesDb.Bge_un_.Id, new VmInstr(_instrCodesDb.Bge_un_, Bge_un_) }, { _instrCodesDb.Ldelem_u2_.Id, new VmInstr(_instrCodesDb.Ldelem_u2_, Ldelem_u2_) }, { _instrCodesDb.Ldind_u2_.Id, new VmInstr(_instrCodesDb.Ldind_u2_, Ldind_u2_) }, { _instrCodesDb.Sub_ovf_un_.Id, new VmInstr(_instrCodesDb.Sub_ovf_un_, Sub_ovf_un_) }, { _instrCodesDb.Ldc_i4_4_.Id, new VmInstr(_instrCodesDb.Ldc_i4_4_, Ldc_i4_4_) }, { _instrCodesDb.Ldarg_0_.Id, new VmInstr(_instrCodesDb.Ldarg_0_, Ldarg_0_) }, { _instrCodesDb.Rem_un_.Id, new VmInstr(_instrCodesDb.Rem_un_, Rem_un_) }, { _instrCodesDb.Ldloc_1_.Id, new VmInstr(_instrCodesDb.Ldloc_1_, Ldloc_1_) }, { _instrCodesDb.Bne_un_.Id, new VmInstr(_instrCodesDb.Bne_un_, Bne_un_) }, { _instrCodesDb.Conv_ovf_i2_un_.Id, new VmInstr(_instrCodesDb.Conv_ovf_i2_un_, Conv_ovf_i2_un_) }, { _instrCodesDb.Ckfinite_.Id, new VmInstr(_instrCodesDb.Ckfinite_, Ckfinite_) }, { _instrCodesDb.Ldobj_.Id, new VmInstr(_instrCodesDb.Ldobj_, Ldobj_) }, { _instrCodesDb.Pop_.Id, new VmInstr(_instrCodesDb.Pop_, Pop_) }, { _instrCodesDb.Constrained_.Id, new VmInstr(_instrCodesDb.Constrained_, Constrained_) }, { _instrCodesDb.Ldc_i4_s_.Id, new VmInstr(_instrCodesDb.Ldc_i4_s_, Ldc_i4_s_) }, { _instrCodesDb.Ldloc_s_.Id, new VmInstr(_instrCodesDb.Ldloc_s_, Ldloc_s_) }, { _instrCodesDb.Ldarg_2_.Id, new VmInstr(_instrCodesDb.Ldarg_2_, Ldarg_2_) }, { _instrCodesDb.Ldarga_.Id, new VmInstr(_instrCodesDb.Ldarga_, Ldarga_) }, { _instrCodesDb.Conv_i8_.Id, new VmInstr(_instrCodesDb.Conv_i8_, Conv_i8_) }, { _instrCodesDb.Br_.Id, new VmInstr(_instrCodesDb.Br_, Br_) }, { _instrCodesDb.Ldc_i4_3_.Id, new VmInstr(_instrCodesDb.Ldc_i4_3_, Ldc_i4_3_) }, { _instrCodesDb.Mul_ovf_.Id, new VmInstr(_instrCodesDb.Mul_ovf_, Mul_ovf_) }, { _instrCodesDb.Shl_.Id, new VmInstr(_instrCodesDb.Shl_, Shl_) }, { _instrCodesDb.Castclass_.Id, new VmInstr(_instrCodesDb.Castclass_, Castclass_) }, { _instrCodesDb.Jmp_.Id, new VmInstr(_instrCodesDb.Jmp_, Jmp_) }, { _instrCodesDb.Beq_.Id, new VmInstr(_instrCodesDb.Beq_, Beq_) }, { _instrCodesDb.Conv_r4_.Id, new VmInstr(_instrCodesDb.Conv_r4_, Conv_r4_) }, { _instrCodesDb.Ble_.Id, new VmInstr(_instrCodesDb.Ble_, Ble_) }, { _instrCodesDb.Conv_ovf_u2_un_.Id, new VmInstr(_instrCodesDb.Conv_ovf_u2_un_, Conv_ovf_u2_un_) }, { _instrCodesDb.Call_.Id, new VmInstr(_instrCodesDb.Call_, Call_) }, { _instrCodesDb.Not_.Id, new VmInstr(_instrCodesDb.Not_, Not_) } }; } } // Token: 0x02000042 RID: 66 public sealed class LocalVarType // \u0008 { // Token: 0x060002E4 RID: 740 RVA: 0x00013F08 File Offset: 0x00012108 // Token: 0x060002E5 RID: 741 RVA: 0x00013F10 File Offset: 0x00012110 // Token: 0x04000171 RID: 369 public int TypeId /* \u0002 */ { get; set; } } // Token: 0x0200004D RID: 77 public sealed class ArgTypeToOutput // \u000E { // Token: 0x06000321 RID: 801 RVA: 0x00014C74 File Offset: 0x00012E74 // Token: 0x06000322 RID: 802 RVA: 0x00014C7C File Offset: 0x00012E7C // Token: 0x0400017C RID: 380 public int TypeId /* \u0002 */ { get; set; } // Token: 0x06000323 RID: 803 RVA: 0x00014C88 File Offset: 0x00012E88 // Token: 0x06000324 RID: 804 RVA: 0x00014C90 File Offset: 0x00012E90 // Token: 0x0400017D RID: 381 public bool IsOutput /* \u0003 */ { get; set; } } // Token: 0x0200005E RID: 94 internal sealed class CatchBlock { // Token: 0x0600036B RID: 875 RVA: 0x00015AFC File Offset: 0x00013CFC // Token: 0x0600036C RID: 876 RVA: 0x00015B04 File Offset: 0x00013D04 // Token: 0x04000189 RID: 393 public byte Kind { get; set; } // Token: 0x0600036D RID: 877 RVA: 0x00015B10 File Offset: 0x00013D10 // Token: 0x0600036E RID: 878 RVA: 0x00015B18 File Offset: 0x00013D18 // Token: 0x0400018A RID: 394 public int ExcTypeId { get; set; } // Token: 0x0600036F RID: 879 RVA: 0x00015B24 File Offset: 0x00013D24 // Token: 0x06000370 RID: 880 RVA: 0x00015B2C File Offset: 0x00013D2C // Token: 0x0400018B RID: 395 public uint PosKind4 { get; set; } // Token: 0x06000371 RID: 881 RVA: 0x00015B38 File Offset: 0x00013D38 // Token: 0x06000372 RID: 882 RVA: 0x00015B40 File Offset: 0x00013D40 // Token: 0x0400018C RID: 396 public uint Start { get; set; } // Token: 0x06000373 RID: 883 RVA: 0x00015B4C File Offset: 0x00013D4C // Token: 0x06000374 RID: 884 RVA: 0x00015B54 File Offset: 0x00013D54 // Token: 0x0400018D RID: 397 public uint Pos { get; set; } // \u0005 // Token: 0x06000375 RID: 885 RVA: 0x00015B60 File Offset: 0x00013D60 // Token: 0x06000376 RID: 886 RVA: 0x00015B68 File Offset: 0x00013D68 // Token: 0x0400018E RID: 398 public uint Len { get; set; } } // Token: 0x02000049 RID: 73 internal abstract class VmTokenInfo // \u0008\u2006 { internal enum Kind : byte { Class0, Field1, Method2, String3, MethodRef4 } // Token: 0x0600030D RID: 781 public abstract Kind TokenKind(); // \u0008\u2006\u2008\u2000\u2002\u200A\u0002 } // Token: 0x02000017 RID: 23 internal sealed class UniversalTokenInfo // \u0003\u2008 { // Token: 0x06000097 RID: 151 RVA: 0x00003E9C File Offset: 0x0000209C // Token: 0x06000098 RID: 152 RVA: 0x00003EA4 File Offset: 0x000020A4 // Token: 0x04000020 RID: 32 public byte IsVm { get; set; } // Token: 0x06000099 RID: 153 RVA: 0x00003EB0 File Offset: 0x000020B0 // Token: 0x0600009A RID: 154 RVA: 0x00003EB8 File Offset: 0x000020B8 // Token: 0x04000021 RID: 33 public int MetadataToken { get; set; } // Token: 0x0600009B RID: 155 RVA: 0x00003EC4 File Offset: 0x000020C4 // Token: 0x0600009C RID: 156 RVA: 0x00003ECC File Offset: 0x000020CC // Token: 0x04000022 RID: 34 public VmTokenInfo VmToken { get; set; } } // Token: 0x02000016 RID: 22 internal sealed class VmMethodRefTokenInfo : VmTokenInfo // \u0003\u2007 { // Token: 0x06000091 RID: 145 RVA: 0x00003E68 File Offset: 0x00002068 // Token: 0x06000092 RID: 146 RVA: 0x00003E70 File Offset: 0x00002070 // Token: 0x0400001E RID: 30 public int Flags { get; set; } // Token: 0x06000093 RID: 147 RVA: 0x00003E7C File Offset: 0x0000207C // Token: 0x06000094 RID: 148 RVA: 0x00003E84 File Offset: 0x00002084 // Token: 0x0400001F RID: 31 public int Pos { get; set; } // Token: 0x06000095 RID: 149 RVA: 0x00003E90 File Offset: 0x00002090 public override Kind TokenKind() // \u0008\u2006\u2008\u2000\u2002\u200A\u0002 { return Kind.MethodRef4; } } // Token: 0x0200004A RID: 74 internal sealed class VmMethodTokenInfo : VmTokenInfo // \u0008\u2007 { // Token: 0x0600030F RID: 783 RVA: 0x00014BB0 File Offset: 0x00012DB0 // Token: 0x06000310 RID: 784 RVA: 0x00014BB8 File Offset: 0x00012DB8 // Token: 0x04000176 RID: 374 public byte Flags { get; set; } // Token: 0x06000311 RID: 785 RVA: 0x00014BC4 File Offset: 0x00012DC4 public bool IsStatic() // \u0002 { return (Flags & 2) > 0; } // Token: 0x06000312 RID: 786 RVA: 0x00014BD4 File Offset: 0x00012DD4 public bool IsGeneric() // \u0003 { return (Flags & 1) > 0; } // Token: 0x06000313 RID: 787 RVA: 0x00014BE4 File Offset: 0x00012DE4 // Token: 0x06000314 RID: 788 RVA: 0x00014BEC File Offset: 0x00012DEC // Token: 0x04000177 RID: 375 public UniversalTokenInfo Class { get; set; } // Token: 0x06000315 RID: 789 RVA: 0x00014BF8 File Offset: 0x00012DF8 // Token: 0x06000316 RID: 790 RVA: 0x00014C00 File Offset: 0x00012E00 // Token: 0x04000178 RID: 376 public string Name { get; set; } // Token: 0x06000317 RID: 791 RVA: 0x00014C0C File Offset: 0x00012E0C // Token: 0x06000318 RID: 792 RVA: 0x00014C14 File Offset: 0x00012E14 // Token: 0x04000179 RID: 377 public UniversalTokenInfo[] Parameters { get; set; } // Token: 0x06000319 RID: 793 RVA: 0x00014C20 File Offset: 0x00012E20 // Token: 0x0600031A RID: 794 RVA: 0x00014C28 File Offset: 0x00012E28 // Token: 0x0400017A RID: 378 public UniversalTokenInfo[] GenericArguments { get; set; } // Token: 0x0600031B RID: 795 RVA: 0x00014C34 File Offset: 0x00012E34 // Token: 0x0600031C RID: 796 RVA: 0x00014C3C File Offset: 0x00012E3C // Token: 0x0400017B RID: 379 public UniversalTokenInfo ReturnType { get; set; } // Token: 0x0600031D RID: 797 RVA: 0x00014C48 File Offset: 0x00012E48 public override Kind TokenKind() // \u0008\u2006\u2008\u2000\u2002\u200A\u0002 { return Kind.Method2; } } // Token: 0x02000056 RID: 86 internal sealed class VmStringTokenInfo : VmTokenInfo // \u000E\u2007 { // Token: 0x06000343 RID: 835 RVA: 0x000153CC File Offset: 0x000135CC // Token: 0x06000344 RID: 836 RVA: 0x000153D4 File Offset: 0x000135D4 // Token: 0x04000185 RID: 389 public string Value { get; set; } // Token: 0x06000345 RID: 837 RVA: 0x000153E0 File Offset: 0x000135E0 public override Kind TokenKind() // \u0008\u2006\u2008\u2000\u2002\u200A\u0002 { return Kind.String3; } } // Token: 0x02000060 RID: 96 internal sealed class VmFieldTokenInfo : VmTokenInfo // \u000F\u2006 { // Token: 0x06000382 RID: 898 RVA: 0x00015C38 File Offset: 0x00013E38 // Token: 0x06000383 RID: 899 RVA: 0x00015C40 File Offset: 0x00013E40 // Token: 0x04000191 RID: 401 public UniversalTokenInfo Class { get; set; } // Token: 0x06000384 RID: 900 RVA: 0x00015C4C File Offset: 0x00013E4C // Token: 0x06000385 RID: 901 RVA: 0x00015C54 File Offset: 0x00013E54 // Token: 0x04000192 RID: 402 public string Name { get; set; } // Token: 0x06000386 RID: 902 RVA: 0x00015C60 File Offset: 0x00013E60 // Token: 0x06000387 RID: 903 RVA: 0x00015C68 File Offset: 0x00013E68 // Token: 0x04000193 RID: 403 public bool IsStatic { get; set; } // Token: 0x06000388 RID: 904 RVA: 0x00015C74 File Offset: 0x00013E74 public override Kind TokenKind() // \u0008\u2006\u2008\u2000\u2002\u200A\u0002 { return Kind.Field1; } } // Token: 0x02000061 RID: 97 internal sealed class VmClassTokenInfo : VmTokenInfo // \u000F\u2007 { // Token: 0x04000194 RID: 404 // Token: 0x0600038A RID: 906 RVA: 0x00015C90 File Offset: 0x00013E90 // Token: 0x0600038B RID: 907 RVA: 0x00015C98 File Offset: 0x00013E98 public string ClassName { get; set; } // Token: 0x0600038C RID: 908 RVA: 0x00015CA4 File Offset: 0x00013EA4 // Token: 0x04000195 RID: 405 // Token: 0x0600038D RID: 909 RVA: 0x00015CAC File Offset: 0x00013EAC public bool IsOuterClassGeneric { get; set; } // Token: 0x0600038E RID: 910 RVA: 0x00015CB8 File Offset: 0x00013EB8 // Token: 0x04000196 RID: 406 // Token: 0x0600038F RID: 911 RVA: 0x00015CC0 File Offset: 0x00013EC0 public bool IsGeneric { get; set; } // Token: 0x06000390 RID: 912 RVA: 0x00015CCC File Offset: 0x00013ECC // Token: 0x04000197 RID: 407 // Token: 0x06000391 RID: 913 RVA: 0x00015CD4 File Offset: 0x00013ED4 public UniversalTokenInfo[] GenericArguments { get; set; } // Token: 0x06000392 RID: 914 RVA: 0x00015CE0 File Offset: 0x00013EE0 // Token: 0x04000198 RID: 408 // Token: 0x06000393 RID: 915 RVA: 0x00015CE8 File Offset: 0x00013EE8 public int OuterClassGenericClassIdx { get; set; } = -1; // Token: 0x06000394 RID: 916 RVA: 0x00015CF4 File Offset: 0x00013EF4 // Token: 0x04000199 RID: 409 // Token: 0x06000395 RID: 917 RVA: 0x00015CFC File Offset: 0x00013EFC public int OuterClassGenericMethodIdx { get; set; } = -1; // Token: 0x06000396 RID: 918 RVA: 0x00015D08 File Offset: 0x00013F08 public override Kind TokenKind() // \u0008\u2006\u2008\u2000\u2002\u200A\u0002 { return Kind.Class0; } } }