Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / Microsoft / Scripting / Compiler / ConstantCheck.cs / 1305376 / ConstantCheck.cs
/* ****************************************************************************
*
* Copyright (c) Microsoft Corporation.
*
* This source code is subject to terms and conditions of the Microsoft Public License. A
* copy of the license can be found in the License.html file at the root of this distribution. If
* you cannot locate the Microsoft Public License, please send an email to
* dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound
* by the terms of the Microsoft Public License.
*
* You must not remove this notice, or any other, from this software.
*
*
* ***************************************************************************/
using System.Diagnostics;
using System.Dynamic.Utils;
namespace System.Linq.Expressions {
internal enum AnalyzeTypeIsResult {
KnownFalse,
KnownTrue,
KnownAssignable, // need null check only
Unknown, // need full runtime check
}
internal static class ConstantCheck {
internal static bool IsNull(Expression e) {
if (e.NodeType == ExpressionType.Constant) {
return ((ConstantExpression)e).Value == null;
}
return false;
}
///
/// If the result of a TypeBinaryExpression is known statically, this
/// returns the result, otherwise it returns null, meaning we'll need
/// to perform the IsInst instruction at runtime.
///
/// The result of this function must be equivalent to IsInst, or
/// null.
///
internal static AnalyzeTypeIsResult AnalyzeTypeIs(TypeBinaryExpression typeIs) {
return AnalyzeTypeIs(typeIs.Expression, typeIs.TypeOperand);
}
///
/// If the result of a unary TypeAs expression is known statically, this
/// returns the result, otherwise it returns null, meaning we'll need
/// to perform the IsInst instruction at runtime.
///
/// The result of this function must be equivalent to IsInst, or
/// null.
///
internal static AnalyzeTypeIsResult AnalyzeTypeIs(UnaryExpression typeAs) {
Debug.Assert(typeAs.NodeType == ExpressionType.TypeAs);
return AnalyzeTypeIs(typeAs.Operand, typeAs.Type);
}
///
/// If the result of an isinst opcode is known statically, this
/// returns the result, otherwise it returns null, meaning we'll need
/// to perform the IsInst instruction at runtime.
///
/// The result of this function must be equivalent to IsInst, or
/// null.
///
private static AnalyzeTypeIsResult AnalyzeTypeIs(Expression operand, Type testType) {
Type operandType = operand.Type;
// Oddly, we allow void operands
// This is LinqV1 behavior of TypeIs
if (operandType == typeof(void)) {
return AnalyzeTypeIsResult.KnownFalse;
}
//
// Type comparisons treat nullable types as if they were the
// underlying type. The reason is when you box a nullable it
// becomes a boxed value of the underlying type, or null.
//
Type nnOperandType = operandType.GetNonNullableType();
Type nnTestType = testType.GetNonNullableType();
//
// See if we can determine the answer based on the static types
//
// Extensive testing showed that Type.IsAssignableFrom,
// Type.IsInstanceOfType, and the isinst instruction were all
// equivalent when used against a live object
//
if (nnTestType.IsAssignableFrom(nnOperandType)) {
// If the operand is a value type (other than nullable), we
// know the result is always true.
if (operandType.IsValueType && !operandType.IsNullableType()) {
return AnalyzeTypeIsResult.KnownTrue;
}
// For reference/nullable types, we need to compare to null at runtime
return AnalyzeTypeIsResult.KnownAssignable;
}
// We used to have an if IsSealed, return KnownFalse check here.
// but that doesn't handle generic types & co/contravariance correctly.
// So just use IsInst, which we know always gives us the right answer.
// Otherwise we need a full runtime check
return AnalyzeTypeIsResult.Unknown;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- remotingproxy.cs
- EntityDataSourceDesigner.cs
- ProxyElement.cs
- TableRow.cs
- CommunicationObjectFaultedException.cs
- ResponseBodyWriter.cs
- MenuItemStyle.cs
- DeclaredTypeElementCollection.cs
- AsyncResult.cs
- ListDictionary.cs
- WindowPatternIdentifiers.cs
- Rijndael.cs
- GlyphingCache.cs
- CallbackValidator.cs
- IntPtr.cs
- WindowsListViewItemCheckBox.cs
- WebZoneDesigner.cs
- GridEntry.cs
- HijriCalendar.cs
- NamespaceEmitter.cs
- MetadataCacheItem.cs
- SmtpNegotiateAuthenticationModule.cs
- SharedStream.cs
- WebPartAuthorizationEventArgs.cs
- DefaultClaimSet.cs
- TypedCompletedAsyncResult.cs
- WindowsTokenRoleProvider.cs
- LiteralTextContainerControlBuilder.cs
- CqlWriter.cs
- MasterPageBuildProvider.cs
- FactoryGenerator.cs
- BindingList.cs
- TransportBindingElementImporter.cs
- AccessibilityApplicationManager.cs
- SqlTriggerAttribute.cs
- HttpResponseHeader.cs
- SmiContextFactory.cs
- DesignTimeParseData.cs
- Matrix3DConverter.cs
- NativeMethods.cs
- ComponentResourceKeyConverter.cs
- TitleStyle.cs
- XmlSchemaIdentityConstraint.cs
- documentsequencetextcontainer.cs
- EmbossBitmapEffect.cs
- VisualStyleTypesAndProperties.cs
- Roles.cs
- ModulesEntry.cs
- MimeMapping.cs
- InstanceOwnerQueryResult.cs
- XmlWellformedWriter.cs
- WindowsToolbarAsMenu.cs
- PersonalizationStateInfo.cs
- RegistryKey.cs
- CryptoKeySecurity.cs
- GenericsInstances.cs
- Command.cs
- ObjectDataSourceMethodEventArgs.cs
- XmlParserContext.cs
- OutputCacheProfile.cs
- ItemList.cs
- ADMembershipUser.cs
- XmlReader.cs
- SynchronousChannelMergeEnumerator.cs
- DeclarativeCatalogPart.cs
- DefaultMemberAttribute.cs
- Underline.cs
- SafeRightsManagementSessionHandle.cs
- FixedNode.cs
- RenderDataDrawingContext.cs
- SerializerProvider.cs
- CounterSample.cs
- UnsignedPublishLicense.cs
- NavigationProperty.cs
- ModelFunction.cs
- EmptyQuery.cs
- XmlWriter.cs
- RightsManagementEncryptionTransform.cs
- CompositeFontInfo.cs
- IndexedGlyphRun.cs
- wgx_render.cs
- WebScriptClientGenerator.cs
- ErrorEventArgs.cs
- BrushValueSerializer.cs
- Color.cs
- WsdlInspector.cs
- DefaultTraceListener.cs
- DrawingVisualDrawingContext.cs
- EmptyEnumerator.cs
- SoapFault.cs
- InvalidComObjectException.cs
- DataViewSetting.cs
- HebrewNumber.cs
- TextTreeInsertElementUndoUnit.cs
- Metadata.cs
- RoutingEndpointTrait.cs
- CompositeControl.cs
- parserscommon.cs
- BamlCollectionHolder.cs
- MimeFormatExtensions.cs