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
- IndependentlyAnimatedPropertyMetadata.cs
- Visual3DCollection.cs
- DataMemberAttribute.cs
- Vector.cs
- CheckBox.cs
- DecimalSumAggregationOperator.cs
- SmtpClient.cs
- QueryInterceptorAttribute.cs
- QilGenerator.cs
- EntitySqlException.cs
- ThousandthOfEmRealDoubles.cs
- NamedPipeTransportElement.cs
- InternalMappingException.cs
- UnicastIPAddressInformationCollection.cs
- UInt32Storage.cs
- XmlSchemaAttribute.cs
- DSASignatureFormatter.cs
- ConfigurationElementCollection.cs
- SplineQuaternionKeyFrame.cs
- SettingsPropertyValueCollection.cs
- WebServiceClientProxyGenerator.cs
- DataGridViewCellLinkedList.cs
- figurelengthconverter.cs
- TextReader.cs
- ObjectConverter.cs
- PickBranchDesigner.xaml.cs
- DispatcherHookEventArgs.cs
- DataObjectAttribute.cs
- DoubleCollectionConverter.cs
- ProtocolsConfigurationEntry.cs
- CombinedGeometry.cs
- ApplicationDirectory.cs
- StorageComplexPropertyMapping.cs
- SecurityHelper.cs
- DocComment.cs
- filewebrequest.cs
- SqlCommand.cs
- UrlAuthFailedErrorFormatter.cs
- SpeechRecognitionEngine.cs
- InternalConfigSettingsFactory.cs
- Bitmap.cs
- AppLevelCompilationSectionCache.cs
- TagNameToTypeMapper.cs
- WindowsTreeView.cs
- NotImplementedException.cs
- TextBoxLine.cs
- OdbcCommand.cs
- AnnotationResource.cs
- AddInProcess.cs
- GraphicsState.cs
- GregorianCalendar.cs
- EntityContainer.cs
- ThemeInfoAttribute.cs
- NonBatchDirectoryCompiler.cs
- EntityChangedParams.cs
- CodeExporter.cs
- InvokeSchedule.cs
- KeyTime.cs
- MarshalByValueComponent.cs
- EventSinkHelperWriter.cs
- CTreeGenerator.cs
- MsmqTransportBindingElement.cs
- RecognizedWordUnit.cs
- BezierSegment.cs
- Utility.cs
- ConfigXmlText.cs
- DataPagerField.cs
- InstanceDescriptor.cs
- BulletedListEventArgs.cs
- SystemIPv6InterfaceProperties.cs
- XmlWriter.cs
- DateTimeOffsetConverter.cs
- PassportAuthenticationEventArgs.cs
- Debug.cs
- X509CertificateValidationMode.cs
- StyleModeStack.cs
- CacheSection.cs
- XmlSchemaValidator.cs
- isolationinterop.cs
- ConnectionStringsExpressionEditor.cs
- ManagementPath.cs
- UInt16.cs
- ObjectFullSpanRewriter.cs
- InternalConfigRoot.cs
- ValueUtilsSmi.cs
- RadioButtonStandardAdapter.cs
- Polyline.cs
- XmlLinkedNode.cs
- LeafCellTreeNode.cs
- MultipleViewPatternIdentifiers.cs
- sitestring.cs
- RectangleGeometry.cs
- InvalidAsynchronousStateException.cs
- EventToken.cs
- InnerItemCollectionView.cs
- grammarelement.cs
- TransactionFlowBindingElement.cs
- SQLSingle.cs
- MouseGestureValueSerializer.cs
- ConfigurationStrings.cs