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
- TypefaceMetricsCache.cs
- SplitterCancelEvent.cs
- DataSourceControl.cs
- AppDomainGrammarProxy.cs
- GradientStopCollection.cs
- CheckBoxStandardAdapter.cs
- JavascriptCallbackBehaviorAttribute.cs
- TaskFileService.cs
- AssociationProvider.cs
- MobileControlsSectionHelper.cs
- SecondaryViewProvider.cs
- FixedNode.cs
- ConditionCollection.cs
- DynamicPhysicalDiscoSearcher.cs
- SqlDataSourceView.cs
- XmlElementList.cs
- RegionInfo.cs
- EntityViewGenerator.cs
- Size3DConverter.cs
- XmlSchemaRedefine.cs
- FormCollection.cs
- ActionItem.cs
- RadioButtonPopupAdapter.cs
- AxisAngleRotation3D.cs
- LabelLiteral.cs
- DEREncoding.cs
- ProfileGroupSettingsCollection.cs
- ConstructorNeedsTagAttribute.cs
- AssociationTypeEmitter.cs
- ObjectParameterCollection.cs
- wmiutil.cs
- LineGeometry.cs
- Int32EqualityComparer.cs
- DefaultWorkflowSchedulerService.cs
- Frame.cs
- ConfigUtil.cs
- CallTemplateAction.cs
- HatchBrush.cs
- VolatileEnlistmentMultiplexing.cs
- GPRECTF.cs
- PlatformNotSupportedException.cs
- ProviderSettingsCollection.cs
- DataControlCommands.cs
- UpdatePanel.cs
- Pen.cs
- AxHostDesigner.cs
- ViewService.cs
- FileLoadException.cs
- FixUpCollection.cs
- AppDomainManager.cs
- QilInvokeEarlyBound.cs
- InternalSendMessage.cs
- KeyedHashAlgorithm.cs
- Helper.cs
- OutputCacheSection.cs
- SplitContainer.cs
- IndexedDataBuffer.cs
- SiteMapDesignerDataSourceView.cs
- ExceptionTranslationTable.cs
- Registry.cs
- FamilyCollection.cs
- StyleCollection.cs
- FramingChannels.cs
- ChildChangedEventArgs.cs
- CodeIdentifiers.cs
- InvalidTimeZoneException.cs
- DataKeyArray.cs
- XPathChildIterator.cs
- SchemeSettingElement.cs
- GridView.cs
- Header.cs
- CustomErrorCollection.cs
- ContentValidator.cs
- SettingsPropertyIsReadOnlyException.cs
- securitycriticaldata.cs
- ControlCodeDomSerializer.cs
- AxDesigner.cs
- DataGridToolTip.cs
- DocumentViewer.cs
- WebErrorHandler.cs
- GridViewCellAutomationPeer.cs
- File.cs
- TcpHostedTransportConfiguration.cs
- Transactions.cs
- SecurityStateEncoder.cs
- ContextMenu.cs
- ElementHostPropertyMap.cs
- ConfigurationException.cs
- EventBuilder.cs
- ACL.cs
- XmlQualifiedName.cs
- SettingsBindableAttribute.cs
- SByte.cs
- ToolStripScrollButton.cs
- RelativeSource.cs
- MaskedTextBoxDesignerActionList.cs
- RSAPKCS1SignatureFormatter.cs
- DateTimeParse.cs
- DesignerSerializationOptionsAttribute.cs
- DataGridDesigner.cs