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
- PreparingEnlistment.cs
- PersonalizationProviderHelper.cs
- SynchronizingStream.cs
- ActiveDocumentEvent.cs
- ItemCheckEvent.cs
- PagerSettings.cs
- Triangle.cs
- listitem.cs
- WebPartZoneCollection.cs
- IntSecurity.cs
- SemanticTag.cs
- XmlILAnnotation.cs
- OLEDB_Util.cs
- DesignerLoader.cs
- SqlRowUpdatingEvent.cs
- FlowDocumentPageViewerAutomationPeer.cs
- WebPartConnectionsConfigureVerb.cs
- StringFreezingAttribute.cs
- CodeExporter.cs
- ContextInformation.cs
- SerialStream.cs
- SecurityRuntime.cs
- Types.cs
- ParagraphResult.cs
- SafeHandles.cs
- ValidationErrorEventArgs.cs
- StatusBarPanelClickEvent.cs
- PointCollection.cs
- HtmlHistory.cs
- MobileControlsSectionHelper.cs
- shaperfactory.cs
- CodeBlockBuilder.cs
- MostlySingletonList.cs
- PngBitmapDecoder.cs
- ForeignKeyFactory.cs
- DataGridPagerStyle.cs
- ShimAsPublicXamlType.cs
- AggregatePushdown.cs
- PingReply.cs
- DependencyPropertyConverter.cs
- KeyConverter.cs
- RayMeshGeometry3DHitTestResult.cs
- IgnoreSectionHandler.cs
- ServiceProviders.cs
- SettingsAttributes.cs
- XmlSchemaComplexContentRestriction.cs
- X509SecurityTokenAuthenticator.cs
- CanExecuteRoutedEventArgs.cs
- ToolStripContainer.cs
- HtmlControlPersistable.cs
- XamlBrushSerializer.cs
- DoubleCollectionValueSerializer.cs
- SoapElementAttribute.cs
- EmptyQuery.cs
- Accessible.cs
- OperatingSystem.cs
- TemplateControlCodeDomTreeGenerator.cs
- TransformerInfoCollection.cs
- WebZone.cs
- Stopwatch.cs
- NetTcpSecurityElement.cs
- OdbcStatementHandle.cs
- DrawTreeNodeEventArgs.cs
- TransformGroup.cs
- ListViewInsertEventArgs.cs
- Events.cs
- HttpListenerTimeoutManager.cs
- ActivitiesCollection.cs
- TreeViewAutomationPeer.cs
- DynamicValueConverter.cs
- OdbcReferenceCollection.cs
- DirectoryObjectSecurity.cs
- XmlTypeAttribute.cs
- PropertyPathWorker.cs
- TextChange.cs
- SinglePhaseEnlistment.cs
- ErrorFormatterPage.cs
- OleDbCommand.cs
- Token.cs
- SafeNativeMemoryHandle.cs
- GroupItemAutomationPeer.cs
- GeometryGroup.cs
- ArrayTypeMismatchException.cs
- TargetException.cs
- AspProxy.cs
- OpacityConverter.cs
- Int16AnimationUsingKeyFrames.cs
- oledbconnectionstring.cs
- BoundColumn.cs
- Privilege.cs
- FlowLayoutPanel.cs
- ResourcePermissionBaseEntry.cs
- ConfigurationManager.cs
- Vector3D.cs
- FontFamilyConverter.cs
- DateTimeFormatInfo.cs
- WorkflowTimerService.cs
- MemoryMappedViewAccessor.cs
- Image.cs
- TypeBinaryExpression.cs