Improve processing of the powershell built-in type data from 'types.ps1xml', 'typesV3.ps1xml' and 'GetEvent.types.ps1xml' (#10898)

This commit is contained in:
Dongbo Wang
2019-11-01 10:36:05 -07:00
committed by Aditya Patwardhan
parent a3d73d751f
commit 8749db9b81
12 changed files with 10210 additions and 2451 deletions
@@ -1,90 +0,0 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System.Collections.Generic;
using System.Management.Automation;
using System.Reflection;
namespace System.Management.Automation.Runspaces
{
internal sealed class GetEvent_Types_Ps1Xml
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
static MethodInfo GetMethodInfo(string typeName, string method)
{
var type = LanguagePrimitives.ConvertTo<Type>(typeName);
return GetMethodInfo(type, method);
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
static MethodInfo GetMethodInfo(Type type, string method)
{
return type.GetMethod(method, BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase);
}
static ScriptBlock GetScriptBlock(string s)
{
var sb = ScriptBlock.CreateDelayParsedScriptBlock(s, isProductCode: true);
sb.LanguageMode = PSLanguageMode.FullLanguage;
return sb;
}
public static IEnumerable<TypeData> Get()
{
var td1 = new TypeData(@"System.Diagnostics.Eventing.Reader.EventLogConfiguration", true);
td1.DefaultDisplayPropertySet =
new PropertySetData(new[] { "LogName", "MaximumSizeInBytes", "RecordCount", "LogMode" }) { Name = "DefaultDisplayPropertySet" };
yield return td1;
var td2 = new TypeData(@"System.Diagnostics.Eventing.Reader.EventLogRecord", true);
td2.DefaultDisplayPropertySet =
new PropertySetData(new[] { "TimeCreated", "ProviderName", "Id", "Message" }) { Name = "DefaultDisplayPropertySet" };
yield return td2;
var td3 = new TypeData(@"System.Diagnostics.Eventing.Reader.ProviderMetadata", true);
td3.Members.Add("ProviderName",
new AliasPropertyData("ProviderName", "Name"));
td3.DefaultDisplayPropertySet =
new PropertySetData(new[] { "Name", "LogLinks" }) { Name = "DefaultDisplayPropertySet" };
yield return td3;
#if !CORECLR
var td4 = new TypeData(@"Microsoft.PowerShell.Commands.GetCounter.CounterSet", true);
td4.Members.Add("Counter",
new AliasPropertyData("Counter", "Paths"));
yield return td4;
var td5 = new TypeData(@"Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample", true);
td5.DefaultDisplayPropertySet =
new PropertySetData(new[] { "Path", "InstanceName", "CookedValue" }) { Name = "DefaultDisplayPropertySet" };
yield return td5;
var td6 = new TypeData(@"Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet", true);
td6.DefaultDisplayPropertySet =
new PropertySetData(new[] { "Timestamp", "Readings" }) { Name = "DefaultDisplayPropertySet" };
yield return td6;
var td7 = new TypeData(@"Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet", true);
td7.Members.Add("Readings",
new ScriptPropertyData(@"Readings", GetScriptBlock(@"$strPaths = """"
foreach ($ctr in $this.CounterSamples)
{
$strPaths += ($ctr.Path + "" :"" + ""`n"")
$strPaths += ($ctr.CookedValue.ToString() + ""`n`n"")
}
return $strPaths"), null));
yield return td7;
#endif
}
}
}
@@ -1211,26 +1211,6 @@ namespace System.Management.Automation.Runspaces
}
}
/// <summary>
/// Special add for TypeTable type entries that removes redundant file entries.
/// </summary>
internal void AddTypeTableTypesInfo(IEnumerable<T> items)
{
if (typeof(T) != typeof(SessionStateTypeEntry)) { throw new PSInvalidOperationException(); }
lock (_syncObject)
{
foreach (var element in items)
{
if (element is SessionStateTypeEntry typeEntry && typeEntry.TypeData != null)
{
// Skip type file entries.
_internalCollection.Add(element);
}
}
}
}
/// <summary>
/// Get enumerator for this collection.
/// </summary>
@@ -3460,12 +3440,7 @@ namespace System.Management.Automation.Runspaces
context.TypeTable = typeTable;
Types.Clear();
// A TypeTable contains types info along with type file references used to create the types info,
// which is redundant information. When resused in a runspace the ISS unpacks the file types again
// resulting in duplicate types and duplication errors when processed.
// So use this special Add method to filter all types files found in the TypeTable.
Types.AddTypeTableTypesInfo(typeTable.typesInfo);
Types.Add(typeTable.typesInfo);
return;
}
@@ -3482,7 +3457,6 @@ namespace System.Management.Automation.Runspaces
ConcurrentDictionary<string, string> filesProcessed
= new ConcurrentDictionary<string, string>(/*concurrencyLevel*/3, /*capacity*/3, StringComparer.OrdinalIgnoreCase);
Parallel.ForEach(Types, sste =>
// foreach (var sste in Types)
{
if (sste.FileName != null)
{
@@ -3510,7 +3484,6 @@ namespace System.Management.Automation.Runspaces
context.TypeTable.Update(sste.TypeData, errors, sste.IsRemove);
}
});
// }
context.TypeTable.ClearConsolidatedMembers();
@@ -3060,7 +3060,7 @@ namespace System.Management.Automation
{
if (string.IsNullOrEmpty(name))
{
throw PSTraceSource.NewArgumentException("name");
throw PSTraceSource.NewArgumentException(nameof(name));
}
this.name = name;
@@ -3080,13 +3080,13 @@ namespace System.Management.Automation
{
if (string.IsNullOrEmpty(name))
{
throw PSTraceSource.NewArgumentException("name");
throw PSTraceSource.NewArgumentException(nameof(name));
}
this.name = name;
if (members == null)
{
throw PSTraceSource.NewArgumentNullException("members");
throw PSTraceSource.NewArgumentNullException(nameof(members));
}
this.internalMembers = new PSMemberInfoInternalCollection<PSMemberInfo>();
@@ -3094,7 +3094,7 @@ namespace System.Management.Automation
{
if (member == null)
{
throw PSTraceSource.NewArgumentNullException("members");
throw PSTraceSource.NewArgumentNullException(nameof(members));
}
this.internalMembers.Add(member.Copy());
@@ -3105,6 +3105,26 @@ namespace System.Management.Automation
_methods = new PSMemberInfoIntegratingCollection<PSMethodInfo>(this, s_emptyMethodCollection);
}
/// <summary>
/// Initializes a new instance of PSMemberSet with all the initial members in <paramref name="members"/>.
/// This constructor is supposed to be used in TypeTable to reuse the passed-in member collection.
/// Null-argument check is skipped here, so callers need to check arguments before passing in.
/// </summary>
/// <param name="name">Name for the member set.</param>
/// <param name="members">Members in the member set.</param>
internal PSMemberSet(string name, PSMemberInfoInternalCollection<PSMemberInfo> members)
{
Diagnostics.Assert(!string.IsNullOrEmpty(name), "Caller needs to guarantee not null or empty.");
Diagnostics.Assert(members != null, "Caller needs to guarantee not null.");
this.name = name;
this.internalMembers = members;
_members = new PSMemberInfoIntegratingCollection<PSMemberInfo>(this, s_emptyMemberCollection);
_properties = new PSMemberInfoIntegratingCollection<PSPropertyInfo>(this, s_emptyPropertyCollection);
_methods = new PSMemberInfoIntegratingCollection<PSMethodInfo>(this, s_emptyMethodCollection);
}
private static readonly Collection<CollectionEntry<PSMemberInfo>> s_typeMemberCollection = GetTypeMemberCollection();
private static readonly Collection<CollectionEntry<PSMethodInfo>> s_typeMethodCollection = GetTypeMethodCollection();
private static readonly Collection<CollectionEntry<PSPropertyInfo>> s_typePropertyCollection = GetTypePropertyCollection();
@@ -3434,13 +3454,13 @@ namespace System.Management.Automation
{
if (string.IsNullOrEmpty(name))
{
throw PSTraceSource.NewArgumentException("name");
throw PSTraceSource.NewArgumentException(nameof(name));
}
this.name = name;
if (referencedPropertyNames == null)
{
throw PSTraceSource.NewArgumentNullException("referencedPropertyNames");
throw PSTraceSource.NewArgumentNullException(nameof(referencedPropertyNames));
}
ReferencedPropertyNames = new Collection<string>();
@@ -3448,13 +3468,31 @@ namespace System.Management.Automation
{
if (string.IsNullOrEmpty(referencedPropertyName))
{
throw PSTraceSource.NewArgumentException("referencedPropertyNames");
throw PSTraceSource.NewArgumentException(nameof(referencedPropertyNames));
}
ReferencedPropertyNames.Add(referencedPropertyName);
}
}
/// <summary>
/// Initializes a new instance of PSPropertySet with a name and list of property names.
/// This constructor is supposed to be used in TypeTable to reuse the passed-in property name list.
/// Null-argument check is skipped here, so callers need to check arguments before passing in.
/// </summary>
/// <param name="name">Name of the set.</param>
/// <param name="referencedPropertyNameList">Name of the properties in the set.</param>
internal PSPropertySet(string name, List<string> referencedPropertyNameList)
{
Diagnostics.Assert(!string.IsNullOrEmpty(name), "Caller needs to guarantee not null or empty.");
Diagnostics.Assert(referencedPropertyNameList != null, "Caller needs to guarantee not null.");
// We use the constructor 'public Collection(IList<T> list)' to create the collection,
// so that the passed-in list is directly used as the backing store of the collection.
this.name = name;
ReferencedPropertyNames = new Collection<string>(referencedPropertyNameList);
}
/// <summary>
/// Gets the property names in this property set.
/// </summary>
@@ -2405,7 +2405,6 @@ namespace System.Management.Automation.Runspaces
/// ScriptMethodData represents a ScriptMethod definition.
/// </summary>
[DebuggerDisplay(@"ScriptMethod: {Name,nq}")]
public sealed class ScriptMethodData : TypeMemberData
{
/// <summary>
@@ -2495,11 +2494,7 @@ namespace System.Management.Automation.Runspaces
throw PSTraceSource.NewArgumentNullException("referencedProperties");
}
ReferencedProperties = new Collection<string>();
foreach (string property in referencedProperties)
{
ReferencedProperties.Add(property);
}
ReferencedProperties = new Collection<string>(new List<string>(referencedProperties));
}
/// <summary>
@@ -2591,7 +2586,7 @@ namespace System.Management.Automation.Runspaces
/// <summary>
/// A class that keeps the information from types.ps1xml files in a cache table.
/// </summary>
public sealed class TypeTable
public sealed partial class TypeTable
{
#region private
@@ -2681,6 +2676,11 @@ namespace System.Management.Automation.Runspaces
TargetTypeForDeserialization
};
// Built-in type file paths.
internal static readonly string TypesFilePath;
internal static readonly string TypesV3FilePath;
internal static readonly string GetEventTypesFilePath;
#endregion
#region Update
@@ -3135,7 +3135,7 @@ namespace System.Management.Automation.Runspaces
}
// the node cardinality is OneToMany
Collection<string> referencedProperties = new Collection<string>();
var referencedProperties = new List<string>(propertySetData.ReferencedProperties.Count);
foreach (string name in propertySetData.ReferencedProperties)
{
if (string.IsNullOrEmpty(name))
@@ -3161,7 +3161,7 @@ namespace System.Management.Automation.Runspaces
internal static void ProcessMemberSetData(ConcurrentBag<string> errors, string typeName, MemberSetData memberSetData, PSMemberInfoInternalCollection<PSMemberInfo> membersCollection, bool isOverride)
{
var memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>();
var memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(memberSetData.Members.Count);
foreach (var m in memberSetData.Members)
{
m.Process(errors, typeName, memberSetMembers, isOverride);
@@ -3175,12 +3175,19 @@ namespace System.Management.Automation.Runspaces
AddMember(errors, typeName, memberSet, membersCollection, isOverride);
}
private static void ProcessStandardMembers(ConcurrentBag<string> errors, string typeName, IEnumerable<TypeMemberData> standardMembers, IEnumerable<PropertySetData> propertySets, PSMemberInfoInternalCollection<PSMemberInfo> membersCollection, bool isOverride)
private static void ProcessStandardMembers(
ConcurrentBag<string> errors,
string typeName,
IEnumerable<TypeMemberData> standardMembers,
IEnumerable<PropertySetData> propertySets,
PSMemberInfoInternalCollection<PSMemberInfo> membersCollection,
bool isOverride)
{
int newMemberCount = standardMembers.Count() + propertySets.Count();
// If StandardMembers do not exists, we follow the original logic to create the StandardMembers
if (membersCollection[PSStandardMembers] == null)
{
var memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>();
var memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(newMemberCount);
ProcessMembersData(errors, typeName, standardMembers, memberSetMembers, false);
foreach (PropertySetData propertySet in propertySets)
@@ -3203,8 +3210,9 @@ namespace System.Management.Automation.Runspaces
var psStandardMemberSet = (PSMemberSet)membersCollection[PSStandardMembers];
// Copy existing internal PSStandard members
var existingMembers = new PSMemberInfoInternalCollection<PSMemberInfo>();
var oldMembersCopy = new PSMemberInfoInternalCollection<PSMemberInfo>();
int totalMemberCount = psStandardMemberSet.InternalMembers.Count + newMemberCount;
var existingMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(totalMemberCount);
var oldMembersCopy = new PSMemberInfoInternalCollection<PSMemberInfo>(totalMemberCount);
foreach (var existingMember in psStandardMemberSet.InternalMembers)
{
existingMembers.Add(existingMember.Copy());
@@ -3251,6 +3259,149 @@ namespace System.Management.Automation.Runspaces
}
}
private static void ProcessStandardMembers(
ConcurrentBag<string> errors,
string typeName,
PSMemberInfoInternalCollection<PSMemberInfo> memberSetMembers,
PSMemberInfoInternalCollection<PSMemberInfo> typeMemberCollection,
bool isOverride)
{
// If StandardMembers do not exists, we follow the original logic to create the StandardMembers
if (typeMemberCollection[PSStandardMembers] == null)
{
CheckStandardMembers(errors, typeName, memberSetMembers);
PSMemberSet standardMemberSet = new PSMemberSet(PSStandardMembers, memberSetMembers)
{
inheritMembers = true,
IsHidden = true,
ShouldSerialize = false
};
AddMember(errors, typeName, standardMemberSet, typeMemberCollection, false);
return;
}
// StandardMembers exist
var psStandardMemberSet = (PSMemberSet)typeMemberCollection[PSStandardMembers];
// Copy existing internal PSStandard members
int totalMemberCount = psStandardMemberSet.InternalMembers.Count + memberSetMembers.Count;
var existingMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(totalMemberCount);
var oldMembersCopy = new PSMemberInfoInternalCollection<PSMemberInfo>(totalMemberCount);
foreach (var existingMember in psStandardMemberSet.InternalMembers)
{
existingMembers.Add(existingMember.Copy());
oldMembersCopy.Add(existingMember.Copy());
}
// Process the Members directly into the 'existingMembers' collection
foreach (PSMemberInfo member in memberSetMembers)
{
AddMember(errors, typeName, member, existingMembers, isOverride);
}
if (CheckStandardMembers(errors, typeName, existingMembers))
{
// No conflict in serialization settings, replace the old StandardMembers with the new one
PSMemberSet standardMemberSet = new PSMemberSet(PSStandardMembers, existingMembers)
{
inheritMembers = true,
IsHidden = true,
ShouldSerialize = false
};
AddMember(errors, typeName, standardMemberSet, typeMemberCollection, isOverride: true);
}
else
{
// There are conflicts in serialization settings, add non-serializationSetting configurations
// into the original member collection. Replace the old StandardMembers with the new one
foreach (PSMemberInfo member in existingMembers)
{
if (oldMembersCopy[member.name] == null)
{
oldMembersCopy.Add(member);
}
}
PSMemberSet standardMemberSet = new PSMemberSet(PSStandardMembers, oldMembersCopy)
{
inheritMembers = true,
IsHidden = true,
ShouldSerialize = false
};
AddMember(errors, typeName, standardMemberSet, typeMemberCollection, isOverride: true);
}
}
private static void ProcessTypeConverter(
ConcurrentBag<string> errors,
string typeName,
Type converterType,
ConcurrentDictionary<string, object> typeConverters,
bool isOverride)
{
if (CreateInstance(errors, typeName, converterType, TypesXmlStrings.UnableToInstantiateTypeConverter, out object instance))
{
if ((instance is TypeConverter) || (instance is PSTypeConverter))
{
LanguagePrimitives.UpdateTypeConvertFromTypeTable(typeName);
}
else
{
AddError(errors, typeName, TypesXmlStrings.TypeIsNotTypeConverter, converterType.FullName);
}
}
if (instance != null && !typeConverters.TryAdd(typeName, instance))
{
if (!isOverride)
{
AddError(errors, typeName, TypesXmlStrings.TypeConverterAlreadyPresent);
}
// If IsOverride == true, eat the TypeConverterAlreadyPresent failure.
}
}
private static void ProcessTypeAdapter(
ConcurrentBag<string> errors,
string typeName,
Type adapterType,
ConcurrentDictionary<string, PSObject.AdapterSet> typeAdapters,
bool isOverride)
{
PSObject.AdapterSet adapterSet = null;
if (CreateInstance(errors, typeName, adapterType, TypesXmlStrings.UnableToInstantiateTypeAdapter, out object instance))
{
PSPropertyAdapter psPropertyAdapter = instance as PSPropertyAdapter;
if (psPropertyAdapter == null)
{
AddError(errors, typeName, TypesXmlStrings.TypeIsNotTypeAdapter, adapterType.FullName);
}
else
{
if (LanguagePrimitives.TryConvertTo(typeName, out Type adaptedType))
{
adapterSet = PSObject.CreateThirdPartyAdapterSet(adaptedType, psPropertyAdapter);
}
else
{
AddError(errors, typeName, TypesXmlStrings.InvalidAdaptedType, typeName);
}
}
}
if (adapterSet != null && !typeAdapters.TryAdd(typeName, adapterSet))
{
if (!isOverride)
{
AddError(errors, typeName, TypesXmlStrings.TypeAdapterAlreadyPresent);
}
// If IsOverride == true, eat the TypeConverterAlreadyPresent failure.
}
}
private void ProcessTypeDataToAdd(ConcurrentBag<string> errors, TypeData typeData)
{
string typeName = typeData.TypeName;
@@ -3281,9 +3432,12 @@ namespace System.Management.Automation.Runspaces
}
PSMemberInfoInternalCollection<PSMemberInfo> typeMembers = null;
bool hasStandardMembers = typeData.StandardMembers.Count > 0 || propertySets.Count > 0;
int collectionSize = typeData.Members.Count + (hasStandardMembers ? 1 : 0);
if (typeData.Members.Count > 0)
{
typeMembers = _extendedMembers.GetOrAdd(typeName, k => new PSMemberInfoInternalCollection<PSMemberInfo>());
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(collectionSize));
ProcessMembersData(errors, typeName, typeData.Members.Values, typeMembers, typeData.IsOverride);
foreach (var memberName in typeData.Members.Keys)
@@ -3292,11 +3446,11 @@ namespace System.Management.Automation.Runspaces
}
}
if (typeData.StandardMembers.Count > 0 || propertySets.Count > 0)
if (hasStandardMembers)
{
if (typeMembers == null)
{
typeMembers = _extendedMembers.GetOrAdd(typeName, k => new PSMemberInfoInternalCollection<PSMemberInfo>());
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
}
ProcessStandardMembers(errors, typeName, typeData.StandardMembers.Values, propertySets, typeMembers, typeData.IsOverride);
@@ -3304,67 +3458,17 @@ namespace System.Management.Automation.Runspaces
if (typeData.TypeConverter != null)
{
object instance = null;
if (CreateInstance(errors, typeName, typeData.TypeConverter, TypesXmlStrings.UnableToInstantiateTypeConverter, out instance))
{
if ((instance is TypeConverter) || (instance is PSTypeConverter))
{
LanguagePrimitives.UpdateTypeConvertFromTypeTable(typeName);
}
else
{
AddError(errors, typeName, TypesXmlStrings.TypeIsNotTypeConverter, typeData.TypeConverter.FullName);
}
}
if (instance != null && !_typeConverters.TryAdd(typeName, instance))
{
if (!typeData.IsOverride)
{
AddError(errors, typeName, TypesXmlStrings.TypeConverterAlreadyPresent);
}
// If IsOverride == true, eat the TypeConverterAlreadyPresent failure.
}
ProcessTypeConverter(errors, typeName, typeData.TypeConverter, _typeConverters, typeData.IsOverride);
}
if (typeData.TypeAdapter != null)
{
object instance;
PSObject.AdapterSet adapterSet = null;
if (CreateInstance(errors, typeName, typeData.TypeAdapter, TypesXmlStrings.UnableToInstantiateTypeAdapter, out instance))
{
PSPropertyAdapter psPropertyAdapter = instance as PSPropertyAdapter;
if (psPropertyAdapter == null)
{
AddError(errors, typeName, TypesXmlStrings.TypeIsNotTypeAdapter, typeData.TypeAdapter.FullName);
}
else
{
Type adaptedType = null;
if (LanguagePrimitives.TryConvertTo(typeName, out adaptedType))
{
adapterSet = PSObject.CreateThirdPartyAdapterSet(adaptedType, psPropertyAdapter);
}
else
{
AddError(errors, typeName, TypesXmlStrings.InvalidAdaptedType, typeName);
}
}
}
if (adapterSet != null && !_typeAdapters.TryAdd(typeName, adapterSet))
{
if (!typeData.IsOverride)
{
AddError(errors, typeName, TypesXmlStrings.TypeAdapterAlreadyPresent);
}
// If IsOverride == true, eat the TypeConverterAlreadyPresent failure.
}
ProcessTypeAdapter(errors, typeName, typeData.TypeAdapter, _typeAdapters, typeData.IsOverride);
}
// Record the information that this typedata was removed from the typetable
// The next time the typetable is updated, we will need to exclude this typedata from the typetable
typesInfo.Add(new SessionStateTypeEntry(typeData, false));
typesInfo.Add(new SessionStateTypeEntry(typeData, isRemove: false));
}
#endregion add members from TypeData
@@ -3389,15 +3493,13 @@ namespace System.Management.Automation.Runspaces
}
}
object unused1;
if (_typeConverters.TryRemove(typeName, out unused1))
if (_typeConverters.TryRemove(typeName, out _))
{
typeExist = true;
LanguagePrimitives.UpdateTypeConvertFromTypeTable(typeName);
}
PSObject.AdapterSet unused2;
if (_typeAdapters.TryRemove(typeName, out unused2))
if (_typeAdapters.TryRemove(typeName, out _))
{
typeExist = true;
}
@@ -3456,6 +3558,8 @@ namespace System.Management.Automation.Runspaces
static TypeTable()
{
s_valueFactoryCache = new Func<string, PSMemberInfoInternalCollection<PSMemberInfo>>[ValueFactoryCacheCount];
// Rather than set these members every time we process the standard members, do it
// just once at startup.
foreach (var sm in s_standardMembers)
@@ -3464,6 +3568,12 @@ namespace System.Management.Automation.Runspaces
}
PSGetMemberBinder.TypeTableMemberAdded(PSStandardMembers);
// Set the built-in type file paths.
var psHome = Utils.DefaultPowerShellAppBase;
TypesFilePath = Path.Combine(psHome, "types.ps1xml");
TypesV3FilePath = Path.Combine(psHome, "typesv3.ps1xml");
GetEventTypesFilePath = Path.Combine(psHome, "GetEvent.types.ps1xml");
}
/// <summary>
@@ -3514,17 +3624,7 @@ namespace System.Management.Automation.Runspaces
/// <returns>List of type files.</returns>
public static List<string> GetDefaultTypeFiles()
{
string typesFilePath = string.Empty;
string typesV3FilePath = string.Empty;
var psHome = Utils.DefaultPowerShellAppBase;
if (!string.IsNullOrEmpty(psHome))
{
typesFilePath = Path.Combine(psHome, "types.ps1xml");
typesV3FilePath = Path.Combine(psHome, "typesv3.ps1xml");
}
return new List<string>() { typesFilePath, typesV3FilePath };
return new List<string>() { TypesFilePath, TypesV3FilePath };
}
/// <summary>
@@ -4256,7 +4356,6 @@ namespace System.Management.Automation.Runspaces
bool isProductCode,
ConcurrentBag<string> errors)
{
typesInfo.Add(new SessionStateTypeEntry(fileToLoad));
LoadContext loadContext = new LoadContext(moduleName, fileToLoad, errors)
{
IsFullyTrusted = isFullyTrusted,
@@ -4272,20 +4371,6 @@ namespace System.Management.Automation.Runspaces
}
}
/// <summary>
/// Removes the <paramref name="typeFile"/> from the current TypeTable's type file list.
/// The TypeTable will not reflect the change until Update is called.
/// </summary>
/// <param name="typeFile"></param>
internal void Remove(string typeFile)
{
lock (_typeFileList)
{
_typeFileList.Remove(typeFile);
typesInfo.Remove(typeFile, null);
}
}
/// <summary>
/// Update the TypeTable by adding a TypeData instance.
/// </summary>
@@ -4337,79 +4422,6 @@ namespace System.Management.Automation.Runspaces
FormatAndTypeDataHelper.ThrowExceptionOnError("ErrorsUpdatingTypes", errors, FormatAndTypeDataHelper.Category.Types);
}
/// <summary>
/// Update typetable from psSnapinTypes, this method will always rebuild the typetable.
/// The psSnapinTypes contain files and strong type data.
/// </summary>
/// <param name="psSnapinTypes"></param>
/// <param name="authorizationManager">
/// Authorization manager to perform signature checks before reading ps1xml files (or null of no checks are needed)
/// </param>
/// <param name="host">
/// Host passed to <paramref name="authorizationManager"/>. Can be null if no interactive questions should be asked.
/// </param>
/// <exception cref="InvalidOperationException">
/// 1. The TypeTable cannot be updated because the TypeTable might have
/// been created outside of the Runspace.
/// </exception>
internal void Update(
Collection<PSSnapInTypeAndFormatErrors> psSnapinTypes,
AuthorizationManager authorizationManager,
PSHost host
)
{
if (isShared)
{
throw PSTraceSource.NewInvalidOperationException(TypesXmlStrings.SharedTypeTableCannotBeUpdated);
}
// Always rebuild the whole TypeTable
Clear();
foreach (PSSnapInTypeAndFormatErrors snapin in psSnapinTypes)
{
// FullPath is not null, then it is a type xml file
if (snapin.FullPath != null)
{
Initialize(snapin.PSSnapinName, snapin.FullPath, snapin.Errors, authorizationManager, host,
out snapin.FailToLoadFile);
}
// FullPath is null, then it is a TypeData
else
{
Update(snapin.Errors, snapin.TypeData, snapin.IsRemove);
}
}
}
/// <summary>
/// Entry created to make reflection-based test suites happy. DO NOT USE THIS ENTRY.
/// </summary>
/// <param name="filePath">The path to the file to load.</param>
/// <param name="errors">A place to put the errors...</param>
/// <param name="clearTable">If true, reset the table to empty...</param>
/// <param name="authorizationManager">
/// Authorization manager to perform signature checks before reading ps1xml files (or null of no checks are needed)
/// </param>
/// <param name="host">
/// Host passed to <paramref name="authorizationManager"/>. Can be null if no interactive questions should be asked.
/// </param>
/// <param name="failToLoadFile">Indicate if the file cannot be loaded due to the security reason.</param>
/// <exception cref="InvalidOperationException">
/// 1. The TypeTable cannot be updated because the TypeTable might have
/// been created outside of the Runspace.
/// </exception>
internal void Update(
string filePath,
ConcurrentBag<string> errors,
bool clearTable,
AuthorizationManager authorizationManager,
PSHost host,
out bool failToLoadFile)
{
Update(filePath, filePath, errors, authorizationManager, host, out failToLoadFile);
}
/// <summary>
/// Update type data from a specific file...
/// </summary>
@@ -4467,38 +4479,24 @@ namespace System.Management.Automation.Runspaces
if (etwEnabled) RunspaceEventSource.Log.ProcessTypeFileStop(filePath);
}
private void ProcessTypeData(string filePath, ConcurrentBag<string> errors, IEnumerable<TypeData> types)
{
typesInfo.Add(new SessionStateTypeEntry(filePath));
// TODO - use parallel foreach without causing any contention
// Parallel.ForEach(types, typeData =>
foreach (var typeData in types)
{
ProcessTypeDataToAdd(errors, typeData);
}
// });
}
private bool ProcessIsBuiltIn(string filePath, ConcurrentBag<string> errors, out bool failToLoadFile)
{
var result = false;
var errorCount = errors.Count;
var psHome = Utils.DefaultPowerShellAppBase;
if (string.Equals(Path.Combine(psHome, "types.ps1xml"), filePath, StringComparison.OrdinalIgnoreCase))
if (string.Equals(TypesFilePath, filePath, StringComparison.OrdinalIgnoreCase))
{
ProcessTypeData(filePath, errors, Types_Ps1Xml.Get());
Process_Types_Ps1Xml(filePath, errors);
result = true;
}
else if (string.Equals(Path.Combine(psHome, "typesv3.ps1xml"), filePath, StringComparison.OrdinalIgnoreCase))
else if (string.Equals(TypesV3FilePath, filePath, StringComparison.OrdinalIgnoreCase))
{
ProcessTypeData(filePath, errors, TypesV3_Ps1Xml.Get());
Process_TypesV3_Ps1Xml(filePath, errors);
result = true;
}
else if (string.Equals(Path.Combine(psHome, "GetEvent.types.ps1xml"), filePath, StringComparison.OrdinalIgnoreCase))
else if (string.Equals(GetEventTypesFilePath, filePath, StringComparison.OrdinalIgnoreCase))
{
ProcessTypeData(filePath, errors, GetEvent_Types_Ps1Xml.Get());
Process_GetEvent_Types_Ps1Xml(filePath, errors);
result = true;
}
@@ -0,0 +1,201 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Management.Automation.Language;
using System.Reflection;
namespace System.Management.Automation.Runspaces
{
public sealed partial class TypeTable
{
private void Process_GetEvent_Types_Ps1Xml(string filePath, ConcurrentBag<string> errors)
{
typesInfo.Add(new SessionStateTypeEntry(filePath));
string typeName = null;
PSMemberInfoInternalCollection<PSMemberInfo> typeMembers = null;
PSMemberInfoInternalCollection<PSMemberInfo> memberSetMembers = null;
HashSet<string> newMembers = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
#region System.Diagnostics.Eventing.Reader.EventLogConfiguration
typeName = @"System.Diagnostics.Eventing.Reader.EventLogConfiguration";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSPropertySet(
@"DefaultDisplayPropertySet",
new List<string> { "LogName", "MaximumSizeInBytes", "RecordCount", "LogMode" }),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion System.Diagnostics.Eventing.Reader.EventLogConfiguration
#region System.Diagnostics.Eventing.Reader.EventLogRecord
typeName = @"System.Diagnostics.Eventing.Reader.EventLogRecord";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSPropertySet(
@"DefaultDisplayPropertySet",
new List<string> { "TimeCreated", "ProviderName", "Id", "Message" }),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion System.Diagnostics.Eventing.Reader.EventLogRecord
#region System.Diagnostics.Eventing.Reader.ProviderMetadata
typeName = @"System.Diagnostics.Eventing.Reader.ProviderMetadata";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 2));
// Process regular members.
newMembers.Add(@"ProviderName");
AddMember(
errors,
typeName,
new PSAliasProperty(@"ProviderName", @"Name", conversionType: null),
typeMembers,
isOverride: false);
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSPropertySet(
@"DefaultDisplayPropertySet",
new List<string> { "Name", "LogLinks" }),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion System.Diagnostics.Eventing.Reader.ProviderMetadata
#if !CORECLR
#region Microsoft.PowerShell.Commands.GetCounter.CounterSet
typeName = @"Microsoft.PowerShell.Commands.GetCounter.CounterSet";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process regular members.
newMembers.Add(@"Counter");
AddMember(
errors,
typeName,
new PSAliasProperty(@"Counter", @"Paths", conversionType: null),
typeMembers,
isOverride: false);
#endregion Microsoft.PowerShell.Commands.GetCounter.CounterSet
#region Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample
typeName = @"Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSPropertySet(
@"DefaultDisplayPropertySet",
new List<string> { "Path", "InstanceName", "CookedValue" }),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample
#region Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet
typeName = @"Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 2));
// Process regular members.
newMembers.Add(@"Readings");
AddMember(
errors,
typeName,
new PSScriptProperty(
@"Readings",
GetScriptBlock(@"$strPaths = """"
foreach ($ctr in $this.CounterSamples)
{
$strPaths += ($ctr.Path + "" :"" + ""`n"")
$strPaths += ($ctr.CookedValue.ToString() + ""`n`n"")
}
return $strPaths"),
setterScript: null,
shouldCloneOnAccess: true),
typeMembers,
isOverride: false);
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSPropertySet(
@"DefaultDisplayPropertySet",
new List<string> { "Timestamp", "Readings" }),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet
#endif
// Update binder version for newly added members.
foreach (string memberName in newMembers)
{
PSGetMemberBinder.TypeTableMemberAdded(memberName);
}
}
}
}
@@ -0,0 +1,436 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Management.Automation.Language;
using System.Reflection;
namespace System.Management.Automation.Runspaces
{
public sealed partial class TypeTable
{
private void Process_TypesV3_Ps1Xml(string filePath, ConcurrentBag<string> errors)
{
typesInfo.Add(new SessionStateTypeEntry(filePath));
string typeName = null;
PSMemberInfoInternalCollection<PSMemberInfo> typeMembers = null;
PSMemberInfoInternalCollection<PSMemberInfo> memberSetMembers = null;
HashSet<string> newMembers = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
#region System.Security.Cryptography.X509Certificates.X509Certificate2
typeName = @"System.Security.Cryptography.X509Certificates.X509Certificate2";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 3));
// Process regular members.
newMembers.Add(@"EnhancedKeyUsageList");
AddMember(
errors,
typeName,
new PSScriptProperty(
@"EnhancedKeyUsageList",
GetScriptBlock(@",(new-object Microsoft.Powershell.Commands.EnhancedKeyUsageProperty -argumentlist $this).EnhancedKeyUsageList;"),
setterScript: null,
shouldCloneOnAccess: true),
typeMembers,
isOverride: false);
newMembers.Add(@"DnsNameList");
AddMember(
errors,
typeName,
new PSScriptProperty(
@"DnsNameList",
GetScriptBlock(@",(new-object Microsoft.Powershell.Commands.DnsNameProperty -argumentlist $this).DnsNameList;"),
setterScript: null,
shouldCloneOnAccess: true),
typeMembers,
isOverride: false);
newMembers.Add(@"SendAsTrustedIssuer");
AddMember(
errors,
typeName,
new PSScriptProperty(
@"SendAsTrustedIssuer",
GetScriptBlock(@"[Microsoft.Powershell.Commands.SendAsTrustedIssuerProperty]::ReadSendAsTrustedIssuerProperty($this)"),
GetScriptBlock(@"$sendAsTrustedIssuer = $args[0]
[Microsoft.Powershell.Commands.SendAsTrustedIssuerProperty]::WriteSendAsTrustedIssuerProperty($this,$this.PsPath,$sendAsTrustedIssuer)"),
shouldCloneOnAccess: true),
typeMembers,
isOverride: false);
#endregion System.Security.Cryptography.X509Certificates.X509Certificate2
#region System.Management.Automation.Remoting.PSSenderInfo
typeName = @"System.Management.Automation.Remoting.PSSenderInfo";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 2));
// Process regular members.
newMembers.Add(@"ConnectedUser");
AddMember(
errors,
typeName,
new PSScriptProperty(
@"ConnectedUser",
GetScriptBlock(@"$this.UserInfo.Identity.Name"),
setterScript: null,
shouldCloneOnAccess: true),
typeMembers,
isOverride: false);
newMembers.Add(@"RunAsUser");
AddMember(
errors,
typeName,
new PSScriptProperty(
@"RunAsUser",
GetScriptBlock(@"if($null -ne $this.UserInfo.WindowsIdentity)
{
$this.UserInfo.WindowsIdentity.Name
}"),
setterScript: null,
shouldCloneOnAccess: true),
typeMembers,
isOverride: false);
#endregion System.Management.Automation.Remoting.PSSenderInfo
#region System.Management.Automation.CompletionResult
typeName = @"System.Management.Automation.CompletionResult";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"SerializationDepth", 1),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion System.Management.Automation.CompletionResult
#region Deserialized.System.Management.Automation.CompletionResult
typeName = @"Deserialized.System.Management.Automation.CompletionResult";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion Deserialized.System.Management.Automation.CompletionResult
#region System.Management.Automation.CommandCompletion
typeName = @"System.Management.Automation.CommandCompletion";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"SerializationDepth", 1),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion System.Management.Automation.CommandCompletion
#region Deserialized.System.Management.Automation.CommandCompletion
typeName = @"Deserialized.System.Management.Automation.CommandCompletion";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion Deserialized.System.Management.Automation.CommandCompletion
#region Microsoft.PowerShell.Commands.ModuleSpecification
typeName = @"Microsoft.PowerShell.Commands.ModuleSpecification";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"SerializationDepth", 1),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion Microsoft.PowerShell.Commands.ModuleSpecification
#region Deserialized.Microsoft.PowerShell.Commands.ModuleSpecification
typeName = @"Deserialized.Microsoft.PowerShell.Commands.ModuleSpecification";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion Deserialized.Microsoft.PowerShell.Commands.ModuleSpecification
#region System.Management.Automation.JobStateEventArgs
typeName = @"System.Management.Automation.JobStateEventArgs";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"SerializationDepth", 2),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion System.Management.Automation.JobStateEventArgs
#region Deserialized.System.Management.Automation.JobStateEventArgs
typeName = @"Deserialized.System.Management.Automation.JobStateEventArgs";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion Deserialized.System.Management.Automation.JobStateEventArgs
#region System.Exception
typeName = @"System.Exception";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"SerializationDepth", 1),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion System.Exception
#region System.Management.Automation.Remoting.PSSessionOption
typeName = @"System.Management.Automation.Remoting.PSSessionOption";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"SerializationDepth", 1),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion System.Management.Automation.Remoting.PSSessionOption
#region Deserialized.System.Management.Automation.Remoting.PSSessionOption
typeName = @"Deserialized.System.Management.Automation.Remoting.PSSessionOption";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion Deserialized.System.Management.Automation.Remoting.PSSessionOption
#region System.Management.Automation.DebuggerStopEventArgs
typeName = @"System.Management.Automation.DebuggerStopEventArgs";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 2));
// Process regular members.
newMembers.Add(@"SerializedInvocationInfo");
AddMember(
errors,
typeName,
new PSCodeProperty(
@"SerializedInvocationInfo",
GetMethodInfo(typeof(Microsoft.PowerShell.DeserializingTypeConverter), @"GetInvocationInfo"),
setterCodeReference: null) { IsHidden = true },
typeMembers,
isOverride: false);
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 3);
AddMember(
errors,
typeName,
new PSNoteProperty(@"SerializationMethod", @"SpecificProperties"),
memberSetMembers,
isOverride: false);
AddMember(
errors,
typeName,
new PSNoteProperty(@"SerializationDepth", 2),
memberSetMembers,
isOverride: false);
AddMember(
errors,
typeName,
new PSPropertySet(
@"PropertySerializationSet",
new List<string> { "Breakpoints", "ResumeAction", "SerializedInvocationInfo" }),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion System.Management.Automation.DebuggerStopEventArgs
#region Deserialized.System.Management.Automation.DebuggerStopEventArgs
typeName = @"Deserialized.System.Management.Automation.DebuggerStopEventArgs";
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
// Process standard members.
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
AddMember(
errors,
typeName,
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
memberSetMembers,
isOverride: false);
ProcessStandardMembers(
errors,
typeName,
memberSetMembers,
typeMembers,
isOverride: false);
#endregion Deserialized.System.Management.Automation.DebuggerStopEventArgs
// Update binder version for newly added members.
foreach (string memberName in newMembers)
{
PSGetMemberBinder.TypeTableMemberAdded(memberName);
}
}
}
}
File diff suppressed because it is too large Load Diff
@@ -1,119 +0,0 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System.Collections.Generic;
using System.Management.Automation;
using System.Reflection;
namespace System.Management.Automation.Runspaces
{
internal sealed class TypesV3_Ps1Xml
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
static MethodInfo GetMethodInfo(string typeName, string method)
{
var type = LanguagePrimitives.ConvertTo<Type>(typeName);
return GetMethodInfo(type, method);
}
static MethodInfo GetMethodInfo(Type type, string method)
{
return type.GetMethod(method, BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase);
}
static ScriptBlock GetScriptBlock(string s)
{
var sb = ScriptBlock.CreateDelayParsedScriptBlock(s, isProductCode: true);
sb.LanguageMode = PSLanguageMode.FullLanguage;
return sb;
}
public static IEnumerable<TypeData> Get()
{
var td1 = new TypeData(@"System.Security.Cryptography.X509Certificates.X509Certificate2", true);
td1.Members.Add("EnhancedKeyUsageList",
new ScriptPropertyData(@"EnhancedKeyUsageList", GetScriptBlock(@",(new-object Microsoft.Powershell.Commands.EnhancedKeyUsageProperty -argumentlist $this).EnhancedKeyUsageList;"), null));
td1.Members.Add("DnsNameList",
new ScriptPropertyData(@"DnsNameList", GetScriptBlock(@",(new-object Microsoft.Powershell.Commands.DnsNameProperty -argumentlist $this).DnsNameList;"), null));
td1.Members.Add("SendAsTrustedIssuer",
new ScriptPropertyData(@"SendAsTrustedIssuer", GetScriptBlock(@"[Microsoft.Powershell.Commands.SendAsTrustedIssuerProperty]::ReadSendAsTrustedIssuerProperty($this)"), GetScriptBlock(@"$sendAsTrustedIssuer = $args[0]
[Microsoft.Powershell.Commands.SendAsTrustedIssuerProperty]::WriteSendAsTrustedIssuerProperty($this,$this.PsPath,$sendAsTrustedIssuer)")));
yield return td1;
var td2 = new TypeData(@"System.Management.Automation.Remoting.PSSenderInfo", true);
td2.Members.Add("ConnectedUser",
new ScriptPropertyData(@"ConnectedUser", GetScriptBlock(@"$this.UserInfo.Identity.Name"), null));
td2.Members.Add("RunAsUser",
new ScriptPropertyData(@"RunAsUser", GetScriptBlock(@"if($null -ne $this.UserInfo.WindowsIdentity)
{
$this.UserInfo.WindowsIdentity.Name
}"), null));
yield return td2;
var td3 = new TypeData(@"System.Management.Automation.CompletionResult", true);
td3.SerializationDepth = 1;
yield return td3;
var td4 = new TypeData(@"Deserialized.System.Management.Automation.CompletionResult", true);
td4.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
yield return td4;
var td5 = new TypeData(@"System.Management.Automation.CommandCompletion", true);
td5.SerializationDepth = 1;
yield return td5;
var td6 = new TypeData(@"Deserialized.System.Management.Automation.CommandCompletion", true);
td6.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
yield return td6;
var td7 = new TypeData(@"Microsoft.PowerShell.Commands.ModuleSpecification", true);
td7.SerializationDepth = 1;
yield return td7;
var td8 = new TypeData(@"Deserialized.Microsoft.PowerShell.Commands.ModuleSpecification", true);
td8.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
yield return td8;
var td9 = new TypeData(@"System.Management.Automation.JobStateEventArgs", true);
td9.SerializationDepth = 2;
yield return td9;
var td10 = new TypeData(@"Deserialized.System.Management.Automation.JobStateEventArgs", true);
td10.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
yield return td10;
var td11 = new TypeData(@"System.Exception", true);
td11.SerializationDepth = 1;
yield return td11;
var td12 = new TypeData(@"System.Management.Automation.Remoting.PSSessionOption", true);
td12.SerializationDepth = 1;
yield return td12;
var td13 = new TypeData(@"Deserialized.System.Management.Automation.Remoting.PSSessionOption", true);
td13.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
yield return td13;
var td14 = new TypeData(@"System.Management.Automation.DebuggerStopEventArgs", true);
td14.Members.Add("SerializedInvocationInfo",
new CodePropertyData("SerializedInvocationInfo", GetMethodInfo(typeof(Microsoft.PowerShell.DeserializingTypeConverter), "GetInvocationInfo"), null) { IsHidden = true });
td14.SerializationMethod = "SpecificProperties";
td14.SerializationDepth = 2;
td14.PropertySerializationSet =
new PropertySetData(new[] { "Breakpoints", "ResumeAction", "SerializedInvocationInfo" }) { Name = "PropertySerializationSet" };
yield return td14;
var td15 = new TypeData(@"Deserialized.System.Management.Automation.DebuggerStopEventArgs", true);
td15.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
yield return td15;
}
}
}
File diff suppressed because it is too large Load Diff
@@ -8,6 +8,7 @@
<OutputType>Exe</OutputType>
<TieredCompilation>true</TieredCompilation>
<TieredCompilationQuickJit>true</TieredCompilationQuickJit>
<TieredCompilationQuickJitForLoops>true</TieredCompilationQuickJitForLoops>
<RuntimeIdentifiers>linux-x64;osx-x64;</RuntimeIdentifiers>
</PropertyGroup>
@@ -7,6 +7,7 @@
<OutputType>Exe</OutputType>
<TieredCompilation>true</TieredCompilation>
<TieredCompilationQuickJit>true</TieredCompilationQuickJit>
<TieredCompilationQuickJitForLoops>true</TieredCompilationQuickJitForLoops>
<RuntimeIdentifiers>win7-x86;win7-x64</RuntimeIdentifiers>
<RootNamespace>Microsoft.PowerShell</RootNamespace>
<ApplicationManifest>..\..\assets\pwsh.manifest</ApplicationManifest>
@@ -0,0 +1,126 @@
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
Describe "Built-in type information tests" -Tag "CI" {
BeforeAll {
$iss = [initialsessionstate]::CreateDefault2()
$rs = [runspacefactory]::CreateRunspace($iss)
$rs.Open()
$ps = [powershell]::Create()
$ps.Runspace = $rs
$types = $ps.AddCommand("Get-TypeData").Invoke()
}
AfterAll {
$ps.Dispose()
$rs.Dispose()
}
It "Should have correct number of built-in type items in type table" {
$types.Count | Should -BeExactly ($IsWindows ? 273 : 271)
}
It "Should have expected member info for 'System.Diagnostics.ProcessModule'" {
$typeData = $types | Where-Object TypeName -eq "System.Diagnostics.ProcessModule"
$typeData | Should -Not -BeNullOrEmpty
$typeData.Members.Count | Should -BeExactly 6
$typeData.Members['Size'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
$typeData.Members['Size'].GetScriptBlock.ToString() | Should -BeExactly '$this.ModuleMemorySize / 1024'
$typeData.Members['Size'].SetScriptBlock | Should -BeNullOrEmpty
$typeData.Members['Size'].IsHidden | Should -BeFalse
$typeData.Members['Size'].Name | Should -Be "Size"
$typeData.Members['Company'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
$typeData.Members['Company'].GetScriptBlock.ToString() | Should -BeExactly '$this.FileVersionInfo.CompanyName'
$typeData.Members['Company'].SetScriptBlock | Should -BeNullOrEmpty
$typeData.Members['Company'].IsHidden | Should -BeFalse
$typeData.Members['Company'].Name | Should -Be "Company"
$typeData.Members['FileVersion'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
$typeData.Members['FileVersion'].GetScriptBlock.ToString() | Should -BeExactly '$this.FileVersionInfo.FileVersion'
$typeData.Members['FileVersion'].SetScriptBlock | Should -BeNullOrEmpty
$typeData.Members['FileVersion'].IsHidden | Should -BeFalse
$typeData.Members['FileVersion'].Name | Should -Be "FileVersion"
$typeData.Members['ProductVersion'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
$typeData.Members['ProductVersion'].GetScriptBlock.ToString() | Should -BeExactly '$this.FileVersionInfo.ProductVersion'
$typeData.Members['ProductVersion'].SetScriptBlock | Should -BeNullOrEmpty
$typeData.Members['ProductVersion'].IsHidden | Should -BeFalse
$typeData.Members['ProductVersion'].Name | Should -Be "ProductVersion"
$typeData.Members['Description'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
$typeData.Members['Description'].GetScriptBlock.ToString() | Should -BeExactly '$this.FileVersionInfo.FileDescription'
$typeData.Members['Description'].SetScriptBlock | Should -BeNullOrEmpty
$typeData.Members['Description'].IsHidden | Should -BeFalse
$typeData.Members['Description'].Name | Should -Be "Description"
$typeData.Members['Product'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
$typeData.Members['Product'].GetScriptBlock.ToString() | Should -BeExactly '$this.FileVersionInfo.ProductName'
$typeData.Members['Product'].SetScriptBlock | Should -BeNullOrEmpty
$typeData.Members['Product'].IsHidden | Should -BeFalse
$typeData.Members['Product'].Name | Should -Be "Product"
$typeData.TypeConverter | Should -BeNullOrEmpty
$typeData.TypeAdapter | Should -BeNullOrEmpty
$typeData.IsOverride | Should -BeFalse
$typeData.SerializationMethod | Should -BeNullOrEmpty
$typeData.TargetTypeForDeserialization | Should -BeNullOrEmpty
$typeData.SerializationDepth | Should -Be 0
$typeData.DefaultDisplayProperty | Should -BeNullOrEmpty
$typeData.InheritPropertySerializationSet | Should -BeFalse
$typeData.StringSerializationSource | Should -BeNullOrEmpty
$typeData.StringSerializationSourceProperty | Should -BeNullOrEmpty
$typeData.DefaultDisplayPropertySet | Should -BeNullOrEmpty
$typeData.DefaultKeyPropertySet | Should -BeNullOrEmpty
$typeData.PropertySerializationSet | Should -BeNullOrEmpty
}
It "Should have expected member info for 'System.Management.Automation.ParameterSetMetadata'" {
$typeData = $types | Where-Object TypeName -eq "System.Management.Automation.ParameterSetMetadata"
$typeData | Should -Not -BeNullOrEmpty
$typeData.Members.Count | Should -BeExactly 1
$typeData.Members['Flags'] | Should -BeOfType "System.Management.Automation.Runspaces.CodePropertyData"
$typeData.Members['Flags'].IsHidden | Should -BeFalse
$typeData.Members['Flags'].Name | Should -Be "Flags"
$typeData.TypeConverter | Should -BeNullOrEmpty
$typeData.TypeAdapter | Should -BeNullOrEmpty
$typeData.IsOverride | Should -BeFalse
$typeData.TargetTypeForDeserialization | Should -BeNullOrEmpty
$typeData.SerializationDepth | Should -Be 0
$typeData.DefaultDisplayProperty | Should -BeNullOrEmpty
$typeData.InheritPropertySerializationSet | Should -BeFalse
$typeData.StringSerializationSource | Should -BeNullOrEmpty
$typeData.StringSerializationSourceProperty | Should -BeNullOrEmpty
$typeData.DefaultDisplayPropertySet | Should -BeNullOrEmpty
$typeData.DefaultKeyPropertySet | Should -BeNullOrEmpty
$typeData.SerializationMethod | Should -BeExactly "SpecificProperties"
$typeData.PropertySerializationSet | Should -BeOfType "System.Management.Automation.Runspaces.PropertySetData"
[string]::Join(",", $typeData.PropertySerializationSet.ReferencedProperties) | Should -BeExactly "Position,Flags,HelpMessage"
}
It "Should have expected member info for 'System.Management.Automation.JobStateEventArgs'" {
$typeData = $types | Where-Object TypeName -eq "System.Management.Automation.JobStateEventArgs"
$typeData | Should -Not -BeNullOrEmpty
$typeData.Members.Count | Should -BeExactly 0
$typeData.TypeConverter | Should -BeNullOrEmpty
$typeData.TypeAdapter | Should -BeNullOrEmpty
$typeData.IsOverride | Should -BeFalse
$typeData.SerializationMethod | Should -BeNullOrEmpty
$typeData.TargetTypeForDeserialization | Should -BeNullOrEmpty
$typeData.DefaultDisplayProperty | Should -BeNullOrEmpty
$typeData.InheritPropertySerializationSet | Should -BeFalse
$typeData.StringSerializationSource | Should -BeNullOrEmpty
$typeData.StringSerializationSourceProperty | Should -BeNullOrEmpty
$typeData.DefaultDisplayPropertySet | Should -BeNullOrEmpty
$typeData.DefaultKeyPropertySet | Should -BeNullOrEmpty
$typeData.SerializationDepth | Should -Be 2
}
}