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
- FormatterServices.cs
- ImageField.cs
- mediaclock.cs
- DoubleAnimationUsingPath.cs
- Transform3DCollection.cs
- TabItemAutomationPeer.cs
- LinearGradientBrush.cs
- IPAddressCollection.cs
- CodeTypeDeclaration.cs
- RegexCharClass.cs
- DataGridCheckBoxColumn.cs
- VerticalAlignConverter.cs
- DictionarySectionHandler.cs
- CompositeDispatchFormatter.cs
- CollectionsUtil.cs
- WmiInstallComponent.cs
- Atom10FormatterFactory.cs
- CodeChecksumPragma.cs
- UniformGrid.cs
- ControlCollection.cs
- HostedAspNetEnvironment.cs
- DocumentGrid.cs
- ProtocolsConfiguration.cs
- ArrayEditor.cs
- GeneralTransformGroup.cs
- EncryptedKey.cs
- HtmlString.cs
- SchemaInfo.cs
- EndpointConfigContainer.cs
- CustomError.cs
- DataServiceQuery.cs
- SvcMapFileSerializer.cs
- PartialList.cs
- MarkupCompilePass1.cs
- LateBoundBitmapDecoder.cs
- Pair.cs
- XamlToRtfWriter.cs
- ProgressBarHighlightConverter.cs
- HostProtectionException.cs
- SiblingIterators.cs
- CommandPlan.cs
- AspNetCompatibilityRequirementsAttribute.cs
- FlowDocumentPage.cs
- TextContainerChangeEventArgs.cs
- WebPartConnectionCollection.cs
- PlacementWorkspace.cs
- RC2CryptoServiceProvider.cs
- MSAAEventDispatcher.cs
- ModelFunction.cs
- PropagatorResult.cs
- CodeTypeReferenceExpression.cs
- SchemaTableColumn.cs
- UriTemplateMatchException.cs
- ElementAction.cs
- HttpResponseInternalWrapper.cs
- WindowsAuthenticationEventArgs.cs
- WebDisplayNameAttribute.cs
- TaiwanLunisolarCalendar.cs
- AdapterUtil.cs
- HtmlHistory.cs
- ConnectionPoolManager.cs
- EdmSchemaError.cs
- ellipse.cs
- HttpListenerContext.cs
- BitmapSizeOptions.cs
- HtmlForm.cs
- Matrix.cs
- BinaryFormatterSinks.cs
- EventMap.cs
- TextUtf8RawTextWriter.cs
- AttachedAnnotation.cs
- OleDbRowUpdatedEvent.cs
- FixedSOMPage.cs
- NameSpaceExtractor.cs
- ChangeProcessor.cs
- ActivityDesignerHelper.cs
- DynamicILGenerator.cs
- Utils.cs
- FileUpload.cs
- CodeExporter.cs
- GenericWebPart.cs
- DPCustomTypeDescriptor.cs
- X509ThumbprintKeyIdentifierClause.cs
- Int16Converter.cs
- MailAddressParser.cs
- MimeMapping.cs
- TemplateManager.cs
- AuthenticationModulesSection.cs
- QueryBranchOp.cs
- ServiceReference.cs
- BufferedReadStream.cs
- QilStrConcatenator.cs
- WebPartZoneBaseDesigner.cs
- RadioButtonPopupAdapter.cs
- MutexSecurity.cs
- WebHttpBinding.cs
- BooleanProjectedSlot.cs
- RootNamespaceAttribute.cs
- TypeDescriptionProvider.cs
- MissingMethodException.cs