예제 #1
0
        public IList <CilInstruction> VisitUnboxToVmExpression(CilUnboxToVmExpression expression)
        {
            var result = new List <CilInstruction>(expression.Expression.AcceptVisitor(this));

            if (expression.Type.IsTypeOf("System", "Object"))
            {
                var convertMethod = _context.VmHelperType.Methods.First(x =>
                                                                        x.Name == nameof(VmHelper.ConvertToVmType) &&
                                                                        x.Parameters.Count == 1);

                result.Add(CilInstruction.Create(CilOpCodes.Call, convertMethod));
            }
            else
            {
                var convertMethod = _context.VmHelperType.Methods.First(x =>
                                                                        x.Name == nameof(VmHelper.ConvertToVmType) &&
                                                                        x.Parameters.Count == 2);

                var typeFromHandle = _context.ReferenceImporter.ImportMethod(typeof(Type).GetMethod("GetTypeFromHandle"));
                result.AddRange(new[]
                {
                    CilInstruction.Create(CilOpCodes.Ldtoken, expression.Type),
                    CilInstruction.Create(CilOpCodes.Call, typeFromHandle),
                    CilInstruction.Create(CilOpCodes.Call, convertMethod),
                });
            }

            return(result);
        }
예제 #2
0
        public override bool VisitUnboxToVmExpression(CilUnboxToVmExpression expression)
        {
            var argument = expression.Expression;

            if (!expression.ExpectedType.IsValueType ||
                expression.ExpectedType.FullName == argument.ExpressionType.FullName)
            {
                argument.ExpectedType = expression.ExpectedType;
                expression.ReplaceWith(argument.Remove());

                argument.AcceptVisitor(this);
                return(true);
            }

            return(base.VisitUnboxToVmExpression(expression));
        }
예제 #3
0
        public IList <CilInstruction> VisitUnboxToVmExpression(CilUnboxToVmExpression expression)
        {
            var convertMethod = _context.VmHelperType.Methods.First(x => x.Name == nameof(VmHelper.ConvertToVmType));

            var result = new List <CilInstruction>(expression.Expression.AcceptVisitor(this));

            if (expression.Type.IsTypeOf("System", "Object"))
            {
                var getType = _context.ReferenceImporter.ImportMethod(typeof(object).GetMethod("GetType"));

                var endif = CilInstruction.Create(CilOpCodes.Nop);
                var @else = CilInstruction.Create(CilOpCodes.Nop);
                result.AddRange(new[]
                {
                    CilInstruction.Create(CilOpCodes.Dup),
                    CilInstruction.Create(CilOpCodes.Brtrue_S, @else),
                    CilInstruction.Create(CilOpCodes.Pop),
                    CilInstruction.Create(CilOpCodes.Ldnull),
                    CilInstruction.Create(CilOpCodes.Br_S, endif),
                    @else,
                    CilInstruction.Create(CilOpCodes.Dup),
                    CilInstruction.Create(CilOpCodes.Callvirt, getType),
                    CilInstruction.Create(CilOpCodes.Call, convertMethod),
                    endif
                });
            }
            else
            {
                var typeFromHandle = _context.ReferenceImporter.ImportMethod(typeof(Type).GetMethod("GetTypeFromHandle"));
                result.AddRange(new[]
                {
                    CilInstruction.Create(CilOpCodes.Ldtoken, expression.Type),
                    CilInstruction.Create(CilOpCodes.Call, typeFromHandle),
                    CilInstruction.Create(CilOpCodes.Call, convertMethod),
                });
            }

            return(result);
        }
예제 #4
0
 public string VisitUnboxToVmExpression(CilUnboxToVmExpression expression) => $"unbox.tovm {expression.Type}";
예제 #5
0
 public virtual bool VisitUnboxToVmExpression(CilUnboxToVmExpression expression)
 {
     return(expression.Expression.AcceptVisitor(this));
 }
예제 #6
0
 public void VisitUnboxToVmExpression(CilUnboxToVmExpression expression)
 {
     expression.Expression.AcceptVisitor(this);
 }