示例#1
0
        private static void GenerateNativeEnumerable(MethodDefinition method, TypeReference TTo, ModuleDefinition systemModule)
        {
            var create = method.ReturnType.FindMethod("Create", 2);

            var invalidCastException = method.Module.ImportReference(systemModule.GetType("System", nameof(InvalidCastException)));

            var success = Instruction.Create(OpCodes.Sizeof, TTo);

            var enumerable = new GenericInstanceType(method.DeclaringType)
            {
                GenericArguments = { method.DeclaringType.GenericParameters[0] }
            };

            method.Body.GetILProcessor()
            .LdArg(0)
            .LdFld(enumerable.FindField("Ptr"))
            .LdArg(0)
            .LdFld(enumerable.FindField("Length"))
            .SizeOf(enumerable.GenericArguments[0])
            .ConvI8()
            .Mul()     // byte長さ
            .Dup()     // 比較用ベース
            .Dup()     // 比較用計算後
            .SizeOf(TTo)
            .Div()
            .SizeOf(TTo)
            .Add(Instruction.Create(OpCodes.Mul))
            .BeqS(success)
            .Pop()
            .Pop()
            .NewObj(invalidCastException.FindMethod(".ctor", 0))
            .Throw()
            .Add(success)
            .Div()
            .Call(create)
            .Ret();
        }