private static void BoxIfGeneric(XTypeReference type, AstExpression node) { // TODO: CLR allows return-by-reference, though C# does not. Do we need to handle this here? if (type.IsGenericParameter) { var resultType = node.GetResultType(); if (resultType.IsPrimitive) { var clone = new AstExpression(node); node.SetCode(AstCode.BoxToGeneric) .SetArguments(clone) .Operand = type; } } else if (type.IsGenericParameterArray()) { var resultType = node.GetResultType().ElementType; if (resultType.IsPrimitive) { var clone = new AstExpression(node); node.SetCode(AstCode.BoxToGeneric).SetArguments(clone).Operand = type; } } }
private static void UnboxIfGeneric(XTypeReference type, AstExpression node, XTypeSystem typeSystem) { if (type.IsGenericParameter || type.IsGenericParameterArray()) { var resultType = node.GetResultType(); if (resultType.IsByReference && !type.IsByReference) { var elementType = resultType.ElementType; var clone = new AstExpression(node); node.SetCode(AstCode.SimpleCastclass).SetArguments(clone).Operand = elementType; } else { if (TreatAsStruct(type, resultType)) { ConvertUnboxStruct(node, resultType, typeSystem); } else { var clone = new AstExpression(node); node.SetCode(AstCode.UnboxFromGeneric).SetArguments(clone).Operand = type; } } } }