From e7221cdadf8c0387a51baa0cd500668af0f226e2 Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 15:06:33 +0500 Subject: [PATCH 01/13] HasGeneratedReservedMembers --- src/System.Management.Automation/engine/MshMemberInfo.cs | 4 ++-- src/System.Management.Automation/engine/MshObject.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/System.Management.Automation/engine/MshMemberInfo.cs b/src/System.Management.Automation/engine/MshMemberInfo.cs index aff5e7635a3..8ae260a383b 100644 --- a/src/System.Management.Automation/engine/MshMemberInfo.cs +++ b/src/System.Management.Automation/engine/MshMemberInfo.cs @@ -4382,9 +4382,9 @@ internal class PSMemberInfoIntegratingCollection : PSMemberInfoCollection, private void GenerateAllReservedMembers() { - if (!_mshOwner.hasGeneratedReservedMembers) + if (!_mshOwner.HasGeneratedReservedMembers) { - _mshOwner.hasGeneratedReservedMembers = true; + _mshOwner.HasGeneratedReservedMembers = true; ReservedNameMembers.GeneratePSExtendedMemberSet(_mshOwner); ReservedNameMembers.GeneratePSBaseMemberSet(_mshOwner); ReservedNameMembers.GeneratePSObjectMemberSet(_mshOwner); diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index b3ae3378e44..75e478f8932 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -646,8 +646,6 @@ private AdapterSet InternalAdapterSet private AdapterSet _adapterSet; - internal bool hasGeneratedReservedMembers; - internal PSMemberInfoInternalCollection InstanceMembers { get @@ -1607,7 +1605,7 @@ public virtual PSObject Copy() } } - returnValue.hasGeneratedReservedMembers = false; + returnValue.HasGeneratedReservedMembers = false; return returnValue; } @@ -2312,6 +2310,8 @@ internal bool IsHelpObject private bool _isHelpObject = false; + internal bool HasGeneratedReservedMembers { get; set; } + #endregion } From fd0766e0f7ef54bcf26654aef1c3b030ce5d5e1f Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 15:31:44 +0500 Subject: [PATCH 02/13] DotNetStaticAdapter --- .../commands/utility/GetMember.cs | 2 +- .../engine/CommandCompletion/CompletionCompleters.cs | 2 +- src/System.Management.Automation/engine/MshObject.cs | 12 ++++++++++-- .../engine/parser/TypeInferenceVisitor.cs | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetMember.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetMember.cs index 4ba35361184..a40ccf798b1 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetMember.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetMember.cs @@ -150,7 +150,7 @@ protected override void ProcessRecord() Adapter staticAdapter = null; if (this.Static == true) { - staticAdapter = PSObject.dotNetStaticAdapter; + staticAdapter = PSObject.DotNetStaticAdapter; object baseObject = this.InputObject.BaseObject; baseObjectAsType = baseObject as System.Type ?? baseObject.GetType(); typeName = baseObjectAsType.FullName; diff --git a/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs b/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs index b340f8ac127..d117e09428a 100644 --- a/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs +++ b/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs @@ -6564,7 +6564,7 @@ internal static void CompleteMemberHelper( return; } - members = PSObject.dotNetStaticAdapter.BaseGetMembers(type); + members = PSObject.DotNetStaticAdapter.BaseGetMembers(type); } else { diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 75e478f8932..81b71f86820 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -376,7 +376,7 @@ private void CommonInitialization(object obj) internal static readonly DotNetAdapter dotNetInstanceAdapter = new DotNetAdapter(); private static readonly DotNetAdapter s_baseAdapterForAdaptedObjects = new BaseDotNetAdapterForAdaptedObjects(); - internal static readonly DotNetAdapter dotNetStaticAdapter = new DotNetAdapter(true); + internal static readonly DotNetAdapter s_dotNetStaticAdapter = new DotNetAdapter(true); private static readonly AdapterSet s_dotNetInstanceAdapterSet = new AdapterSet(dotNetInstanceAdapter, null); private static readonly AdapterSet s_mshMemberSetAdapter = new AdapterSet(new PSMemberSetAdapter(), null); @@ -1002,7 +1002,7 @@ internal static PSMemberInfo GetStaticCLRMember(object obj, string methodName) } var objType = obj as Type ?? obj.GetType(); - return dotNetStaticAdapter.BaseGetMember(objType, methodName); + return DotNetStaticAdapter.BaseGetMember(objType, methodName); } /// @@ -2312,6 +2312,14 @@ internal bool IsHelpObject internal bool HasGeneratedReservedMembers { get; set; } + /// + /// Members from the adapter of the object before it was serialized + /// Null for live objects but not null for deserialized objects. + /// + internal PSMemberInfoInternalCollection AdaptedMembers { get; set; } + + internal static DotNetAdapter DotNetStaticAdapter => s_dotNetStaticAdapter; + #endregion } diff --git a/src/System.Management.Automation/engine/parser/TypeInferenceVisitor.cs b/src/System.Management.Automation/engine/parser/TypeInferenceVisitor.cs index 31ce46f3854..e376695885f 100644 --- a/src/System.Management.Automation/engine/parser/TypeInferenceVisitor.cs +++ b/src/System.Management.Automation/engine/parser/TypeInferenceVisitor.cs @@ -249,7 +249,7 @@ internal void AddMembersByInferredTypesClrType(PSTypeName typename, bool isStati } var members = isStatic - ? PSObject.dotNetStaticAdapter.BaseGetMembers(type) + ? PSObject.DotNetStaticAdapter.BaseGetMembers(type) : PSObject.dotNetInstanceAdapter.GetPropertiesAndMethods(type, false); if (filterToCall != null) From 8038c4e35d3d9f472da5d58ac235eb1706df5d9f Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 15:58:00 +0500 Subject: [PATCH 03/13] DotNetInstanceAdapter --- .../engine/MshMemberInfo.cs | 4 ++-- .../engine/MshObject.cs | 18 ++++++++++-------- .../engine/parser/TypeInferenceVisitor.cs | 2 +- .../engine/runtime/Binding/Binders.cs | 10 +++++----- .../engine/serialization.cs | 4 ++-- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/System.Management.Automation/engine/MshMemberInfo.cs b/src/System.Management.Automation/engine/MshMemberInfo.cs index 8ae260a383b..eafe553831d 100644 --- a/src/System.Management.Automation/engine/MshMemberInfo.cs +++ b/src/System.Management.Automation/engine/MshMemberInfo.cs @@ -3342,7 +3342,7 @@ private void GenerateInternalMembersFromBase() else { foreach (PSMemberInfo member in - PSObject.dotNetInstanceAdapter.BaseGetMembers(_psObject.ImmediateBaseObject)) + PSObject.DotNetInstanceAdapter.BaseGetMembers(_psObject.ImmediateBaseObject)) { internalMembers.Add(member.Copy()); } @@ -3377,7 +3377,7 @@ private PSMemberInfoInternalCollection GetInternalMembersFromAdapt private void GenerateInternalMembersFromPSObject() { - PSMemberInfoCollection members = PSObject.dotNetInstanceAdapter.BaseGetMembers( + PSMemberInfoCollection members = PSObject.DotNetInstanceAdapter.BaseGetMembers( _psObject); foreach (PSMemberInfo member in members) { diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 81b71f86820..cab89467955 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -374,21 +374,21 @@ private void CommonInitialization(object obj) _typeTable = context?.TypeTableWeakReference; } - internal static readonly DotNetAdapter dotNetInstanceAdapter = new DotNetAdapter(); + internal static readonly DotNetAdapter s_dotNetInstanceAdapter = new DotNetAdapter(); private static readonly DotNetAdapter s_baseAdapterForAdaptedObjects = new BaseDotNetAdapterForAdaptedObjects(); internal static readonly DotNetAdapter s_dotNetStaticAdapter = new DotNetAdapter(true); - private static readonly AdapterSet s_dotNetInstanceAdapterSet = new AdapterSet(dotNetInstanceAdapter, null); + private static readonly AdapterSet s_dotNetInstanceAdapterSet = new AdapterSet(DotNetInstanceAdapter, null); private static readonly AdapterSet s_mshMemberSetAdapter = new AdapterSet(new PSMemberSetAdapter(), null); private static readonly AdapterSet s_mshObjectAdapter = new AdapterSet(new PSObjectAdapter(), null); private static readonly PSObject.AdapterSet s_cimInstanceAdapter = new PSObject.AdapterSet(new ThirdPartyAdapter(typeof(Microsoft.Management.Infrastructure.CimInstance), new Microsoft.PowerShell.Cim.CimInstanceAdapter()), - PSObject.dotNetInstanceAdapter); + PSObject.DotNetInstanceAdapter); #if !UNIX - private static readonly AdapterSet s_managementObjectAdapter = new AdapterSet(new ManagementObjectAdapter(), dotNetInstanceAdapter); - private static readonly AdapterSet s_managementClassAdapter = new AdapterSet(new ManagementClassApdapter(), dotNetInstanceAdapter); - private static readonly AdapterSet s_directoryEntryAdapter = new AdapterSet(new DirectoryEntryAdapter(), dotNetInstanceAdapter); + private static readonly AdapterSet s_managementObjectAdapter = new AdapterSet(new ManagementObjectAdapter(), DotNetInstanceAdapter); + private static readonly AdapterSet s_managementClassAdapter = new AdapterSet(new ManagementClassApdapter(), DotNetInstanceAdapter); + private static readonly AdapterSet s_directoryEntryAdapter = new AdapterSet(new DirectoryEntryAdapter(), DotNetInstanceAdapter); #endif private static readonly AdapterSet s_dataRowViewAdapter = new AdapterSet(new DataRowViewAdapter(), s_baseAdapterForAdaptedObjects); private static readonly AdapterSet s_dataRowAdapter = new AdapterSet(new DataRowAdapter(), s_baseAdapterForAdaptedObjects); @@ -482,7 +482,7 @@ internal static AdapterSet GetMappedAdapter(object obj, TypeTable typeTable) ComTypeInfo info = ComTypeInfo.GetDispatchTypeInfo(obj); return info != null - ? new AdapterSet(new ComAdapter(info), dotNetInstanceAdapter) + ? new AdapterSet(new ComAdapter(info), DotNetInstanceAdapter) : PSObject.s_dotNetInstanceAdapterSet; } else @@ -2082,7 +2082,7 @@ internal string ToStringFromDeserialization /// /// This class is solely used by PSObject to support .net member lookup for all the - /// adapters except for dotNetInstanceAdapter, mshMemberSetAdapter and mshObjectAdapter. + /// adapters except for DotNetInstanceAdapter, mshMemberSetAdapter and mshObjectAdapter. /// If the original adapter is not one of those, then .net members are also exposed /// on the PSObject. This will have the following effect: /// @@ -2320,6 +2320,8 @@ internal bool IsHelpObject internal static DotNetAdapter DotNetStaticAdapter => s_dotNetStaticAdapter; + internal static DotNetAdapter DotNetInstanceAdapter => s_dotNetInstanceAdapter; + #endregion } diff --git a/src/System.Management.Automation/engine/parser/TypeInferenceVisitor.cs b/src/System.Management.Automation/engine/parser/TypeInferenceVisitor.cs index e376695885f..3e3b6932714 100644 --- a/src/System.Management.Automation/engine/parser/TypeInferenceVisitor.cs +++ b/src/System.Management.Automation/engine/parser/TypeInferenceVisitor.cs @@ -250,7 +250,7 @@ internal void AddMembersByInferredTypesClrType(PSTypeName typename, bool isStati var members = isStatic ? PSObject.DotNetStaticAdapter.BaseGetMembers(type) - : PSObject.dotNetInstanceAdapter.GetPropertiesAndMethods(type, false); + : PSObject.DotNetInstanceAdapter.GetPropertiesAndMethods(type, false); if (filterToCall != null) { diff --git a/src/System.Management.Automation/engine/runtime/Binding/Binders.cs b/src/System.Management.Automation/engine/runtime/Binding/Binders.cs index 18d9449a540..4e6740d8f43 100644 --- a/src/System.Management.Automation/engine/runtime/Binding/Binders.cs +++ b/src/System.Management.Automation/engine/runtime/Binding/Binders.cs @@ -5703,7 +5703,7 @@ internal PSMemberInfo GetPSMemberInfo(DynamicMetaObject target, } } - if (_classScope != null && (target.LimitType == _classScope || target.LimitType.IsSubclassOf(_classScope)) && adapterSet.OriginalAdapter == PSObject.dotNetInstanceAdapter) + if (_classScope != null && (target.LimitType == _classScope || target.LimitType.IsSubclassOf(_classScope)) && adapterSet.OriginalAdapter == PSObject.DotNetInstanceAdapter) { List candidateMethods = null; foreach (var member in _classScope.GetMembers(BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.NonPublic)) @@ -5719,7 +5719,7 @@ internal PSMemberInfo GetPSMemberInfo(DynamicMetaObject target, if ((getMethod == null || getMethod.IsFamily || getMethod.IsPublic) && (setMethod == null || setMethod.IsFamily || setMethod.IsPublic)) { - memberInfo = new PSProperty(this.Name, PSObject.dotNetInstanceAdapter, target.Value, new DotNetAdapter.PropertyCacheEntry(propertyInfo)); + memberInfo = new PSProperty(this.Name, PSObject.DotNetInstanceAdapter, target.Value, new DotNetAdapter.PropertyCacheEntry(propertyInfo)); } } else @@ -5729,7 +5729,7 @@ internal PSMemberInfo GetPSMemberInfo(DynamicMetaObject target, { if (fieldInfo.IsFamily) { - memberInfo = new PSProperty(this.Name, PSObject.dotNetInstanceAdapter, target.Value, new DotNetAdapter.PropertyCacheEntry(fieldInfo)); + memberInfo = new PSProperty(this.Name, PSObject.DotNetInstanceAdapter, target.Value, new DotNetAdapter.PropertyCacheEntry(fieldInfo)); } } else @@ -5767,7 +5767,7 @@ internal PSMemberInfo GetPSMemberInfo(DynamicMetaObject target, else { DotNetAdapter.MethodCacheEntry method = new DotNetAdapter.MethodCacheEntry(candidateMethods.ToArray()); - memberInfo = PSMethod.Create(this.Name, PSObject.dotNetInstanceAdapter, null, method); + memberInfo = PSMethod.Create(this.Name, PSObject.DotNetInstanceAdapter, null, method); } } } @@ -6976,7 +6976,7 @@ internal static MethodInfo FindBestMethod(DynamicMetaObject target, { MethodInfo result = null; - var psMethod = PSObject.dotNetInstanceAdapter.GetDotNetMethod(PSObject.Base(target.Value), methodName); + var psMethod = PSObject.DotNetInstanceAdapter.GetDotNetMethod(PSObject.Base(target.Value), methodName); if (psMethod != null) { var data = (DotNetAdapter.MethodCacheEntry)psMethod.adapterData; diff --git a/src/System.Management.Automation/engine/serialization.cs b/src/System.Management.Automation/engine/serialization.cs index b69f2434f42..9a1345518a5 100644 --- a/src/System.Management.Automation/engine/serialization.cs +++ b/src/System.Management.Automation/engine/serialization.cs @@ -3643,7 +3643,7 @@ private PSObject ReadPSObject() else if (IsNextElement(SerializationStrings.ToStringElementTag)) { dso.ToStringFromDeserialization = ReadDecodedElementString(SerializationStrings.ToStringElementTag); - dso.InstanceMembers.Add(PSObject.dotNetInstanceAdapter.GetDotNetMethod(dso, "ToString")); + dso.InstanceMembers.Add(PSObject.DotNetInstanceAdapter.GetDotNetMethod(dso, "ToString")); PSGetMemberBinder.SetHasInstanceMember("ToString"); // Fix for Win8:75437 // The TokenText property is used in type conversion and it is not being populated during deserialization @@ -3826,7 +3826,7 @@ private void ReadProperties(PSObject dso) dso.adaptedMembers = new PSMemberInfoInternalCollection(); // Add the GetType method to the instance members, so that it works on deserialized psobjects - dso.InstanceMembers.Add(PSObject.dotNetInstanceAdapter.GetDotNetMethod(dso, "GetType")); + dso.InstanceMembers.Add(PSObject.DotNetInstanceAdapter.GetDotNetMethod(dso, "GetType")); PSGetMemberBinder.SetHasInstanceMember("GetType"); // Set Clr members to a collection which is empty From 9d6bfb17758f8accbbb0b80253eb508c9f71685a Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 16:17:56 +0500 Subject: [PATCH 04/13] ClrMembers --- .../engine/MshMemberInfo.cs | 4 ++-- .../engine/MshObject.cs | 14 +++++++------- .../engine/serialization.cs | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/System.Management.Automation/engine/MshMemberInfo.cs b/src/System.Management.Automation/engine/MshMemberInfo.cs index eafe553831d..b4809a68f4f 100644 --- a/src/System.Management.Automation/engine/MshMemberInfo.cs +++ b/src/System.Management.Automation/engine/MshMemberInfo.cs @@ -3331,9 +3331,9 @@ private void GenerateInternalMembersFromBase() { if (_psObject.isDeserialized) { - if (_psObject.clrMembers != null) + if (_psObject.ClrMembers != null) { - foreach (PSMemberInfo member in _psObject.clrMembers) + foreach (PSMemberInfo member in _psObject.ClrMembers) { internalMembers.Add(member.Copy()); } diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index cab89467955..84ad2921466 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -714,12 +714,6 @@ internal static bool HasInstanceMembers(object obj, out PSMemberInfoInternalColl /// internal PSMemberInfoInternalCollection adaptedMembers; - /// - /// Members from the adapter of the object before it was serialized - /// Null for live objects but not null for deserialized objects. - /// - internal PSMemberInfoInternalCollection clrMembers; - /// /// Set to true when the BaseObject is PSCustomObject. /// @@ -2013,7 +2007,7 @@ internal static void CopyDeserializerFields(PSObject source, PSObject target) { target.isDeserialized = source.isDeserialized; target.adaptedMembers = source.adaptedMembers; - target.clrMembers = source.clrMembers; + target.ClrMembers = source.ClrMembers; } if (target._toStringFromDeserialization == null) @@ -2320,6 +2314,12 @@ internal bool IsHelpObject internal static DotNetAdapter DotNetStaticAdapter => s_dotNetStaticAdapter; + /// + /// Members from the adapter of the object before it was serialized + /// Null for live objects but not null for deserialized objects. + /// + internal PSMemberInfoInternalCollection ClrMembers { get; set; } + internal static DotNetAdapter DotNetInstanceAdapter => s_dotNetInstanceAdapter; #endregion diff --git a/src/System.Management.Automation/engine/serialization.cs b/src/System.Management.Automation/engine/serialization.cs index 9a1345518a5..58538e5bf07 100644 --- a/src/System.Management.Automation/engine/serialization.cs +++ b/src/System.Management.Automation/engine/serialization.cs @@ -3830,7 +3830,7 @@ private void ReadProperties(PSObject dso) PSGetMemberBinder.SetHasInstanceMember("GetType"); // Set Clr members to a collection which is empty - dso.clrMembers = new PSMemberInfoInternalCollection(); + dso.ClrMembers = new PSMemberInfoInternalCollection(); if (ReadStartElementAndHandleEmpty(SerializationStrings.AdapterProperties)) { From 2ac60a56c3de2e64819382a553493f802607ec65 Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 16:44:18 +0500 Subject: [PATCH 05/13] AdaptedMembers --- .../engine/MshMemberInfo.cs | 4 ++-- .../engine/MshObject.cs | 22 +++++++------------ .../engine/serialization.cs | 10 ++++----- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/System.Management.Automation/engine/MshMemberInfo.cs b/src/System.Management.Automation/engine/MshMemberInfo.cs index b4809a68f4f..cb23f586646 100644 --- a/src/System.Management.Automation/engine/MshMemberInfo.cs +++ b/src/System.Management.Automation/engine/MshMemberInfo.cs @@ -3355,9 +3355,9 @@ private PSMemberInfoInternalCollection GetInternalMembersFromAdapt if (_psObject.isDeserialized) { - if (_psObject.adaptedMembers != null) + if (_psObject.AdaptedMembers != null) { - foreach (PSMemberInfo member in _psObject.adaptedMembers) + foreach (PSMemberInfo member in _psObject.AdaptedMembers) { retVal.Add(member.Copy()); } diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 84ad2921466..4daceeb04e0 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -115,12 +115,12 @@ private static T AdapterGetMemberDelegate(PSObject msjObj, string name) where { if (msjObj.isDeserialized) { - if (msjObj.adaptedMembers == null) + if (msjObj.AdaptedMembers == null) { return null; } - T adaptedMember = msjObj.adaptedMembers[name] as T; + T adaptedMember = msjObj.AdaptedMembers[name] as T; PSObject.memberResolution.WriteLine("Serialized adapted member: {0}.", adaptedMember == null ? "not found" : adaptedMember.Name); return adaptedMember; } @@ -154,13 +154,13 @@ private static PSMemberInfoInternalCollection AdapterGetMembersDelegate(PS { if (msjObj.isDeserialized) { - if (msjObj.adaptedMembers == null) + if (msjObj.AdaptedMembers == null) { return new PSMemberInfoInternalCollection(); } - PSObject.memberResolution.WriteLine("Serialized adapted members: {0}.", msjObj.adaptedMembers.Count); - return TransformMemberInfoCollection(msjObj.adaptedMembers); + PSObject.memberResolution.WriteLine("Serialized adapted members: {0}.", msjObj.AdaptedMembers.Count); + return TransformMemberInfoCollection(msjObj.AdaptedMembers); } PSMemberInfoInternalCollection retValue = msjObj.InternalAdapter.BaseGetMembers(msjObj._immediateBaseObject); @@ -708,12 +708,6 @@ internal static bool HasInstanceMembers(object obj, out PSMemberInfoInternalColl /// private bool _storeTypeNameAndInstanceMembersLocally; - /// - /// Members from the adapter of the object before it was serialized - /// Null for live objects but not null for deserialized objects. - /// - internal PSMemberInfoInternalCollection adaptedMembers; - /// /// Set to true when the BaseObject is PSCustomObject. /// @@ -1968,7 +1962,7 @@ internal bool ShouldSerializeAdapter() { if (this.isDeserialized) { - return this.adaptedMembers != null; + return this.AdaptedMembers != null; } return !this.immediateBaseObjectIsEmpty; @@ -1976,7 +1970,7 @@ internal bool ShouldSerializeAdapter() internal PSMemberInfoInternalCollection GetAdaptedProperties() { - return GetProperties(this.adaptedMembers, this.InternalAdapter); + return GetProperties(this.AdaptedMembers, this.InternalAdapter); } private PSMemberInfoInternalCollection GetProperties(PSMemberInfoInternalCollection serializedMembers, Adapter particularAdapter) @@ -2006,7 +2000,7 @@ internal static void CopyDeserializerFields(PSObject source, PSObject target) if (!target.isDeserialized) { target.isDeserialized = source.isDeserialized; - target.adaptedMembers = source.adaptedMembers; + target.AdaptedMembers = source.AdaptedMembers; target.ClrMembers = source.ClrMembers; } diff --git a/src/System.Management.Automation/engine/serialization.cs b/src/System.Management.Automation/engine/serialization.cs index 58538e5bf07..4a325dc278e 100644 --- a/src/System.Management.Automation/engine/serialization.cs +++ b/src/System.Management.Automation/engine/serialization.cs @@ -3463,9 +3463,9 @@ private PSObject RehydrateCimInstance(PSObject deserializedObject) } // process properties that were originally "adapted" properties - if (deserializedObject.adaptedMembers != null) + if (deserializedObject.AdaptedMembers != null) { - foreach (PSMemberInfo deserializedMemberInfo in deserializedObject.adaptedMembers) + foreach (PSMemberInfo deserializedMemberInfo in deserializedObject.AdaptedMembers) { PSPropertyInfo deserializedProperty = deserializedMemberInfo as PSPropertyInfo; if (deserializedProperty == null) @@ -3495,7 +3495,7 @@ private PSObject RehydrateCimInstance(PSObject deserializedObject) } // skip adapted properties - if ((deserializedObject.adaptedMembers != null) && (deserializedObject.adaptedMembers[deserializedProperty.Name] != null)) + if ((deserializedObject.AdaptedMembers != null) && (deserializedObject.AdaptedMembers[deserializedProperty.Name] != null)) { continue; } @@ -3823,7 +3823,7 @@ private void ReadProperties(PSObject dso) // Since we are adding baseobject properties as propertybag, // mark the object as deserialized. dso.isDeserialized = true; - dso.adaptedMembers = new PSMemberInfoInternalCollection(); + dso.AdaptedMembers = new PSMemberInfoInternalCollection(); // Add the GetType method to the instance members, so that it works on deserialized psobjects dso.InstanceMembers.Add(PSObject.DotNetInstanceAdapter.GetDotNetMethod(dso, "GetType")); @@ -3840,7 +3840,7 @@ private void ReadProperties(PSObject dso) string property = ReadNameAttribute(); object value = ReadOneObject(); PSProperty prop = new PSProperty(property, value); - dso.adaptedMembers.Add(prop); + dso.AdaptedMembers.Add(prop); } ReadEndElement(); From 4f06b809f30063d94b151ebecd52d95b02df1456 Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 17:33:33 +0500 Subject: [PATCH 06/13] MemberResolution --- .../engine/CoreAdapter.cs | 22 ++++++++-------- .../engine/MshMemberInfo.cs | 26 +++++++++---------- .../engine/MshObject.cs | 26 ++++++++++--------- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/System.Management.Automation/engine/CoreAdapter.cs b/src/System.Management.Automation/engine/CoreAdapter.cs index f2e745e4b4c..1afc2b69b91 100644 --- a/src/System.Management.Automation/engine/CoreAdapter.cs +++ b/src/System.Management.Automation/engine/CoreAdapter.cs @@ -1537,7 +1537,7 @@ internal static Type EffectiveArgumentType(object arg) internal static void SetReferences(object[] arguments, MethodInformation methodInformation, object[] originalArguments) { - using (PSObject.memberResolution.TraceScope("Checking for possible references.")) + using (PSObject.MemberResolution.TraceScope("Checking for possible references.")) { ParameterInformation[] parameters = methodInformation.parameters; for (int i = 0; (i < originalArguments.Length) && (i < parameters.Length) && (i < arguments.Length); i++) @@ -1567,7 +1567,7 @@ internal static void SetReferences(object[] arguments, MethodInformation methodI } object argument = arguments[i]; - PSObject.memberResolution.WriteLine("Argument '{0}' was a reference so it will be set to \"{1}\".", i + 1, argument); + PSObject.MemberResolution.WriteLine("Argument '{0}' was a reference so it will be set to \"{1}\".", i + 1, argument); originalArgumentReference.Value = argument; } } @@ -1741,7 +1741,7 @@ internal static object MethodArgumentConvertTo(object valueToConvert, bool isParameterByRef, int parameterIndex, Type resultType, IFormatProvider formatProvider) { - using (PSObject.memberResolution.TraceScope("Method argument conversion.")) + using (PSObject.MemberResolution.TraceScope("Method argument conversion.")) { if (resultType == null) { @@ -1772,7 +1772,7 @@ internal static object UnReference(object obj, out bool isArgumentByRef) PSReference reference = obj as PSReference; if (reference != null) { - PSObject.memberResolution.WriteLine("Parameter was a reference."); + PSObject.MemberResolution.WriteLine("Parameter was a reference."); isArgumentByRef = true; return reference.Value; } @@ -1785,7 +1785,7 @@ internal static object UnReference(object obj, out bool isArgumentByRef) if (reference != null) { - PSObject.memberResolution.WriteLine("Parameter was an PSObject containing a reference."); + PSObject.MemberResolution.WriteLine("Parameter was an PSObject containing a reference."); isArgumentByRef = true; return reference.Value; } @@ -1796,7 +1796,7 @@ internal static object UnReference(object obj, out bool isArgumentByRef) internal static object PropertySetAndMethodArgumentConvertTo(object valueToConvert, Type resultType, IFormatProvider formatProvider) { - using (PSObject.memberResolution.TraceScope("Converting parameter \"{0}\" to \"{1}\".", valueToConvert, resultType)) + using (PSObject.MemberResolution.TraceScope("Converting parameter \"{0}\" to \"{1}\".", valueToConvert, resultType)) { if (resultType == null) { @@ -1808,7 +1808,7 @@ internal static object PropertySetAndMethodArgumentConvertTo(object valueToConve { if (resultType == typeof(object)) { - PSObject.memberResolution.WriteLine("Parameter was an PSObject and will be converted to System.Object."); + PSObject.MemberResolution.WriteLine("Parameter was an PSObject and will be converted to System.Object."); // we use PSObject.Base so we don't return // PSCustomObject return PSObject.Base(mshObj); @@ -4061,7 +4061,7 @@ internal static object MethodInvokeDotNet( string methodDefinition = bestMethod.methodDefinition; ScriptTrace.Trace(1, "TraceMethodCall", ParserStrings.TraceMethodCall, methodDefinition); - PSObject.memberResolution.WriteLine("Calling Method: {0}", methodDefinition); + PSObject.MemberResolution.WriteLine("Calling Method: {0}", methodDefinition); return AuxiliaryMethodInvoke(target, newArguments, bestMethod, arguments); } @@ -4084,9 +4084,9 @@ internal static object ConstructorInvokeDotNet(Type type, ConstructorInfo[] cons private static object InvokeResolvedConstructor(MethodInformation bestMethod, object[] newArguments, object[] arguments) { - if ((PSObject.memberResolution.Options & PSTraceSourceOptions.WriteLine) != 0) + if ((PSObject.MemberResolution.Options & PSTraceSourceOptions.WriteLine) != 0) { - PSObject.memberResolution.WriteLine("Calling Constructor: {0}", DotNetAdapter.GetMethodInfoOverloadDefinition(null, + PSObject.MemberResolution.WriteLine("Calling Constructor: {0}", DotNetAdapter.GetMethodInfoOverloadDefinition(null, bestMethod.method, 0)); } @@ -4107,7 +4107,7 @@ internal static void ParameterizedPropertyInvokeSet(string propertyName, object // of all parameters but the last one object[] newArguments; MethodInformation bestMethod = GetBestMethodAndArguments(propertyName, methodInformation, arguments, out newArguments); - PSObject.memberResolution.WriteLine("Calling Set Method: {0}", bestMethod.methodDefinition); + PSObject.MemberResolution.WriteLine("Calling Set Method: {0}", bestMethod.methodDefinition); ParameterInfo[] bestMethodParameters = bestMethod.method.GetParameters(); Type propertyType = bestMethodParameters[bestMethodParameters.Length - 1].ParameterType; diff --git a/src/System.Management.Automation/engine/MshMemberInfo.cs b/src/System.Management.Automation/engine/MshMemberInfo.cs index cb23f586646..031b6a52103 100644 --- a/src/System.Management.Automation/engine/MshMemberInfo.cs +++ b/src/System.Management.Automation/engine/MshMemberInfo.cs @@ -4676,7 +4676,7 @@ public override T this[string name] { get { - using (PSObject.memberResolution.TraceScope("Lookup")) + using (PSObject.MemberResolution.TraceScope("Lookup")) { if (string.IsNullOrEmpty(name)) { @@ -4697,7 +4697,7 @@ public override T this[string name] member = instanceMembers[name]; if (member is T memberAsT) { - PSObject.memberResolution.WriteLine("Found PSObject instance member: {0}.", name); + PSObject.MemberResolution.WriteLine("Found PSObject instance member: {0}.", name); return memberAsT; } } @@ -4711,7 +4711,7 @@ public override T this[string name] // In membersets we cannot replicate the instance when adding // since the memberset might not yet have an associated PSObject. // We replicate the instance when returning the members of the memberset. - PSObject.memberResolution.WriteLine("Found PSMemberSet member: {0}.", name); + PSObject.MemberResolution.WriteLine("Found PSMemberSet member: {0}.", name); member.ReplicateInstance(delegateOwner); return memberAsT; } @@ -4748,7 +4748,7 @@ public override T this[string name] private PSMemberInfoInternalCollection GetIntegratedMembers(MshMemberMatchOptions matchOptions) { - using (PSObject.memberResolution.TraceScope("Generating the total list of members")) + using (PSObject.MemberResolution.TraceScope("Generating the total list of members")) { PSMemberInfoInternalCollection returnValue = new PSMemberInfoInternalCollection(); object delegateOwner; @@ -4794,14 +4794,14 @@ private PSMemberInfoInternalCollection GetIntegratedMembers(MshMemberMatchOpt PSMemberInfo previousMember = returnValue[member.Name]; if (previousMember != null) { - PSObject.memberResolution.WriteLine("Member \"{0}\" of type \"{1}\" has been ignored because a member with the same name and type \"{2}\" is already present.", + PSObject.MemberResolution.WriteLine("Member \"{0}\" of type \"{1}\" has been ignored because a member with the same name and type \"{2}\" is already present.", member.Name, member.MemberType, previousMember.MemberType); continue; } if (!member.MatchesOptions(matchOptions)) { - PSObject.memberResolution.WriteLine("Skipping hidden member \"{0}\".", member.Name); + PSObject.MemberResolution.WriteLine("Skipping hidden member \"{0}\".", member.Name); continue; } @@ -4871,7 +4871,7 @@ public override ReadOnlyPSMemberInfoCollection Match(string name, PSMemberTyp /// For invalid arguments. internal override ReadOnlyPSMemberInfoCollection Match(string name, PSMemberTypes memberTypes, MshMemberMatchOptions matchOptions) { - using (PSObject.memberResolution.TraceScope("Matching \"{0}\"", name)) + using (PSObject.MemberResolution.TraceScope("Matching \"{0}\"", name)) { if (string.IsNullOrEmpty(name)) { @@ -4886,7 +4886,7 @@ internal override ReadOnlyPSMemberInfoCollection Match(string name, PSMemberT WildcardPattern nameMatch = MemberMatch.GetNamePattern(name); PSMemberInfoInternalCollection allMembers = GetIntegratedMembers(matchOptions); ReadOnlyPSMemberInfoCollection returnValue = new ReadOnlyPSMemberInfoCollection(MemberMatch.Match(allMembers, name, nameMatch, memberTypes)); - PSObject.memberResolution.WriteLine("{0} total matches.", returnValue.Count); + PSObject.MemberResolution.WriteLine("{0} total matches.", returnValue.Count); return returnValue; } } @@ -4919,7 +4919,7 @@ internal struct Enumerator : IEnumerator where S : PSMemberInfo /// Members we are enumerating. internal Enumerator(PSMemberInfoIntegratingCollection integratingCollection) { - using (PSObject.memberResolution.TraceScope("Enumeration Start")) + using (PSObject.MemberResolution.TraceScope("Enumeration Start")) { _currentIndex = -1; _current = null; @@ -4927,13 +4927,13 @@ internal Enumerator(PSMemberInfoIntegratingCollection integratingCollection) if (integratingCollection._mshOwner != null) { integratingCollection.GenerateAllReservedMembers(); - PSObject.memberResolution.WriteLine("Enumerating PSObject with type \"{0}\".", integratingCollection._mshOwner.ImmediateBaseObject.GetType().FullName); - PSObject.memberResolution.WriteLine("PSObject instance members: {0}", _allMembers.VisibleCount); + PSObject.MemberResolution.WriteLine("Enumerating PSObject with type \"{0}\".", integratingCollection._mshOwner.ImmediateBaseObject.GetType().FullName); + PSObject.MemberResolution.WriteLine("PSObject instance members: {0}", _allMembers.VisibleCount); } else { - PSObject.memberResolution.WriteLine("Enumerating PSMemberSet \"{0}\".", integratingCollection._memberSetOwner.Name); - PSObject.memberResolution.WriteLine("MemberSet instance members: {0}", _allMembers.VisibleCount); + PSObject.MemberResolution.WriteLine("Enumerating PSMemberSet \"{0}\".", integratingCollection._memberSetOwner.Name); + PSObject.MemberResolution.WriteLine("MemberSet instance members: {0}", _allMembers.VisibleCount); } } } diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 4daceeb04e0..b833027a8a6 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -78,17 +78,17 @@ private static T TypeTableGetMemberDelegate(PSObject msjObj, TypeTable typeTa PSMemberInfo member = allMembers[name]; if (member == null) { - PSObject.memberResolution.WriteLine("\"{0}\" NOT present in type table.", name); + PSObject.MemberResolution.WriteLine("\"{0}\" NOT present in type table.", name); return null; } if (member is T memberAsT) { - PSObject.memberResolution.WriteLine("\"{0}\" present in type table.", name); + PSObject.MemberResolution.WriteLine("\"{0}\" present in type table.", name); return memberAsT; } - PSObject.memberResolution.WriteLine("\"{0}\" from types table ignored because it has type {1} instead of {2}.", + PSObject.MemberResolution.WriteLine("\"{0}\" from types table ignored because it has type {1} instead of {2}.", name, member.GetType(), typeof(T)); return null; } @@ -107,7 +107,7 @@ internal static PSMemberInfoInternalCollection TypeTableGetMembersDelegate } PSMemberInfoInternalCollection members = typeTableToUse.GetMembers(msjObj.InternalTypeNames); - PSObject.memberResolution.WriteLine("Type table members: {0}.", members.Count); + PSObject.MemberResolution.WriteLine("Type table members: {0}.", members.Count); return members; } @@ -121,12 +121,12 @@ private static T AdapterGetMemberDelegate(PSObject msjObj, string name) where } T adaptedMember = msjObj.AdaptedMembers[name] as T; - PSObject.memberResolution.WriteLine("Serialized adapted member: {0}.", adaptedMember == null ? "not found" : adaptedMember.Name); + PSObject.MemberResolution.WriteLine("Serialized adapted member: {0}.", adaptedMember == null ? "not found" : adaptedMember.Name); return adaptedMember; } T retValue = msjObj.InternalAdapter.BaseGetMember(msjObj._immediateBaseObject, name); - PSObject.memberResolution.WriteLine("Adapted member: {0}.", retValue == null ? "not found" : retValue.Name); + PSObject.MemberResolution.WriteLine("Adapted member: {0}.", retValue == null ? "not found" : retValue.Name); return retValue; } @@ -159,12 +159,12 @@ private static PSMemberInfoInternalCollection AdapterGetMembersDelegate(PS return new PSMemberInfoInternalCollection(); } - PSObject.memberResolution.WriteLine("Serialized adapted members: {0}.", msjObj.AdaptedMembers.Count); + PSObject.MemberResolution.WriteLine("Serialized adapted members: {0}.", msjObj.AdaptedMembers.Count); return TransformMemberInfoCollection(msjObj.AdaptedMembers); } PSMemberInfoInternalCollection retValue = msjObj.InternalAdapter.BaseGetMembers(msjObj._immediateBaseObject); - PSObject.memberResolution.WriteLine("Adapted members: {0}.", retValue.VisibleCount); + PSObject.MemberResolution.WriteLine("Adapted members: {0}.", retValue.VisibleCount); return retValue; } @@ -174,7 +174,7 @@ private static PSMemberInfoInternalCollection DotNetGetMembersDelegate(PSO if (msjObj.InternalBaseDotNetAdapter != null) { PSMemberInfoInternalCollection retValue = msjObj.InternalBaseDotNetAdapter.BaseGetMembers(msjObj._immediateBaseObject); - PSObject.memberResolution.WriteLine("DotNet members: {0}.", retValue.VisibleCount); + PSObject.MemberResolution.WriteLine("DotNet members: {0}.", retValue.VisibleCount); return retValue; } @@ -187,7 +187,7 @@ private static T DotNetGetMemberDelegate(PSObject msjObj, string name) where if (msjObj.InternalBaseDotNetAdapter != null) { T retValue = msjObj.InternalBaseDotNetAdapter.BaseGetMember(msjObj._immediateBaseObject, name); - PSObject.memberResolution.WriteLine("DotNet member: {0}.", retValue == null ? "not found" : retValue.Name); + PSObject.MemberResolution.WriteLine("DotNet member: {0}.", retValue == null ? "not found" : retValue.Name); return retValue; } @@ -598,6 +598,8 @@ internal static PSObject ConstructPSObjectFromSerializationInfo(SerializationInf private WeakReference _typeTable; + private static readonly PSTraceSource s_memberResolution = PSTraceSource.GetTracer("MemberResolution", "Traces the resolution from member name to the member. A member can be a property, method, etc.", false); + /// /// This is the adapter that will depend on the type of baseObject. /// @@ -713,8 +715,6 @@ internal static bool HasInstanceMembers(object obj, out PSMemberInfoInternalColl /// internal bool immediateBaseObjectIsEmpty; - internal static PSTraceSource memberResolution = PSTraceSource.GetTracer("MemberResolution", "Traces the resolution from member name to the member. A member can be a property, method, etc.", false); - #endregion instance fields #endregion fields @@ -2308,6 +2308,8 @@ internal bool IsHelpObject internal static DotNetAdapter DotNetStaticAdapter => s_dotNetStaticAdapter; + internal static PSTraceSource MemberResolution => s_memberResolution; + /// /// Members from the adapter of the object before it was serialized /// Null for live objects but not null for deserialized objects. From 00eb582aa5b97651efa87bb5c08ae806f969d6ea Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 17:54:40 +0500 Subject: [PATCH 07/13] ImmediateBaseObjectIsEmpty --- .../commands/utility/CustomSerialization.cs | 6 ++-- .../commands/utility/WebCmdlet/JsonObject.cs | 2 +- .../engine/MshObject.cs | 30 +++++++++---------- .../engine/ParameterBinderBase.cs | 2 +- .../engine/SessionStateDriveAPIs.cs | 2 +- .../engine/serialization.cs | 10 +++---- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs index 0553ee9dbfd..d7a372aed3e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs @@ -342,7 +342,7 @@ private bool HandlePrimitiveKnownTypePSObject(object source, string property, in bool sourceHandled = false; PSObject moSource = source as PSObject; - if (moSource != null && !moSource.immediateBaseObjectIsEmpty) + if (moSource != null && !moSource.ImmediateBaseObjectIsEmpty) { // Check if baseObject is primitive known type object baseObject = moSource.ImmediateBaseObject; @@ -367,7 +367,7 @@ private bool HandleKnownContainerTypes(object source, string property, int depth IDictionary dictionary = null; // If passed in object is PSObject with no baseobject, return false. - if (mshSource != null && mshSource.immediateBaseObjectIsEmpty) + if (mshSource != null && mshSource.ImmediateBaseObjectIsEmpty) { return false; } @@ -595,7 +595,7 @@ private void HandleComplexTypePSObject(PSObject source, string property, int dep bool isEnum = false; bool isPSObject = false; - if (!source.immediateBaseObjectIsEmpty) + if (!source.ImmediateBaseObjectIsEmpty) { isEnum = source.ImmediateBaseObject is Enum; isPSObject = source.ImmediateBaseObject is PSObject; diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs index 4ac980430bf..8e9d63eb34f 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs @@ -551,7 +551,7 @@ private static object ProcessValue(object obj, int currentDepth, in ConvertToJso { if (currentDepth > context.MaxDepth) { - if (pso != null && pso.immediateBaseObjectIsEmpty) + if (pso != null && pso.ImmediateBaseObjectIsEmpty) { // The obj is a pure PSObject, we convert the original PSObject to a string, // instead of its base object in this case diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index b833027a8a6..ef40b35002d 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -366,7 +366,7 @@ private void CommonInitialization(object obj) Diagnostics.Assert(obj != null, "checked by callers"); if (obj is PSCustomObject) { - this.immediateBaseObjectIsEmpty = true; + this.ImmediateBaseObjectIsEmpty = true; } _immediateBaseObject = obj; @@ -710,11 +710,6 @@ internal static bool HasInstanceMembers(object obj, out PSMemberInfoInternalColl /// private bool _storeTypeNameAndInstanceMembersLocally; - /// - /// Set to true when the BaseObject is PSCustomObject. - /// - internal bool immediateBaseObjectIsEmpty; - #endregion instance fields #endregion fields @@ -966,7 +961,7 @@ internal static object Base(object obj) if (mshObj == AutomationNull.Value) return null; - if (mshObj.immediateBaseObjectIsEmpty) + if (mshObj.ImmediateBaseObjectIsEmpty) { return obj; } @@ -976,7 +971,7 @@ internal static object Base(object obj) { returnValue = mshObj._immediateBaseObject; mshObj = returnValue as PSObject; - } while ((mshObj != null) && (!mshObj.immediateBaseObjectIsEmpty)); + } while ((mshObj != null) && (!mshObj.ImmediateBaseObjectIsEmpty)); return returnValue; } @@ -1398,7 +1393,7 @@ internal static string ToString(ExecutionContext context, object obj, string sep // Since we don't have a brokered ToString, we check for the need to enumerate the object or its properties if (recurse) { - if (mshObj.immediateBaseObjectIsEmpty) + if (mshObj.ImmediateBaseObjectIsEmpty) { try { @@ -1541,12 +1536,12 @@ public virtual PSObject Copy() if (this.BaseObject is PSCustomObject) { returnValue._immediateBaseObject = PSCustomObject.SelfInstance; - returnValue.immediateBaseObjectIsEmpty = true; + returnValue.ImmediateBaseObjectIsEmpty = true; } else { returnValue._immediateBaseObject = _immediateBaseObject; - returnValue.immediateBaseObjectIsEmpty = false; + returnValue.ImmediateBaseObjectIsEmpty = false; } // Instance members will be recovered as necessary through the resurrection table. @@ -1774,7 +1769,7 @@ public virtual void GetObjectData(SerializationInfo info, StreamingContext conte // We create a wrapper PSObject, so that we can successfully deserialize it string serializedContent; - if (this.immediateBaseObjectIsEmpty) + if (this.ImmediateBaseObjectIsEmpty) { PSObject serializeTarget = new PSObject(this); serializedContent = PSSerializer.Serialize(serializeTarget); @@ -1965,7 +1960,7 @@ internal bool ShouldSerializeAdapter() return this.AdaptedMembers != null; } - return !this.immediateBaseObjectIsEmpty; + return !this.ImmediateBaseObjectIsEmpty; } internal PSMemberInfoInternalCollection GetAdaptedProperties() @@ -2019,9 +2014,9 @@ internal static void CopyDeserializerFields(PSObject source, PSObject target) ///This method is to be used only by Serialization code internal void SetCoreOnDeserialization(object value, bool overrideTypeInfo) { - Diagnostics.Assert(this.immediateBaseObjectIsEmpty, "BaseObject should be PSCustomObject for deserialized objects"); + Diagnostics.Assert(this.ImmediateBaseObjectIsEmpty, "BaseObject should be PSCustomObject for deserialized objects"); Diagnostics.Assert(value != null, "known objects are never null"); - this.immediateBaseObjectIsEmpty = false; + this.ImmediateBaseObjectIsEmpty = false; _immediateBaseObject = value; _adapterSet = GetMappedAdapter(_immediateBaseObject, GetTypeTable()); if (overrideTypeInfo) @@ -2300,6 +2295,11 @@ internal bool IsHelpObject internal bool HasGeneratedReservedMembers { get; set; } + /// + /// Set to true when the BaseObject is PSCustomObject. + /// + internal bool ImmediateBaseObjectIsEmpty { get; set; } + /// /// Members from the adapter of the object before it was serialized /// Null for live objects but not null for deserialized objects. diff --git a/src/System.Management.Automation/engine/ParameterBinderBase.cs b/src/System.Management.Automation/engine/ParameterBinderBase.cs index 39b08596ecb..e25d6df5063 100644 --- a/src/System.Management.Automation/engine/ParameterBinderBase.cs +++ b/src/System.Management.Automation/engine/ParameterBinderBase.cs @@ -850,7 +850,7 @@ private bool ShouldContinueUncoercedBind( } var psobj = parameterValue as PSObject; - if (psobj != null && !psobj.immediateBaseObjectIsEmpty) + if (psobj != null && !psobj.ImmediateBaseObjectIsEmpty) { // See if the base object is of the same type or // as subclass of the parameter diff --git a/src/System.Management.Automation/engine/SessionStateDriveAPIs.cs b/src/System.Management.Automation/engine/SessionStateDriveAPIs.cs index b2eed9aeb55..b6af867457d 100644 --- a/src/System.Management.Automation/engine/SessionStateDriveAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateDriveAPIs.cs @@ -88,7 +88,7 @@ internal PSDriveInfo NewDrive(PSDriveInfo drive, string scopeID) // set the return value to the first drive (should only be one). - if (!successObjects[0].immediateBaseObjectIsEmpty) + if (!successObjects[0].ImmediateBaseObjectIsEmpty) { result = (PSDriveInfo)successObjects[0].BaseObject; } diff --git a/src/System.Management.Automation/engine/serialization.cs b/src/System.Management.Automation/engine/serialization.cs index 4a325dc278e..f1957170bc4 100644 --- a/src/System.Management.Automation/engine/serialization.cs +++ b/src/System.Management.Automation/engine/serialization.cs @@ -1100,7 +1100,7 @@ private bool HandleSecureString(object source, string streamName, string propert moSource = source as PSObject; } - if (moSource != null && !moSource.immediateBaseObjectIsEmpty) + if (moSource != null && !moSource.ImmediateBaseObjectIsEmpty) { // check if source is of type secure string secureString = moSource.ImmediateBaseObject as SecureString; @@ -1172,7 +1172,7 @@ int depth bool sourceHandled = false; PSObject moSource = source as PSObject; - if (moSource != null && !moSource.immediateBaseObjectIsEmpty) + if (moSource != null && !moSource.ImmediateBaseObjectIsEmpty) { // Check if baseObject is primitive known type object baseObject = moSource.ImmediateBaseObject; @@ -1203,7 +1203,7 @@ int depth IDictionary dictionary = null; // If passed in object is PSObject with no baseobject, return false. - if (mshSource != null && mshSource.immediateBaseObjectIsEmpty) + if (mshSource != null && mshSource.ImmediateBaseObjectIsEmpty) { return false; } @@ -1460,7 +1460,7 @@ int depth bool isPSObject = false; bool isCimInstance = false; - if (!mshSource.immediateBaseObjectIsEmpty) + if (!mshSource.ImmediateBaseObjectIsEmpty) { do // false loop { @@ -1495,7 +1495,7 @@ int depth bool writeToString = true; if (mshSource.ToStringFromDeserialization == null) // continue to write ToString from deserialized objects, but... { - if (mshSource.immediateBaseObjectIsEmpty) // ... don't write ToString for property bags + if (mshSource.ImmediateBaseObjectIsEmpty) // ... don't write ToString for property bags { writeToString = false; } From 619052499cb069ac4dc16527a0861f4b7755562d Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 18:11:09 +0500 Subject: [PATCH 08/13] TokenText --- src/System.Management.Automation/engine/MshObject.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index ef40b35002d..4d43e1d3ec1 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -585,11 +585,6 @@ internal static PSObject ConstructPSObjectFromSerializationInfo(SerializationInf #region instance fields private readonly object _lockObject = new Object(); - /// - /// If this is non-null return this string as the ToString() for this wrapped object. - /// - internal string TokenText; - /// /// This is the main field in the class representing /// the System.Object we are encapsulating. @@ -2300,6 +2295,11 @@ internal bool IsHelpObject /// internal bool ImmediateBaseObjectIsEmpty { get; set; } + /// + /// If this is non-null return this string as the ToString() for this wrapped object. + /// + internal string TokenText; + /// /// Members from the adapter of the object before it was serialized /// Null for live objects but not null for deserialized objects. From fa130ecbe0d6b7853d5445ebd4dc3ca097cefe0d Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 18:29:36 +0500 Subject: [PATCH 09/13] ToStringFromDeserialization --- .../engine/MshObject.cs | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 4d43e1d3ec1..2cfaa6a594d 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -1471,9 +1471,9 @@ public override string ToString() { // If ToString value from deserialization is available, // simply return it. - if (_toStringFromDeserialization != null) + if (ToStringFromDeserialization != null) { - return _toStringFromDeserialization; + return ToStringFromDeserialization; } return PSObject.ToString(null, this, null, null, null, true, false); @@ -1492,9 +1492,9 @@ public string ToString(string format, IFormatProvider formatProvider) { // If ToString value from deserialization is available, // simply return it. - if (_toStringFromDeserialization != null) + if (ToStringFromDeserialization != null) { - return _toStringFromDeserialization; + return ToStringFromDeserialization; } return PSObject.ToString(null, this, null, format, formatProvider, true, false); @@ -1994,9 +1994,9 @@ internal static void CopyDeserializerFields(PSObject source, PSObject target) target.ClrMembers = source.ClrMembers; } - if (target._toStringFromDeserialization == null) + if (target.ToStringFromDeserialization == null) { - target._toStringFromDeserialization = source._toStringFromDeserialization; + target.ToStringFromDeserialization = source.ToStringFromDeserialization; target.TokenText = source.TokenText; } } @@ -2020,9 +2020,6 @@ internal void SetCoreOnDeserialization(object value, bool overrideTypeInfo) } } - // This is toString value set on deserialization - private string _toStringFromDeserialization = null; - internal bool preserveToString = false; internal bool preserveToStringSet = false; @@ -2047,15 +2044,6 @@ internal bool PreserveToString } } - /// - /// Sets the to string value on deserialization. - /// - internal string ToStringFromDeserialization - { - get => _toStringFromDeserialization; - set => _toStringFromDeserialization = value; - } - #endregion serialization /// @@ -2300,6 +2288,11 @@ internal bool IsHelpObject /// internal string TokenText; + /// + /// Sets the to string value on deserialization. + /// + internal string ToStringFromDeserialization { get; set; } + /// /// Members from the adapter of the object before it was serialized /// Null for live objects but not null for deserialized objects. From 803e01045f568709e5779fcfd970be6fe2872865 Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 22:43:12 +0500 Subject: [PATCH 10/13] IsDeserialized --- .../commands/utility/CustomSerialization.cs | 2 +- .../engine/MshMemberInfo.cs | 4 ++-- .../engine/MshObject.cs | 23 ++++++++++--------- .../engine/parser/Compiler.cs | 4 ++-- .../engine/runtime/Binding/Binders.cs | 20 ++++++++-------- .../engine/serialization.cs | 6 ++--- 6 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs index d7a372aed3e..b286d645c23 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/CustomSerialization.cs @@ -411,7 +411,7 @@ private bool HandleKnownContainerTypes(object source, string property, int depth // We serialize properties of enumerable and on deserialization mark the object // as Deserialized. So if object is marked deserialized, we should write properties. // Note: we do not serialize the properties of IEnumerable if depth is zero. - if (depth != 0 && (ct == ContainerType.Enumerable || (mshSource != null && mshSource.isDeserialized))) + if (depth != 0 && (ct == ContainerType.Enumerable || (mshSource != null && mshSource.IsDeserialized))) { // Note:Depth is the depth for serialization of baseObject. // Depth for serialization of each property is one less. diff --git a/src/System.Management.Automation/engine/MshMemberInfo.cs b/src/System.Management.Automation/engine/MshMemberInfo.cs index 031b6a52103..92f69f63330 100644 --- a/src/System.Management.Automation/engine/MshMemberInfo.cs +++ b/src/System.Management.Automation/engine/MshMemberInfo.cs @@ -3329,7 +3329,7 @@ internal override PSMemberInfoInternalCollection InternalMembers private void GenerateInternalMembersFromBase() { - if (_psObject.isDeserialized) + if (_psObject.IsDeserialized) { if (_psObject.ClrMembers != null) { @@ -3353,7 +3353,7 @@ private PSMemberInfoInternalCollection GetInternalMembersFromAdapt { PSMemberInfoInternalCollection retVal = new PSMemberInfoInternalCollection(); - if (_psObject.isDeserialized) + if (_psObject.IsDeserialized) { if (_psObject.AdaptedMembers != null) { diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 2cfaa6a594d..5b64b6b7abd 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -113,7 +113,7 @@ internal static PSMemberInfoInternalCollection TypeTableGetMembersDelegate private static T AdapterGetMemberDelegate(PSObject msjObj, string name) where T : PSMemberInfo { - if (msjObj.isDeserialized) + if (msjObj.IsDeserialized) { if (msjObj.AdaptedMembers == null) { @@ -152,7 +152,7 @@ internal static PSMemberInfoInternalCollection TransformMemberInfoCollection< private static PSMemberInfoInternalCollection AdapterGetMembersDelegate(PSObject msjObj) where T : PSMemberInfo { - if (msjObj.isDeserialized) + if (msjObj.IsDeserialized) { if (msjObj.AdaptedMembers == null) { @@ -1950,7 +1950,7 @@ internal Collection GetSpecificPropertiesToSerialize(TypeTable backupTyp internal bool ShouldSerializeAdapter() { - if (this.isDeserialized) + if (this.IsDeserialized) { return this.AdaptedMembers != null; } @@ -1965,7 +1965,7 @@ internal PSMemberInfoInternalCollection GetAdaptedProperties() private PSMemberInfoInternalCollection GetProperties(PSMemberInfoInternalCollection serializedMembers, Adapter particularAdapter) { - if (this.isDeserialized) + if (this.IsDeserialized) { return serializedMembers; } @@ -1980,16 +1980,11 @@ private PSMemberInfoInternalCollection GetProperties(PSMemberInf return returnValue; } - /// - /// This flag is set to true in deserialized shellobject. - /// - internal bool isDeserialized; - internal static void CopyDeserializerFields(PSObject source, PSObject target) { - if (!target.isDeserialized) + if (!target.IsDeserialized) { - target.isDeserialized = source.isDeserialized; + target.IsDeserialized = source.IsDeserialized; target.AdaptedMembers = source.AdaptedMembers; target.ClrMembers = source.ClrMembers; } @@ -2268,6 +2263,12 @@ DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter) #region Help formatting + /// + /// This flag is set to true in deserialized shellobject. + /// + internal bool IsDeserialized { get; set; } + + internal bool IsHelpObject { get => _isHelpObject; diff --git a/src/System.Management.Automation/engine/parser/Compiler.cs b/src/System.Management.Automation/engine/parser/Compiler.cs index 72ede0a4458..38be1893896 100644 --- a/src/System.Management.Automation/engine/parser/Compiler.cs +++ b/src/System.Management.Automation/engine/parser/Compiler.cs @@ -339,8 +339,8 @@ internal static class CachedReflectionInfo typeof(PSObject).GetMethod(nameof(PSObject.Base), staticFlags); internal static readonly PropertyInfo PSObject_BaseObject = typeof(PSObject).GetProperty(nameof(PSObject.BaseObject)); - internal static readonly FieldInfo PSObject_isDeserialized = - typeof(PSObject).GetField(nameof(PSObject.isDeserialized), instanceFlags); + internal static readonly PropertyInfo PSObject_IsDeserialized = + typeof(PSObject).GetProperty(nameof(PSObject.IsDeserialized), instanceFlags); internal static readonly MethodInfo PSObject_ToStringParser = typeof(PSObject).GetMethod(nameof(PSObject.ToStringParser), staticFlags, null, new[] { typeof(ExecutionContext), typeof(object) }, null); diff --git a/src/System.Management.Automation/engine/runtime/Binding/Binders.cs b/src/System.Management.Automation/engine/runtime/Binding/Binders.cs index 4e6740d8f43..48b054847bd 100644 --- a/src/System.Management.Automation/engine/runtime/Binding/Binders.cs +++ b/src/System.Management.Automation/engine/runtime/Binding/Binders.cs @@ -5386,7 +5386,7 @@ internal static Expression GetTargetExpr(DynamicMetaObject target, Type castToTy // If the target value is actually a deserialized PSObject, we should use the original value var psobj = value as PSObject; - if (psobj != null && psobj != AutomationNull.Value && !psobj.isDeserialized) + if (psobj != null && psobj != AutomationNull.Value && !psobj.IsDeserialized) { expr = Expression.Call(CachedReflectionInfo.PSObject_Base, expr); value = PSObject.Base(value); @@ -5650,7 +5650,7 @@ internal PSMemberInfo GetPSMemberInfo(DynamicMetaObject target, // // - If not, we want to use the base object, so that we might generate optimized code. var psobj = target.Value as PSObject; - bool isTargetDeserializedObject = (psobj != null) && (psobj.isDeserialized); + bool isTargetDeserializedObject = (psobj != null) && (psobj.IsDeserialized); object value = isTargetDeserializedObject ? target.Value : PSObject.Base(target.Value); var adapterSet = PSObject.GetMappedAdapter(value, typeTable); @@ -5788,7 +5788,7 @@ internal PSMemberInfo GetPSMemberInfo(DynamicMetaObject target, if (isTargetDeserializedObject) { restrictions = restrictions.Merge(BindingRestrictions.GetExpressionRestriction( - Expression.Field(target.Expression.Cast(typeof(PSObject)), CachedReflectionInfo.PSObject_isDeserialized))); + Expression.Property(target.Expression.Cast(typeof(PSObject)), CachedReflectionInfo.PSObject_IsDeserialized))); } if (hasTypeTableMember) @@ -6744,8 +6744,8 @@ public override DynamicMetaObject FallbackInvokeMember(DynamicMetaObject target, // If the target value is a PSObject and its base object happens to be a Hashtable or ArrayList, // we might have three interesting cases here: // (1) the target value could be a regular PSObject that wraps the Hashtable/ArrayList, i.e. $target = [PSObject]::AsPSObject($hash) - // (2) the target value could be a deserialized object (PSObject) with the 'isDeserialized' field to be false, i.e. deserialized Hashtable/ArrayList/Dictionary[string, string] - // (3) the target value could be a deserialized object (PSObject) with the 'isDeserialized' field to be true, i.e. deserialized XmlElement + // (2) the target value could be a deserialized object (PSObject) with the 'IsDeserialized' field to be false, i.e. deserialized Hashtable/ArrayList/Dictionary[string, string] + // (3) the target value could be a deserialized object (PSObject) with the 'IsDeserialized' field to be true, i.e. deserialized XmlElement // For the first two cases, it's OK to call a .NET method from the base object, such as $target.Add(). // For the third case, calling a .NET method from the base object is incorrect, because the original type of the deserialized object doesn't have the method. // example: XmlElement derives from IEnumerable, so it's treated as a container object when powershell does the serialization -- using an ArrayList to hold @@ -6758,14 +6758,14 @@ public override DynamicMetaObject FallbackInvokeMember(DynamicMetaObject target, var psObj = target.Value as PSObject; if (psObj != null && (targetValue.GetType() == typeof(Hashtable) || targetValue.GetType() == typeof(ArrayList))) { - // If we get here, then the target value should have 'isDeserialized == false', otherwise we cannot get a .NET methodInfo - // from _getMemberBinder.GetPSMemberInfo(). This is because when 'isDeserialized' is true, we use the PSObject to find the + // If we get here, then the target value should have 'IsDeserialized == false', otherwise we cannot get a .NET methodInfo + // from _getMemberBinder.GetPSMemberInfo(). This is because when 'IsDeserialized' is true, we use the PSObject to find the // corresponding Adapter -- PSObjectAdapter, which cannot be optimized. - Diagnostics.Assert(psObj.isDeserialized == false, - "isDeserialized should be false, because if not, we cannot get a .NET method/parameterizedProperty from GetPSMemberInfo"); + Diagnostics.Assert(psObj.IsDeserialized == false, + "IsDeserialized should be false, because if not, we cannot get a .NET method/parameterizedProperty from GetPSMemberInfo"); restrictions = restrictions.Merge(BindingRestrictions.GetExpressionRestriction( - Expression.Not(Expression.Field(target.Expression.Cast(typeof(PSObject)), CachedReflectionInfo.PSObject_isDeserialized)))); + Expression.Not(Expression.Property(target.Expression.Cast(typeof(PSObject)), CachedReflectionInfo.PSObject_IsDeserialized)))); } } diff --git a/src/System.Management.Automation/engine/serialization.cs b/src/System.Management.Automation/engine/serialization.cs index f1957170bc4..048a7491d75 100644 --- a/src/System.Management.Automation/engine/serialization.cs +++ b/src/System.Management.Automation/engine/serialization.cs @@ -1252,7 +1252,7 @@ int depth // So on roundtrip it will show up as List. // We serialize properties of enumerable and on deserialization mark the object as Deserialized. // So if object is marked deserialized, we should write properties. - if (ct == ContainerType.Enumerable || (mshSource != null && mshSource.isDeserialized)) + if (ct == ContainerType.Enumerable || (mshSource != null && mshSource.IsDeserialized)) { PSObject sourceAsPSObject = PSObject.AsPSObject(source); PSMemberInfoInternalCollection specificPropertiesToSerialize = SerializationUtilities.GetSpecificPropertiesToSerialize(sourceAsPSObject, AllPropertiesCollection, _typeTable); @@ -2327,7 +2327,7 @@ private int GetDepthOfSerialization(object source, int depth) if (0 != (_context.options & SerializationOptions.PreserveSerializationSettingOfOriginal)) { - if ((pso.isDeserialized) && (depth <= 0)) + if ((pso.IsDeserialized) && (depth <= 0)) { return 1; } @@ -3822,7 +3822,7 @@ private void ReadProperties(PSObject dso) // Since we are adding baseobject properties as propertybag, // mark the object as deserialized. - dso.isDeserialized = true; + dso.IsDeserialized = true; dso.AdaptedMembers = new PSMemberInfoInternalCollection(); // Add the GetType method to the instance members, so that it works on deserialized psobjects From d8ff2f42ecb8466883568259d16818b71843e477 Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 16 Mar 2019 23:57:12 +0500 Subject: [PATCH 11/13] StoreTypeNameAndInstanceMembersLocally --- .../engine/MshObject.cs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 5b64b6b7abd..547caac9c40 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -699,12 +699,6 @@ internal static bool HasInstanceMembers(object obj, out PSMemberInfoInternalColl private static readonly ConditionalWeakTable> s_instanceMembersResurrectionTable = new ConditionalWeakTable>(); - /// - /// Indicate whether we store the instance members and type names locally - /// for this PSObject instance. - /// - private bool _storeTypeNameAndInstanceMembersLocally; - #endregion instance fields #endregion fields @@ -1020,7 +1014,7 @@ internal static PSObject AsPSObject(object obj, bool storeTypeNameAndInstanceMem return so; } - return new PSObject(obj) { _storeTypeNameAndInstanceMembersLocally = storeTypeNameAndInstanceMembersLocally }; + return new PSObject(obj) { StoreTypeNameAndInstanceMembersLocally = storeTypeNameAndInstanceMembersLocally }; } /// @@ -1047,7 +1041,7 @@ internal static object GetKeyForResurrectionTables(object obj) if (psObjectAboveBase.ImmediateBaseObject is PSCustomObject || psObjectAboveBase.ImmediateBaseObject is string - || pso._storeTypeNameAndInstanceMembersLocally) + || pso.StoreTypeNameAndInstanceMembersLocally) { return psObjectAboveBase; } @@ -2268,6 +2262,11 @@ DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter) /// internal bool IsDeserialized { get; set; } + /// + /// Indicate whether we store the instance members and type names locally + /// for this PSObject instance. + /// + private bool StoreTypeNameAndInstanceMembersLocally { get; set; } internal bool IsHelpObject { From 8b69140f73b2af6437d995607016003cedacd046 Mon Sep 17 00:00:00 2001 From: Ilya Date: Sun, 17 Mar 2019 00:48:47 +0500 Subject: [PATCH 12/13] Reorder --- .../engine/MshObject.cs | 180 +++++++++--------- 1 file changed, 88 insertions(+), 92 deletions(-) diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 547caac9c40..996b6674831 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -194,10 +194,6 @@ private static T DotNetGetMemberDelegate(PSObject msjObj, string name) where return null; } - private static readonly Collection> s_memberCollection = GetMemberCollection(PSMemberViewTypes.All); - private static readonly Collection> s_methodCollection = GetMethodCollection(); - private static readonly Collection> s_propertyCollection = GetPropertyCollection(PSMemberViewTypes.All); - /// /// A collection of delegates to get Extended/Adapted/Dotnet members based on the /// @@ -374,26 +370,6 @@ private void CommonInitialization(object obj) _typeTable = context?.TypeTableWeakReference; } - internal static readonly DotNetAdapter s_dotNetInstanceAdapter = new DotNetAdapter(); - private static readonly DotNetAdapter s_baseAdapterForAdaptedObjects = new BaseDotNetAdapterForAdaptedObjects(); - internal static readonly DotNetAdapter s_dotNetStaticAdapter = new DotNetAdapter(true); - - private static readonly AdapterSet s_dotNetInstanceAdapterSet = new AdapterSet(DotNetInstanceAdapter, null); - private static readonly AdapterSet s_mshMemberSetAdapter = new AdapterSet(new PSMemberSetAdapter(), null); - private static readonly AdapterSet s_mshObjectAdapter = new AdapterSet(new PSObjectAdapter(), null); - private static readonly PSObject.AdapterSet s_cimInstanceAdapter = - new PSObject.AdapterSet(new ThirdPartyAdapter(typeof(Microsoft.Management.Infrastructure.CimInstance), - new Microsoft.PowerShell.Cim.CimInstanceAdapter()), - PSObject.DotNetInstanceAdapter); -#if !UNIX - private static readonly AdapterSet s_managementObjectAdapter = new AdapterSet(new ManagementObjectAdapter(), DotNetInstanceAdapter); - private static readonly AdapterSet s_managementClassAdapter = new AdapterSet(new ManagementClassApdapter(), DotNetInstanceAdapter); - private static readonly AdapterSet s_directoryEntryAdapter = new AdapterSet(new DirectoryEntryAdapter(), DotNetInstanceAdapter); -#endif - private static readonly AdapterSet s_dataRowViewAdapter = new AdapterSet(new DataRowViewAdapter(), s_baseAdapterForAdaptedObjects); - private static readonly AdapterSet s_dataRowAdapter = new AdapterSet(new DataRowAdapter(), s_baseAdapterForAdaptedObjects); - private static readonly AdapterSet s_xmlNodeAdapter = new AdapterSet(new XmlNodeAdapter(), s_baseAdapterForAdaptedObjects); - #region Adapter Mappings private static readonly ConcurrentDictionary s_adapterMapping = new ConcurrentDictionary(); @@ -583,8 +559,11 @@ internal static PSObject ConstructPSObjectFromSerializationInfo(SerializationInf #region fields #region instance fields + private readonly object _lockObject = new Object(); + private ConsolidatedString _typeNames; + /// /// This is the main field in the class representing /// the System.Object we are encapsulating. @@ -592,8 +571,66 @@ internal static PSObject ConstructPSObjectFromSerializationInfo(SerializationInf private object _immediateBaseObject; private WeakReference _typeTable; + private AdapterSet _adapterSet; + private PSMemberInfoInternalCollection _instanceMembers; + private PSMemberInfoIntegratingCollection _properties; + private PSMemberInfoIntegratingCollection _methods; + + #endregion instance fields private static readonly PSTraceSource s_memberResolution = PSTraceSource.GetTracer("MemberResolution", "Traces the resolution from member name to the member. A member can be a property, method, etc.", false); + private static readonly ConditionalWeakTable s_typeNamesResurrectionTable = new ConditionalWeakTable(); + private static readonly Collection> s_memberCollection = GetMemberCollection(PSMemberViewTypes.All); + private static readonly Collection> s_methodCollection = GetMethodCollection(); + private static readonly Collection> s_propertyCollection = GetPropertyCollection(PSMemberViewTypes.All); + internal static readonly DotNetAdapter s_dotNetInstanceAdapter = new DotNetAdapter(); + private static readonly DotNetAdapter s_baseAdapterForAdaptedObjects = new BaseDotNetAdapterForAdaptedObjects(); + internal static readonly DotNetAdapter s_dotNetStaticAdapter = new DotNetAdapter(true); + + private static readonly AdapterSet s_dotNetInstanceAdapterSet = new AdapterSet(DotNetInstanceAdapter, null); + private static readonly AdapterSet s_mshMemberSetAdapter = new AdapterSet(new PSMemberSetAdapter(), null); + private static readonly AdapterSet s_mshObjectAdapter = new AdapterSet(new PSObjectAdapter(), null); + private static readonly PSObject.AdapterSet s_cimInstanceAdapter = + new PSObject.AdapterSet(new ThirdPartyAdapter(typeof(Microsoft.Management.Infrastructure.CimInstance), + new Microsoft.PowerShell.Cim.CimInstanceAdapter()), + PSObject.DotNetInstanceAdapter); +#if !UNIX + private static readonly AdapterSet s_managementObjectAdapter = new AdapterSet(new ManagementObjectAdapter(), DotNetInstanceAdapter); + private static readonly AdapterSet s_managementClassAdapter = new AdapterSet(new ManagementClassApdapter(), DotNetInstanceAdapter); + private static readonly AdapterSet s_directoryEntryAdapter = new AdapterSet(new DirectoryEntryAdapter(), DotNetInstanceAdapter); +#endif + private static readonly AdapterSet s_dataRowViewAdapter = new AdapterSet(new DataRowViewAdapter(), s_baseAdapterForAdaptedObjects); + private static readonly AdapterSet s_dataRowAdapter = new AdapterSet(new DataRowAdapter(), s_baseAdapterForAdaptedObjects); + private static readonly AdapterSet s_xmlNodeAdapter = new AdapterSet(new XmlNodeAdapter(), s_baseAdapterForAdaptedObjects); + + + #endregion fields + + #region properties + + internal PSMemberInfoInternalCollection InstanceMembers + { + get + { + if (_instanceMembers == null) + { + lock (_lockObject) + { + if (_instanceMembers == null) + { + _instanceMembers = + s_instanceMembersResurrectionTable.GetValue( + GetKeyForResurrectionTables(this), + _ => new PSMemberInfoInternalCollection()); + } + } + } + + return _instanceMembers; + } + + set => _instanceMembers = value; + } /// /// This is the adapter that will depend on the type of baseObject. @@ -641,70 +678,9 @@ private AdapterSet InternalAdapterSet } } - private AdapterSet _adapterSet; - - internal PSMemberInfoInternalCollection InstanceMembers - { - get - { - if (_instanceMembers == null) - { - lock (_lockObject) - { - if (_instanceMembers == null) - { - _instanceMembers = - s_instanceMembersResurrectionTable.GetValue( - GetKeyForResurrectionTables(this), - _ => new PSMemberInfoInternalCollection()); - } - } - } - - return _instanceMembers; - } - - set => _instanceMembers = value; - } - - private PSMemberInfoInternalCollection _instanceMembers; - - internal static bool HasInstanceMembers(object obj, out PSMemberInfoInternalCollection instanceMembers) - { - if (obj is PSObject psobj) - { - lock (psobj) - { - if (psobj._instanceMembers == null) - { - s_instanceMembersResurrectionTable.TryGetValue(GetKeyForResurrectionTables(psobj), - out psobj._instanceMembers); - } - } - - instanceMembers = psobj._instanceMembers; - } - else if (obj != null) - { - s_instanceMembersResurrectionTable.TryGetValue(GetKeyForResurrectionTables(obj), out instanceMembers); - } - else - { - instanceMembers = null; - } - - return instanceMembers != null && instanceMembers.Count > 0; - } - private static readonly ConditionalWeakTable> s_instanceMembersResurrectionTable = new ConditionalWeakTable>(); - #endregion instance fields - - #endregion fields - - #region properties - /// /// Gets the member collection. /// @@ -751,8 +727,6 @@ public PSMemberInfoCollection Properties } } - private PSMemberInfoIntegratingCollection _properties; - /// /// Gets the Method collection, or the members that are actually methods. /// @@ -775,8 +749,6 @@ public PSMemberInfoCollection Methods } } - private PSMemberInfoIntegratingCollection _methods; - /// /// Gets the object we are directly wrapping. /// @@ -887,13 +859,37 @@ internal static bool HasInstanceTypeName(object obj, out ConsolidatedString resu return s_typeNamesResurrectionTable.TryGetValue(GetKeyForResurrectionTables(obj), out result); } - private ConsolidatedString _typeNames; - private static readonly ConditionalWeakTable s_typeNamesResurrectionTable = new ConditionalWeakTable(); - #endregion properties #region static methods + internal static bool HasInstanceMembers(object obj, out PSMemberInfoInternalCollection instanceMembers) + { + if (obj is PSObject psobj) + { + lock (psobj) + { + if (psobj._instanceMembers == null) + { + s_instanceMembersResurrectionTable.TryGetValue(GetKeyForResurrectionTables(psobj), + out psobj._instanceMembers); + } + } + + instanceMembers = psobj._instanceMembers; + } + else if (obj != null) + { + s_instanceMembersResurrectionTable.TryGetValue(GetKeyForResurrectionTables(obj), out instanceMembers); + } + else + { + instanceMembers = null; + } + + return instanceMembers != null && instanceMembers.Count > 0; + } + /// /// /// From 555cf68a7c59493622218561742bbb86aef239cd Mon Sep 17 00:00:00 2001 From: Ilya Date: Sun, 17 Mar 2019 01:11:30 +0500 Subject: [PATCH 13/13] Minor fixes --- .../engine/MshObject.cs | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 996b6674831..f3661c97493 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -891,41 +891,50 @@ internal static bool HasInstanceMembers(object obj, out PSMemberInfoInternalColl } /// + /// Convert an int to PSObject. /// - /// - /// + /// Value to convert. + /// PSObject. public static implicit operator PSObject(int valueToConvert) { return PSObject.AsPSObject(valueToConvert); } + /// + /// Convert a string to PSObject. /// - /// - /// + /// Value to convert. + /// PSObject. public static implicit operator PSObject(string valueToConvert) { return PSObject.AsPSObject(valueToConvert); } + /// + /// Convert a Hastable to PSObject. /// - /// - /// + /// Value to convert. + /// PSObject. public static implicit operator PSObject(Hashtable valueToConvert) { return PSObject.AsPSObject(valueToConvert); } + /// + /// Convert a double to PSObject. /// - /// - /// + /// Value to convert. + /// PSObject. public static implicit operator PSObject(double valueToConvert) { return PSObject.AsPSObject(valueToConvert); } + /// + /// Convert a bool to PSObject. /// - /// - /// + /// Value to convert. + /// PSObject. public static implicit operator PSObject(bool valueToConvert) { return PSObject.AsPSObject(valueToConvert); @@ -2342,7 +2351,7 @@ internal enum SerializationMethod AllPublicProperties = 0, String = 1, SpecificProperties = 2 - }; + } } #pragma warning restore 56500