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
- Compilation.cs
- BuilderInfo.cs
- DataGridViewColumnCollectionEditor.cs
- KeyInstance.cs
- Win32MouseDevice.cs
- IncrementalCompileAnalyzer.cs
- PolyLineSegment.cs
- XmlHierarchicalEnumerable.cs
- ApplicationCommands.cs
- ProcessHost.cs
- CommonXSendMessage.cs
- XmlReaderDelegator.cs
- NavigationPropertyEmitter.cs
- RegularExpressionValidator.cs
- InternalTypeHelper.cs
- ColumnHeader.cs
- StubHelpers.cs
- BaseTypeViewSchema.cs
- XamlInt32CollectionSerializer.cs
- OdbcUtils.cs
- ConfigurationPropertyCollection.cs
- SettingsAttributeDictionary.cs
- RouteParser.cs
- IIS7UserPrincipal.cs
- ISAPIApplicationHost.cs
- SettingsPropertyWrongTypeException.cs
- URLIdentityPermission.cs
- WorkflowMarkupSerializationProvider.cs
- BaseTemplateParser.cs
- SecurityResources.cs
- ListSortDescriptionCollection.cs
- ShapeTypeface.cs
- MediaScriptCommandRoutedEventArgs.cs
- SqlDataSourceCache.cs
- SequentialUshortCollection.cs
- FileDialog_Vista.cs
- InvocationExpression.cs
- ImageButton.cs
- SHA256.cs
- CreateUserWizardDesigner.cs
- MemoryFailPoint.cs
- RequestNavigateEventArgs.cs
- ObjectConverter.cs
- DuplexSecurityProtocolFactory.cs
- _AuthenticationState.cs
- SettingsProviderCollection.cs
- StackOverflowException.cs
- TableItemProviderWrapper.cs
- ItemsPresenter.cs
- XmlValueConverter.cs
- ComplexPropertyEntry.cs
- StoryFragments.cs
- PageVisual.cs
- TextBoxBase.cs
- DPCustomTypeDescriptor.cs
- IndexedEnumerable.cs
- SchemaAttDef.cs
- KnownIds.cs
- Imaging.cs
- SiteMapProvider.cs
- IdentityModelDictionary.cs
- MessageDecoder.cs
- QueryResponse.cs
- DrawTreeNodeEventArgs.cs
- SeekableReadStream.cs
- AttributeTable.cs
- LoginCancelEventArgs.cs
- SafeEventHandle.cs
- XmlWrappingReader.cs
- ObjectDataSourceDisposingEventArgs.cs
- ConfigXmlAttribute.cs
- PingReply.cs
- CaseInsensitiveHashCodeProvider.cs
- LocalValueEnumerator.cs
- MessageSecurityVersionConverter.cs
- MetadataHelper.cs
- IWorkflowDebuggerService.cs
- DataGridViewCellErrorTextNeededEventArgs.cs
- PrintDocument.cs
- CheckPair.cs
- PropertyPathWorker.cs
- LocalFileSettingsProvider.cs
- StateItem.cs
- CorrelationActionMessageFilter.cs
- StreamUpdate.cs
- DesignConnectionCollection.cs
- QilLiteral.cs
- CloudCollection.cs
- StreamWriter.cs
- SystemThemeKey.cs
- TextParagraph.cs
- GroupDescription.cs
- RadioButtonBaseAdapter.cs
- tibetanshape.cs
- Random.cs
- XmlSchemaAttributeGroupRef.cs
- UntrustedRecipientException.cs
- SqlCacheDependencySection.cs
- UserPreferenceChangingEventArgs.cs
- MethodBuilder.cs