Code:
/ 4.0 / 4.0 / 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
- ValueSerializer.cs
- FontNamesConverter.cs
- ValidationSummaryDesigner.cs
- SendMailErrorEventArgs.cs
- TextElementCollection.cs
- DataServiceRequest.cs
- DefaultBindingPropertyAttribute.cs
- CommonObjectSecurity.cs
- PageScaling.cs
- XmlHierarchicalEnumerable.cs
- ItemCollection.cs
- LayoutTable.cs
- XmlObjectSerializerReadContextComplex.cs
- BinaryExpression.cs
- ResourceAttributes.cs
- CodeDOMProvider.cs
- DrawToolTipEventArgs.cs
- InvokeHandlers.cs
- TreeViewBindingsEditorForm.cs
- ContentIterators.cs
- DataGridViewBindingCompleteEventArgs.cs
- PermissionAttributes.cs
- ContractMapping.cs
- TreeBuilder.cs
- UnsafeNetInfoNativeMethods.cs
- CompositeKey.cs
- WebPartEditorApplyVerb.cs
- BitmapMetadataEnumerator.cs
- PartialCachingControl.cs
- HttpCapabilitiesEvaluator.cs
- GraphicsPath.cs
- MatrixCamera.cs
- SqlBuffer.cs
- ListComponentEditor.cs
- TokenizerHelper.cs
- EntityProviderFactory.cs
- SqlEnums.cs
- ListViewGroupItemCollection.cs
- Trace.cs
- IDispatchConstantAttribute.cs
- ProcessStartInfo.cs
- XmlArrayItemAttribute.cs
- ToggleProviderWrapper.cs
- FileClassifier.cs
- PlanCompilerUtil.cs
- TemplateControlBuildProvider.cs
- ComponentResourceKey.cs
- RelatedCurrencyManager.cs
- SamlSubject.cs
- CollectionBuilder.cs
- DataSourceGeneratorException.cs
- ControlEvent.cs
- Bidi.cs
- DnsPermission.cs
- CursorInteropHelper.cs
- InlinedAggregationOperatorEnumerator.cs
- FormViewDeleteEventArgs.cs
- ValueChangedEventManager.cs
- WsatServiceCertificate.cs
- Animatable.cs
- EpmSyndicationContentSerializer.cs
- DataSourceXmlSubItemAttribute.cs
- WebPartCancelEventArgs.cs
- ManipulationInertiaStartingEventArgs.cs
- XmlArrayAttribute.cs
- Hyperlink.cs
- SetterBaseCollection.cs
- MulticastDelegate.cs
- HttpValueCollection.cs
- ResourceReader.cs
- PerfCounters.cs
- EntityProviderFactory.cs
- WebHttpBehavior.cs
- RowType.cs
- PageAsyncTaskManager.cs
- NativeStructs.cs
- DesignerAttribute.cs
- BufferModesCollection.cs
- CustomErrorsSection.cs
- SHA512.cs
- OracleConnectionStringBuilder.cs
- ResourceWriter.cs
- KeyTimeConverter.cs
- WebControlToolBoxItem.cs
- XPathNavigatorReader.cs
- AsyncPostBackErrorEventArgs.cs
- ClientTarget.cs
- DataGridHeadersVisibilityToVisibilityConverter.cs
- PersistChildrenAttribute.cs
- IdentityHolder.cs
- GatewayIPAddressInformationCollection.cs
- StrokeNode.cs
- CodeTypeMemberCollection.cs
- WorkflowInstanceQuery.cs
- Merger.cs
- UInt32Converter.cs
- NativeMethods.cs
- IIS7UserPrincipal.cs
- CollectionViewProxy.cs
- DrawingDrawingContext.cs