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
- ColumnHeader.cs
- WebPartCatalogAddVerb.cs
- SmuggledIUnknown.cs
- HighContrastHelper.cs
- BrowserTree.cs
- Misc.cs
- DocumentAutomationPeer.cs
- SoapAttributes.cs
- XsltCompileContext.cs
- MenuDesigner.cs
- HijriCalendar.cs
- ItemMap.cs
- IPEndPointCollection.cs
- SplitContainerDesigner.cs
- OleDbErrorCollection.cs
- XmlDocumentSerializer.cs
- HttpCookie.cs
- DashStyle.cs
- BaseProcessor.cs
- VisualStyleElement.cs
- ProcessInfo.cs
- RSAPKCS1SignatureFormatter.cs
- UnsafeNativeMethods.cs
- Table.cs
- XmlDownloadManager.cs
- WebControlsSection.cs
- ButtonFlatAdapter.cs
- ListSortDescription.cs
- NavigationWindowAutomationPeer.cs
- DefaultEvaluationContext.cs
- DbConnectionPoolGroup.cs
- DataGridViewSelectedColumnCollection.cs
- IgnoreSectionHandler.cs
- UIServiceHelper.cs
- GreenMethods.cs
- FtpWebResponse.cs
- PointAnimationBase.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- DockingAttribute.cs
- ScriptManager.cs
- DirectoryRedirect.cs
- PocoPropertyAccessorStrategy.cs
- PropertyEntry.cs
- CombinedGeometry.cs
- GridEntryCollection.cs
- Constants.cs
- SecurityException.cs
- PKCS1MaskGenerationMethod.cs
- TypeConvertions.cs
- UniqueSet.cs
- AnnotationAdorner.cs
- RadioButtonList.cs
- FormsAuthenticationEventArgs.cs
- VirtualPath.cs
- CompilationUnit.cs
- SubtreeProcessor.cs
- ParameterCollection.cs
- SafeLocalAllocation.cs
- MethodRental.cs
- ClientType.cs
- MimeTypeAttribute.cs
- BamlResourceSerializer.cs
- ScriptingScriptResourceHandlerSection.cs
- ListBoxItemWrapperAutomationPeer.cs
- HtmlString.cs
- SafeProcessHandle.cs
- LicenseManager.cs
- GroupQuery.cs
- Page.cs
- StatusBarAutomationPeer.cs
- QilGenerator.cs
- StatusBarAutomationPeer.cs
- AbstractExpressions.cs
- OdbcConnectionStringbuilder.cs
- ellipse.cs
- TrackingLocationCollection.cs
- FixedSOMFixedBlock.cs
- FloatUtil.cs
- IsolatedStorageException.cs
- UnsafeNativeMethodsCLR.cs
- MimeWriter.cs
- NavigationService.cs
- GenericUI.cs
- SharedStream.cs
- RemoteWebConfigurationHostServer.cs
- TypeInitializationException.cs
- TextContainerChangeEventArgs.cs
- ColumnResizeUndoUnit.cs
- SoapElementAttribute.cs
- X509Certificate2Collection.cs
- SchemaImporter.cs
- TimeStampChecker.cs
- MsmqAuthenticationMode.cs
- WindowInteractionStateTracker.cs
- FieldToken.cs
- TargetException.cs
- UInt64Storage.cs
- CharacterMetrics.cs
- NamespaceMapping.cs
- FilteredXmlReader.cs