Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / Microsoft / Scripting / Compiler / HoistedLocals.cs / 1305376 / HoistedLocals.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.Collections.Generic; using System.Collections.ObjectModel; using System.Runtime.CompilerServices; using System.Dynamic.Utils; namespace System.Linq.Expressions.Compiler { // Suppose we have something like: // // (string s)=>()=>s. // // We wish to generate the outer as: // // FuncOuterMethod(Closure closure, string s) // { // object[] locals = new object[1]; // locals[0] = new StrongBox (); // ((StrongBox )locals[0]).Value = s; // return ((DynamicMethod)closure.Constants[0]).CreateDelegate(typeof(Func ), new Closure(null, locals)); // } // // ... and the inner as: // // string InnerMethod(Closure closure) // { // object[] locals = closure.Locals; // return ((StrongBox )locals[0]).Value; // } // // This class tracks that "s" was hoisted into a closure, as the 0th // element in the array // /// /// Stores information about locals and arguments that are hoisted into /// the closure array because they're referenced in an inner lambda. /// /// This class is sometimes emitted as a runtime constant for internal /// use to hoist variables/parameters in quoted expressions /// /// Invariant: this class stores no mutable state /// internal sealed class HoistedLocals { // The parent locals, if any internal readonly HoistedLocals Parent; // A mapping of hoisted variables to their indexes in the array internal readonly ReadOnlyDictionaryIndexes; // The variables, in the order they appear in the array internal readonly ReadOnlyCollection Variables; // A virtual variable for accessing this locals array internal readonly ParameterExpression SelfVariable; internal HoistedLocals(HoistedLocals parent, ReadOnlyCollection vars) { if (parent != null) { // Add the parent locals array as the 0th element in the array vars = new TrueReadOnlyCollection (vars.AddFirst(parent.SelfVariable)); } Dictionary indexes = new Dictionary (vars.Count); for (int i = 0; i < vars.Count; i++) { indexes.Add(vars[i], i); } SelfVariable = Expression.Variable(typeof(object[]), null); Parent = parent; Variables = vars; Indexes = new ReadOnlyDictionary (indexes); } internal ParameterExpression ParentVariable { get { return Parent != null ? Parent.SelfVariable : null; } } internal static object[] GetParent(object[] locals) { return ((StrongBox
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- OperationFormatter.cs
- BitmapImage.cs
- QuaternionAnimation.cs
- XsltLibrary.cs
- PropertyKey.cs
- Pipe.cs
- EntityDataSourceUtil.cs
- ErrorRuntimeConfig.cs
- Parsers.cs
- SqlDependencyUtils.cs
- ComponentCollection.cs
- HtmlTernaryTree.cs
- GB18030Encoding.cs
- TypeLoadException.cs
- WebServiceAttribute.cs
- CommandBinding.cs
- webeventbuffer.cs
- RectangleGeometry.cs
- PointAnimationClockResource.cs
- NodeFunctions.cs
- SecurityHelper.cs
- Rect.cs
- DataGridViewLinkColumn.cs
- DiscoveryReference.cs
- FixedStringLookup.cs
- XmlMembersMapping.cs
- Constants.cs
- HMACRIPEMD160.cs
- VectorConverter.cs
- RedirectionProxy.cs
- TextParaClient.cs
- MaterializeFromAtom.cs
- HitTestParameters3D.cs
- SystemNetHelpers.cs
- CommandEventArgs.cs
- InputScope.cs
- BevelBitmapEffect.cs
- RightsManagementPermission.cs
- SynchronizationHandlesCodeDomSerializer.cs
- BinaryMethodMessage.cs
- WebSysDefaultValueAttribute.cs
- HttpInputStream.cs
- WSDualHttpBinding.cs
- MappingModelBuildProvider.cs
- IpcChannelHelper.cs
- TraceProvider.cs
- EventProviderWriter.cs
- ObjectToIdCache.cs
- HttpAsyncResult.cs
- CallContext.cs
- FrameAutomationPeer.cs
- CodeCastExpression.cs
- DataGridViewIntLinkedList.cs
- GroupDescription.cs
- xmlfixedPageInfo.cs
- AssemblyInfo.cs
- LineMetrics.cs
- CompareInfo.cs
- XmlNamedNodeMap.cs
- BindingMAnagerBase.cs
- MDIControlStrip.cs
- SystemPens.cs
- ChtmlTextWriter.cs
- EnumValAlphaComparer.cs
- X509ChainPolicy.cs
- ScriptingSectionGroup.cs
- InProcStateClientManager.cs
- RegexNode.cs
- Domain.cs
- Operator.cs
- Publisher.cs
- DataObjectEventArgs.cs
- Overlapped.cs
- ThrowHelper.cs
- FontFamily.cs
- ToolbarAUtomationPeer.cs
- XmlSchemaValidator.cs
- OdbcReferenceCollection.cs
- DigestComparer.cs
- TitleStyle.cs
- _PooledStream.cs
- BridgeDataReader.cs
- TimeSpanMinutesOrInfiniteConverter.cs
- LinkClickEvent.cs
- DbParameterHelper.cs
- UnsafeCollabNativeMethods.cs
- ContextProperty.cs
- SqlUserDefinedTypeAttribute.cs
- Enlistment.cs
- SslStream.cs
- InternalConfigConfigurationFactory.cs
- MiniLockedBorderGlyph.cs
- XmlNamespaceManager.cs
- ToolStripGripRenderEventArgs.cs
- StringArrayEditor.cs
- ResolveMatchesMessage11.cs
- SelectionPattern.cs
- ArrangedElementCollection.cs
- ApplicationActivator.cs
- DataTemplate.cs