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
- TogglePatternIdentifiers.cs
- FontStretchConverter.cs
- TextOnlyOutput.cs
- DigitShape.cs
- SchemaInfo.cs
- CommandManager.cs
- FieldAccessException.cs
- ConstructorNeedsTagAttribute.cs
- SchemaMapping.cs
- SparseMemoryStream.cs
- FileStream.cs
- ActiveXHost.cs
- ContainerParaClient.cs
- MonthCalendar.cs
- XmlDataProvider.cs
- SendingRequestEventArgs.cs
- NullPackagingPolicy.cs
- OracleRowUpdatedEventArgs.cs
- BinaryCommonClasses.cs
- CalendarData.cs
- DataGridLength.cs
- DesignBindingConverter.cs
- ListSourceHelper.cs
- SlipBehavior.cs
- EventLogEntryCollection.cs
- SystemNetworkInterface.cs
- PagesSection.cs
- MemberPathMap.cs
- LowerCaseStringConverter.cs
- JsonWriterDelegator.cs
- ShaperBuffers.cs
- ImageMapEventArgs.cs
- ExtentKey.cs
- VariableQuery.cs
- ToolStripDesignerUtils.cs
- DataObjectFieldAttribute.cs
- OfTypeExpression.cs
- control.ime.cs
- WebPartEditorApplyVerb.cs
- BaseAutoFormat.cs
- SingleConverter.cs
- FontInfo.cs
- LongCountAggregationOperator.cs
- Vector3DCollectionConverter.cs
- Publisher.cs
- CodeRegionDirective.cs
- Run.cs
- WindowsRichEdit.cs
- RequestBringIntoViewEventArgs.cs
- HtmlLink.cs
- UnmanagedMemoryStream.cs
- SpellerInterop.cs
- WindowsFormsEditorServiceHelper.cs
- FrameDimension.cs
- CommandID.cs
- BigIntegerStorage.cs
- RegexMatch.cs
- DynamicILGenerator.cs
- ToggleButtonAutomationPeer.cs
- CurrentTimeZone.cs
- ClickablePoint.cs
- DataGridViewRowsAddedEventArgs.cs
- ApplicationManager.cs
- Visual.cs
- ScaleTransform3D.cs
- CursorConverter.cs
- ItemsPresenter.cs
- ConstructorBuilder.cs
- ProfileServiceManager.cs
- SmtpException.cs
- DebuggerAttributes.cs
- InputLanguageEventArgs.cs
- SmtpCommands.cs
- NumericPagerField.cs
- BlurEffect.cs
- AnnotationAuthorChangedEventArgs.cs
- TreeNodeCollection.cs
- GeometryModel3D.cs
- ClientCultureInfo.cs
- KeyPressEvent.cs
- SamlSecurityTokenAuthenticator.cs
- Hex.cs
- ToolStripArrowRenderEventArgs.cs
- AccessDataSourceView.cs
- LineSegment.cs
- FixedPageStructure.cs
- DockPanel.cs
- Int16.cs
- ImageSource.cs
- FontResourceCache.cs
- Connector.cs
- SafeHandle.cs
- CounterSampleCalculator.cs
- DateTimeParse.cs
- ConnectorMovedEventArgs.cs
- ExeContext.cs
- SiteMapPath.cs
- CheckBoxPopupAdapter.cs
- GiveFeedbackEvent.cs
- ListBindableAttribute.cs