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); }
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)); }
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); }
public string VisitUnboxToVmExpression(CilUnboxToVmExpression expression) => $"unbox.tovm {expression.Type}";
public virtual bool VisitUnboxToVmExpression(CilUnboxToVmExpression expression) { return(expression.Expression.AcceptVisitor(this)); }
public void VisitUnboxToVmExpression(CilUnboxToVmExpression expression) { expression.Expression.AcceptVisitor(this); }