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
- DateTimeOffsetAdapter.cs
- ServiceContractGenerationContext.cs
- Region.cs
- SchemaImporter.cs
- AttributeCollection.cs
- ColorMap.cs
- ConfigurationPropertyAttribute.cs
- DesignerHierarchicalDataSourceView.cs
- CaseInsensitiveOrdinalStringComparer.cs
- GridViewHeaderRowPresenterAutomationPeer.cs
- TextDecorationLocationValidation.cs
- X509Chain.cs
- OperationResponse.cs
- Parsers.cs
- OpenFileDialog.cs
- CustomLineCap.cs
- DatatypeImplementation.cs
- StringUtil.cs
- DataListCommandEventArgs.cs
- Html32TextWriter.cs
- ArrayExtension.cs
- ServiceNameElement.cs
- DefaultParameterValueAttribute.cs
- ConfigXmlSignificantWhitespace.cs
- DataGridColumnHeaderAutomationPeer.cs
- BufferedReceiveElement.cs
- ApplicationTrust.cs
- MultipartContentParser.cs
- MarkupExtensionParser.cs
- SafeWaitHandle.cs
- TemplatePropertyEntry.cs
- GZipDecoder.cs
- SelectionProcessor.cs
- DbDataRecord.cs
- SocketPermission.cs
- EnumerableRowCollection.cs
- DataReaderContainer.cs
- DelayDesigner.cs
- ListMarkerLine.cs
- PieceDirectory.cs
- XmlUtil.cs
- PermissionSet.cs
- PageOutputColor.cs
- COM2EnumConverter.cs
- RuntimeWrappedException.cs
- DataGridViewHitTestInfo.cs
- GenericIdentity.cs
- DictationGrammar.cs
- IfAction.cs
- SoapHeaderAttribute.cs
- CorrelationTokenTypeConvertor.cs
- RelationshipEndCollection.cs
- SinglePageViewer.cs
- ContainerAction.cs
- ReceiveParametersContent.cs
- PackageRelationshipSelector.cs
- TimersDescriptionAttribute.cs
- PropertyInformation.cs
- AnnotationDocumentPaginator.cs
- DBDataPermission.cs
- LookupBindingPropertiesAttribute.cs
- SqlSupersetValidator.cs
- TextBlock.cs
- Scripts.cs
- FlowDocumentReaderAutomationPeer.cs
- SettingsSection.cs
- _ListenerAsyncResult.cs
- HttpSessionStateWrapper.cs
- Enum.cs
- AdornerHitTestResult.cs
- ConnectionPoolManager.cs
- ChannelCacheSettings.cs
- dbenumerator.cs
- AdPostCacheSubstitution.cs
- MergablePropertyAttribute.cs
- DataGridViewColumnEventArgs.cs
- ObjectConverter.cs
- WebPartZone.cs
- AttachedAnnotationChangedEventArgs.cs
- Buffer.cs
- HttpDictionary.cs
- ToolStripLabel.cs
- mediaeventshelper.cs
- TextEditorTyping.cs
- FormattedTextSymbols.cs
- ToolStripItemRenderEventArgs.cs
- SystemIPAddressInformation.cs
- AudienceUriMode.cs
- __Filters.cs
- AnimationClockResource.cs
- Canvas.cs
- XamlReader.cs
- MultipleViewPattern.cs
- LambdaCompiler.Lambda.cs
- Misc.cs
- PrinterSettings.cs
- bidPrivateBase.cs
- SafeNativeMethodsMilCoreApi.cs
- KeyedHashAlgorithm.cs
- FreezableCollection.cs