Code:
/ 4.0 / 4.0 / 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. /* **************************************************************************** * * 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
- HtmlLabelAdapter.cs
- VariantWrapper.cs
- Task.cs
- Annotation.cs
- DesignerMetadata.cs
- FlowLayout.cs
- KnownColorTable.cs
- ScriptReference.cs
- ProcessStartInfo.cs
- WindowsSpinner.cs
- ButtonRenderer.cs
- Profiler.cs
- HostedTransportConfigurationManager.cs
- BamlResourceSerializer.cs
- ApplicationContext.cs
- StrokeCollection2.cs
- TextEffectCollection.cs
- DataGridViewDataErrorEventArgs.cs
- Mapping.cs
- WindowsUserNameSecurityTokenAuthenticator.cs
- AppSettingsReader.cs
- XmlSchemas.cs
- PageFunction.cs
- InputReportEventArgs.cs
- ImageClickEventArgs.cs
- PrinterSettings.cs
- SoapFault.cs
- SystemIPInterfaceProperties.cs
- FullTextBreakpoint.cs
- DomNameTable.cs
- ListCollectionView.cs
- WebPartChrome.cs
- StateManagedCollection.cs
- ProviderCommandInfoUtils.cs
- ObjectView.cs
- AutomationElementIdentifiers.cs
- ThreadPool.cs
- ToolBarDesigner.cs
- EdgeProfileValidation.cs
- DbException.cs
- Viewport3DVisual.cs
- TextElementCollectionHelper.cs
- SessionIDManager.cs
- TextSpan.cs
- ColumnBinding.cs
- DependencyObjectProvider.cs
- SpeakProgressEventArgs.cs
- StorageComplexPropertyMapping.cs
- SkipStoryboardToFill.cs
- ProcessThreadCollection.cs
- PersistenceTask.cs
- WizardStepCollectionEditor.cs
- DataRowChangeEvent.cs
- VirtualPath.cs
- UnknownBitmapDecoder.cs
- DataGridViewButtonCell.cs
- InputDevice.cs
- Privilege.cs
- WsatStrings.cs
- ViewSimplifier.cs
- ConfigurationCollectionAttribute.cs
- SmiEventSink_Default.cs
- AdornerDecorator.cs
- ResourceProviderFactory.cs
- SecurityIdentifierElementCollection.cs
- IUnknownConstantAttribute.cs
- CollaborationHelperFunctions.cs
- Interlocked.cs
- Pkcs7Signer.cs
- DataGridViewCheckBoxColumn.cs
- PerformanceCountersElement.cs
- _NetRes.cs
- UpdateManifestForBrowserApplication.cs
- RepeaterItemCollection.cs
- Int32RectConverter.cs
- QueryContinueDragEventArgs.cs
- GorillaCodec.cs
- MexHttpsBindingCollectionElement.cs
- CodeMethodInvokeExpression.cs
- HoistedLocals.cs
- DeferrableContent.cs
- SegmentInfo.cs
- StrongNameUtility.cs
- CurrencyWrapper.cs
- ToolTipService.cs
- XmlWriter.cs
- ImageMapEventArgs.cs
- TraceContext.cs
- PropertyValueChangedEvent.cs
- StickyNoteHelper.cs
- ProfileModule.cs
- UserControlAutomationPeer.cs
- DebugView.cs
- DoubleUtil.cs
- ListDictionaryInternal.cs
- ConfigurationLocation.cs
- UriTemplateTrieNode.cs
- FamilyCollection.cs
- GestureRecognizer.cs
- cache.cs