private HLLocation ProcessMethodCallExpression(IMethodCall pExpression) { List <HLLocation> locationsParameters = new List <HLLocation>(); if (pExpression.ThisArgument.Type.TypeCode != PrimitiveTypeCode.Invalid) { locationsParameters.Add(ProcessExpression(pExpression.ThisArgument)); } else if (pExpression.MethodToCall.IsStatic) { HLType typeContainer = null; if (pExpression.MethodToCall.ContainingType.ResolvedType.IsValueType) { typeContainer = HLDomain.GetOrCreateType(MutableModelHelper.GetManagedPointerTypeReference(pExpression.MethodToCall.ContainingType, HLDomain.Host.InternFactory, pExpression.MethodToCall.ContainingType)); } else { typeContainer = HLDomain.GetOrCreateType(pExpression.MethodToCall.ContainingType); } locationsParameters.Add(HLNullLocation.Create(typeContainer)); } foreach (IExpression argument in pExpression.Arguments) { locationsParameters.Add(ProcessExpression(argument)); } HLLocation locationReturn = null; HLMethod methodCalled = HLDomain.GetOrCreateMethod(pExpression.MethodToCall); if (methodCalled.ReturnType.Definition.TypeCode != PrimitiveTypeCode.Void) { locationReturn = HLTemporaryLocation.Create(CreateTemporary(methodCalled.ReturnType)); } mCurrentBlock.EmitCall(methodCalled, pExpression.IsVirtualCall, locationReturn, locationsParameters); return(locationReturn); }
private HLLocation ProcessCompileTimeConstantExpression(ICompileTimeConstant pExpression) { if (pExpression.Value == null) { return(HLNullLocation.Create(HLDomain.GetOrCreateType(pExpression.Type))); } if (pExpression.Type.ResolvedType.IsEnum) { return(HLEnumLiteralLocation.Create(HLDomain.GetOrCreateType(pExpression.Type), pExpression.Value.ToString())); } if (pExpression.Value is bool) { return(HLBooleanLiteralLocation.Create((bool)pExpression.Value)); } if (pExpression.Value is sbyte) { return(HLInt8LiteralLocation.Create((sbyte)pExpression.Value)); } if (pExpression.Value is byte) { return(HLUInt8LiteralLocation.Create((byte)pExpression.Value)); } if (pExpression.Value is char) { return(HLCharLiteralLocation.Create((char)pExpression.Value)); } if (pExpression.Value is short) { return(HLInt16LiteralLocation.Create((short)pExpression.Value)); } if (pExpression.Value is ushort) { return(HLUInt16LiteralLocation.Create((ushort)pExpression.Value)); } if (pExpression.Value is float) { return(HLFloat32LiteralLocation.Create((float)pExpression.Value)); } if (pExpression.Value is int) { return(HLInt32LiteralLocation.Create((int)pExpression.Value)); } if (pExpression.Value is uint) { return(HLUInt32LiteralLocation.Create((uint)pExpression.Value)); } if (pExpression.Value is double) { return(HLFloat64LiteralLocation.Create((double)pExpression.Value)); } if (pExpression.Value is long) { return(HLInt64LiteralLocation.Create((long)pExpression.Value)); } if (pExpression.Value is ulong) { return(HLUInt64LiteralLocation.Create((ulong)pExpression.Value)); } if (pExpression.Value is string) { return(HLStringLiteralLocation.Create((string)pExpression.Value)); } throw new NotSupportedException(); }