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
- Int32Collection.cs
- DataBoundLiteralControl.cs
- DrawingBrush.cs
- MemberJoinTreeNode.cs
- EndpointAddressProcessor.cs
- UdpContractFilterBehavior.cs
- SqlDataSourceCache.cs
- XmlNavigatorFilter.cs
- XPathNodePointer.cs
- NameTable.cs
- MultiDataTrigger.cs
- TableRowCollection.cs
- MenuItemBindingCollection.cs
- FixedSOMLineRanges.cs
- TerminatorSinks.cs
- _KerberosClient.cs
- unitconverter.cs
- PriorityBindingExpression.cs
- Style.cs
- StringFormat.cs
- PermissionSetEnumerator.cs
- SocketElement.cs
- GlobalProxySelection.cs
- DeflateStream.cs
- MappingMetadataHelper.cs
- ListMarkerSourceInfo.cs
- QueryStack.cs
- TableStyle.cs
- DataPager.cs
- StringInfo.cs
- HtmlTableRowCollection.cs
- XmlSchemaAnnotation.cs
- XmlCharType.cs
- TaskFileService.cs
- ReachDocumentReferenceSerializer.cs
- RbTree.cs
- TraceContextRecord.cs
- Preprocessor.cs
- StreamGeometry.cs
- TreeViewItemAutomationPeer.cs
- loginstatus.cs
- XmlElementAttribute.cs
- IListConverters.cs
- PriorityQueue.cs
- SQLDouble.cs
- CodeLinePragma.cs
- Control.cs
- CqlErrorHelper.cs
- ComponentConverter.cs
- Rotation3D.cs
- OdbcConnectionPoolProviderInfo.cs
- WebPartDeleteVerb.cs
- CompilerTypeWithParams.cs
- SafeReadContext.cs
- Exception.cs
- NamedPermissionSet.cs
- SecurityContextSecurityTokenAuthenticator.cs
- CommonObjectSecurity.cs
- TaskForm.cs
- QuaternionAnimation.cs
- ScrollContentPresenter.cs
- CodePropertyReferenceExpression.cs
- Page.cs
- HitTestDrawingContextWalker.cs
- MessagePartDescription.cs
- panel.cs
- RSAOAEPKeyExchangeFormatter.cs
- ColumnMapVisitor.cs
- ZoneMembershipCondition.cs
- QuaternionAnimation.cs
- EmptyQuery.cs
- ToolStripSettings.cs
- ProtocolsConfigurationHandler.cs
- EditorServiceContext.cs
- DataGridViewColumnEventArgs.cs
- HttpListenerElement.cs
- DecoderReplacementFallback.cs
- CodeGeneratorOptions.cs
- LicenseException.cs
- Zone.cs
- TrackPoint.cs
- SymLanguageType.cs
- ManipulationInertiaStartingEventArgs.cs
- ConsumerConnectionPointCollection.cs
- CryptoConfig.cs
- BamlLocalizationDictionary.cs
- RectangleHotSpot.cs
- SqlInternalConnectionTds.cs
- ComponentCommands.cs
- ServiceOperationParameter.cs
- ItemMap.cs
- MessageDecoder.cs
- MeasureData.cs
- ArrangedElementCollection.cs
- TextEncodedRawTextWriter.cs
- SmtpMail.cs
- SqlTypeConverter.cs
- CoreSwitches.cs
- XmlNullResolver.cs
- GenericParameterDataContract.cs