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:
//
// Func OuterMethod(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 ReadOnlyDictionary Indexes;
// 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
- State.cs
- EmbeddedMailObjectsCollection.cs
- LinkConverter.cs
- BamlMapTable.cs
- ExtensionFile.cs
- documentsequencetextcontainer.cs
- MembershipPasswordException.cs
- StandardCommands.cs
- Context.cs
- ExpressionConverter.cs
- NullRuntimeConfig.cs
- EntityTemplateFactory.cs
- FastEncoder.cs
- DataStreams.cs
- DataKeyArray.cs
- UserControl.cs
- EntityContainerAssociationSet.cs
- PersonalizationProvider.cs
- ControlTemplate.cs
- RelationshipType.cs
- ParameterToken.cs
- XmlSchemaCompilationSettings.cs
- ACL.cs
- ModulesEntry.cs
- ExtenderHelpers.cs
- OleDbParameterCollection.cs
- IPEndPointCollection.cs
- InternalTypeHelper.cs
- Mapping.cs
- DataServiceRequestException.cs
- SqlCacheDependencySection.cs
- RadioButtonAutomationPeer.cs
- SrgsRuleRef.cs
- InvocationExpression.cs
- SvcMapFile.cs
- CompositionAdorner.cs
- MultipleViewPatternIdentifiers.cs
- SmiEventSink_DeferedProcessing.cs
- SQLByte.cs
- DropSource.cs
- StateRuntime.cs
- CreateUserWizardStep.cs
- SharedPersonalizationStateInfo.cs
- ProfileInfo.cs
- EpmContentDeSerializer.cs
- ExpressionBuilder.cs
- SelectionItemPattern.cs
- AnnotationMap.cs
- RawKeyboardInputReport.cs
- ArgumentException.cs
- TextBoxView.cs
- TdsParserStateObject.cs
- RichTextBox.cs
- AssociationTypeEmitter.cs
- FormsAuthenticationUserCollection.cs
- InsufficientExecutionStackException.cs
- SharedStatics.cs
- TextEditorLists.cs
- CustomWebEventKey.cs
- InternalsVisibleToAttribute.cs
- ConfigurationStrings.cs
- ObjectCacheSettings.cs
- MimeMapping.cs
- LinqDataSourceDisposeEventArgs.cs
- QilChoice.cs
- ExpressionEditorSheet.cs
- UniqueIdentifierService.cs
- SqlGatherProducedAliases.cs
- tibetanshape.cs
- ResourceDefaultValueAttribute.cs
- ClickablePoint.cs
- ProgressBar.cs
- StringWriter.cs
- HttpClientChannel.cs
- WindowsHyperlink.cs
- Models.cs
- Int32RectValueSerializer.cs
- ZoneIdentityPermission.cs
- Drawing.cs
- WinEventHandler.cs
- WindowsScrollBarBits.cs
- externdll.cs
- MultiView.cs
- HTMLTextWriter.cs
- DefaultHttpHandler.cs
- CultureTableRecord.cs
- PersonalizationEntry.cs
- InputProviderSite.cs
- EllipticalNodeOperations.cs
- HtmlTextArea.cs
- ColorBlend.cs
- XmlSchemaImport.cs
- XXXInfos.cs
- CultureInfoConverter.cs
- SerializationObjectManager.cs
- WindowsGraphicsWrapper.cs
- TreeNodeStyle.cs
- SessionEndedEventArgs.cs
- PropertyTab.cs
- RuleRef.cs