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
- PropertyBuilder.cs
- StaticSiteMapProvider.cs
- FormViewRow.cs
- SerializationSectionGroup.cs
- RichTextBoxAutomationPeer.cs
- ButtonFieldBase.cs
- Logging.cs
- Propagator.cs
- HuffCodec.cs
- SqlBulkCopyColumnMapping.cs
- RemoteWebConfigurationHostStream.cs
- DbProviderServices.cs
- MatchAllMessageFilter.cs
- PageSettings.cs
- CorrelationTokenInvalidatedHandler.cs
- X509Extension.cs
- EdmComplexTypeAttribute.cs
- XslException.cs
- Pair.cs
- BuildProvidersCompiler.cs
- ButtonBase.cs
- DataViewManager.cs
- DesignerDataTable.cs
- StateRuntime.cs
- RewritingProcessor.cs
- TableRow.cs
- EventLogEntryCollection.cs
- TreeViewHitTestInfo.cs
- ListDesigner.cs
- WebBrowserSiteBase.cs
- WebPartsPersonalizationAuthorization.cs
- BroadcastEventHelper.cs
- _AuthenticationState.cs
- Scene3D.cs
- LookupBindingPropertiesAttribute.cs
- WebRequestModulesSection.cs
- XmlBoundElement.cs
- RegistryExceptionHelper.cs
- IgnoreFlushAndCloseStream.cs
- MetafileHeaderWmf.cs
- recordstatefactory.cs
- EditorPartChrome.cs
- SessionStateItemCollection.cs
- Latin1Encoding.cs
- Application.cs
- VirtualDirectoryMappingCollection.cs
- HttpRequest.cs
- AnnotationHelper.cs
- TouchDevice.cs
- BindingCompleteEventArgs.cs
- CodeTypeReferenceCollection.cs
- DashStyle.cs
- RouteTable.cs
- CrossContextChannel.cs
- DescriptionAttribute.cs
- EventLogPermissionAttribute.cs
- RadioButtonList.cs
- CultureSpecificCharacterBufferRange.cs
- MarkupCompilePass2.cs
- RemotingAttributes.cs
- HttpRuntime.cs
- FormsAuthentication.cs
- XmlLangPropertyAttribute.cs
- ManipulationVelocities.cs
- BreakRecordTable.cs
- DrawItemEvent.cs
- PolyQuadraticBezierSegment.cs
- unsafeIndexingFilterStream.cs
- ConfigXmlCDataSection.cs
- LookupNode.cs
- BuilderPropertyEntry.cs
- PathStreamGeometryContext.cs
- SmtpException.cs
- ToolStripTextBox.cs
- DefaultCommandConverter.cs
- CachedTypeface.cs
- LOSFormatter.cs
- ValueProviderWrapper.cs
- EntityReference.cs
- WebServiceClientProxyGenerator.cs
- TableItemProviderWrapper.cs
- DropShadowBitmapEffect.cs
- SelectingProviderEventArgs.cs
- AsmxEndpointPickerExtension.cs
- SecurityContextKeyIdentifierClause.cs
- TypeName.cs
- CompilationPass2TaskInternal.cs
- CodeNamespaceImportCollection.cs
- CodeGotoStatement.cs
- dataobject.cs
- AssociationSetEnd.cs
- SchemaElement.cs
- HideDisabledControlAdapter.cs
- DataTableMapping.cs
- MenuScrollingVisibilityConverter.cs
- WsiProfilesElement.cs
- ConfigXmlAttribute.cs
- SafeRightsManagementSessionHandle.cs
- ExtendedPropertyDescriptor.cs
- Stack.cs