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
- AccessText.cs
- SkewTransform.cs
- UserPreferenceChangedEventArgs.cs
- BrushValueSerializer.cs
- ErrorEventArgs.cs
- TypeUtil.cs
- SpellerInterop.cs
- GlobalizationSection.cs
- AutomationElement.cs
- CodeVariableDeclarationStatement.cs
- NodeInfo.cs
- HostingEnvironmentException.cs
- SpellerError.cs
- AmbientLight.cs
- PrimitiveSchema.cs
- DropShadowEffect.cs
- InvalidDataContractException.cs
- ListViewInsertionMark.cs
- TheQuery.cs
- XmlException.cs
- Relationship.cs
- GPPOINT.cs
- SmtpTransport.cs
- ArrayEditor.cs
- BitmapDecoder.cs
- FirstMatchCodeGroup.cs
- Evidence.cs
- LambdaCompiler.Statements.cs
- SqlNotificationEventArgs.cs
- ObfuscationAttribute.cs
- SAPICategories.cs
- ZeroOpNode.cs
- NamespaceList.cs
- Bind.cs
- StructuralType.cs
- ManagementScope.cs
- DataSourceControlBuilder.cs
- ClusterUtils.cs
- ArithmeticException.cs
- TransformedBitmap.cs
- SystemThemeKey.cs
- UnionExpr.cs
- XmlQualifiedName.cs
- EventListener.cs
- DynamicDiscoveryDocument.cs
- FontSourceCollection.cs
- ObfuscationAttribute.cs
- InheritablePropertyChangeInfo.cs
- HostExecutionContextManager.cs
- LongTypeConverter.cs
- SingleAnimationBase.cs
- SqlUtils.cs
- DebugView.cs
- OleDbErrorCollection.cs
- DesignTimeType.cs
- FigureParaClient.cs
- CompositeCollection.cs
- GetPageNumberCompletedEventArgs.cs
- IncrementalReadDecoders.cs
- TransactedBatchContext.cs
- ImageKeyConverter.cs
- DragDropManager.cs
- UrlMapping.cs
- CustomWebEventKey.cs
- ResourcePermissionBaseEntry.cs
- DataGridCellEditEndingEventArgs.cs
- Compilation.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- HwndSourceParameters.cs
- TextElement.cs
- BidOverLoads.cs
- XmlConverter.cs
- StaticTextPointer.cs
- DrawingContextDrawingContextWalker.cs
- FieldDescriptor.cs
- baseshape.cs
- SQLByte.cs
- ValidationErrorCollection.cs
- BitmapPalettes.cs
- WebConfigurationFileMap.cs
- safelink.cs
- ClientSideProviderDescription.cs
- WpfGeneratedKnownProperties.cs
- WebBrowserPermission.cs
- SoapEnumAttribute.cs
- GenerateTemporaryTargetAssembly.cs
- XsltLibrary.cs
- ShaderEffect.cs
- CommonDialog.cs
- IteratorDescriptor.cs
- SHA1CryptoServiceProvider.cs
- MarkupCompilePass2.cs
- DataGridView.cs
- WmpBitmapEncoder.cs
- DecimalConstantAttribute.cs
- HtmlButton.cs
- ForeignKeyFactory.cs
- PasswordBoxAutomationPeer.cs
- XmlNodeReader.cs
- RegularExpressionValidator.cs