Code:
/ 4.0 / 4.0 / 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
- BookmarkInfo.cs
- _NetworkingPerfCounters.cs
- DoubleLinkList.cs
- InlineCollection.cs
- UniqueEventHelper.cs
- ChildTable.cs
- XamlStream.cs
- RadioButton.cs
- MasterPageParser.cs
- DataRecordInternal.cs
- KeyValuePair.cs
- RuntimeHelpers.cs
- DataStreams.cs
- ImageCollectionCodeDomSerializer.cs
- Identity.cs
- Point.cs
- MethodBody.cs
- ToolBarButtonDesigner.cs
- MetadataSource.cs
- DataMemberAttribute.cs
- XamlPoint3DCollectionSerializer.cs
- coordinatorscratchpad.cs
- HandleInitializationContext.cs
- TagNameToTypeMapper.cs
- TrackingProfileSerializer.cs
- HttpRequestWrapper.cs
- RequiredFieldValidator.cs
- WebSysDisplayNameAttribute.cs
- NullRuntimeConfig.cs
- ISFTagAndGuidCache.cs
- Grant.cs
- ToolStripMenuItem.cs
- FlowLayoutPanel.cs
- UiaCoreProviderApi.cs
- XmlSchemaGroup.cs
- StorageRoot.cs
- OneOfConst.cs
- FormatConvertedBitmap.cs
- FileInfo.cs
- ExpandCollapseProviderWrapper.cs
- ToolStripProgressBar.cs
- _ProxyChain.cs
- CompareValidator.cs
- TextCompositionManager.cs
- SwitchAttribute.cs
- EntityKeyElement.cs
- DelegatingConfigHost.cs
- GeometryCollection.cs
- RequiredArgumentAttribute.cs
- Logging.cs
- DateTimeSerializationSection.cs
- TextDecorationCollectionConverter.cs
- PenContext.cs
- WebRequestModuleElement.cs
- HtmlElementEventArgs.cs
- WindowsAuthenticationEventArgs.cs
- InvalidOperationException.cs
- SerializerDescriptor.cs
- RoleService.cs
- cryptoapiTransform.cs
- InvalidChannelBindingException.cs
- FormsAuthenticationCredentials.cs
- FixedSOMTableCell.cs
- GacUtil.cs
- RowParagraph.cs
- localization.cs
- ClipboardData.cs
- FlowStep.cs
- RegistryKey.cs
- DesignerAttribute.cs
- LinqDataSourceSelectEventArgs.cs
- InvalidComObjectException.cs
- WasAdminWrapper.cs
- DataControlFieldHeaderCell.cs
- Metadata.cs
- SchemaInfo.cs
- DataGrid.cs
- TextTreeTextBlock.cs
- EventListener.cs
- VideoDrawing.cs
- AtomServiceDocumentSerializer.cs
- ControlPager.cs
- SystemColorTracker.cs
- EntityContainerEmitter.cs
- PointLight.cs
- FastPropertyAccessor.cs
- OleDbTransaction.cs
- RuntimeArgumentHandle.cs
- EncryptedData.cs
- CompilationUnit.cs
- StrongTypingException.cs
- DebugView.cs
- OracleInternalConnection.cs
- StickyNoteHelper.cs
- StructuredTypeEmitter.cs
- Double.cs
- RuntimeUtils.cs
- DataObjectEventArgs.cs
- RectConverter.cs
- SymmetricSecurityProtocol.cs