diff --git a/src/libraries/System.Private.CoreLib/src/System/String.cs b/src/libraries/System.Private.CoreLib/src/System/String.cs index ec6fc18d8debf..f29d327a260d4 100644 --- a/src/libraries/System.Private.CoreLib/src/System/String.cs +++ b/src/libraries/System.Private.CoreLib/src/System/String.cs @@ -49,10 +49,11 @@ public sealed partial class String : IComparable, IEnumerable, IConvertible, IEn [PreserveDependency("Ctor(System.Char[])", "System.String")] public extern String(char[]? value); + private #if !CORECLR static #endif - private string Ctor(char[]? value) + string Ctor(char[]? value) { if (value == null || value.Length == 0) return Empty; @@ -71,10 +72,11 @@ private string Ctor(char[]? value) [PreserveDependency("Ctor(System.Char[],System.Int32,System.Int32)", "System.String")] public extern String(char[] value, int startIndex, int length); + private #if !CORECLR static #endif - private string Ctor(char[] value, int startIndex, int length) + string Ctor(char[] value, int startIndex, int length) { if (value == null) throw new ArgumentNullException(nameof(value)); @@ -106,10 +108,11 @@ private string Ctor(char[] value, int startIndex, int length) [PreserveDependency("Ctor(System.Char*)", "System.String")] public extern unsafe String(char* value); + private #if !CORECLR static #endif - private unsafe string Ctor(char* ptr) + unsafe string Ctor(char* ptr) { if (ptr == null) return Empty; @@ -133,10 +136,11 @@ private unsafe string Ctor(char* ptr) [PreserveDependency("Ctor(System.Char*,System.Int32,System.Int32)", "System.String")] public extern unsafe String(char* value, int startIndex, int length); + private #if !CORECLR static #endif - private unsafe string Ctor(char* ptr, int startIndex, int length) + unsafe string Ctor(char* ptr, int startIndex, int length) { if (length < 0) throw new ArgumentOutOfRangeException(nameof(length), SR.ArgumentOutOfRange_NegativeLength); @@ -171,10 +175,11 @@ private unsafe string Ctor(char* ptr, int startIndex, int length) [PreserveDependency("Ctor(System.SByte*)", "System.String")] public extern unsafe String(sbyte* value); + private #if !CORECLR static #endif - private unsafe string Ctor(sbyte* value) + unsafe string Ctor(sbyte* value) { byte* pb = (byte*)value; if (pb == null) @@ -190,10 +195,11 @@ private unsafe string Ctor(sbyte* value) [PreserveDependency("Ctor(System.SByte*,System.Int32,System.Int32)", "System.String")] public extern unsafe String(sbyte* value, int startIndex, int length); + private #if !CORECLR static #endif - private unsafe string Ctor(sbyte* value, int startIndex, int length) + unsafe string Ctor(sbyte* value, int startIndex, int length) { if (startIndex < 0) throw new ArgumentOutOfRangeException(nameof(startIndex), SR.ArgumentOutOfRange_StartIndex); @@ -250,10 +256,11 @@ private static unsafe string CreateStringForSByteConstructor(byte* pb, int numBy [PreserveDependency("Ctor(System.SByte*,System.Int32,System.Int32,System.Text.Encoding)", "System.String")] public extern unsafe String(sbyte* value, int startIndex, int length, Encoding enc); + private #if !CORECLR static #endif - private unsafe string Ctor(sbyte* value, int startIndex, int length, Encoding? enc) + unsafe string Ctor(sbyte* value, int startIndex, int length, Encoding? enc) { if (enc == null) return new string(value, startIndex, length); @@ -285,10 +292,11 @@ private unsafe string Ctor(sbyte* value, int startIndex, int length, Encoding? e [PreserveDependency("Ctor(System.Char,System.Int32)", "System.String")] public extern String(char c, int count); + private #if !CORECLR static #endif - private string Ctor(char c, int count) + string Ctor(char c, int count) { if (count <= 0) { @@ -335,10 +343,11 @@ private string Ctor(char c, int count) [PreserveDependency("Ctor(System.ReadOnlySpan`1)", "System.String")] public extern String(ReadOnlySpan value); + private #if !CORECLR static #endif - private unsafe string Ctor(ReadOnlySpan value) + unsafe string Ctor(ReadOnlySpan value) { if (value.Length == 0) return Empty; diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Windows.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Windows.cs index 34d2895dd7dc4..286ec0310d2ad 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Windows.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Windows.cs @@ -57,7 +57,7 @@ public void ReleaseCore(int count) for (int i = 0; i < count; i++) { - if(!Interop.Kernel32.PostQueuedCompletionStatus(_completionPort, 1, UIntPtr.Zero, IntPtr.Zero)) + if (!Interop.Kernel32.PostQueuedCompletionStatus(_completionPort, 1, UIntPtr.Zero, IntPtr.Zero)) { var lastError = Marshal.GetLastWin32Error(); var exception = new OutOfMemoryException(); diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.cs index 4e812549e3c7b..62affa80c3075 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.cs @@ -27,7 +27,7 @@ public LowLevelLifoSemaphore(int initialSignalCount, int maximumSignalCount, int Debug.Assert(maximumSignalCount > 0); Debug.Assert(spinCount >= 0); - _separated = new CacheLineSeparatedCounts(); + _separated = default; _separated._counts._signalCount = (uint)initialSignalCount; _maximumSignalCount = maximumSignalCount; _spinCount = spinCount; @@ -204,7 +204,7 @@ private bool WaitForSignal(int timeoutMs) { // Unregister the waiter. The wait subsystem used above guarantees that a thread that wakes due to a timeout does // not observe a signal to the object being waited upon. - Counts toSubtract = new Counts(); + Counts toSubtract = default; toSubtract._waiterCount++; Counts newCounts = _separated._counts.Subtract(toSubtract); Debug.Assert(newCounts._waiterCount != ushort.MaxValue); // Check for underflow diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.GateThread.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.GateThread.cs index a6124b4e1a3b4..96dfdebec7b92 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.GateThread.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.GateThread.cs @@ -16,17 +16,15 @@ private static class GateThread private static int s_runningState; - private static AutoResetEvent s_runGateThreadEvent = new AutoResetEvent(true); + private static readonly AutoResetEvent s_runGateThreadEvent = new AutoResetEvent(initialState: true); - private static LowLevelLock s_createdLock = new LowLevelLock(); - - private static CpuUtilizationReader s_cpu = new CpuUtilizationReader(); + private static CpuUtilizationReader s_cpu; private const int MaxRuns = 2; // TODO: CoreCLR: Worker Tracking in CoreCLR? (Config name: ThreadPool_EnableWorkerTracking) private static void GateThreadStart() { - var initialCpuRead = s_cpu.CurrentUtilization; // The first reading is over a time range other than what we are focusing on, so we do not use the read. + _ = s_cpu.CurrentUtilization; // The first reading is over a time range other than what we are focusing on, so we do not use the read. AppContext.TryGetSwitch("System.Threading.ThreadPool.DisableStarvationDetection", out bool disableStarvationDetection); AppContext.TryGetSwitch("System.Threading.ThreadPool.DebugBreakOnWorkerStarvation", out bool debuggerBreakOnWorkStarvation); @@ -87,7 +85,7 @@ private static bool SufficientDelaySinceLastDequeue() int minimumDelay; - if(ThreadPoolInstance._cpuUtilization < CpuUtilizationLow) + if (ThreadPoolInstance._cpuUtilization < CpuUtilizationLow) { minimumDelay = GateThreadDelayMs; } diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.HillClimbing.Complex.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.HillClimbing.Complex.cs index 7093ba3ad93d7..b3cd2da17b1c5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.HillClimbing.Complex.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.HillClimbing.Complex.cs @@ -19,15 +19,15 @@ public Complex(double real, double imaginary) public double Imaginary { get; } public double Real { get; } - public static Complex operator*(double scalar, Complex complex) => new Complex(scalar * complex.Real, scalar * complex.Imaginary); + public static Complex operator *(double scalar, Complex complex) => new Complex(scalar * complex.Real, scalar * complex.Imaginary); - public static Complex operator*(Complex complex, double scalar) => scalar * complex; + public static Complex operator *(Complex complex, double scalar) => scalar * complex; - public static Complex operator/(Complex complex, double scalar) => new Complex(complex.Real / scalar, complex.Imaginary / scalar); + public static Complex operator /(Complex complex, double scalar) => new Complex(complex.Real / scalar, complex.Imaginary / scalar); - public static Complex operator-(Complex lhs, Complex rhs) => new Complex(lhs.Real - rhs.Real, lhs.Imaginary - rhs.Imaginary); + public static Complex operator -(Complex lhs, Complex rhs) => new Complex(lhs.Real - rhs.Real, lhs.Imaginary - rhs.Imaginary); - public static Complex operator/(Complex lhs, Complex rhs) + public static Complex operator /(Complex lhs, Complex rhs) { double denom = rhs.Real * rhs.Real + rhs.Imaginary * rhs.Imaginary; return new Complex((lhs.Real * rhs.Real + lhs.Imaginary * rhs.Imaginary) / denom, (-lhs.Real * rhs.Imaginary + lhs.Imaginary * rhs.Real) / denom); diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.HillClimbing.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.HillClimbing.cs index 7cca4cd679105..b1eae812b4c80 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.HillClimbing.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.HillClimbing.cs @@ -399,7 +399,7 @@ private void LogTransition(int newThreadCount, double throughput, StateOrTransit // Use the _log array as a circular array for log entries int index = (_logStart + _logSize) % LogCapacity; - if(_logSize == LogCapacity) + if (_logSize == LogCapacity) { _logStart = (_logStart + 1) % LogCapacity; _logSize--; // hide this slot while we update it @@ -420,7 +420,7 @@ private void LogTransition(int newThreadCount, double throughput, StateOrTransit public void ForceChange(int newThreadCount, StateOrTransition state) { - if(_lastThreadCount != newThreadCount) + if (_lastThreadCount != newThreadCount) { _currentControlSetting += newThreadCount - _lastThreadCount; ChangeThreadCount(newThreadCount, state); @@ -442,7 +442,7 @@ private Complex GetWaveComponent(double[] samples, int numSamples, double period double cos = Math.Cos(w); double coeff = 2 * cos; double q0 = 0, q1 = 0, q2 = 0; - for(int i = 0; i < numSamples; ++i) + for (int i = 0; i < numSamples; ++i) { q0 = coeff * q1 - q2 + samples[(_totalSamples - numSamples + i) % _samplesToMeasure]; q2 = q1; diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.ThreadCounts.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.ThreadCounts.cs index 3fc6cf9fd963c..411cdbeb4c3dd 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.ThreadCounts.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.ThreadCounts.cs @@ -13,7 +13,7 @@ internal partial class PortableThreadPool /// Tracks information on the number of threads we want/have in different states in our thread pool. /// [StructLayout(LayoutKind.Explicit)] - struct ThreadCounts + private struct ThreadCounts { /// /// Max possible thread pool threads we want to have. diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs index d34576bcde26a..593429973b0f2 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WaitThread.cs @@ -238,7 +238,7 @@ private void WaitThreadStart() } else { - if(numUserWaits == 0) + if (numUserWaits == 0) { if (ThreadPoolInstance.TryRemoveWaitThread(this)) { diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WorkerThread.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WorkerThread.cs index 5a96fdd61727d..3fdf1f65767af 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WorkerThread.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WorkerThread.cs @@ -173,7 +173,7 @@ internal static void MaybeAddWorkingWorker() newCounts.numExistingThreads -= (short)toCreate; ThreadCounts oldCounts = ThreadCounts.CompareExchangeCounts(ref ThreadPoolInstance._separated.counts, newCounts, counts); - if(oldCounts == counts) + if (oldCounts == counts) { break; } diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.cs index 3da645357790e..3529148f53437 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.cs @@ -232,13 +232,13 @@ private void AdjustMaxWorkersActive() double elapsedSeconds = (double)(endTime - startTime) / freq; - if(elapsedSeconds * 1000 >= _threadAdjustmentIntervalMs / 2) + if (elapsedSeconds * 1000 >= _threadAdjustmentIntervalMs / 2) { ThreadCounts currentCounts = ThreadCounts.VolatileReadCounts(ref _separated.counts); int newMax; (newMax, _threadAdjustmentIntervalMs) = HillClimbing.ThreadPoolHillClimber.Update(currentCounts.numThreadsGoal, elapsedSeconds, numCompletions); - while(newMax != currentCounts.numThreadsGoal) + while (newMax != currentCounts.numThreadsGoal) { ThreadCounts newCounts = currentCounts; newCounts.numThreadsGoal = (short)newMax; @@ -260,7 +260,7 @@ private void AdjustMaxWorkersActive() } else { - if(oldCounts.numThreadsGoal > currentCounts.numThreadsGoal && oldCounts.numThreadsGoal >= newMax) + if (oldCounts.numThreadsGoal > currentCounts.numThreadsGoal && oldCounts.numThreadsGoal >= newMax) { // someone (probably the gate thread) increased the thread count more than // we are about to do. Don't interfere. @@ -283,7 +283,7 @@ private bool ShouldAdjustMaxWorkersActive() int priorTime = Volatile.Read(ref _separated.priorCompletedWorkRequestsTime); int requiredInterval = _separated.nextCompletedWorkRequestsTime - priorTime; int elapsedInterval = Environment.TickCount - priorTime; - if(elapsedInterval >= requiredInterval) + if (elapsedInterval >= requiredInterval) { // Avoid trying to adjust the thread count goal if there are already more threads than the thread count goal. // In that situation, hill climbing must have previously decided to decrease the thread count goal, so let's diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPoolEventSource.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPoolEventSource.cs index 97fad82779e7d..f5eb61986e3e8 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPoolEventSource.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPoolEventSource.cs @@ -68,7 +68,7 @@ public unsafe void WorkerThreadAdjustmentSample(double throughput) } } - [Event(5, Level = EventLevel.Informational, Message = WorkerThreadAdjustmentSampleMessage, Opcode = Opcodes.AdjustmentOpcode, Version = 0, Task = Tasks.WorkerThreadAdjustmentTask, Keywords = Keywords.ThreadingKeyword)] + [Event(5, Level = EventLevel.Informational, Message = WorkerThreadAdjustmentAdjustmentEventMessage, Opcode = Opcodes.AdjustmentOpcode, Version = 0, Task = Tasks.WorkerThreadAdjustmentTask, Keywords = Keywords.ThreadingKeyword)] public unsafe void WorkerThreadAdjustmentAdjustment(double averageThroughput, int newWorkerThreadCount, int stateOrTransition) { if (IsEnabled()) @@ -84,7 +84,7 @@ public unsafe void WorkerThreadAdjustmentAdjustment(double averageThroughput, in } } - [Event(6, Level = EventLevel.Verbose, Message = WorkerThreadAdjustmentSampleMessage, Opcode = Opcodes.StatsOpcode, Version = 0, Task = Tasks.WorkerThreadAdjustmentTask, Keywords = Keywords.ThreadingKeyword)] + [Event(6, Level = EventLevel.Verbose, Message = WorkerThreadAdjustmentStatsEventMessage, Opcode = Opcodes.StatsOpcode, Version = 0, Task = Tasks.WorkerThreadAdjustmentTask, Keywords = Keywords.ThreadingKeyword)] [CLSCompliant(false)] public unsafe void WorkerThreadAdjustmentStats(double duration, double throughput, double threadWave, double throughputWave, double throughputErrorEstimate, double averageThroughputNoise, double ratio, double confidence, double currentControlSetting, ushort newThreadWaveMagnitude) diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPool.Portable.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPool.Portable.cs index e63b7e50a8313..85c9e0033e718 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPool.Portable.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPool.Portable.cs @@ -29,7 +29,7 @@ internal RegisteredWaitHandle(WaitHandle waitHandle, _ThreadPoolWaitOrTimerCallb ~RegisteredWaitHandle() { - if(WaitThread != null) + if (WaitThread != null) { Unregister(null); } @@ -408,7 +408,7 @@ internal static bool NotifyWorkItemComplete() private static RegisteredWaitHandle RegisterWaitForSingleObject( WaitHandle waitObject, WaitOrTimerCallback callBack, - Object state, + object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce, bool flowExecutionContext) diff --git a/src/mono/netcore/System.Private.CoreLib/GenerateMonoCoreLibVersionFile.targets b/src/mono/netcore/System.Private.CoreLib/GenerateMonoCoreLibVersionFile.targets index 786643f90e230..a2e4d6b6f92d5 100644 --- a/src/mono/netcore/System.Private.CoreLib/GenerateMonoCoreLibVersionFile.targets +++ b/src/mono/netcore/System.Private.CoreLib/GenerateMonoCoreLibVersionFile.targets @@ -9,13 +9,19 @@ <_MonoCoreLibVersionNumber>$([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText('$(MonoProjectRoot)\configure.ac')), 'MONO_CORLIB_VERSION=([a-fA-F0-9\-]+)').Groups[1].Value) <_MonoCoreLibVersionFileLines> +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + // This is a generated file. Do not edit. + +#pragma warning disable CA1823 // unused field namespace System { - partial class Environment - { - const string mono_corlib_version = "$(_MonoCoreLibVersionNumber)"%3B - } + public partial class Environment + { + private const string mono_corlib_version = "$(_MonoCoreLibVersionNumber)"%3B + } } @@ -28,4 +34,4 @@ namespace System - \ No newline at end of file + diff --git a/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj index a60befa49fa09..22a5e4dd0b440 100644 --- a/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj +++ b/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj @@ -1,4 +1,4 @@ - + @@ -9,6 +9,7 @@ false false netcoreapp2.1 + false Portable @@ -60,7 +61,7 @@ <_FullFrameworkReferenceAssemblyPaths>$(MSBuildThisFileDirectory)/Documentation true $(OutputPath)$(MSBuildProjectName).xml - false + true diff --git a/src/mono/netcore/System.Private.CoreLib/src/Microsoft/Win32/SafeHandles/SafeWaitHandle.Unix.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/Microsoft/Win32/SafeHandles/SafeWaitHandle.Unix.Mono.cs index 607853e37f609..007b126965790 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/Microsoft/Win32/SafeHandles/SafeWaitHandle.Unix.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/Microsoft/Win32/SafeHandles/SafeWaitHandle.Unix.Mono.cs @@ -8,15 +8,15 @@ namespace Microsoft.Win32.SafeHandles { - partial class SafeWaitHandle - { - protected override bool ReleaseHandle () - { - CloseEventInternal (handle); - return true; - } + public partial class SafeWaitHandle + { + protected override bool ReleaseHandle() + { + CloseEventInternal(handle); + return true; + } - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern void CloseEventInternal (IntPtr handle); - } + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void CloseEventInternal(IntPtr handle); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoDomain.cs b/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoDomain.cs index f98f250abc15d..e74ce9fbe0ef5 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoDomain.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoDomain.cs @@ -8,17 +8,17 @@ namespace Mono { - [StructLayout (LayoutKind.Sequential)] - internal sealed partial class MonoDomain - { - #pragma warning disable 169 + [StructLayout(LayoutKind.Sequential)] + internal sealed partial class MonoDomain + { +#pragma warning disable 169 #region Sync with object-internals.h - IntPtr _mono_app_domain; - #endregion - #pragma warning restore 169 + private IntPtr _mono_app_domain; + #endregion +#pragma warning restore 169 - public event UnhandledExceptionEventHandler UnhandledException; + public event UnhandledExceptionEventHandler UnhandledException; - public event EventHandler ProcessExit; - } + public event EventHandler ProcessExit; + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoDomainSetup.cs b/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoDomainSetup.cs index 1f261b25110f2..96489ca489a99 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoDomainSetup.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoDomainSetup.cs @@ -7,39 +7,39 @@ namespace Mono { - [StructLayout (LayoutKind.Sequential)] - internal sealed class MonoDomainSetup - { - #region Sync with object-internals.h - string application_base; - string application_name; - string cache_path; - string configuration_file; - string dynamic_base; - string license_file; - string private_bin_path; - string private_bin_path_probe; - string shadow_copy_directories; - string shadow_copy_files; - bool publisher_policy; - private bool path_changed; - private int loader_optimization; - bool disallow_binding_redirects; - bool disallow_code_downloads; + [StructLayout(LayoutKind.Sequential)] + internal sealed class MonoDomainSetup + { + #region Sync with object-internals.h + private string application_base; + private string application_name; + private string cache_path; + private string configuration_file; + private string dynamic_base; + private string license_file; + private string private_bin_path; + private string private_bin_path_probe; + private string shadow_copy_directories; + private string shadow_copy_files; + private bool publisher_policy; + private bool path_changed; + private int loader_optimization; + private bool disallow_binding_redirects; + private bool disallow_code_downloads; - object _activationArguments; - object domain_initializer; - object application_trust; - string [] domain_initializer_args; + private object _activationArguments; + private object domain_initializer; + private object application_trust; + private string[] domain_initializer_args; - bool disallow_appbase_probe; - byte [] configuration_bytes; + private bool disallow_appbase_probe; + private byte[] configuration_bytes; - byte [] serialized_non_primitives; - #endregion + private byte[] serialized_non_primitives; + #endregion - public MonoDomainSetup () - { - } - } + public MonoDomainSetup() + { + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoListItem.cs b/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoListItem.cs index 4c93afe2e14ad..4582ed842703b 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoListItem.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/Mono/MonoListItem.cs @@ -4,10 +4,10 @@ namespace Mono { - // Internal type used by Mono runtime only - internal sealed class MonoListItem - { - public MonoListItem next; - public object data; - } + // Internal type used by Mono runtime only + internal sealed class MonoListItem + { + public MonoListItem next; + public object data; + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeHandles.cs b/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeHandles.cs index 2ea23029c2db7..1d05876ce99a3 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeHandles.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeHandles.cs @@ -8,233 +8,239 @@ namespace Mono { - unsafe struct RuntimeClassHandle - { - RuntimeStructs.MonoClass* value; - - internal RuntimeClassHandle (RuntimeStructs.MonoClass* value) - { - this.value = value; - } - - internal RuntimeClassHandle (IntPtr ptr) - { - this.value = (RuntimeStructs.MonoClass*) ptr; - } - - internal RuntimeStructs.MonoClass* Value => value; - - public override bool Equals (object? obj) - { - if (obj == null || GetType () != obj.GetType ()) - return false; - - return value == ((RuntimeClassHandle)obj).Value; - } - - public override int GetHashCode () => ((IntPtr)value).GetHashCode (); - - public bool Equals (RuntimeClassHandle handle) - { - return value == handle.Value; - } - - public static bool operator == (RuntimeClassHandle left, object? right) - { - return right != null && right is RuntimeClassHandle rch && left.Equals (rch); - } - - public static bool operator != (RuntimeClassHandle left, object? right) - { - return !(left == right); - } - - public static bool operator == (object? left, RuntimeClassHandle right) - { - return left != null && left is RuntimeClassHandle rch && rch.Equals (right); - } - - public static bool operator != (object? left, RuntimeClassHandle right) - { - return !(left == right); - } - - [MethodImpl (MethodImplOptions.InternalCall)] - internal unsafe extern static IntPtr GetTypeFromClass (RuntimeStructs.MonoClass *klass); - - internal RuntimeTypeHandle GetTypeHandle () => new RuntimeTypeHandle (GetTypeFromClass (value)); - } - - unsafe struct RuntimeRemoteClassHandle - { - RuntimeStructs.RemoteClass* value; - - internal RuntimeRemoteClassHandle (RuntimeStructs.RemoteClass* value) - { - this.value = value; - } - - internal RuntimeClassHandle ProxyClass { - get { - return new RuntimeClassHandle (value->proxy_class); - } - } - } - - unsafe struct RuntimeGenericParamInfoHandle - { - RuntimeStructs.GenericParamInfo* value; - - internal RuntimeGenericParamInfoHandle (RuntimeStructs.GenericParamInfo* value) - { - this.value = value; - } - - internal RuntimeGenericParamInfoHandle (IntPtr ptr) - { - this.value = (RuntimeStructs.GenericParamInfo*) ptr; - } - - internal Type[] Constraints => GetConstraints (); - - internal GenericParameterAttributes Attributes => (GenericParameterAttributes) value->flags; - - Type[] GetConstraints () - { - int n = GetConstraintsCount (); - var a = new Type [n]; - for (int i = 0; i < n; i++) { - RuntimeClassHandle c = new RuntimeClassHandle (value->constraints[i]); - a[i] = Type.GetTypeFromHandle (c.GetTypeHandle ()); - } - - return a; - } - - int GetConstraintsCount () - { - int i = 0; - RuntimeStructs.MonoClass** p = value->constraints; - while (p != null && *p != null) { - p++; i++; - } - return i; - } - } - - internal struct RuntimeEventHandle - { - IntPtr value; - - internal RuntimeEventHandle (IntPtr v) - { - value = v; - } - - public IntPtr Value => value; - - public override bool Equals (object? obj) - { - if (obj == null || GetType () != obj.GetType ()) - return false; - - return value == ((RuntimeEventHandle)obj).Value; - } - - public bool Equals (RuntimeEventHandle handle) - { - return value == handle.Value; - } - - public override int GetHashCode () - { - return value.GetHashCode (); - } - - public static bool operator == (RuntimeEventHandle left, RuntimeEventHandle right) - { - return left.Equals (right); - } - - public static bool operator != (RuntimeEventHandle left, RuntimeEventHandle right) - { - return !left.Equals (right); - } - } - - internal struct RuntimePropertyHandle - { - IntPtr value; - - internal RuntimePropertyHandle (IntPtr v) - { - value = v; - } - - public IntPtr Value => value; - - public override bool Equals (object? obj) - { - if (obj == null || GetType () != obj.GetType ()) - return false; - - return value == ((RuntimePropertyHandle)obj).Value; - } - - public bool Equals (RuntimePropertyHandle handle) - { - return value == handle.Value; - } - - public override int GetHashCode () - { - return value.GetHashCode (); - } - - public static bool operator == (RuntimePropertyHandle left, RuntimePropertyHandle right) - { - return left.Equals (right); - } - - public static bool operator != (RuntimePropertyHandle left, RuntimePropertyHandle right) - { - return !left.Equals (right); - } - } - - unsafe struct RuntimeGPtrArrayHandle - { - RuntimeStructs.GPtrArray* value; - - internal RuntimeGPtrArrayHandle (RuntimeStructs.GPtrArray* value) - { - this.value = value; - } - - internal RuntimeGPtrArrayHandle (IntPtr ptr) - { - this.value = (RuntimeStructs.GPtrArray*) ptr; - } - - internal int Length => value->len; - - internal IntPtr this [int i] => Lookup (i); - - internal IntPtr Lookup (int i) - { - if (i >= 0 && i < Length) { - return value->data[i]; - } else - throw new IndexOutOfRangeException (); - } - - [MethodImpl(MethodImplOptions.InternalCall)] - extern static void GPtrArrayFree (RuntimeStructs.GPtrArray* value); - - internal static void DestroyAndFree (ref RuntimeGPtrArrayHandle h) - { - GPtrArrayFree (h.value); - h.value = null; - } - } + internal unsafe struct RuntimeClassHandle + { + private RuntimeStructs.MonoClass* value; + + internal RuntimeClassHandle(RuntimeStructs.MonoClass* value) + { + this.value = value; + } + + internal RuntimeClassHandle(IntPtr ptr) + { + this.value = (RuntimeStructs.MonoClass*)ptr; + } + + internal RuntimeStructs.MonoClass* Value => value; + + public override bool Equals(object? obj) + { + if (obj == null || GetType() != obj.GetType()) + return false; + + return value == ((RuntimeClassHandle)obj).Value; + } + + public override int GetHashCode() => ((IntPtr)value).GetHashCode(); + + public bool Equals(RuntimeClassHandle handle) + { + return value == handle.Value; + } + + public static bool operator ==(RuntimeClassHandle left, object? right) + { + return right != null && right is RuntimeClassHandle rch && left.Equals(rch); + } + + public static bool operator !=(RuntimeClassHandle left, object? right) + { + return !(left == right); + } + + public static bool operator ==(object? left, RuntimeClassHandle right) + { + return left != null && left is RuntimeClassHandle rch && rch.Equals(right); + } + + public static bool operator !=(object? left, RuntimeClassHandle right) + { + return !(left == right); + } + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static unsafe extern IntPtr GetTypeFromClass(RuntimeStructs.MonoClass* klass); + + internal RuntimeTypeHandle GetTypeHandle() => new RuntimeTypeHandle(GetTypeFromClass(value)); + } + + internal unsafe struct RuntimeRemoteClassHandle + { + private RuntimeStructs.RemoteClass* value; + + internal RuntimeRemoteClassHandle(RuntimeStructs.RemoteClass* value) + { + this.value = value; + } + + internal RuntimeClassHandle ProxyClass + { + get + { + return new RuntimeClassHandle(value->proxy_class); + } + } + } + + internal unsafe struct RuntimeGenericParamInfoHandle + { + private RuntimeStructs.GenericParamInfo* value; + + internal RuntimeGenericParamInfoHandle(RuntimeStructs.GenericParamInfo* value) + { + this.value = value; + } + + internal RuntimeGenericParamInfoHandle(IntPtr ptr) + { + this.value = (RuntimeStructs.GenericParamInfo*)ptr; + } + + internal Type[] Constraints => GetConstraints(); + + internal GenericParameterAttributes Attributes => (GenericParameterAttributes)value->flags; + + private Type[] GetConstraints() + { + int n = GetConstraintsCount(); + var a = new Type[n]; + for (int i = 0; i < n; i++) + { + RuntimeClassHandle c = new RuntimeClassHandle(value->constraints[i]); + a[i] = Type.GetTypeFromHandle(c.GetTypeHandle()); + } + + return a; + } + + private int GetConstraintsCount() + { + int i = 0; + RuntimeStructs.MonoClass** p = value->constraints; + while (p != null && *p != null) + { + p++; i++; + } + return i; + } + } + + internal struct RuntimeEventHandle + { + private IntPtr value; + + internal RuntimeEventHandle(IntPtr v) + { + value = v; + } + + public IntPtr Value => value; + + public override bool Equals(object? obj) + { + if (obj == null || GetType() != obj.GetType()) + return false; + + return value == ((RuntimeEventHandle)obj).Value; + } + + public bool Equals(RuntimeEventHandle handle) + { + return value == handle.Value; + } + + public override int GetHashCode() + { + return value.GetHashCode(); + } + + public static bool operator ==(RuntimeEventHandle left, RuntimeEventHandle right) + { + return left.Equals(right); + } + + public static bool operator !=(RuntimeEventHandle left, RuntimeEventHandle right) + { + return !left.Equals(right); + } + } + + internal struct RuntimePropertyHandle + { + private IntPtr value; + + internal RuntimePropertyHandle(IntPtr v) + { + value = v; + } + + public IntPtr Value => value; + + public override bool Equals(object? obj) + { + if (obj == null || GetType() != obj.GetType()) + return false; + + return value == ((RuntimePropertyHandle)obj).Value; + } + + public bool Equals(RuntimePropertyHandle handle) + { + return value == handle.Value; + } + + public override int GetHashCode() + { + return value.GetHashCode(); + } + + public static bool operator ==(RuntimePropertyHandle left, RuntimePropertyHandle right) + { + return left.Equals(right); + } + + public static bool operator !=(RuntimePropertyHandle left, RuntimePropertyHandle right) + { + return !left.Equals(right); + } + } + + internal unsafe struct RuntimeGPtrArrayHandle + { + private RuntimeStructs.GPtrArray* value; + + internal RuntimeGPtrArrayHandle(RuntimeStructs.GPtrArray* value) + { + this.value = value; + } + + internal RuntimeGPtrArrayHandle(IntPtr ptr) + { + this.value = (RuntimeStructs.GPtrArray*)ptr; + } + + internal int Length => value->len; + + internal IntPtr this[int i] => Lookup(i); + + internal IntPtr Lookup(int i) + { + if (i >= 0 && i < Length) + { + return value->data[i]; + } + else + throw new IndexOutOfRangeException(); + } + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern void GPtrArrayFree(RuntimeStructs.GPtrArray* value); + + internal static void DestroyAndFree(ref RuntimeGPtrArrayHandle h) + { + GPtrArrayFree(h.value); + h.value = null; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeMarshal.cs b/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeMarshal.cs index 28124b21aaf43..1ed70e8c6ebdd 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeMarshal.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeMarshal.cs @@ -2,77 +2,89 @@ using System.Runtime.InteropServices; using System.Runtime.CompilerServices; -namespace Mono { - internal static class RuntimeMarshal { - internal static string PtrToUtf8String (IntPtr ptr) - { - unsafe { - if (ptr == IntPtr.Zero) - return string.Empty; +namespace Mono +{ + internal static class RuntimeMarshal + { + internal static string PtrToUtf8String(IntPtr ptr) + { + unsafe + { + if (ptr == IntPtr.Zero) + return string.Empty; - byte* bytes = (byte*)ptr; - int length = 0; + byte* bytes = (byte*)ptr; + int length = 0; - try { - while (bytes++ [0] != 0) - length++; - } catch (NullReferenceException) { - throw new ArgumentOutOfRangeException ("ptr", "Value does not refer to a valid string."); - } + try + { + while (bytes++[0] != 0) + length++; + } + catch (NullReferenceException) + { + throw new ArgumentOutOfRangeException(nameof(ptr), "Value does not refer to a valid string."); + } - return new String ((sbyte*)ptr, 0, length, System.Text.Encoding.UTF8); - } - } + return new string((sbyte*)ptr, 0, length, System.Text.Encoding.UTF8); + } + } - internal static SafeStringMarshal MarshalString (string str) - { - return new SafeStringMarshal (str); - } + internal static SafeStringMarshal MarshalString(string str) + { + return new SafeStringMarshal(str); + } - static int DecodeBlobSize (IntPtr in_ptr, out IntPtr out_ptr) - { - uint size; - unsafe { - byte *ptr = (byte*)in_ptr; - - if ((*ptr & 0x80) == 0) { - size = (uint)(ptr [0] & 0x7f); - ptr++; - } else if ((*ptr & 0x40) == 0){ - size = (uint)(((ptr [0] & 0x3f) << 8) + ptr [1]); - ptr += 2; - } else { - size = (uint)(((ptr [0] & 0x1f) << 24) + - (ptr [1] << 16) + - (ptr [2] << 8) + - ptr [3]); - ptr += 4; - } - out_ptr = (IntPtr)ptr; - } + private static int DecodeBlobSize(IntPtr in_ptr, out IntPtr out_ptr) + { + uint size; + unsafe + { + byte* ptr = (byte*)in_ptr; - return (int)size; - } + if ((*ptr & 0x80) == 0) + { + size = (uint)(ptr[0] & 0x7f); + ptr++; + } + else if ((*ptr & 0x40) == 0) + { + size = (uint)(((ptr[0] & 0x3f) << 8) + ptr[1]); + ptr += 2; + } + else + { + size = (uint)(((ptr[0] & 0x1f) << 24) + + (ptr[1] << 16) + + (ptr[2] << 8) + + ptr[3]); + ptr += 4; + } + out_ptr = (IntPtr)ptr; + } - internal static byte[] DecodeBlobArray (IntPtr ptr) - { - IntPtr out_ptr; - int size = DecodeBlobSize (ptr, out out_ptr); - byte[] res = new byte [size]; - Marshal.Copy (out_ptr, res, 0, size); - return res; - } + return (int)size; + } - internal static int AsciHexDigitValue (int c) - { - if (c >= '0' && c <= '9') - return c - '0'; - if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - return c - 'A' + 10; - } + internal static byte[] DecodeBlobArray(IntPtr ptr) + { + IntPtr out_ptr; + int size = DecodeBlobSize(ptr, out out_ptr); + byte[] res = new byte[size]; + Marshal.Copy(out_ptr, res, 0, size); + return res; + } - [MethodImpl (MethodImplOptions.InternalCall)] - internal static extern void FreeAssemblyName (ref MonoAssemblyName name, bool freeStruct); - } + internal static int AsciHexDigitValue(int c) + { + if (c >= '0' && c <= '9') + return c - '0'; + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + return c - 'A' + 10; + } + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void FreeAssemblyName(ref MonoAssemblyName name, bool freeStruct); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeStructs.cs b/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeStructs.cs index ae0255124d4d0..281be6d54a326 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeStructs.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/Mono/RuntimeStructs.cs @@ -14,88 +14,96 @@ #pragma warning disable 169 -namespace Mono { - // - // Managed representations of mono runtime types - // - internal static class RuntimeStructs { - // class-internals.h MonoRemoteClass - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct RemoteClass { - internal IntPtr default_vtable; - internal IntPtr xdomain_vtable; - internal MonoClass* proxy_class; - internal IntPtr proxy_class_name; - internal uint interface_count; - // FIXME: How to represent variable-length array struct member? - // MonoClass* interfaces []; - } +namespace Mono +{ + // + // Managed representations of mono runtime types + // + internal static class RuntimeStructs + { + // class-internals.h MonoRemoteClass + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct RemoteClass + { + internal IntPtr default_vtable; + internal IntPtr xdomain_vtable; + internal MonoClass* proxy_class; + internal IntPtr proxy_class_name; + internal uint interface_count; + // FIXME: How to represent variable-length array struct member? + // MonoClass* interfaces []; + } - internal struct MonoClass { - } + internal struct MonoClass + { + } - // class-internals.h MonoGenericParamInfo - internal unsafe struct GenericParamInfo { - internal MonoClass* pklass; - internal IntPtr name; - internal ushort flags; - internal uint token; - internal MonoClass** constraints; /* NULL terminated */ - } + // class-internals.h MonoGenericParamInfo + internal unsafe struct GenericParamInfo + { + internal MonoClass* pklass; + internal IntPtr name; + internal ushort flags; + internal uint token; + internal MonoClass** constraints; /* NULL terminated */ + } - // glib.h GPtrArray - internal unsafe struct GPtrArray { - internal IntPtr* data; - internal int len; - } - } + // glib.h GPtrArray + internal unsafe struct GPtrArray + { + internal IntPtr* data; + internal int len; + } + } - //Maps to metadata-internals.h:: MonoAssemblyName - internal unsafe struct MonoAssemblyName - { - const int MONO_PUBLIC_KEY_TOKEN_LENGTH = 17; + //Maps to metadata-internals.h:: MonoAssemblyName + internal unsafe struct MonoAssemblyName + { + #pragma warning disable CA1823 // TODO: https://github.com/dotnet/roslyn/issues/37593 + private const int MONO_PUBLIC_KEY_TOKEN_LENGTH = 17; + #pragma warning restore CA1823 - internal IntPtr name; - internal IntPtr culture; - internal IntPtr hash_value; - internal IntPtr public_key; - internal fixed byte public_key_token [MONO_PUBLIC_KEY_TOKEN_LENGTH]; - internal uint hash_alg; - internal uint hash_len; - internal uint flags; + internal IntPtr name; + internal IntPtr culture; + internal IntPtr hash_value; + internal IntPtr public_key; + internal fixed byte public_key_token[MONO_PUBLIC_KEY_TOKEN_LENGTH]; + internal uint hash_alg; + internal uint hash_len; + internal uint flags; #if NETCORE - internal int major, minor, build, revision; + internal int major, minor, build, revision; #else internal ushort major, minor, build, revision; #endif - internal ushort arch; - } + internal ushort arch; + } - // Used to implement generic sharing - // See mini-generic-sharing.c - // We use these instead of the normal ValueTuple types to avoid linking in the - // c# methods belonging to those types - internal struct ValueTuple - { - } + // Used to implement generic sharing + // See mini-generic-sharing.c + // We use these instead of the normal ValueTuple types to avoid linking in the + // c# methods belonging to those types + internal struct ValueTuple + { + } internal struct ValueTuple { public T1 Item1; - } + } internal struct ValueTuple { public T1 Item1; public T2 Item2; - } + } internal struct ValueTuple { public T1 Item1; public T2 Item2; public T3 Item3; - } + } internal struct ValueTuple { @@ -103,7 +111,7 @@ internal struct ValueTuple public T2 Item2; public T3 Item3; public T4 Item4; - } + } internal struct ValueTuple { @@ -112,12 +120,12 @@ internal struct ValueTuple public T3 Item3; public T4 Item4; public T5 Item5; - } + } - internal class NullByRefReturnException : Exception - { - public NullByRefReturnException () - { - } - } + internal class NullByRefReturnException : Exception + { + public NullByRefReturnException() + { + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/Mono/SafeGPtrArrayHandle.cs b/src/mono/netcore/System.Private.CoreLib/src/Mono/SafeGPtrArrayHandle.cs index 0441c9b8bd8b9..2f8a550049284 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/Mono/SafeGPtrArrayHandle.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/Mono/SafeGPtrArrayHandle.cs @@ -12,27 +12,32 @@ using System; using System.Runtime.CompilerServices; -namespace Mono { - internal struct SafeGPtrArrayHandle : IDisposable { - RuntimeGPtrArrayHandle handle; - - internal SafeGPtrArrayHandle (IntPtr ptr) - { - handle = new RuntimeGPtrArrayHandle (ptr); - } - - public void Dispose () { - RuntimeGPtrArrayHandle.DestroyAndFree (ref handle); - } - - internal int Length { - get { - return handle.Length; - } - } - - internal IntPtr this[int i] => handle[i]; - } +namespace Mono +{ + internal struct SafeGPtrArrayHandle : IDisposable + { + private RuntimeGPtrArrayHandle handle; + + internal SafeGPtrArrayHandle(IntPtr ptr) + { + handle = new RuntimeGPtrArrayHandle(ptr); + } + + public void Dispose() + { + RuntimeGPtrArrayHandle.DestroyAndFree(ref handle); + } + + internal int Length + { + get + { + return handle.Length; + } + } + + internal IntPtr this[int i] => handle[i]; + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/Mono/SafeStringMarshal.cs b/src/mono/netcore/System.Private.CoreLib/src/Mono/SafeStringMarshal.cs index d21829d5dc9bd..ce561ecdcef2f 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/Mono/SafeStringMarshal.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/Mono/SafeStringMarshal.cs @@ -12,40 +12,47 @@ using System; using System.Runtime.CompilerServices; -namespace Mono { - internal struct SafeStringMarshal : IDisposable { - readonly string str; - IntPtr marshaled_string; - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static IntPtr StringToUtf8_icall (ref string str); - - public static IntPtr StringToUtf8 (string str) - { - return StringToUtf8_icall (ref str); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public extern static void GFree (IntPtr ptr); - - public SafeStringMarshal (string str) { - this.str = str; - this.marshaled_string = IntPtr.Zero; - } - - public IntPtr Value { - get { - if (marshaled_string == IntPtr.Zero && str != null) - marshaled_string = StringToUtf8 (str); - return marshaled_string; - } - } - - public void Dispose () { - if (marshaled_string != IntPtr.Zero) { - GFree (marshaled_string); - marshaled_string = IntPtr.Zero; - } - } - } +namespace Mono +{ + internal struct SafeStringMarshal : IDisposable + { + private readonly string str; + private IntPtr marshaled_string; + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern IntPtr StringToUtf8_icall(ref string str); + + public static IntPtr StringToUtf8(string str) + { + return StringToUtf8_icall(ref str); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern void GFree(IntPtr ptr); + + public SafeStringMarshal(string str) + { + this.str = str; + this.marshaled_string = IntPtr.Zero; + } + + public IntPtr Value + { + get + { + if (marshaled_string == IntPtr.Zero && str != null) + marshaled_string = StringToUtf8(str); + return marshaled_string; + } + } + + public void Dispose() + { + if (marshaled_string != IntPtr.Zero) + { + GFree(marshaled_string); + marshaled_string = IntPtr.Zero; + } + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/ArgIterator.cs b/src/mono/netcore/System.Private.CoreLib/src/System/ArgIterator.cs index 3b4d0a88050cc..0adc71670b911 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/ArgIterator.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/ArgIterator.cs @@ -5,100 +5,102 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System +namespace System { - [StructLayout (LayoutKind.Auto)] - public ref struct ArgIterator - { + [StructLayout(LayoutKind.Auto)] + public ref struct ArgIterator + { #pragma warning disable 169, 414 - IntPtr sig; - IntPtr args; - int next_arg; - int num_args; + private IntPtr sig; + private IntPtr args; + private int next_arg; + private int num_args; #pragma warning restore 169, 414 - [MethodImpl (MethodImplOptions.InternalCall)] - extern void Setup (IntPtr argsp, IntPtr start); + [MethodImpl(MethodImplOptions.InternalCall)] + private extern void Setup(IntPtr argsp, IntPtr start); - public ArgIterator (RuntimeArgumentHandle arglist) - { - sig = IntPtr.Zero; - args = IntPtr.Zero; - next_arg = num_args = 0; - if (arglist.args == IntPtr.Zero) - throw new PlatformNotSupportedException (); - Setup (arglist.args, IntPtr.Zero); - } + public ArgIterator(RuntimeArgumentHandle arglist) + { + sig = IntPtr.Zero; + args = IntPtr.Zero; + next_arg = num_args = 0; + if (arglist.args == IntPtr.Zero) + throw new PlatformNotSupportedException(); + Setup(arglist.args, IntPtr.Zero); + } - [CLSCompliant (false)] - unsafe public ArgIterator (RuntimeArgumentHandle arglist, void *ptr) - { - sig = IntPtr.Zero; - args = IntPtr.Zero; - next_arg = num_args = 0; - if (arglist.args == IntPtr.Zero) - throw new PlatformNotSupportedException (); - Setup (arglist.args, (IntPtr) ptr); - } + [CLSCompliant(false)] + public unsafe ArgIterator(RuntimeArgumentHandle arglist, void* ptr) + { + sig = IntPtr.Zero; + args = IntPtr.Zero; + next_arg = num_args = 0; + if (arglist.args == IntPtr.Zero) + throw new PlatformNotSupportedException(); + Setup(arglist.args, (IntPtr)ptr); + } - public void End () - { - next_arg = num_args; - } + public void End() + { + next_arg = num_args; + } - public override bool Equals (object? o) - { - throw new NotSupportedException ("ArgIterator does not support Equals."); - } + public override bool Equals(object? o) + { + throw new NotSupportedException("ArgIterator does not support Equals."); + } - public override int GetHashCode () - { - return sig.GetHashCode (); - } + public override int GetHashCode() + { + return sig.GetHashCode(); + } - [CLSCompliant (false)] - public TypedReference GetNextArg () - { - if (num_args == next_arg) - throw new InvalidOperationException ("Invalid iterator position."); - TypedReference result = new TypedReference (); - unsafe { - IntGetNextArg (&result); - } - return result; - } + [CLSCompliant(false)] + public TypedReference GetNextArg() + { + if (num_args == next_arg) + throw new InvalidOperationException("Invalid iterator position."); + TypedReference result = default; + unsafe + { + IntGetNextArg(&result); + } + return result; + } - [MethodImpl (MethodImplOptions.InternalCall)] - extern unsafe void IntGetNextArg (void *res); + [MethodImpl(MethodImplOptions.InternalCall)] + private extern unsafe void IntGetNextArg(void* res); - [CLSCompliant (false)] - public TypedReference GetNextArg (RuntimeTypeHandle rth) - { - if (num_args == next_arg) - throw new InvalidOperationException ("Invalid iterator position."); - TypedReference result = new TypedReference (); - unsafe { - IntGetNextArgWithType (&result, rth.Value); - } - return result; - } + [CLSCompliant(false)] + public TypedReference GetNextArg(RuntimeTypeHandle rth) + { + if (num_args == next_arg) + throw new InvalidOperationException("Invalid iterator position."); + TypedReference result = default; + unsafe + { + IntGetNextArgWithType(&result, rth.Value); + } + return result; + } - [MethodImpl (MethodImplOptions.InternalCall)] - extern unsafe void IntGetNextArgWithType (void *res, IntPtr rth); + [MethodImpl(MethodImplOptions.InternalCall)] + private extern unsafe void IntGetNextArgWithType(void* res, IntPtr rth); - public RuntimeTypeHandle GetNextArgType () - { - if (num_args == next_arg) - throw new InvalidOperationException ("Invalid iterator position."); - return new RuntimeTypeHandle (IntGetNextArgType ()); - } + public RuntimeTypeHandle GetNextArgType() + { + if (num_args == next_arg) + throw new InvalidOperationException("Invalid iterator position."); + return new RuntimeTypeHandle(IntGetNextArgType()); + } - [MethodImpl (MethodImplOptions.InternalCall)] - extern IntPtr IntGetNextArgType (); + [MethodImpl(MethodImplOptions.InternalCall)] + private extern IntPtr IntGetNextArgType(); - public int GetRemainingCount () - { - return num_args - next_arg; - } - } + public int GetRemainingCount() + { + return num_args - next_arg; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Array.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Array.Mono.cs index d4ac896bd9ced..bfbed4dd48925 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Array.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Array.Mono.cs @@ -9,6 +9,8 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Mono; + +#pragma warning disable SA1121 // explicitly using type aliases instead of built-in types #if TARGET_64BIT using nuint = System.UInt64; #else @@ -17,596 +19,632 @@ namespace System { - partial class Array - { - [StructLayout(LayoutKind.Sequential)] - private class RawData - { - public IntPtr Bounds; - public IntPtr Count; - public byte Data; - } - - public int Length { - [Intrinsic] - get => Length; - } - - public long LongLength { - get { - long length = GetLength (0); - - for (int i = 1; i < Rank; i++) { - length *= GetLength (i); - } - return length; - } - } - - public int Rank { - [Intrinsic] - get => Rank; - } - - public static unsafe void Clear (Array array, int index, int length) - { - if (array == null) - ThrowHelper.ThrowArgumentNullException (ExceptionArgument.array); - - int lowerBound = array.GetLowerBound (0); - int elementSize = array.GetElementSize (); - nuint numComponents = (nuint) Unsafe.As (array).Count; - - int offset = index - lowerBound; - - if (index < lowerBound || offset < 0 || length < 0 || (uint) (offset + length) > numComponents) - ThrowHelper.ThrowIndexOutOfRangeException (); - - ref byte ptr = ref Unsafe.AddByteOffset (ref array.GetRawSzArrayData(), (uint) offset * (nuint) elementSize); - nuint byteLength = (uint) length * (nuint) elementSize; - - if (RuntimeHelpers.ObjectHasReferences (array)) - SpanHelpers.ClearWithReferences (ref Unsafe.As (ref ptr), byteLength / (uint)sizeof (IntPtr)); - else - SpanHelpers.ClearWithoutReferences (ref ptr, byteLength); - } - - public static void ConstrainedCopy (Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length) - { - Copy (sourceArray, sourceIndex, destinationArray, destinationIndex, length, true); - } - - public static void Copy (Array sourceArray, Array destinationArray, int length) - { - if (sourceArray == null) - throw new ArgumentNullException ("sourceArray"); - - if (destinationArray == null) - throw new ArgumentNullException ("destinationArray"); - - Copy (sourceArray, sourceArray.GetLowerBound (0), destinationArray, - destinationArray.GetLowerBound (0), length); - } - - public static void Copy (Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length) - { - Copy (sourceArray, sourceIndex, destinationArray, destinationIndex, length, false); - } - - private static void Copy (Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable) - { - if (sourceArray == null) - throw new ArgumentNullException (nameof (sourceArray)); - - if (destinationArray == null) - throw new ArgumentNullException (nameof (destinationArray)); - - if (length < 0) - throw new ArgumentOutOfRangeException (nameof (length), "Value has to be >= 0."); - - if (sourceArray.Rank != destinationArray.Rank) - throw new RankException(SR.Rank_MultiDimNotSupported); - - if (sourceIndex < 0) - throw new ArgumentOutOfRangeException (nameof (sourceIndex), "Value has to be >= 0."); - - if (destinationIndex < 0) - throw new ArgumentOutOfRangeException (nameof (destinationIndex), "Value has to be >= 0."); - - if (FastCopy (sourceArray, sourceIndex, destinationArray, destinationIndex, length)) - return; - - int source_pos = sourceIndex - sourceArray.GetLowerBound (0); - int dest_pos = destinationIndex - destinationArray.GetLowerBound (0); - - if (source_pos < 0) - throw new ArgumentOutOfRangeException (nameof (sourceIndex), "Index was less than the array's lower bound in the first dimension."); - - if (dest_pos < 0) - throw new ArgumentOutOfRangeException (nameof (destinationIndex), "Index was less than the array's lower bound in the first dimension."); - - // re-ordered to avoid possible integer overflow - if (source_pos > sourceArray.Length - length) - throw new ArgumentException (SR.Arg_LongerThanSrcArray, nameof (sourceArray)); - - if (dest_pos > destinationArray.Length - length) { - throw new ArgumentException ("Destination array was not long enough. Check destIndex and length, and the array's lower bounds", nameof (destinationArray)); - } - - Type src_type = sourceArray.GetType ().GetElementType ()!; - Type dst_type = destinationArray.GetType ().GetElementType ()!; - var dst_type_vt = dst_type.IsValueType && Nullable.GetUnderlyingType (dst_type) == null; - - bool src_is_enum = src_type.IsEnum; - bool dst_is_enum = dst_type.IsEnum; - - if (src_is_enum) - src_type = Enum.GetUnderlyingType (src_type); - if (dst_is_enum) - dst_type = Enum.GetUnderlyingType (dst_type); - - if (reliable) { - if (!dst_type.Equals (src_type) && - !(dst_type.IsPrimitive && src_type.IsPrimitive && CanChangePrimitive(ref dst_type, ref src_type, true))) { - throw new ArrayTypeMismatchException (SR.ArrayTypeMismatch_CantAssignType); - } - } else { - if (!CanAssignArrayElement (src_type, dst_type)) { - throw new ArrayTypeMismatchException (SR.ArrayTypeMismatch_CantAssignType); - } - } - - if (!Object.ReferenceEquals (sourceArray, destinationArray) || source_pos > dest_pos) { - for (int i = 0; i < length; i++) { - Object srcval = sourceArray.GetValueImpl (source_pos + i); - - if (!src_type.IsValueType && dst_is_enum) - throw new InvalidCastException (SR.InvalidCast_DownCastArrayElement); - - if (dst_type_vt && (srcval == null || (src_type == typeof (object) && srcval.GetType () != dst_type))) - throw new InvalidCastException (); - - try { - destinationArray.SetValueRelaxedImpl (srcval, dest_pos + i); - } catch (ArgumentException) { - throw CreateArrayTypeMismatchException (); - } - } - } else { - for (int i = length - 1; i >= 0; i--) { - Object srcval = sourceArray.GetValueImpl (source_pos + i); - - try { - destinationArray.SetValueRelaxedImpl (srcval, dest_pos + i); - } catch (ArgumentException) { - throw CreateArrayTypeMismatchException (); - } - } - } - } - - static ArrayTypeMismatchException CreateArrayTypeMismatchException () - { - return new ArrayTypeMismatchException (); - } - - static bool CanAssignArrayElement (Type source, Type target) - { - if (!target.IsValueType && !target.IsPointer) { - if (!source.IsValueType && !source.IsPointer) { - // Reference to reference copy - return - source.IsInterface || target.IsInterface || - source.IsAssignableFrom (target) || target.IsAssignableFrom (source); - } else { - // Value to reference copy - if (source.IsPointer) - return false; - return target.IsAssignableFrom (source); - } - } else { - if (source.IsEquivalentTo (target)) { - return true; - } else if (source.IsPointer && target.IsPointer) { - return true; - } else if (source.IsPrimitive && target.IsPrimitive) { - - // Allow primitive type widening - return CanChangePrimitive (ref source, ref target, false); - } else if (!source.IsValueType && !source.IsPointer) { - // Source is base class or interface of destination type - if (target.IsPointer) - return false; - return source.IsAssignableFrom (target); - } - } - - return false; - } - - public static unsafe Array CreateInstance (Type elementType, int length) - { - if (elementType is null) - ThrowHelper.ThrowArgumentNullException (ExceptionArgument.elementType); - if (length < 0) - ThrowHelper.ThrowLengthArgumentOutOfRange_ArgumentOutOfRange_NeedNonNegNum (); - - RuntimeType? runtimeType = elementType.UnderlyingSystemType as RuntimeType; - if (runtimeType == null) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_MustBeType, ExceptionArgument.elementType); - - Array array = null; - InternalCreate (ref array, runtimeType._impl.Value, 1, &length, null); - GC.KeepAlive (runtimeType); - return array; - } - - public static unsafe Array CreateInstance (Type elementType, int length1, int length2) - { - if (elementType is null) - ThrowHelper.ThrowArgumentNullException (ExceptionArgument.elementType); - if (length1 < 0) - ThrowHelper.ThrowArgumentOutOfRangeException (ExceptionArgument.length1, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); - if (length2 < 0) - ThrowHelper.ThrowArgumentOutOfRangeException (ExceptionArgument.length2, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); - - RuntimeType? runtimeType = elementType.UnderlyingSystemType as RuntimeType; - if (runtimeType == null) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_MustBeType, ExceptionArgument.elementType); - - int* lengths = stackalloc int [] { length1, length2 }; - Array array = null; - InternalCreate (ref array, runtimeType._impl.Value, 2, lengths, null); - GC.KeepAlive (runtimeType); - return array; - } - - public static unsafe Array CreateInstance (Type elementType, int length1, int length2, int length3) - { - if (elementType is null) - ThrowHelper.ThrowArgumentNullException (ExceptionArgument.elementType); - if (length1 < 0) - ThrowHelper.ThrowArgumentOutOfRangeException (ExceptionArgument.length1, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); - if (length2 < 0) - ThrowHelper.ThrowArgumentOutOfRangeException (ExceptionArgument.length2, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); - if (length3 < 0) - ThrowHelper.ThrowArgumentOutOfRangeException (ExceptionArgument.length3, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); - - RuntimeType? runtimeType = elementType.UnderlyingSystemType as RuntimeType; - if (runtimeType == null) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_MustBeType, ExceptionArgument.elementType); - - int* lengths = stackalloc int [] { length1, length2, length3 }; - Array array = null; - InternalCreate (ref array, runtimeType._impl.Value, 3, lengths, null); - GC.KeepAlive (runtimeType); - return array; - } - - public static unsafe Array CreateInstance (Type elementType, params int[] lengths) - { - if (elementType is null) - ThrowHelper.ThrowArgumentNullException (ExceptionArgument.elementType); - if (lengths == null) - ThrowHelper.ThrowArgumentNullException (ExceptionArgument.lengths); - if (lengths.Length == 0) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_NeedAtLeast1Rank); - - RuntimeType? runtimeType = elementType.UnderlyingSystemType as RuntimeType; - if (runtimeType == null) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_MustBeType, ExceptionArgument.elementType); - - for (int i = 0; i < lengths.Length; i++) - if (lengths [i] < 0) - ThrowHelper.ThrowArgumentOutOfRangeException (ExceptionArgument.lengths, i, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); - - Array array = null; - fixed (int* pLengths = &lengths [0]) - InternalCreate (ref array, runtimeType._impl.Value, lengths.Length, pLengths, null); - GC.KeepAlive (runtimeType); - return array; - } - - public static unsafe Array CreateInstance (Type elementType, int[] lengths, int[] lowerBounds) - { - if (elementType == null) - ThrowHelper.ThrowArgumentNullException (ExceptionArgument.elementType); - if (lengths == null) - ThrowHelper.ThrowArgumentNullException (ExceptionArgument.lengths); - if (lowerBounds == null) - ThrowHelper.ThrowArgumentNullException (ExceptionArgument.lowerBounds); - if (lengths.Length != lowerBounds!.Length) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_RanksAndBounds); - if (lengths.Length == 0) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_NeedAtLeast1Rank); - - for (int i = 0; i < lengths.Length; i++) - if (lengths [i] < 0) - ThrowHelper.ThrowArgumentOutOfRangeException (ExceptionArgument.lengths, i, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); - - RuntimeType? runtimeType = elementType.UnderlyingSystemType as RuntimeType; - if (runtimeType == null) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_MustBeType, ExceptionArgument.elementType); - - Array array = null; - fixed (int* pLengths = &lengths [0]) - fixed (int* pLowerBounds = &lowerBounds [0]) - InternalCreate (ref array, runtimeType._impl.Value, lengths.Length, pLengths, pLowerBounds); - GC.KeepAlive (runtimeType); - return array; - } - - [MethodImpl (MethodImplOptions.InternalCall)] - static extern unsafe void InternalCreate (ref Array result, IntPtr elementType, int rank, int* lengths, int* lowerBounds); - - public object GetValue (int index) - { - if (Rank != 1) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_Need1DArray); - - var lb = GetLowerBound (0); - if (index < lb || index > GetUpperBound (0)) - throw new IndexOutOfRangeException ("Index has to be between upper and lower bound of the array."); - - if (GetType ().GetElementType ()!.IsPointer) - throw new NotSupportedException (SR.NotSupported_Type); - - return GetValueImpl (index - lb); - } - - public object GetValue (int index1, int index2) - { - if (Rank != 2) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_Need2DArray); - - int[] ind = {index1, index2}; - return GetValue (ind); - } - - public object GetValue (int index1, int index2, int index3) - { - if (Rank != 3) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_Need3DArray); - - int[] ind = {index1, index2, index3}; - return GetValue (ind); - } - - public void Initialize () - { - } - - static int IndexOfImpl(T[] array, T value, int startIndex, int count) - { - return EqualityComparer.Default.IndexOf (array, value, startIndex, count); - } - - static int LastIndexOfImpl(T[] array, T value, int startIndex, int count) - { - return EqualityComparer.Default.LastIndexOf (array, value, startIndex, count); - } - - public void SetValue (object? value, int index) - { - if (Rank != 1) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_Need1DArray); - - var lb = GetLowerBound (0); - if (index < lb || index > GetUpperBound (0)) - throw new IndexOutOfRangeException ("Index has to be >= lower bound and <= upper bound of the array."); - - if (GetType ().GetElementType ()!.IsPointer) - throw new NotSupportedException (SR.NotSupported_Type); - - SetValueImpl (value, index - lb); - } - - public void SetValue (object? value, int index1, int index2) - { - if (Rank != 2) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_Need2DArray); - - int[] ind = {index1, index2}; - SetValue (value, ind); - } - - public void SetValue (object? value, int index1, int index2, int index3) - { - if (Rank != 3) - ThrowHelper.ThrowArgumentException (ExceptionResource.Arg_Need3DArray); - - int[] ind = {index1, index2, index3}; - SetValue (value, ind); - } - - public int GetUpperBound (int dimension) - { - return GetLowerBound (dimension) + GetLength (dimension) - 1; - } - - [Intrinsic] - [MethodImpl (MethodImplOptions.AggressiveInlining)] - internal ref byte GetRawSzArrayData () - { - // TODO: Missing intrinsic in interpreter - return ref Unsafe.As(this).Data; - } - - [Intrinsic] - [MethodImpl (MethodImplOptions.AggressiveInlining)] - internal ref byte GetRawArrayData () - { - // TODO: Missing intrinsic in interpreter - return ref Unsafe.As(this).Data; - } - - [Intrinsic] - internal int GetElementSize () => GetElementSize (); - - [Intrinsic] - internal bool IsPrimitive () => IsPrimitive (); - - [MethodImpl (MethodImplOptions.InternalCall)] - internal extern CorElementType GetCorElementTypeOfElementType(); - - [MethodImpl (MethodImplOptions.InternalCall)] - extern bool IsValueOfElementType(object value); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static bool CanChangePrimitive (ref Type srcType, ref Type dstType, bool reliable); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static bool FastCopy (Array source, int source_idx, Array dest, int dest_idx, int length); - - [Intrinsic] // when dimension is `0` constant - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern int GetLength (int dimension); - - [Intrinsic] // when dimension is `0` constant - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern int GetLowerBound (int dimension); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern object GetValue (params int[] indices); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern void SetValue (object? value, params int[] indices); - - // CAUTION! No bounds checking! - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void GetGenericValue_icall (ref Array self, int pos, out T value); - - // CAUTION! No bounds checking! - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern object GetValueImpl (int pos); - - // CAUTION! No bounds checking! - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void SetGenericValue_icall (ref Array self, int pos, ref T value); - - [Intrinsic] - void GetGenericValueImpl (int pos, out T value) - { - var self = this; - GetGenericValue_icall (ref self, pos, out value); - } - - [Intrinsic] - void SetGenericValueImpl (int pos, ref T value) - { - var self = this; - SetGenericValue_icall (ref self, pos, ref value); - } - - // CAUTION! No bounds checking! - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern void SetValueImpl (object? value, int pos); - - // CAUTION! No bounds checking! - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern void SetValueRelaxedImpl (object? value, int pos); - - /* - * These methods are used to implement the implicit generic interfaces - * implemented by arrays in NET 2.0. - * Only make those methods generic which really need it, to avoid - * creating useless instantiations. - */ - internal int InternalArray__ICollection_get_Count () - { - return Length; - } - - internal bool InternalArray__ICollection_get_IsReadOnly () - { - return true; - } - - internal IEnumerator InternalArray__IEnumerable_GetEnumerator () - { - return Length == 0 ? SZGenericArrayEnumerator.Empty : new SZGenericArrayEnumerator (Unsafe.As (this)); - } - - internal void InternalArray__ICollection_Clear () - { - ThrowHelper.ThrowNotSupportedException (ExceptionResource.NotSupported_ReadOnlyCollection); - } - - internal void InternalArray__ICollection_Add (T item) - { - ThrowHelper.ThrowNotSupportedException (ExceptionResource.NotSupported_FixedSizeCollection); - } - - internal bool InternalArray__ICollection_Remove (T item) - { - ThrowHelper.ThrowNotSupportedException (ExceptionResource.NotSupported_FixedSizeCollection); - return default; - } - - internal bool InternalArray__ICollection_Contains (T item) - { - return IndexOf ((T[])this, item, 0, Length) >= 0; - } - - internal void InternalArray__ICollection_CopyTo (T[] array, int arrayIndex) - { - Copy (this, GetLowerBound (0), array, arrayIndex, Length); - } - - internal T InternalArray__IReadOnlyList_get_Item (int index) - { - if ((uint)index >= (uint)Length) - ThrowHelper.ThrowArgumentOutOfRange_IndexException (); - - T value; - // Do not change this to call GetGenericValue_icall directly, due to special casing in the runtime. - GetGenericValueImpl (index, out value); - return value; - } - - internal int InternalArray__IReadOnlyCollection_get_Count () - { - return Length; - } - - internal void InternalArray__Insert (int index, T item) - { - ThrowHelper.ThrowNotSupportedException (ExceptionResource.NotSupported_FixedSizeCollection); - } - - internal void InternalArray__RemoveAt (int index) - { - ThrowHelper.ThrowNotSupportedException (ExceptionResource.NotSupported_FixedSizeCollection); - } - - internal int InternalArray__IndexOf (T item) - { - return IndexOf ((T[])this, item, 0, Length); - } - - internal T InternalArray__get_Item (int index) - { - if ((uint)index >= (uint)Length) - ThrowHelper.ThrowArgumentOutOfRange_IndexException (); - - T value; - // Do not change this to call GetGenericValue_icall directly, due to special casing in the runtime. - GetGenericValueImpl (index, out value); - return value; - } - - internal void InternalArray__set_Item (int index, T item) - { - if ((uint)index >= (uint)Length) - ThrowHelper.ThrowArgumentOutOfRange_IndexException(); - - if (this is object[] oarray) { - oarray! [index] = (object)item; - return; - } - - // Do not change this to call SetGenericValue_icall directly, due to special casing in the runtime. - SetGenericValueImpl (index, ref item); - } - } + public partial class Array + { + [StructLayout(LayoutKind.Sequential)] + private class RawData + { + public IntPtr Bounds; + public IntPtr Count; + public byte Data; + } + + public int Length + { + [Intrinsic] + get => Length; + } + + public long LongLength + { + get + { + long length = GetLength(0); + + for (int i = 1; i < Rank; i++) + { + length *= GetLength(i); + } + return length; + } + } + + public int Rank + { + [Intrinsic] + get => Rank; + } + + public static unsafe void Clear(Array array, int index, int length) + { + if (array == null) + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array); + + int lowerBound = array.GetLowerBound(0); + int elementSize = array.GetElementSize(); + nuint numComponents = (nuint)Unsafe.As(array).Count; + + int offset = index - lowerBound; + + if (index < lowerBound || offset < 0 || length < 0 || (uint)(offset + length) > numComponents) + ThrowHelper.ThrowIndexOutOfRangeException(); + + ref byte ptr = ref Unsafe.AddByteOffset(ref array.GetRawSzArrayData(), (uint)offset * (nuint)elementSize); + nuint byteLength = (uint)length * (nuint)elementSize; + + if (RuntimeHelpers.ObjectHasReferences(array)) + SpanHelpers.ClearWithReferences(ref Unsafe.As(ref ptr), byteLength / (uint)sizeof(IntPtr)); + else + SpanHelpers.ClearWithoutReferences(ref ptr, byteLength); + } + + public static void ConstrainedCopy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length) + { + Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length, true); + } + + public static void Copy(Array sourceArray, Array destinationArray, int length) + { + if (sourceArray == null) + throw new ArgumentNullException(nameof(sourceArray)); + + if (destinationArray == null) + throw new ArgumentNullException(nameof(destinationArray)); + + Copy(sourceArray, sourceArray.GetLowerBound(0), destinationArray, + destinationArray.GetLowerBound(0), length); + } + + public static void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length) + { + Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length, false); + } + + private static void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable) + { + if (sourceArray == null) + throw new ArgumentNullException(nameof(sourceArray)); + + if (destinationArray == null) + throw new ArgumentNullException(nameof(destinationArray)); + + if (length < 0) + throw new ArgumentOutOfRangeException(nameof(length), "Value has to be >= 0."); + + if (sourceArray.Rank != destinationArray.Rank) + throw new RankException(SR.Rank_MultiDimNotSupported); + + if (sourceIndex < 0) + throw new ArgumentOutOfRangeException(nameof(sourceIndex), "Value has to be >= 0."); + + if (destinationIndex < 0) + throw new ArgumentOutOfRangeException(nameof(destinationIndex), "Value has to be >= 0."); + + if (FastCopy(sourceArray, sourceIndex, destinationArray, destinationIndex, length)) + return; + + int source_pos = sourceIndex - sourceArray.GetLowerBound(0); + int dest_pos = destinationIndex - destinationArray.GetLowerBound(0); + + if (source_pos < 0) + throw new ArgumentOutOfRangeException(nameof(sourceIndex), "Index was less than the array's lower bound in the first dimension."); + + if (dest_pos < 0) + throw new ArgumentOutOfRangeException(nameof(destinationIndex), "Index was less than the array's lower bound in the first dimension."); + + // re-ordered to avoid possible integer overflow + if (source_pos > sourceArray.Length - length) + throw new ArgumentException(SR.Arg_LongerThanSrcArray, nameof(sourceArray)); + + if (dest_pos > destinationArray.Length - length) + { + throw new ArgumentException("Destination array was not long enough. Check destIndex and length, and the array's lower bounds", nameof(destinationArray)); + } + + Type src_type = sourceArray.GetType().GetElementType()!; + Type dst_type = destinationArray.GetType().GetElementType()!; + var dst_type_vt = dst_type.IsValueType && Nullable.GetUnderlyingType(dst_type) == null; + + bool src_is_enum = src_type.IsEnum; + bool dst_is_enum = dst_type.IsEnum; + + if (src_is_enum) + src_type = Enum.GetUnderlyingType(src_type); + if (dst_is_enum) + dst_type = Enum.GetUnderlyingType(dst_type); + + if (reliable) + { + if (!dst_type.Equals(src_type) && + !(dst_type.IsPrimitive && src_type.IsPrimitive && CanChangePrimitive(ref dst_type, ref src_type, true))) + { + throw new ArrayTypeMismatchException(SR.ArrayTypeMismatch_CantAssignType); + } + } + else + { + if (!CanAssignArrayElement(src_type, dst_type)) + { + throw new ArrayTypeMismatchException(SR.ArrayTypeMismatch_CantAssignType); + } + } + + if (!ReferenceEquals(sourceArray, destinationArray) || source_pos > dest_pos) + { + for (int i = 0; i < length; i++) + { + object srcval = sourceArray.GetValueImpl(source_pos + i); + + if (!src_type.IsValueType && dst_is_enum) + throw new InvalidCastException(SR.InvalidCast_DownCastArrayElement); + + if (dst_type_vt && (srcval == null || (src_type == typeof(object) && srcval.GetType() != dst_type))) + throw new InvalidCastException(); + + try + { + destinationArray.SetValueRelaxedImpl(srcval, dest_pos + i); + } + catch (ArgumentException) + { + throw CreateArrayTypeMismatchException(); + } + } + } + else + { + for (int i = length - 1; i >= 0; i--) + { + object srcval = sourceArray.GetValueImpl(source_pos + i); + + try + { + destinationArray.SetValueRelaxedImpl(srcval, dest_pos + i); + } + catch (ArgumentException) + { + throw CreateArrayTypeMismatchException(); + } + } + } + } + + private static ArrayTypeMismatchException CreateArrayTypeMismatchException() + { + return new ArrayTypeMismatchException(); + } + + private static bool CanAssignArrayElement(Type source, Type target) + { + if (!target.IsValueType && !target.IsPointer) + { + if (!source.IsValueType && !source.IsPointer) + { + // Reference to reference copy + return + source.IsInterface || target.IsInterface || + source.IsAssignableFrom(target) || target.IsAssignableFrom(source); + } + else + { + // Value to reference copy + if (source.IsPointer) + return false; + return target.IsAssignableFrom(source); + } + } + else + { + if (source.IsEquivalentTo(target)) + { + return true; + } + else if (source.IsPointer && target.IsPointer) + { + return true; + } + else if (source.IsPrimitive && target.IsPrimitive) + { + + // Allow primitive type widening + return CanChangePrimitive(ref source, ref target, false); + } + else if (!source.IsValueType && !source.IsPointer) + { + // Source is base class or interface of destination type + if (target.IsPointer) + return false; + return source.IsAssignableFrom(target); + } + } + + return false; + } + + public static unsafe Array CreateInstance(Type elementType, int length) + { + if (elementType is null) + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.elementType); + if (length < 0) + ThrowHelper.ThrowLengthArgumentOutOfRange_ArgumentOutOfRange_NeedNonNegNum(); + + RuntimeType? runtimeType = elementType.UnderlyingSystemType as RuntimeType; + if (runtimeType == null) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_MustBeType, ExceptionArgument.elementType); + + Array array = null; + InternalCreate(ref array, runtimeType._impl.Value, 1, &length, null); + GC.KeepAlive(runtimeType); + return array; + } + + public static unsafe Array CreateInstance(Type elementType, int length1, int length2) + { + if (elementType is null) + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.elementType); + if (length1 < 0) + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.length1, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); + if (length2 < 0) + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.length2, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); + + RuntimeType? runtimeType = elementType.UnderlyingSystemType as RuntimeType; + if (runtimeType == null) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_MustBeType, ExceptionArgument.elementType); + + int* lengths = stackalloc int[] { length1, length2 }; + Array array = null; + InternalCreate(ref array, runtimeType._impl.Value, 2, lengths, null); + GC.KeepAlive(runtimeType); + return array; + } + + public static unsafe Array CreateInstance(Type elementType, int length1, int length2, int length3) + { + if (elementType is null) + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.elementType); + if (length1 < 0) + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.length1, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); + if (length2 < 0) + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.length2, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); + if (length3 < 0) + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.length3, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); + + RuntimeType? runtimeType = elementType.UnderlyingSystemType as RuntimeType; + if (runtimeType == null) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_MustBeType, ExceptionArgument.elementType); + + int* lengths = stackalloc int[] { length1, length2, length3 }; + Array array = null; + InternalCreate(ref array, runtimeType._impl.Value, 3, lengths, null); + GC.KeepAlive(runtimeType); + return array; + } + + public static unsafe Array CreateInstance(Type elementType, params int[] lengths) + { + if (elementType is null) + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.elementType); + if (lengths == null) + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.lengths); + if (lengths.Length == 0) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_NeedAtLeast1Rank); + + RuntimeType? runtimeType = elementType.UnderlyingSystemType as RuntimeType; + if (runtimeType == null) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_MustBeType, ExceptionArgument.elementType); + + for (int i = 0; i < lengths.Length; i++) + if (lengths[i] < 0) + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.lengths, i, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); + + Array array = null; + fixed (int* pLengths = &lengths[0]) + InternalCreate(ref array, runtimeType._impl.Value, lengths.Length, pLengths, null); + GC.KeepAlive(runtimeType); + return array; + } + + public static unsafe Array CreateInstance(Type elementType, int[] lengths, int[] lowerBounds) + { + if (elementType == null) + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.elementType); + if (lengths == null) + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.lengths); + if (lowerBounds == null) + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.lowerBounds); + if (lengths.Length != lowerBounds!.Length) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_RanksAndBounds); + if (lengths.Length == 0) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_NeedAtLeast1Rank); + + for (int i = 0; i < lengths.Length; i++) + if (lengths[i] < 0) + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.lengths, i, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); + + RuntimeType? runtimeType = elementType.UnderlyingSystemType as RuntimeType; + if (runtimeType == null) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_MustBeType, ExceptionArgument.elementType); + + Array array = null; + fixed (int* pLengths = &lengths[0]) + fixed (int* pLowerBounds = &lowerBounds[0]) + InternalCreate(ref array, runtimeType._impl.Value, lengths.Length, pLengths, pLowerBounds); + GC.KeepAlive(runtimeType); + return array; + } + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern unsafe void InternalCreate(ref Array result, IntPtr elementType, int rank, int* lengths, int* lowerBounds); + + public object GetValue(int index) + { + if (Rank != 1) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_Need1DArray); + + var lb = GetLowerBound(0); + if (index < lb || index > GetUpperBound(0)) + throw new IndexOutOfRangeException("Index has to be between upper and lower bound of the array."); + + if (GetType().GetElementType()!.IsPointer) + throw new NotSupportedException(SR.NotSupported_Type); + + return GetValueImpl(index - lb); + } + + public object GetValue(int index1, int index2) + { + if (Rank != 2) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_Need2DArray); + + int[] ind = { index1, index2 }; + return GetValue(ind); + } + + public object GetValue(int index1, int index2, int index3) + { + if (Rank != 3) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_Need3DArray); + + int[] ind = { index1, index2, index3 }; + return GetValue(ind); + } + + public void Initialize() + { + } + + private static int IndexOfImpl(T[] array, T value, int startIndex, int count) + { + return EqualityComparer.Default.IndexOf(array, value, startIndex, count); + } + + private static int LastIndexOfImpl(T[] array, T value, int startIndex, int count) + { + return EqualityComparer.Default.LastIndexOf(array, value, startIndex, count); + } + + public void SetValue(object? value, int index) + { + if (Rank != 1) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_Need1DArray); + + var lb = GetLowerBound(0); + if (index < lb || index > GetUpperBound(0)) + throw new IndexOutOfRangeException("Index has to be >= lower bound and <= upper bound of the array."); + + if (GetType().GetElementType()!.IsPointer) + throw new NotSupportedException(SR.NotSupported_Type); + + SetValueImpl(value, index - lb); + } + + public void SetValue(object? value, int index1, int index2) + { + if (Rank != 2) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_Need2DArray); + + int[] ind = { index1, index2 }; + SetValue(value, ind); + } + + public void SetValue(object? value, int index1, int index2, int index3) + { + if (Rank != 3) + ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_Need3DArray); + + int[] ind = { index1, index2, index3 }; + SetValue(value, ind); + } + + public int GetUpperBound(int dimension) + { + return GetLowerBound(dimension) + GetLength(dimension) - 1; + } + + [Intrinsic] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal ref byte GetRawSzArrayData() + { + // TODO: Missing intrinsic in interpreter + return ref Unsafe.As(this).Data; + } + + [Intrinsic] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal ref byte GetRawArrayData() + { + // TODO: Missing intrinsic in interpreter + return ref Unsafe.As(this).Data; + } + + [Intrinsic] + internal int GetElementSize() => GetElementSize(); + + [Intrinsic] + internal bool IsPrimitive() => IsPrimitive(); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal extern CorElementType GetCorElementTypeOfElementType(); + + [MethodImpl(MethodImplOptions.InternalCall)] + private extern bool IsValueOfElementType(object value); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool CanChangePrimitive(ref Type srcType, ref Type dstType, bool reliable); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern bool FastCopy(Array source, int source_idx, Array dest, int dest_idx, int length); + + [Intrinsic] // when dimension is `0` constant + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public extern int GetLength(int dimension); + + [Intrinsic] // when dimension is `0` constant + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public extern int GetLowerBound(int dimension); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public extern object GetValue(params int[] indices); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public extern void SetValue(object? value, params int[] indices); + + // CAUTION! No bounds checking! + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void GetGenericValue_icall(ref Array self, int pos, out T value); + + // CAUTION! No bounds checking! + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern object GetValueImpl(int pos); + + // CAUTION! No bounds checking! + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void SetGenericValue_icall(ref Array self, int pos, ref T value); + + [Intrinsic] + private void GetGenericValueImpl(int pos, out T value) + { + var self = this; + GetGenericValue_icall(ref self, pos, out value); + } + + [Intrinsic] + private void SetGenericValueImpl(int pos, ref T value) + { + var self = this; + SetGenericValue_icall(ref self, pos, ref value); + } + + // CAUTION! No bounds checking! + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern void SetValueImpl(object? value, int pos); + + // CAUTION! No bounds checking! + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern void SetValueRelaxedImpl(object? value, int pos); + + /* + * These methods are used to implement the implicit generic interfaces + * implemented by arrays in NET 2.0. + * Only make those methods generic which really need it, to avoid + * creating useless instantiations. + */ + internal int InternalArray__ICollection_get_Count() + { + return Length; + } + + internal bool InternalArray__ICollection_get_IsReadOnly() + { + return true; + } + + internal IEnumerator InternalArray__IEnumerable_GetEnumerator() + { + return Length == 0 ? SZGenericArrayEnumerator.Empty : new SZGenericArrayEnumerator(Unsafe.As(this)); + } + + internal void InternalArray__ICollection_Clear() + { + ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection); + } + + internal void InternalArray__ICollection_Add(T item) + { + ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_FixedSizeCollection); + } + + internal bool InternalArray__ICollection_Remove(T item) + { + ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_FixedSizeCollection); + return default; + } + + internal bool InternalArray__ICollection_Contains(T item) + { + return IndexOf((T[])this, item, 0, Length) >= 0; + } + + internal void InternalArray__ICollection_CopyTo(T[] array, int arrayIndex) + { + Copy(this, GetLowerBound(0), array, arrayIndex, Length); + } + + internal T InternalArray__IReadOnlyList_get_Item(int index) + { + if ((uint)index >= (uint)Length) + ThrowHelper.ThrowArgumentOutOfRange_IndexException(); + + T value; + // Do not change this to call GetGenericValue_icall directly, due to special casing in the runtime. + GetGenericValueImpl(index, out value); + return value; + } + + internal int InternalArray__IReadOnlyCollection_get_Count() + { + return Length; + } + + internal void InternalArray__Insert(int index, T item) + { + ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_FixedSizeCollection); + } + + internal void InternalArray__RemoveAt(int index) + { + ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_FixedSizeCollection); + } + + internal int InternalArray__IndexOf(T item) + { + return IndexOf((T[])this, item, 0, Length); + } + + internal T InternalArray__get_Item(int index) + { + if ((uint)index >= (uint)Length) + ThrowHelper.ThrowArgumentOutOfRange_IndexException(); + + T value; + // Do not change this to call GetGenericValue_icall directly, due to special casing in the runtime. + GetGenericValueImpl(index, out value); + return value; + } + + internal void InternalArray__set_Item(int index, T item) + { + if ((uint)index >= (uint)Length) + ThrowHelper.ThrowArgumentOutOfRange_IndexException(); + + if (this is object[] oarray) + { + oarray![index] = (object)item; + return; + } + + // Do not change this to call SetGenericValue_icall directly, due to special casing in the runtime. + SetGenericValueImpl(index, ref item); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Attribute.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Attribute.Mono.cs index 3a67f4d1b927e..4fe6b1181ac10 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Attribute.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Attribute.Mono.cs @@ -7,56 +7,56 @@ namespace System { - partial class Attribute - { - static Attribute? GetAttr (ICustomAttributeProvider element, Type attributeType, bool inherit) - { - if (attributeType == null) - throw new ArgumentNullException (nameof (attributeType)); - if (!attributeType.IsSubclassOf (typeof (Attribute)) && attributeType != typeof (Attribute) && attributeType != typeof (CustomAttribute)) - throw new ArgumentException (SR.Argument_MustHaveAttributeBaseClass + " " + attributeType.FullName); + public partial class Attribute + { + private static Attribute? GetAttr(ICustomAttributeProvider element, Type attributeType, bool inherit) + { + if (attributeType == null) + throw new ArgumentNullException(nameof(attributeType)); + if (!attributeType.IsSubclassOf(typeof(Attribute)) && attributeType != typeof(Attribute) && attributeType != typeof(CustomAttribute)) + throw new ArgumentException(SR.Argument_MustHaveAttributeBaseClass + " " + attributeType.FullName); - var attrs = CustomAttribute.GetCustomAttributes (element, attributeType, inherit); - if (attrs == null || attrs.Length == 0) - return null; - if (attrs.Length != 1) - throw new AmbiguousMatchException (); - return (Attribute)(attrs [0]); - } + var attrs = CustomAttribute.GetCustomAttributes(element, attributeType, inherit); + if (attrs == null || attrs.Length == 0) + return null; + if (attrs.Length != 1) + throw new AmbiguousMatchException(); + return (Attribute)(attrs[0]); + } - public static Attribute GetCustomAttribute (Assembly element, Type attributeType) => GetAttr (element, attributeType, true); - public static Attribute GetCustomAttribute(Assembly element, Type attributeType, bool inherit) => GetAttr (element, attributeType, inherit); - public static Attribute GetCustomAttribute(MemberInfo element, Type attributeType) => GetAttr (element, attributeType, true); - public static Attribute GetCustomAttribute(MemberInfo element, Type attributeType, bool inherit) => GetAttr (element, attributeType, inherit); - public static Attribute GetCustomAttribute(Module element, Type attributeType) => GetAttr (element, attributeType, true); - public static Attribute GetCustomAttribute(Module element, Type attributeType, bool inherit) => GetAttr (element, attributeType, inherit); - public static Attribute GetCustomAttribute(ParameterInfo element, Type attributeType) => GetAttr (element, attributeType, true); - public static Attribute GetCustomAttribute(ParameterInfo element, Type attributeType, bool inherit) => GetAttr (element, attributeType, inherit); + public static Attribute GetCustomAttribute(Assembly element, Type attributeType) => GetAttr(element, attributeType, true); + public static Attribute GetCustomAttribute(Assembly element, Type attributeType, bool inherit) => GetAttr(element, attributeType, inherit); + public static Attribute GetCustomAttribute(MemberInfo element, Type attributeType) => GetAttr(element, attributeType, true); + public static Attribute GetCustomAttribute(MemberInfo element, Type attributeType, bool inherit) => GetAttr(element, attributeType, inherit); + public static Attribute GetCustomAttribute(Module element, Type attributeType) => GetAttr(element, attributeType, true); + public static Attribute GetCustomAttribute(Module element, Type attributeType, bool inherit) => GetAttr(element, attributeType, inherit); + public static Attribute GetCustomAttribute(ParameterInfo element, Type attributeType) => GetAttr(element, attributeType, true); + public static Attribute GetCustomAttribute(ParameterInfo element, Type attributeType, bool inherit) => GetAttr(element, attributeType, inherit); - public static Attribute[] GetCustomAttributes (Assembly element) => (Attribute[])CustomAttribute.GetCustomAttributes (element, true); - public static Attribute[] GetCustomAttributes (Assembly element, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes (element, inherit); - public static Attribute[] GetCustomAttributes (Assembly element, Type attributeType) => (Attribute[])CustomAttribute.GetCustomAttributes ((ICustomAttributeProvider)element, attributeType, true); - public static Attribute[] GetCustomAttributes (Assembly element, Type attributeType, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes ((ICustomAttributeProvider)element, attributeType, inherit); - public static Attribute[] GetCustomAttributes (MemberInfo element) => (Attribute[])CustomAttribute.GetCustomAttributes (element, true); - public static Attribute[] GetCustomAttributes (MemberInfo element, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes (element, inherit); - public static Attribute[] GetCustomAttributes (MemberInfo element, Type attributeType) => (Attribute[])CustomAttribute.GetCustomAttributes ((ICustomAttributeProvider)element, attributeType, true); - public static Attribute[] GetCustomAttributes (MemberInfo element, Type attributeType, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes ((ICustomAttributeProvider)element, attributeType, inherit); - public static Attribute[] GetCustomAttributes (Module element) => (Attribute[])CustomAttribute.GetCustomAttributes (element, true); - public static Attribute[] GetCustomAttributes (Module element, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes (element, inherit); - public static Attribute[] GetCustomAttributes (Module element, Type attributeType) => (Attribute[])CustomAttribute.GetCustomAttributes ((ICustomAttributeProvider)element, attributeType, true); - public static Attribute[] GetCustomAttributes (Module element, Type attributeType, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes ((ICustomAttributeProvider)element, attributeType, inherit); - public static Attribute[] GetCustomAttributes (ParameterInfo element) => (Attribute[])CustomAttribute.GetCustomAttributes (element, true); - public static Attribute[] GetCustomAttributes (ParameterInfo element, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes (element, inherit); - public static Attribute[] GetCustomAttributes (ParameterInfo element, Type attributeType) => (Attribute[])CustomAttribute.GetCustomAttributes ((ICustomAttributeProvider)element, attributeType, true); - public static Attribute[] GetCustomAttributes (ParameterInfo element, Type attributeType, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes ((ICustomAttributeProvider)element, attributeType, inherit); + public static Attribute[] GetCustomAttributes(Assembly element) => (Attribute[])CustomAttribute.GetCustomAttributes(element, true); + public static Attribute[] GetCustomAttributes(Assembly element, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes(element, inherit); + public static Attribute[] GetCustomAttributes(Assembly element, Type attributeType) => (Attribute[])CustomAttribute.GetCustomAttributes((ICustomAttributeProvider)element, attributeType, true); + public static Attribute[] GetCustomAttributes(Assembly element, Type attributeType, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes((ICustomAttributeProvider)element, attributeType, inherit); + public static Attribute[] GetCustomAttributes(MemberInfo element) => (Attribute[])CustomAttribute.GetCustomAttributes(element, true); + public static Attribute[] GetCustomAttributes(MemberInfo element, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes(element, inherit); + public static Attribute[] GetCustomAttributes(MemberInfo element, Type attributeType) => (Attribute[])CustomAttribute.GetCustomAttributes((ICustomAttributeProvider)element, attributeType, true); + public static Attribute[] GetCustomAttributes(MemberInfo element, Type attributeType, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes((ICustomAttributeProvider)element, attributeType, inherit); + public static Attribute[] GetCustomAttributes(Module element) => (Attribute[])CustomAttribute.GetCustomAttributes(element, true); + public static Attribute[] GetCustomAttributes(Module element, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes(element, inherit); + public static Attribute[] GetCustomAttributes(Module element, Type attributeType) => (Attribute[])CustomAttribute.GetCustomAttributes((ICustomAttributeProvider)element, attributeType, true); + public static Attribute[] GetCustomAttributes(Module element, Type attributeType, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes((ICustomAttributeProvider)element, attributeType, inherit); + public static Attribute[] GetCustomAttributes(ParameterInfo element) => (Attribute[])CustomAttribute.GetCustomAttributes(element, true); + public static Attribute[] GetCustomAttributes(ParameterInfo element, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes(element, inherit); + public static Attribute[] GetCustomAttributes(ParameterInfo element, Type attributeType) => (Attribute[])CustomAttribute.GetCustomAttributes((ICustomAttributeProvider)element, attributeType, true); + public static Attribute[] GetCustomAttributes(ParameterInfo element, Type attributeType, bool inherit) => (Attribute[])CustomAttribute.GetCustomAttributes((ICustomAttributeProvider)element, attributeType, inherit); - public static bool IsDefined (Assembly element, Type attributeType) => CustomAttribute.IsDefined ((ICustomAttributeProvider)element, attributeType, true); - public static bool IsDefined (Assembly element, Type attributeType, bool inherit) => CustomAttribute.IsDefined ((ICustomAttributeProvider)element, attributeType, inherit); - public static bool IsDefined (MemberInfo element, Type attributeType) => CustomAttribute.IsDefined ((ICustomAttributeProvider)element, attributeType, true); - public static bool IsDefined (MemberInfo element, Type attributeType, bool inherit) => CustomAttribute.IsDefined ((ICustomAttributeProvider)element, attributeType, inherit); - public static bool IsDefined (Module element, Type attributeType) => CustomAttribute.IsDefined ((ICustomAttributeProvider)element, attributeType, true); - public static bool IsDefined (Module element, Type attributeType, bool inherit) => CustomAttribute.IsDefined ((ICustomAttributeProvider)element, attributeType, inherit); - public static bool IsDefined (ParameterInfo element, Type attributeType) => CustomAttribute.IsDefined ((ICustomAttributeProvider)element, attributeType, true); - public static bool IsDefined (ParameterInfo element, Type attributeType, bool inherit) => CustomAttribute.IsDefined ((ICustomAttributeProvider)element, attributeType, inherit); - } + public static bool IsDefined(Assembly element, Type attributeType) => CustomAttribute.IsDefined((ICustomAttributeProvider)element, attributeType, true); + public static bool IsDefined(Assembly element, Type attributeType, bool inherit) => CustomAttribute.IsDefined((ICustomAttributeProvider)element, attributeType, inherit); + public static bool IsDefined(MemberInfo element, Type attributeType) => CustomAttribute.IsDefined((ICustomAttributeProvider)element, attributeType, true); + public static bool IsDefined(MemberInfo element, Type attributeType, bool inherit) => CustomAttribute.IsDefined((ICustomAttributeProvider)element, attributeType, inherit); + public static bool IsDefined(Module element, Type attributeType) => CustomAttribute.IsDefined((ICustomAttributeProvider)element, attributeType, true); + public static bool IsDefined(Module element, Type attributeType, bool inherit) => CustomAttribute.IsDefined((ICustomAttributeProvider)element, attributeType, inherit); + public static bool IsDefined(ParameterInfo element, Type attributeType) => CustomAttribute.IsDefined((ICustomAttributeProvider)element, attributeType, true); + public static bool IsDefined(ParameterInfo element, Type attributeType, bool inherit) => CustomAttribute.IsDefined((ICustomAttributeProvider)element, attributeType, inherit); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Buffer.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Buffer.Mono.cs index c6de61399162f..b4772965b6ad3 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Buffer.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Buffer.Mono.cs @@ -4,6 +4,7 @@ using System.Runtime.CompilerServices; +#pragma warning disable SA1121 // explicitly using type aliases instead of built-in types #if TARGET_64BIT using nuint = System.UInt64; #else @@ -12,25 +13,26 @@ namespace System { - partial class Buffer - { - internal static unsafe void Memcpy (byte* dest, byte* src, int len) => Memmove (dest, src, (nuint) len); + public partial class Buffer + { + internal static unsafe void Memcpy(byte* dest, byte* src, int len) => Memmove(dest, src, (nuint)len); - [MethodImpl (MethodImplOptions.InternalCall)] - static extern unsafe void __Memmove (byte* dest, byte* src, nuint len); + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern unsafe void __Memmove(byte* dest, byte* src, nuint len); - [MethodImpl (MethodImplOptions.InternalCall)] - static extern void BulkMoveWithWriteBarrier (ref byte dmem, ref byte smem, nuint size); + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern void BulkMoveWithWriteBarrier(ref byte dmem, ref byte smem, nuint size); - [MethodImpl(MethodImplOptions.NoInlining)] - internal static unsafe void _ZeroMemory(ref byte b, nuint byteLength) - { - fixed (byte* bytePointer = &b) { - __ZeroMemory (bytePointer, byteLength); - } - } - - [MethodImpl (MethodImplOptions.InternalCall)] - static extern unsafe void __ZeroMemory (void* p, nuint byteLength); - } + [MethodImpl(MethodImplOptions.NoInlining)] + internal static unsafe void _ZeroMemory(ref byte b, nuint byteLength) + { + fixed (byte* bytePointer = &b) + { + __ZeroMemory(bytePointer, byteLength); + } + } + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern unsafe void __ZeroMemory(void* p, nuint byteLength); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/ArraySortHelper.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/ArraySortHelper.Mono.cs index 238b880dcc501..dfd45f961d45c 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/ArraySortHelper.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/ArraySortHelper.Mono.cs @@ -4,13 +4,13 @@ namespace System.Collections.Generic { - partial class ArraySortHelper - { - public static ArraySortHelper Default { get; } = new ArraySortHelper(); - } + internal partial class ArraySortHelper + { + public static ArraySortHelper Default { get; } = new ArraySortHelper(); + } - partial class ArraySortHelper - { - public static ArraySortHelper Default { get; } = new ArraySortHelper(); - } + internal partial class ArraySortHelper + { + public static ArraySortHelper Default { get; } = new ArraySortHelper(); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/Comparer.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/Comparer.Mono.cs index c9f61ff528dc5..14dddda60fc8a 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/Comparer.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/Comparer.Mono.cs @@ -7,46 +7,51 @@ namespace System.Collections.Generic { - partial class Comparer - { - static volatile Comparer defaultComparer; - - public static Comparer Default { - get { - Comparer comparer = defaultComparer; - if (comparer == null) { - // Do not use static constructor. Generic static constructors are problematic for Mono AOT. - Interlocked.CompareExchange(ref defaultComparer, CreateComparer(), null); - comparer = defaultComparer; - } - return comparer; - } - } - - static Comparer CreateComparer() { - RuntimeType t = (RuntimeType)typeof(T); - - if (typeof(IComparable).IsAssignableFrom(t)) - return (Comparer)RuntimeType.CreateInstanceForAnotherGenericParameter (typeof(GenericComparer<>), t); - - // If T is a Nullable where U implements IComparable return a NullableComparer - if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) { - RuntimeType u = (RuntimeType)t.GetGenericArguments()[0]; - if (typeof(IComparable<>).MakeGenericType (u).IsAssignableFrom (u)) - return (Comparer)RuntimeType.CreateInstanceForAnotherGenericParameter (typeof(NullableComparer<>), u); - } - - if (t.IsEnum) - return (Comparer)RuntimeType.CreateInstanceForAnotherGenericParameter (typeof(EnumComparer<>), t); - - // Otherwise return an ObjectComparer - return new ObjectComparer (); - } - } - - partial class EnumComparer - { - [MethodImpl (MethodImplOptions.AggressiveInlining)] - public override int Compare (T x, T y) => JitHelpers.EnumCompareTo (x, y); - } + public partial class Comparer + { + private static volatile Comparer defaultComparer; + + public static Comparer Default + { + get + { + Comparer comparer = defaultComparer; + if (comparer == null) + { + // Do not use static constructor. Generic static constructors are problematic for Mono AOT. + Interlocked.CompareExchange(ref defaultComparer, CreateComparer(), null); + comparer = defaultComparer; + } + return comparer; + } + } + + private static Comparer CreateComparer() + { + RuntimeType t = (RuntimeType)typeof(T); + + if (typeof(IComparable).IsAssignableFrom(t)) + return (Comparer)RuntimeType.CreateInstanceForAnotherGenericParameter(typeof(GenericComparer<>), t); + + // If T is a Nullable where U implements IComparable return a NullableComparer + if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + RuntimeType u = (RuntimeType)t.GetGenericArguments()[0]; + if (typeof(IComparable<>).MakeGenericType(u).IsAssignableFrom(u)) + return (Comparer)RuntimeType.CreateInstanceForAnotherGenericParameter(typeof(NullableComparer<>), u); + } + + if (t.IsEnum) + return (Comparer)RuntimeType.CreateInstanceForAnotherGenericParameter(typeof(EnumComparer<>), t); + + // Otherwise return an ObjectComparer + return new ObjectComparer(); + } + } + + internal partial class EnumComparer + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override int Compare(T x, T y) => JitHelpers.EnumCompareTo(x, y); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/EqualityComparer.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/EqualityComparer.Mono.cs index 18ea29f559843..c4ccb5a70f015 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/EqualityComparer.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Collections/Generic/EqualityComparer.Mono.cs @@ -7,80 +7,90 @@ namespace System.Collections.Generic { - partial class EqualityComparer - { - static volatile EqualityComparer defaultComparer; + public partial class EqualityComparer + { + private static volatile EqualityComparer defaultComparer; - public static EqualityComparer Default { - [MethodImplAttribute (MethodImplOptions.AggressiveInlining)] - get { - EqualityComparer comparer = defaultComparer; - if (comparer == null) { - // Do not use static constructor. Generic static constructors are problematic for Mono AOT. - Interlocked.CompareExchange(ref defaultComparer, CreateComparer(), null); - comparer = defaultComparer; - } - return comparer; - } - } + public static EqualityComparer Default + { + [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] + get + { + EqualityComparer comparer = defaultComparer; + if (comparer == null) + { + // Do not use static constructor. Generic static constructors are problematic for Mono AOT. + Interlocked.CompareExchange(ref defaultComparer, CreateComparer(), null); + comparer = defaultComparer; + } + return comparer; + } + } - static EqualityComparer CreateComparer () - { - RuntimeType t = (RuntimeType)typeof(T); + private static EqualityComparer CreateComparer() + { + RuntimeType t = (RuntimeType)typeof(T); - ///////////////////////////////////////////////// - // KEEP THIS IN SYNC WITH THE DEVIRT CODE - // IN METHOD-TO-IR.C - ///////////////////////////////////////////////// + ///////////////////////////////////////////////// + // KEEP THIS IN SYNC WITH THE DEVIRT CODE + // IN METHOD-TO-IR.C + ///////////////////////////////////////////////// - if (t == typeof(byte)) { - return (EqualityComparer)(object)(new ByteEqualityComparer()); - } + if (t == typeof(byte)) + { + return (EqualityComparer)(object)(new ByteEqualityComparer()); + } - if (typeof(IEquatable).IsAssignableFrom(t)) { - return (EqualityComparer)RuntimeType.CreateInstanceForAnotherGenericParameter (typeof(GenericEqualityComparer<>), t); - } + if (typeof(IEquatable).IsAssignableFrom(t)) + { + return (EqualityComparer)RuntimeType.CreateInstanceForAnotherGenericParameter(typeof(GenericEqualityComparer<>), t); + } - if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) { - RuntimeType u = (RuntimeType)t.GetGenericArguments()[0]; - if (typeof(IEquatable<>).MakeGenericType(u).IsAssignableFrom(u)) { - return (EqualityComparer)RuntimeType.CreateInstanceForAnotherGenericParameter (typeof(NullableEqualityComparer<>), u); - } - } + if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + RuntimeType u = (RuntimeType)t.GetGenericArguments()[0]; + if (typeof(IEquatable<>).MakeGenericType(u).IsAssignableFrom(u)) + { + return (EqualityComparer)RuntimeType.CreateInstanceForAnotherGenericParameter(typeof(NullableEqualityComparer<>), u); + } + } - if (t.IsEnum) { - return (EqualityComparer)RuntimeType.CreateInstanceForAnotherGenericParameter (typeof(EnumEqualityComparer<>), t); - } - - return new ObjectEqualityComparer(); - } + if (t.IsEnum) + { + return (EqualityComparer)RuntimeType.CreateInstanceForAnotherGenericParameter(typeof(EnumEqualityComparer<>), t); + } - // MONOTODO: Add specialized versions - internal virtual int IndexOf (T[] array, T value, int startIndex, int count) - { - int endIndex = startIndex + count; - for (int i = startIndex; i < endIndex; i++) { - if (Equals (array[i], value)) - return i; - } - return -1; - } + return new ObjectEqualityComparer(); + } - internal virtual int LastIndexOf (T[] array, T value, int startIndex, int count) - { - int endIndex = startIndex - count + 1; - for (int i = startIndex; i >= endIndex; i--) { - if (Equals (array[i], value)) - return i; - } - return -1; - } + // MONOTODO: Add specialized versions + internal virtual int IndexOf(T[] array, T value, int startIndex, int count) + { + int endIndex = startIndex + count; + for (int i = startIndex; i < endIndex; i++) + { + if (Equals(array[i], value)) + return i; + } + return -1; + } - } + internal virtual int LastIndexOf(T[] array, T value, int startIndex, int count) + { + int endIndex = startIndex - count + 1; + for (int i = startIndex; i >= endIndex; i--) + { + if (Equals(array[i], value)) + return i; + } + return -1; + } - partial class EnumEqualityComparer - { - [MethodImpl (MethodImplOptions.AggressiveInlining)] - public override bool Equals (T x, T y) => JitHelpers.EnumEquals (x, y); - } + } + + public partial class EnumEqualityComparer + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override bool Equals(T x, T y) => JitHelpers.EnumEquals(x, y); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Delegate.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Delegate.Mono.cs index 09fec9904ae42..13500a5594d99 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Delegate.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Delegate.Mono.cs @@ -16,10 +16,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -36,490 +36,546 @@ namespace System { - /* Contains the rarely used fields of Delegate */ - sealed class DelegateData - { - public Type? target_type; - public string? method_name; - public bool curried_first_arg; - } - - [StructLayout (LayoutKind.Sequential)] - partial class Delegate - { - #region Sync with object-internals.h - IntPtr method_ptr; - IntPtr invoke_impl; - object? _target; - IntPtr method; - IntPtr delegate_trampoline; - IntPtr extra_arg; - IntPtr method_code; - IntPtr interp_method; - IntPtr interp_invoke_impl; - MethodInfo? method_info; - - // Keep a ref of the MethodInfo passed to CreateDelegate. - // Used to keep DynamicMethods alive. - MethodInfo? original_method_info; - - DelegateData data; - - bool method_is_virtual; - #endregion - - protected Delegate (object target, string method) - { - if (target is null) - throw new ArgumentNullException (nameof (target)); - - if (method is null) - throw new ArgumentNullException (nameof (method)); - - this._target = target; - this.data = new DelegateData () { - method_name = method - }; - } - - protected Delegate (Type target, string method) - { - if (target is null) - throw new ArgumentNullException (nameof (target)); - - if (target.ContainsGenericParameters) - throw new ArgumentException (SR.Arg_UnboundGenParam, nameof (target)); - - if (method is null) - throw new ArgumentNullException (nameof (method)); - - if (!target.IsRuntimeImplemented ()) - throw new ArgumentException (SR.Argument_MustBeRuntimeType, nameof (target)); - - this.data = new DelegateData () { - method_name = method, - target_type = target - }; - } - - public object? Target => GetTarget (); - - internal virtual object? GetTarget () => _target; - - public static Delegate CreateDelegate (Type type, object? firstArgument, MethodInfo method, bool throwOnBindFailure) - { - return CreateDelegate (type, firstArgument, method, throwOnBindFailure, true)!; - } - - public static Delegate? CreateDelegate (Type type, MethodInfo method, bool throwOnBindFailure) - { - return CreateDelegate (type, null, method, throwOnBindFailure, false); - } - - static Delegate? CreateDelegate (Type type, object? firstArgument, MethodInfo method, bool throwOnBindFailure, bool allowClosed) - { - if (type is null) - throw new ArgumentNullException (nameof (type)); - if (method is null) - throw new ArgumentNullException (nameof (method)); - - if (!(type is RuntimeType rtType)) - throw new ArgumentException (SR.Argument_MustBeRuntimeType, nameof (type)); - if (!(method is RuntimeMethodInfo || method is System.Reflection.Emit.DynamicMethod)) - throw new ArgumentException (SR.Argument_MustBeRuntimeMethodInfo, nameof (method)); - - if (!rtType.IsDelegate ()) - throw new ArgumentException (SR.Arg_MustBeDelegate, nameof (type)); - - if (!IsMatchingCandidate (type, firstArgument, method, allowClosed, out DelegateData? delegate_data)) { - if (throwOnBindFailure) - throw new ArgumentException (SR.Arg_DlgtTargMeth); - - return null; - } - - Delegate? d = CreateDelegate_internal (type, firstArgument, method, throwOnBindFailure); - if (d != null) { - d.original_method_info = method; - d.data = delegate_data!; - } - - return d; - } - - public static Delegate? CreateDelegate (Type type, object target, string method, bool ignoreCase, bool throwOnBindFailure) - { - if (type is null) - throw new ArgumentNullException (nameof (type)); - if (target is null) - throw new ArgumentNullException (nameof (target)); - if (method is null) - throw new ArgumentNullException (nameof (method)); - - if (!(type is RuntimeType rtType)) - throw new ArgumentException (SR.Argument_MustBeRuntimeType, nameof (type)); - if (!rtType.IsDelegate ()) - throw new ArgumentException (SR.Arg_MustBeDelegate, nameof (type)); - - MethodInfo? info = GetCandidateMethod (type, target.GetType (), method, BindingFlags.Instance, ignoreCase); - if (info is null) { - if (throwOnBindFailure) - throw new ArgumentException (SR.Arg_DlgtTargMeth); - - return null; - } - - return CreateDelegate_internal (type, null, info, throwOnBindFailure); - } - - public static Delegate? CreateDelegate (Type type, Type target, string method, bool ignoreCase, bool throwOnBindFailure) - { - if (type is null) - throw new ArgumentNullException (nameof (type)); - if (target is null) - throw new ArgumentNullException (nameof (target)); - if (target.ContainsGenericParameters) - throw new ArgumentException (SR.Arg_UnboundGenParam, nameof (target)); - if (method is null) - throw new ArgumentNullException (nameof (method)); - - if (!(type is RuntimeType rtType)) - throw new ArgumentException (SR.Argument_MustBeRuntimeType, nameof (type)); - - if (!target.IsRuntimeImplemented ()) - throw new ArgumentException (SR.Argument_MustBeRuntimeType, nameof (target)); - if (!rtType.IsDelegate ()) - throw new ArgumentException (SR.Arg_MustBeDelegate, nameof (type)); - - MethodInfo? info = GetCandidateMethod (type, target, method, BindingFlags.Static, ignoreCase); - if (info is null) { - if (throwOnBindFailure) - throw new ArgumentException (SR.Arg_DlgtTargMeth); - - return null; - } - - return CreateDelegate_internal (type, null, info, throwOnBindFailure); - } - - static MethodInfo? GetCandidateMethod (Type type, Type target, string method, BindingFlags bflags, bool ignoreCase) - { - MethodInfo? invoke = type.GetMethod ("Invoke"); - if (invoke is null) - return null; - - ParameterInfo [] delargs = invoke.GetParametersInternal (); - Type[] delargtypes = new Type [delargs.Length]; - - for (int i = 0; i < delargs.Length; i++) - delargtypes [i] = delargs [i].ParameterType; - - /* - * since we need to walk the inheritance chain anyway to - * find private methods, adjust the bindingflags to ignore - * inherited methods - */ - BindingFlags flags = BindingFlags.ExactBinding | - BindingFlags.Public | BindingFlags.NonPublic | - BindingFlags.DeclaredOnly | bflags; - - if (ignoreCase) - flags |= BindingFlags.IgnoreCase; - - for (Type? targetType = target; targetType != null; targetType = targetType.BaseType) { - MethodInfo? mi = targetType.GetMethod (method, flags, null, delargtypes, Array.Empty()); - - if (mi != null && IsReturnTypeMatch (invoke.ReturnType!, mi.ReturnType!)) { - return mi; - } - } - - return null; - } - - static bool IsMatchingCandidate (Type type, object? target, MethodInfo method, bool allowClosed, out DelegateData? delegateData) - { - MethodInfo? invoke = type.GetMethod ("Invoke"); - - if (invoke == null || !IsReturnTypeMatch (invoke.ReturnType!, method.ReturnType!)) { - delegateData = null; - return false; - } - - ParameterInfo[] delargs = invoke.GetParametersInternal (); - ParameterInfo[] args = method.GetParametersInternal (); - - bool argLengthMatch; - - if (target != null) { - // delegate closed over target - if (!method.IsStatic) - // target is passed as this - argLengthMatch = (args.Length == delargs.Length); - else - // target is passed as the first argument to the static method - argLengthMatch = (args.Length == delargs.Length + 1); - } else { - if (!method.IsStatic) { - // - // Net 2.0 feature. The first argument of the delegate is passed - // as the 'this' argument to the method. - // - argLengthMatch = (args.Length + 1 == delargs.Length); - - if (!argLengthMatch) - // closed over a null reference - argLengthMatch = (args.Length == delargs.Length); - } else { - argLengthMatch = (args.Length == delargs.Length); - - if (!argLengthMatch) - // closed over a null reference - argLengthMatch = args.Length == delargs.Length + 1; - } - } - - if (!argLengthMatch) { - delegateData = null; - return false; - } - - bool argsMatch; - delegateData = new DelegateData (); - - if (target != null) { - if (!method.IsStatic) { - argsMatch = IsArgumentTypeMatchWithThis (target.GetType (), method.DeclaringType!, true); - for (int i = 0; i < args.Length; i++) - argsMatch &= IsArgumentTypeMatch (delargs [i].ParameterType, args [i].ParameterType); - } else { - argsMatch = IsArgumentTypeMatch (target.GetType (), args [0].ParameterType); - for (int i = 1; i < args.Length; i++) - argsMatch &= IsArgumentTypeMatch (delargs [i - 1].ParameterType, args [i].ParameterType); - - delegateData.curried_first_arg = true; - } - } else { - if (!method.IsStatic) { - if (args.Length + 1 == delargs.Length) { - // The first argument should match this - argsMatch = IsArgumentTypeMatchWithThis (delargs [0].ParameterType, method.DeclaringType!, false); - for (int i = 0; i < args.Length; i++) - argsMatch &= IsArgumentTypeMatch (delargs [i + 1].ParameterType, args [i].ParameterType); - } else { - // closed over a null reference - argsMatch = allowClosed; - for (int i = 0; i < args.Length; i++) - argsMatch &= IsArgumentTypeMatch (delargs [i].ParameterType, args [i].ParameterType); - } - } else { - if (delargs.Length + 1 == args.Length) { - // closed over a null reference - argsMatch = !(args [0].ParameterType.IsValueType || args [0].ParameterType.IsByRef) && allowClosed; - for (int i = 0; i < delargs.Length; i++) - argsMatch &= IsArgumentTypeMatch (delargs [i].ParameterType, args [i + 1].ParameterType); - - delegateData.curried_first_arg = true; - } else { - argsMatch = true; - for (int i = 0; i < args.Length; i++) - argsMatch &= IsArgumentTypeMatch (delargs [i].ParameterType, args [i].ParameterType); - } - } - } - - return argsMatch; - } - - static bool IsReturnTypeMatch (Type delReturnType, Type returnType) - { - bool returnMatch = returnType == delReturnType; - - if (!returnMatch) { - // Delegate covariance - if (!returnType.IsValueType && delReturnType.IsAssignableFrom (returnType)) - returnMatch = true; - else - { - bool isDelArgEnum = delReturnType.IsEnum; - bool isArgEnum = returnType.IsEnum; - if (isArgEnum && isDelArgEnum) - returnMatch = Enum.GetUnderlyingType (delReturnType) == Enum.GetUnderlyingType (returnType); - else if (isDelArgEnum && Enum.GetUnderlyingType (delReturnType) == returnType) - returnMatch = true; - else if (isArgEnum && Enum.GetUnderlyingType (returnType) == delReturnType) - returnMatch = true; - } - } - - return returnMatch; - } - - static bool IsArgumentTypeMatch (Type delArgType, Type argType) - { - bool match = delArgType == argType; - - // Delegate contravariance - if (!match) { - if (!argType.IsValueType && argType.IsAssignableFrom (delArgType)) - match = true; - } - // enum basetypes - if (!match) { - if (delArgType.IsEnum && Enum.GetUnderlyingType (delArgType) == argType) - match = true; - else if (argType.IsEnum && Enum.GetUnderlyingType (argType) == delArgType) - match = true; - } - - return match; - } - - static bool IsArgumentTypeMatchWithThis (Type delArgType, Type argType, bool boxedThis) - { - bool match; - if (argType.IsValueType) - match = delArgType.IsByRef && delArgType.GetElementType () == argType || - (boxedThis && delArgType == argType); - else - match = delArgType == argType || argType.IsAssignableFrom (delArgType); - - return match; - } - - protected virtual object? DynamicInvokeImpl (object?[]? args) - { - if (Method is null) { + /* Contains the rarely used fields of Delegate */ + internal sealed class DelegateData + { + public Type? target_type; + public string? method_name; + public bool curried_first_arg; + } + + [StructLayout(LayoutKind.Sequential)] + public partial class Delegate + { + #region Sync with object-internals.h + private IntPtr method_ptr; + private IntPtr invoke_impl; + private object? _target; + private IntPtr method; + private IntPtr delegate_trampoline; + private IntPtr extra_arg; + private IntPtr method_code; + private IntPtr interp_method; + private IntPtr interp_invoke_impl; + private MethodInfo? method_info; + + // Keep a ref of the MethodInfo passed to CreateDelegate. + // Used to keep DynamicMethods alive. + private MethodInfo? original_method_info; + + private DelegateData data; + + private bool method_is_virtual; + #endregion + + protected Delegate(object target, string method) + { + if (target is null) + throw new ArgumentNullException(nameof(target)); + + if (method is null) + throw new ArgumentNullException(nameof(method)); + + this._target = target; + this.data = new DelegateData() + { + method_name = method + }; + } + + protected Delegate(Type target, string method) + { + if (target is null) + throw new ArgumentNullException(nameof(target)); + + if (target.ContainsGenericParameters) + throw new ArgumentException(SR.Arg_UnboundGenParam, nameof(target)); + + if (method is null) + throw new ArgumentNullException(nameof(method)); + + if (!target.IsRuntimeImplemented()) + throw new ArgumentException(SR.Argument_MustBeRuntimeType, nameof(target)); + + this.data = new DelegateData() + { + method_name = method, + target_type = target + }; + } + + public object? Target => GetTarget(); + + internal virtual object? GetTarget() => _target; + + public static Delegate CreateDelegate(Type type, object? firstArgument, MethodInfo method, bool throwOnBindFailure) + { + return CreateDelegate(type, firstArgument, method, throwOnBindFailure, true)!; + } + + public static Delegate? CreateDelegate(Type type, MethodInfo method, bool throwOnBindFailure) + { + return CreateDelegate(type, null, method, throwOnBindFailure, false); + } + + private static Delegate? CreateDelegate(Type type, object? firstArgument, MethodInfo method, bool throwOnBindFailure, bool allowClosed) + { + if (type is null) + throw new ArgumentNullException(nameof(type)); + if (method is null) + throw new ArgumentNullException(nameof(method)); + + if (!(type is RuntimeType rtType)) + throw new ArgumentException(SR.Argument_MustBeRuntimeType, nameof(type)); + if (!(method is RuntimeMethodInfo || method is System.Reflection.Emit.DynamicMethod)) + throw new ArgumentException(SR.Argument_MustBeRuntimeMethodInfo, nameof(method)); + + if (!rtType.IsDelegate()) + throw new ArgumentException(SR.Arg_MustBeDelegate, nameof(type)); + + if (!IsMatchingCandidate(type, firstArgument, method, allowClosed, out DelegateData? delegate_data)) + { + if (throwOnBindFailure) + throw new ArgumentException(SR.Arg_DlgtTargMeth); + + return null; + } + + Delegate? d = CreateDelegate_internal(type, firstArgument, method, throwOnBindFailure); + if (d != null) + { + d.original_method_info = method; + d.data = delegate_data!; + } + + return d; + } + + public static Delegate? CreateDelegate(Type type, object target, string method, bool ignoreCase, bool throwOnBindFailure) + { + if (type is null) + throw new ArgumentNullException(nameof(type)); + if (target is null) + throw new ArgumentNullException(nameof(target)); + if (method is null) + throw new ArgumentNullException(nameof(method)); + + if (!(type is RuntimeType rtType)) + throw new ArgumentException(SR.Argument_MustBeRuntimeType, nameof(type)); + if (!rtType.IsDelegate()) + throw new ArgumentException(SR.Arg_MustBeDelegate, nameof(type)); + + MethodInfo? info = GetCandidateMethod(type, target.GetType(), method, BindingFlags.Instance, ignoreCase); + if (info is null) + { + if (throwOnBindFailure) + throw new ArgumentException(SR.Arg_DlgtTargMeth); + + return null; + } + + return CreateDelegate_internal(type, null, info, throwOnBindFailure); + } + + public static Delegate? CreateDelegate(Type type, Type target, string method, bool ignoreCase, bool throwOnBindFailure) + { + if (type is null) + throw new ArgumentNullException(nameof(type)); + if (target is null) + throw new ArgumentNullException(nameof(target)); + if (target.ContainsGenericParameters) + throw new ArgumentException(SR.Arg_UnboundGenParam, nameof(target)); + if (method is null) + throw new ArgumentNullException(nameof(method)); + + if (!(type is RuntimeType rtType)) + throw new ArgumentException(SR.Argument_MustBeRuntimeType, nameof(type)); + + if (!target.IsRuntimeImplemented()) + throw new ArgumentException(SR.Argument_MustBeRuntimeType, nameof(target)); + if (!rtType.IsDelegate()) + throw new ArgumentException(SR.Arg_MustBeDelegate, nameof(type)); + + MethodInfo? info = GetCandidateMethod(type, target, method, BindingFlags.Static, ignoreCase); + if (info is null) + { + if (throwOnBindFailure) + throw new ArgumentException(SR.Arg_DlgtTargMeth); + + return null; + } + + return CreateDelegate_internal(type, null, info, throwOnBindFailure); + } + + private static MethodInfo? GetCandidateMethod(Type type, Type target, string method, BindingFlags bflags, bool ignoreCase) + { + MethodInfo? invoke = type.GetMethod("Invoke"); + if (invoke is null) + return null; + + ParameterInfo[] delargs = invoke.GetParametersInternal(); + Type[] delargtypes = new Type[delargs.Length]; + + for (int i = 0; i < delargs.Length; i++) + delargtypes[i] = delargs[i].ParameterType; + + /* + * since we need to walk the inheritance chain anyway to + * find private methods, adjust the bindingflags to ignore + * inherited methods + */ + BindingFlags flags = BindingFlags.ExactBinding | + BindingFlags.Public | BindingFlags.NonPublic | + BindingFlags.DeclaredOnly | bflags; + + if (ignoreCase) + flags |= BindingFlags.IgnoreCase; + + for (Type? targetType = target; targetType != null; targetType = targetType.BaseType) + { + MethodInfo? mi = targetType.GetMethod(method, flags, null, delargtypes, Array.Empty()); + + if (mi != null && IsReturnTypeMatch(invoke.ReturnType!, mi.ReturnType!)) + { + return mi; + } + } + + return null; + } + + private static bool IsMatchingCandidate(Type type, object? target, MethodInfo method, bool allowClosed, out DelegateData? delegateData) + { + MethodInfo? invoke = type.GetMethod("Invoke"); + + if (invoke == null || !IsReturnTypeMatch(invoke.ReturnType!, method.ReturnType!)) + { + delegateData = null; + return false; + } + + ParameterInfo[] delargs = invoke.GetParametersInternal(); + ParameterInfo[] args = method.GetParametersInternal(); + + bool argLengthMatch; + + if (target != null) + { + // delegate closed over target + if (!method.IsStatic) + // target is passed as this + argLengthMatch = (args.Length == delargs.Length); + else + // target is passed as the first argument to the static method + argLengthMatch = (args.Length == delargs.Length + 1); + } + else + { + if (!method.IsStatic) + { + // + // Net 2.0 feature. The first argument of the delegate is passed + // as the 'this' argument to the method. + // + argLengthMatch = (args.Length + 1 == delargs.Length); + + if (!argLengthMatch) + // closed over a null reference + argLengthMatch = (args.Length == delargs.Length); + } + else + { + argLengthMatch = (args.Length == delargs.Length); + + if (!argLengthMatch) + // closed over a null reference + argLengthMatch = args.Length == delargs.Length + 1; + } + } + + if (!argLengthMatch) + { + delegateData = null; + return false; + } + + bool argsMatch; + delegateData = new DelegateData(); + + if (target != null) + { + if (!method.IsStatic) + { + argsMatch = IsArgumentTypeMatchWithThis(target.GetType(), method.DeclaringType!, true); + for (int i = 0; i < args.Length; i++) + argsMatch &= IsArgumentTypeMatch(delargs[i].ParameterType, args[i].ParameterType); + } + else + { + argsMatch = IsArgumentTypeMatch(target.GetType(), args[0].ParameterType); + for (int i = 1; i < args.Length; i++) + argsMatch &= IsArgumentTypeMatch(delargs[i - 1].ParameterType, args[i].ParameterType); + + delegateData.curried_first_arg = true; + } + } + else + { + if (!method.IsStatic) + { + if (args.Length + 1 == delargs.Length) + { + // The first argument should match this + argsMatch = IsArgumentTypeMatchWithThis(delargs[0].ParameterType, method.DeclaringType!, false); + for (int i = 0; i < args.Length; i++) + argsMatch &= IsArgumentTypeMatch(delargs[i + 1].ParameterType, args[i].ParameterType); + } + else + { + // closed over a null reference + argsMatch = allowClosed; + for (int i = 0; i < args.Length; i++) + argsMatch &= IsArgumentTypeMatch(delargs[i].ParameterType, args[i].ParameterType); + } + } + else + { + if (delargs.Length + 1 == args.Length) + { + // closed over a null reference + argsMatch = !(args[0].ParameterType.IsValueType || args[0].ParameterType.IsByRef) && allowClosed; + for (int i = 0; i < delargs.Length; i++) + argsMatch &= IsArgumentTypeMatch(delargs[i].ParameterType, args[i + 1].ParameterType); + + delegateData.curried_first_arg = true; + } + else + { + argsMatch = true; + for (int i = 0; i < args.Length; i++) + argsMatch &= IsArgumentTypeMatch(delargs[i].ParameterType, args[i].ParameterType); + } + } + } + + return argsMatch; + } + + private static bool IsReturnTypeMatch(Type delReturnType, Type returnType) + { + bool returnMatch = returnType == delReturnType; + + if (!returnMatch) + { + // Delegate covariance + if (!returnType.IsValueType && delReturnType.IsAssignableFrom(returnType)) + returnMatch = true; + else + { + bool isDelArgEnum = delReturnType.IsEnum; + bool isArgEnum = returnType.IsEnum; + if (isArgEnum && isDelArgEnum) + returnMatch = Enum.GetUnderlyingType(delReturnType) == Enum.GetUnderlyingType(returnType); + else if (isDelArgEnum && Enum.GetUnderlyingType(delReturnType) == returnType) + returnMatch = true; + else if (isArgEnum && Enum.GetUnderlyingType(returnType) == delReturnType) + returnMatch = true; + } + } + + return returnMatch; + } + + private static bool IsArgumentTypeMatch(Type delArgType, Type argType) + { + bool match = delArgType == argType; + + // Delegate contravariance + if (!match) + { + if (!argType.IsValueType && argType.IsAssignableFrom(delArgType)) + match = true; + } + // enum basetypes + if (!match) + { + if (delArgType.IsEnum && Enum.GetUnderlyingType(delArgType) == argType) + match = true; + else if (argType.IsEnum && Enum.GetUnderlyingType(argType) == delArgType) + match = true; + } + + return match; + } + + private static bool IsArgumentTypeMatchWithThis(Type delArgType, Type argType, bool boxedThis) + { + bool match; + if (argType.IsValueType) + match = delArgType.IsByRef && delArgType.GetElementType() == argType || + (boxedThis && delArgType == argType); + else + match = delArgType == argType || argType.IsAssignableFrom(delArgType); + + return match; + } + + protected virtual object? DynamicInvokeImpl(object?[]? args) + { + if (Method is null) + { #nullable disable - // FIXME: This code cannot handle null argument values - Type[] mtypes = new Type [args.Length]; - for (int i = 0; i < args.Length; ++i) { - mtypes [i] = args [i].GetType (); - } - method_info = _target.GetType ().GetMethod (data.method_name, mtypes); + // FIXME: This code cannot handle null argument values + Type[] mtypes = new Type[args.Length]; + for (int i = 0; i < args.Length; ++i) + { + mtypes[i] = args[i].GetType(); + } + method_info = _target.GetType().GetMethod(data.method_name, mtypes); #nullable restore - } - - var target = _target; - - if (data is null) - data = CreateDelegateData (); - - // replace all Type.Missing with default values defined on parameters of the delegate if any - MethodInfo? invoke = GetType ().GetMethod ("Invoke"); - if (invoke != null && args != null) { - ParameterInfo[] delegateParameters = invoke.GetParameters (); - for (int i = 0; i < args.Length; i++) { - if (args [i] == Type.Missing) { - ParameterInfo dlgParam = delegateParameters [i]; - if (dlgParam.HasDefaultValue) { - args [i] = dlgParam.DefaultValue; - } - } - } - } - - if (Method.IsStatic) { - // - // The delegate is bound to _target - // - if (data.curried_first_arg) { - if (args is null) { - args = new object?[] { target }; - } else { - Array.Resize (ref args, args.Length + 1); - Array.Copy (args, 0, args, 1, args.Length - 1); - args [0] = target; - } - - target = null; - } - } else { - if (_target is null && args?.Length > 0) { - target = args [0]; - Array.Copy (args, 1, args, 0, args.Length - 1); - Array.Resize (ref args, args.Length - 1); - } - } - - return Method.Invoke (target, args); - } - - public override bool Equals (object? obj) - { - if (!(obj is Delegate d) || !InternalEqualTypes (this, obj)) - return false; - - // Do not compare method_ptr, since it can point to a trampoline - if (d._target == _target && d.Method == Method) { - if (d.data != null || data != null) { - /* Uncommon case */ - if (d.data != null && data != null) - return (d.data.target_type == data.target_type && d.data.method_name == data.method_name); - else { - if (d.data != null) - return d.data.target_type is null; - if (data != null) - return data.target_type is null; - return false; - } - } - return true; - } - - return false; - } - - public override int GetHashCode () - { - MethodInfo? m = Method; - - return (m != null ? m.GetHashCode () : GetType ().GetHashCode ()) ^ RuntimeHelpers.GetHashCode (_target); - } - - protected virtual MethodInfo GetMethodImpl () - { - if (method_info != null) - return method_info; - - if (method != IntPtr.Zero) { - if (!method_is_virtual) - method_info = (MethodInfo) RuntimeMethodInfo.GetMethodFromHandleNoGenericCheck (new RuntimeMethodHandle (method)); - else - method_info = GetVirtualMethod_internal (); - } - - return method_info; - } - - DelegateData CreateDelegateData () - { - DelegateData delegate_data = new DelegateData (); - if (method_info.IsStatic) { - if (_target != null) { - delegate_data.curried_first_arg = true; - } else { - MethodInfo? invoke = GetType ().GetMethod ("Invoke"); - if (invoke != null && invoke.GetParametersCount () + 1 == method_info.GetParametersCount ()) - delegate_data.curried_first_arg = true; - } - } - - return delegate_data; - } - - static bool InternalEqualTypes (object source, object value) - { - return source.GetType () == value.GetType (); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - private protected extern static MulticastDelegate AllocDelegateLike_internal (Delegate d); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern Delegate? CreateDelegate_internal (Type type, object? target, MethodInfo info, bool throwOnBindFailure); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern MethodInfo GetVirtualMethod_internal (); - } + } + + var target = _target; + + if (data is null) + data = CreateDelegateData(); + + // replace all Type.Missing with default values defined on parameters of the delegate if any + MethodInfo? invoke = GetType().GetMethod("Invoke"); + if (invoke != null && args != null) + { + ParameterInfo[] delegateParameters = invoke.GetParameters(); + for (int i = 0; i < args.Length; i++) + { + if (args[i] == Type.Missing) + { + ParameterInfo dlgParam = delegateParameters[i]; + if (dlgParam.HasDefaultValue) + { + args[i] = dlgParam.DefaultValue; + } + } + } + } + + if (Method.IsStatic) + { + // + // The delegate is bound to _target + // + if (data.curried_first_arg) + { + if (args is null) + { + args = new object?[] { target }; + } + else + { + Array.Resize(ref args, args.Length + 1); + Array.Copy(args, 0, args, 1, args.Length - 1); + args[0] = target; + } + + target = null; + } + } + else + { + if (_target is null && args?.Length > 0) + { + target = args[0]; + Array.Copy(args, 1, args, 0, args.Length - 1); + Array.Resize(ref args, args.Length - 1); + } + } + + return Method.Invoke(target, args); + } + + public override bool Equals(object? obj) + { + if (!(obj is Delegate d) || !InternalEqualTypes(this, obj)) + return false; + + // Do not compare method_ptr, since it can point to a trampoline + if (d._target == _target && d.Method == Method) + { + if (d.data != null || data != null) + { + /* Uncommon case */ + if (d.data != null && data != null) + return (d.data.target_type == data.target_type && d.data.method_name == data.method_name); + else + { + if (d.data != null) + return d.data.target_type is null; + if (data != null) + return data.target_type is null; + return false; + } + } + return true; + } + + return false; + } + + public override int GetHashCode() + { + MethodInfo? m = Method; + + return (m != null ? m.GetHashCode() : GetType().GetHashCode()) ^ RuntimeHelpers.GetHashCode(_target); + } + + protected virtual MethodInfo GetMethodImpl() + { + if (method_info != null) + return method_info; + + if (method != IntPtr.Zero) + { + if (!method_is_virtual) + method_info = (MethodInfo)RuntimeMethodInfo.GetMethodFromHandleNoGenericCheck(new RuntimeMethodHandle(method)); + else + method_info = GetVirtualMethod_internal(); + } + + return method_info; + } + + private DelegateData CreateDelegateData() + { + DelegateData delegate_data = new DelegateData(); + if (method_info.IsStatic) + { + if (_target != null) + { + delegate_data.curried_first_arg = true; + } + else + { + MethodInfo? invoke = GetType().GetMethod("Invoke"); + if (invoke != null && invoke.GetParametersCount() + 1 == method_info.GetParametersCount()) + delegate_data.curried_first_arg = true; + } + } + + return delegate_data; + } + + private static bool InternalEqualTypes(object source, object value) + { + return source.GetType() == value.GetType(); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private protected static extern MulticastDelegate AllocDelegateLike_internal(Delegate d); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern Delegate? CreateDelegate_internal(Type type, object? target, MethodInfo info, bool throwOnBindFailure); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern MethodInfo GetVirtualMethod_internal(); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs index 1692021801c42..97070e35c1179 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs @@ -6,39 +6,39 @@ namespace System.Diagnostics { - public static class Debugger - { - public static readonly string DefaultCategory = ""; + public static class Debugger + { + public static readonly string DefaultCategory = ""; - public static bool IsAttached => IsAttached_internal (); + public static bool IsAttached => IsAttached_internal(); - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static bool IsAttached_internal (); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool IsAttached_internal(); - [Intrinsic] - public static void Break () - { - // The JIT inserts a breakpoint on the caller. - } + [Intrinsic] + public static void Break() + { + // The JIT inserts a breakpoint on the caller. + } - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public static extern bool IsLogging(); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern bool IsLogging(); - public static bool Launch () - { - throw new NotImplementedException (); - } + public static bool Launch() + { + throw new NotImplementedException(); + } - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern void Log_icall (int level, ref string category, ref string message); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void Log_icall(int level, ref string category, ref string message); - public static void Log (int level, string category, string message) - { - Log_icall (level, ref category, ref message); - } + public static void Log(int level, string category, string message) + { + Log_icall(level, ref category, ref message); + } - public static void NotifyOfCrossThreadDependency () - { - } - } + public static void NotifyOfCrossThreadDependency() + { + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/StackFrame.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/StackFrame.Mono.cs index 35bada2fb2334..74e401f1a943b 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/StackFrame.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/StackFrame.Mono.cs @@ -8,47 +8,49 @@ namespace System.Diagnostics { - partial class StackFrame - { - internal StackFrame (MonoStackFrame monoStackFrame, bool needFileInfo) - { - _method = monoStackFrame.methodBase; - _nativeOffset = monoStackFrame.nativeOffset; - _ilOffset = monoStackFrame.ilOffset; - - if (needFileInfo) { - _fileName = monoStackFrame.fileName; - _lineNumber = monoStackFrame.lineNumber; - _columnNumber = monoStackFrame.columnNumber; - } - - _isLastFrameFromForeignExceptionStackTrace = monoStackFrame.isLastFrameFromForeignException; - } - - [MethodImplAttribute (MethodImplOptions.NoInlining)] - void BuildStackFrame (int skipFrames, bool needFileInfo) - { - const int SystemDiagnosticsStackDepth = 3; - - if (skipFrames + SystemDiagnosticsStackDepth < 0 || !get_frame_info (skipFrames + SystemDiagnosticsStackDepth, needFileInfo, out var method, out var ilOffset, out var nativeOffset, out var fileName, out var line, out var column)) - return; - - _method = method; - _ilOffset = ilOffset; - _nativeOffset = nativeOffset; - - if (needFileInfo) { - _fileName = fileName; - _lineNumber = line; - _columnNumber = column; - } - } - - bool AppendStackFrameWithoutMethodBase (StringBuilder sb) => false; - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern bool get_frame_info (int skipFrames, bool needFileInfo, - out MethodBase method, out int ilOffset, out int nativeOffset, out string file, out int line, out int column); - - } + public partial class StackFrame + { + internal StackFrame(MonoStackFrame monoStackFrame, bool needFileInfo) + { + _method = monoStackFrame.methodBase; + _nativeOffset = monoStackFrame.nativeOffset; + _ilOffset = monoStackFrame.ilOffset; + + if (needFileInfo) + { + _fileName = monoStackFrame.fileName; + _lineNumber = monoStackFrame.lineNumber; + _columnNumber = monoStackFrame.columnNumber; + } + + _isLastFrameFromForeignExceptionStackTrace = monoStackFrame.isLastFrameFromForeignException; + } + + [MethodImplAttribute(MethodImplOptions.NoInlining)] + private void BuildStackFrame(int skipFrames, bool needFileInfo) + { + const int SystemDiagnosticsStackDepth = 3; + + if (skipFrames + SystemDiagnosticsStackDepth < 0 || !get_frame_info(skipFrames + SystemDiagnosticsStackDepth, needFileInfo, out var method, out var ilOffset, out var nativeOffset, out var fileName, out var line, out var column)) + return; + + _method = method; + _ilOffset = ilOffset; + _nativeOffset = nativeOffset; + + if (needFileInfo) + { + _fileName = fileName; + _lineNumber = line; + _columnNumber = column; + } + } + + private bool AppendStackFrameWithoutMethodBase(StringBuilder sb) => false; + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool get_frame_info(int skipFrames, bool needFileInfo, + out MethodBase method, out int ilOffset, out int nativeOffset, out string file, out int line, out int column); + + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/StackTrace.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/StackTrace.Mono.cs index 07d417a8c9f9a..79e8b48270de4 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/StackTrace.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Diagnostics/StackTrace.Mono.cs @@ -9,78 +9,85 @@ namespace System.Diagnostics { - // Need our own stackframe class since the shared version has its own fields - [StructLayout (LayoutKind.Sequential)] - class MonoStackFrame - { - #region Keep in sync with object-internals.h - internal int ilOffset; - internal int nativeOffset; - // Unused - internal long methodAddress; - // Unused - internal uint methodIndex; - internal MethodBase methodBase; - internal string fileName; - internal int lineNumber; - internal int columnNumber; - // Unused - internal string internalMethodName; - #endregion + // Need our own stackframe class since the shared version has its own fields + [StructLayout(LayoutKind.Sequential)] + internal class MonoStackFrame + { + #region Keep in sync with object-internals.h + internal int ilOffset; + internal int nativeOffset; + // Unused + internal long methodAddress; + // Unused + internal uint methodIndex; + internal MethodBase methodBase; + internal string fileName; + internal int lineNumber; + internal int columnNumber; + // Unused + internal string internalMethodName; + #endregion - internal bool isLastFrameFromForeignException; - } + internal bool isLastFrameFromForeignException; + } - partial class StackTrace - { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern MonoStackFrame[] get_trace (Exception e, int skipFrames, bool needFileInfo); + public partial class StackTrace + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern MonoStackFrame[] get_trace(Exception e, int skipFrames, bool needFileInfo); - [MethodImplAttribute (MethodImplOptions.NoInlining)] - void InitializeForCurrentThread (int skipFrames, bool needFileInfo) - { - skipFrames += 2; // Current method + parent ctor + [MethodImplAttribute(MethodImplOptions.NoInlining)] + private void InitializeForCurrentThread(int skipFrames, bool needFileInfo) + { + skipFrames += 2; // Current method + parent ctor - StackFrame sf; - var frames = new List (); - while (skipFrames >= 0) { - sf = new StackFrame (skipFrames, needFileInfo); - if (sf.GetMethod () == null) { - break; - } - frames.Add (sf); - skipFrames++; - } + StackFrame sf; + var frames = new List(); + while (skipFrames >= 0) + { + sf = new StackFrame(skipFrames, needFileInfo); + if (sf.GetMethod() == null) + { + break; + } + frames.Add(sf); + skipFrames++; + } - _stackFrames = frames.ToArray (); - _numOfFrames = _stackFrames.Length; - } - - void InitializeForException (Exception e, int skipFrames, bool needFileInfo) - { - var frames = get_trace (e, skipFrames, needFileInfo); - _numOfFrames = frames.Length; + _stackFrames = frames.ToArray(); + _numOfFrames = _stackFrames.Length; + } - int foreignFrames; - MonoStackFrame[] foreignExceptions = e.foreignExceptionsFrames; + private void InitializeForException(Exception e, int skipFrames, bool needFileInfo) + { + var frames = get_trace(e, skipFrames, needFileInfo); + _numOfFrames = frames.Length; - if (foreignExceptions != null) { - foreignFrames = foreignExceptions.Length; - _numOfFrames += foreignFrames; + int foreignFrames; + MonoStackFrame[] foreignExceptions = e.foreignExceptionsFrames; - _stackFrames = new StackFrame [_numOfFrames]; + if (foreignExceptions != null) + { + foreignFrames = foreignExceptions.Length; + _numOfFrames += foreignFrames; - for (int i = 0; i < foreignExceptions.Length; ++i) { - _stackFrames [i] = new StackFrame (foreignExceptions [i], needFileInfo); - } - } else { - _stackFrames = new StackFrame [_numOfFrames]; - foreignFrames = 0; - } + _stackFrames = new StackFrame[_numOfFrames]; - for (int i = 0; i < frames.Length; ++i) { - _stackFrames [foreignFrames + i] = new StackFrame (frames [i], needFileInfo); - } - } - } + for (int i = 0; i < foreignExceptions.Length; ++i) + { + _stackFrames[i] = new StackFrame(foreignExceptions[i], needFileInfo); + } + } + else + { + _stackFrames = new StackFrame[_numOfFrames]; + foreignFrames = 0; + } + + for (int i = 0; i < frames.Length; ++i) + { + _stackFrames[foreignFrames + i] = new StackFrame(frames[i], needFileInfo); + } + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Enum.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Enum.Mono.cs index ec9c508fd3616..88bb891eb2662 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Enum.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Enum.Mono.cs @@ -7,126 +7,127 @@ namespace System { - partial class Enum - { - internal sealed class EnumInfo - { - public readonly bool HasFlagsAttribute; - public readonly ulong[] Values; - public readonly string[] Names; - - // Each entry contains a list of sorted pair of enum field names and values, sorted by values - public EnumInfo (bool hasFlagsAttribute, ulong[] values, string[] names) - { - HasFlagsAttribute = hasFlagsAttribute; - Values = values; - Names = names; - } - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern bool InternalHasFlag (Enum flags); - - [Intrinsic] - public bool HasFlag (Enum flag) - { - if (flag is null) - throw new ArgumentNullException (nameof (flag)); - if (!this.GetType ().IsEquivalentTo (flag.GetType ())) - throw new ArgumentException (SR.Format (SR.Argument_EnumTypeDoesNotMatch, flag.GetType (), this.GetType ())); - - return InternalHasFlag (flag); - } - - public static string? GetName (Type enumType, object value) - { - if (enumType is null) - throw new ArgumentNullException (nameof(enumType)); - - return enumType.GetEnumName (value); - } - - public static string[] GetNames (Type enumType) - { - if (enumType is null) - throw new ArgumentNullException (nameof (enumType)); - - return enumType.GetEnumNames (); - } - - public static Type GetUnderlyingType (Type enumType) - { - if (enumType is null) - throw new ArgumentNullException (nameof (enumType)); - - return enumType.GetEnumUnderlyingType (); - } - - public static Array GetValues (Type enumType) - { - if (enumType is null) - throw new ArgumentNullException (nameof (enumType)); - - return enumType.GetEnumValues (); - } - - public static bool IsDefined (Type enumType, object value) - { - if (enumType is null) - throw new ArgumentNullException (nameof (enumType)); - - return enumType.IsEnumDefined (value); - } - - internal static ulong[] InternalGetValues (RuntimeType enumType) - { - // Get all of the values - return GetEnumInfo (enumType, false).Values; - } - - internal static string[] InternalGetNames (RuntimeType enumType) - { - // Get all of the names - return GetEnumInfo (enumType, true).Names; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern bool GetEnumValuesAndNames (RuntimeType enumType, out ulong[] values, out string[] names); - - static EnumInfo GetEnumInfo (RuntimeType enumType, bool getNames = true) - { - var entry = enumType.Cache.EnumInfo; - - if (entry == null || (getNames && entry.Names == null)) { - if (!GetEnumValuesAndNames (enumType, out var values, out var names)) - Array.Sort (values, names, System.Collections.Generic.Comparer.Default); - - bool hasFlagsAttribute = enumType.IsDefined (typeof (FlagsAttribute), inherit: false); - entry = new EnumInfo (hasFlagsAttribute, values, names); - enumType.Cache.EnumInfo = entry; - } - - return entry; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern object InternalBoxEnum (RuntimeType enumType, long value); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern CorElementType InternalGetCorElementType (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern RuntimeType InternalGetUnderlyingType (RuntimeType enumType); - - static RuntimeType ValidateRuntimeType (Type enumType) - { - if (enumType is null) - throw new ArgumentNullException (nameof (enumType)); - if (!enumType.IsEnum) - throw new ArgumentException (SR.Arg_MustBeEnum, nameof (enumType)); - if (!(enumType is RuntimeType rtType)) - throw new ArgumentException (SR.Arg_MustBeType, nameof (enumType)); - return rtType; - } - } + public partial class Enum + { + internal sealed class EnumInfo + { + public readonly bool HasFlagsAttribute; + public readonly ulong[] Values; + public readonly string[] Names; + + // Each entry contains a list of sorted pair of enum field names and values, sorted by values + public EnumInfo(bool hasFlagsAttribute, ulong[] values, string[] names) + { + HasFlagsAttribute = hasFlagsAttribute; + Values = values; + Names = names; + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern bool InternalHasFlag(Enum flags); + + [Intrinsic] + public bool HasFlag(Enum flag) + { + if (flag is null) + throw new ArgumentNullException(nameof(flag)); + if (!this.GetType().IsEquivalentTo(flag.GetType())) + throw new ArgumentException(SR.Format(SR.Argument_EnumTypeDoesNotMatch, flag.GetType(), this.GetType())); + + return InternalHasFlag(flag); + } + + public static string? GetName(Type enumType, object value) + { + if (enumType is null) + throw new ArgumentNullException(nameof(enumType)); + + return enumType.GetEnumName(value); + } + + public static string[] GetNames(Type enumType) + { + if (enumType is null) + throw new ArgumentNullException(nameof(enumType)); + + return enumType.GetEnumNames(); + } + + public static Type GetUnderlyingType(Type enumType) + { + if (enumType is null) + throw new ArgumentNullException(nameof(enumType)); + + return enumType.GetEnumUnderlyingType(); + } + + public static Array GetValues(Type enumType) + { + if (enumType is null) + throw new ArgumentNullException(nameof(enumType)); + + return enumType.GetEnumValues(); + } + + public static bool IsDefined(Type enumType, object value) + { + if (enumType is null) + throw new ArgumentNullException(nameof(enumType)); + + return enumType.IsEnumDefined(value); + } + + internal static ulong[] InternalGetValues(RuntimeType enumType) + { + // Get all of the values + return GetEnumInfo(enumType, false).Values; + } + + internal static string[] InternalGetNames(RuntimeType enumType) + { + // Get all of the names + return GetEnumInfo(enumType, true).Names; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool GetEnumValuesAndNames(RuntimeType enumType, out ulong[] values, out string[] names); + + private static EnumInfo GetEnumInfo(RuntimeType enumType, bool getNames = true) + { + var entry = enumType.Cache.EnumInfo; + + if (entry == null || (getNames && entry.Names == null)) + { + if (!GetEnumValuesAndNames(enumType, out var values, out var names)) + Array.Sort(values, names, Collections.Generic.Comparer.Default); + + bool hasFlagsAttribute = enumType.IsDefined(typeof(FlagsAttribute), inherit: false); + entry = new EnumInfo(hasFlagsAttribute, values, names); + enumType.Cache.EnumInfo = entry; + } + + return entry; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern object InternalBoxEnum(RuntimeType enumType, long value); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern CorElementType InternalGetCorElementType(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern RuntimeType InternalGetUnderlyingType(RuntimeType enumType); + + private static RuntimeType ValidateRuntimeType(Type enumType) + { + if (enumType is null) + throw new ArgumentNullException(nameof(enumType)); + if (!enumType.IsEnum) + throw new ArgumentException(SR.Arg_MustBeEnum, nameof(enumType)); + if (!(enumType is RuntimeType rtType)) + throw new ArgumentException(SR.Arg_MustBeType, nameof(enumType)); + return rtType; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Environment.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Environment.Mono.cs index 9ceeb5115d72e..9a18526a9ad6d 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Environment.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Environment.Mono.cs @@ -11,77 +11,81 @@ namespace System { - partial class Environment - { - public static int CurrentManagedThreadId => Thread.CurrentThread.ManagedThreadId; - - public extern static int ExitCode { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - [MethodImplAttribute (MethodImplOptions.InternalCall)] - set; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern int GetProcessorCount (); - - public static string StackTrace { - [MethodImpl (MethodImplOptions.NoInlining)] // Prevent inlining from affecting where the stacktrace starts - get => new StackTrace (true).ToString (System.Diagnostics.StackTrace.TraceFormat.Normal); - } - - public extern static int TickCount { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } - - public extern static long TickCount64 { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - [DoesNotReturn] - public extern static void Exit (int exitCode); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static string[] GetCommandLineArgs (); - - [DoesNotReturn] - public static void FailFast (string message) - { - FailFast (message, null, null); - } - - [DoesNotReturn] - public static void FailFast(string message, Exception exception) - { - FailFast (message, exception, null); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - [DoesNotReturn] - public extern static void FailFast (string message, Exception exception, string errorSource); - } - -#region referencesource dependencies - to be removed - - partial class Environment - { - internal static string GetResourceString (string key) - { - return key; - } - - internal static string GetResourceString (string key, CultureInfo culture) - { - return key; - } - - internal static string GetResourceString (string key, params object[] values) - { - return string.Format (CultureInfo.InvariantCulture, key, values); - } - } -#endregion + public partial class Environment + { + public static int CurrentManagedThreadId => Thread.CurrentThread.ManagedThreadId; + + public static extern int ExitCode + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + [MethodImplAttribute(MethodImplOptions.InternalCall)] + set; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int GetProcessorCount(); + + public static string StackTrace + { + [MethodImpl(MethodImplOptions.NoInlining)] // Prevent inlining from affecting where the stacktrace starts + get => new StackTrace(true).ToString(Diagnostics.StackTrace.TraceFormat.Normal); + } + + public static extern int TickCount + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + } + + public static extern long TickCount64 + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + [DoesNotReturn] + public static extern void Exit(int exitCode); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern string[] GetCommandLineArgs(); + + [DoesNotReturn] + public static void FailFast(string message) + { + FailFast(message, null, null); + } + + [DoesNotReturn] + public static void FailFast(string message, Exception exception) + { + FailFast(message, exception, null); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + [DoesNotReturn] + public static extern void FailFast(string message, Exception exception, string errorSource); + } + + #region referencesource dependencies - to be removed + + public partial class Environment + { + internal static string GetResourceString(string key) + { + return key; + } + + internal static string GetResourceString(string key, CultureInfo culture) + { + return key; + } + + internal static string GetResourceString(string key, params object[] values) + { + return string.Format(CultureInfo.InvariantCulture, key, values); + } + } + #endregion } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Environment.Unix.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Environment.Unix.Mono.cs index 6b186fd13cd39..e4ab168b1e6b4 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Environment.Unix.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Environment.Unix.Mono.cs @@ -11,93 +11,107 @@ namespace System { - partial class Environment - { - private static Dictionary s_environment; - - static string GetEnvironmentVariableCore (string variable) - { - Debug.Assert(variable != null); - - if (s_environment == null) { - using (var h = RuntimeMarshal.MarshalString (variable)) { - return internalGetEnvironmentVariable_native (h.Value); - } - } - - variable = TrimStringOnFirstZero (variable); - lock (s_environment) { - s_environment.TryGetValue (variable, out string value); - return value; - } - } - - static unsafe void SetEnvironmentVariableCore (string variable, string? value) - { - Debug.Assert(variable != null); - - EnsureEnvironmentCached (); - lock (s_environment) { - variable = TrimStringOnFirstZero (variable); - value = value == null ? null : TrimStringOnFirstZero (value); - if (string.IsNullOrEmpty (value)) { - s_environment.Remove (variable); - } else { - s_environment[variable] = value; - } - } - } - - public static IDictionary GetEnvironmentVariables () - { - var results = new Hashtable(); - - EnsureEnvironmentCached(); - lock (s_environment) { - foreach (var keyValuePair in s_environment) { - results.Add(keyValuePair.Key, keyValuePair.Value); - } - } - - return results; - } - - private static string TrimStringOnFirstZero (string value) - { - int index = value.IndexOf ('\0'); - if (index >= 0) { - return value.Substring (0, index); - } - return value; - } - - private static void EnsureEnvironmentCached () - { - if (s_environment == null) { - Interlocked.CompareExchange (ref s_environment, GetSystemEnvironmentVariables (), null); - } - } - - private static Dictionary GetSystemEnvironmentVariables () - { - var results = new Dictionary(); - - foreach (string name in GetEnvironmentVariableNames ()) { - if (name != null) { - using (var h = RuntimeMarshal.MarshalString (name)) { - results.Add (name, internalGetEnvironmentVariable_native (h.Value)); - } - } - } - - return results; - } - - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static string internalGetEnvironmentVariable_native (IntPtr variable); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - private extern static string [] GetEnvironmentVariableNames (); - } + public partial class Environment + { + private static Dictionary s_environment; + + private static string GetEnvironmentVariableCore(string variable) + { + Debug.Assert(variable != null); + + if (s_environment == null) + { + using (var h = RuntimeMarshal.MarshalString(variable)) + { + return internalGetEnvironmentVariable_native(h.Value); + } + } + + variable = TrimStringOnFirstZero(variable); + lock (s_environment) + { + s_environment.TryGetValue(variable, out string value); + return value; + } + } + + private static unsafe void SetEnvironmentVariableCore(string variable, string? value) + { + Debug.Assert(variable != null); + + EnsureEnvironmentCached(); + lock (s_environment) + { + variable = TrimStringOnFirstZero(variable); + value = value == null ? null : TrimStringOnFirstZero(value); + if (string.IsNullOrEmpty(value)) + { + s_environment.Remove(variable); + } + else + { + s_environment[variable] = value; + } + } + } + + public static IDictionary GetEnvironmentVariables() + { + var results = new Hashtable(); + + EnsureEnvironmentCached(); + lock (s_environment) + { + foreach (var keyValuePair in s_environment) + { + results.Add(keyValuePair.Key, keyValuePair.Value); + } + } + + return results; + } + + private static string TrimStringOnFirstZero(string value) + { + int index = value.IndexOf('\0'); + if (index >= 0) + { + return value.Substring(0, index); + } + return value; + } + + private static void EnsureEnvironmentCached() + { + if (s_environment == null) + { + Interlocked.CompareExchange(ref s_environment, GetSystemEnvironmentVariables(), null); + } + } + + private static Dictionary GetSystemEnvironmentVariables() + { + var results = new Dictionary(); + + foreach (string name in GetEnvironmentVariableNames()) + { + if (name != null) + { + using (var h = RuntimeMarshal.MarshalString(name)) + { + results.Add(name, internalGetEnvironmentVariable_native(h.Value)); + } + } + } + + return results; + } + + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern string internalGetEnvironmentVariable_native(IntPtr variable); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern string[] GetEnvironmentVariableNames(); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Exception.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Exception.Mono.cs index 9d1f9a402cbea..f1a23e54376b4 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Exception.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Exception.Mono.cs @@ -10,137 +10,146 @@ namespace System { - [StructLayout (LayoutKind.Sequential)] - partial class Exception - { - internal readonly struct DispatchState - { - public readonly MonoStackFrame[] StackFrames; - - public DispatchState (MonoStackFrame[] stackFrames) - { - StackFrames = stackFrames; - } - } - - # region Keep in sync with MonoException in object-internals.h - string? _unused1; - internal string _message; - IDictionary _data; - Exception _innerException; - string _helpURL; - object _traceIPs; - string? _stackTraceString; - string? _remoteStackTraceString; - int _unused4; - object _dynamicMethods; // Dynamic methods referenced by the stack trace - int _HResult; - string _source; - object? _unused6; - internal MonoStackFrame[] foreignExceptionsFrames; - IntPtr[] native_trace_ips; - int caught_in_unmanaged; - #endregion - - public MethodBase? TargetSite { - get { - StackTrace st = new StackTrace (this, true); - if (st.FrameCount > 0) - return st.GetFrame (0)?.GetMethod (); - - return null; - } - } - - public virtual string? StackTrace => GetStackTrace (true); - - string? GetStackTrace (bool needFileInfo) - { - string? stackTraceString = _stackTraceString; - string? remoteStackTraceString = _remoteStackTraceString; - - if (stackTraceString != null) - return remoteStackTraceString + stackTraceString; - if (_traceIPs == null) - return remoteStackTraceString; - - return remoteStackTraceString + new StackTrace (this, needFileInfo).ToString (System.Diagnostics.StackTrace.TraceFormat.Normal); - } - - internal DispatchState CaptureDispatchState () - { - MonoStackFrame[] stackFrames; - - if (_traceIPs != null) { - stackFrames = System.Diagnostics.StackTrace.get_trace (this, 0, true); - stackFrames [stackFrames.Length - 1].isLastFrameFromForeignException = true; - - if (foreignExceptionsFrames != null) { - var combinedStackFrames = new MonoStackFrame [stackFrames.Length + foreignExceptionsFrames.Length]; - Array.Copy (foreignExceptionsFrames, 0, combinedStackFrames, 0, foreignExceptionsFrames.Length); - Array.Copy (stackFrames, 0, combinedStackFrames, foreignExceptionsFrames.Length, stackFrames.Length); - - stackFrames = combinedStackFrames; - } - } else { - stackFrames = foreignExceptionsFrames; - } - - return new DispatchState (stackFrames); - } - - internal void RestoreDispatchState (in DispatchState state) - { - foreignExceptionsFrames = state.StackFrames; - - _stackTraceString = null; - } - - [StackTraceHidden] - internal void SetCurrentStackTrace () - { - // Check to see if the exception already has a stack set in it. - if (_traceIPs != null || _stackTraceString != null || _remoteStackTraceString != null) { - ThrowHelper.ThrowInvalidOperationException (); - } - - // Store the current stack trace into the "remote" stack trace, which was originally introduced to support - // remoting of exceptions cross app-domain boundaries, and is thus concatenated into Exception.StackTrace - // when it's retrieved. - var sb = new StringBuilder (256); - new StackTrace (fNeedFileInfo: true).ToString (System.Diagnostics.StackTrace.TraceFormat.TrailingNewLine, sb); - sb.AppendLine (SR.Exception_EndStackTraceFromPreviousThrow); - _remoteStackTraceString = sb.ToString (); - } - - string? CreateSourceName () - { - var st = new StackTrace (this, fNeedFileInfo: false); - if (st.FrameCount > 0) { - StackFrame sf = st.GetFrame (0)!; - MethodBase method = sf.GetMethod (); - - Module module = method.Module; - RuntimeModule rtModule = module as RuntimeModule; - - if (rtModule == null) { - var moduleBuilder = module as System.Reflection.Emit.ModuleBuilder; - if (moduleBuilder != null) - throw new NotImplementedException (); // TODO: rtModule = moduleBuilder.InternalModule; - else - throw new ArgumentException (SR.Argument_MustBeRuntimeReflectionObject); - } - - return rtModule.GetRuntimeAssembly ().GetName ().Name; // TODO: GetSimpleName (); - } - - return null; - } - - static IDictionary CreateDataContainer () => new ListDictionaryInternal (); - - static string? SerializationWatsonBuckets => null; - string? SerializationRemoteStackTraceString => _remoteStackTraceString; - string? SerializationStackTraceString => GetStackTrace (true); - } + [StructLayout(LayoutKind.Sequential)] + public partial class Exception + { + internal readonly struct DispatchState + { + public readonly MonoStackFrame[] StackFrames; + + public DispatchState(MonoStackFrame[] stackFrames) + { + StackFrames = stackFrames; + } + } + + #region Keep in sync with MonoException in object-internals.h + private string? _unused1; + internal string _message; + private IDictionary _data; + private Exception _innerException; + private string _helpURL; + private object _traceIPs; + private string? _stackTraceString; + private string? _remoteStackTraceString; + private int _unused4; + private object _dynamicMethods; // Dynamic methods referenced by the stack trace + private int _HResult; + private string _source; + private object? _unused6; + internal MonoStackFrame[] foreignExceptionsFrames; + private IntPtr[] native_trace_ips; + private int caught_in_unmanaged; + #endregion + + public MethodBase? TargetSite + { + get + { + StackTrace st = new StackTrace(this, true); + if (st.FrameCount > 0) + return st.GetFrame(0)?.GetMethod(); + + return null; + } + } + + public virtual string? StackTrace => GetStackTrace(true); + + private string? GetStackTrace(bool needFileInfo) + { + string? stackTraceString = _stackTraceString; + string? remoteStackTraceString = _remoteStackTraceString; + + if (stackTraceString != null) + return remoteStackTraceString + stackTraceString; + if (_traceIPs == null) + return remoteStackTraceString; + + return remoteStackTraceString + new StackTrace(this, needFileInfo).ToString(Diagnostics.StackTrace.TraceFormat.Normal); + } + + internal DispatchState CaptureDispatchState() + { + MonoStackFrame[] stackFrames; + + if (_traceIPs != null) + { + stackFrames = Diagnostics.StackTrace.get_trace(this, 0, true); + stackFrames[stackFrames.Length - 1].isLastFrameFromForeignException = true; + + if (foreignExceptionsFrames != null) + { + var combinedStackFrames = new MonoStackFrame[stackFrames.Length + foreignExceptionsFrames.Length]; + Array.Copy(foreignExceptionsFrames, 0, combinedStackFrames, 0, foreignExceptionsFrames.Length); + Array.Copy(stackFrames, 0, combinedStackFrames, foreignExceptionsFrames.Length, stackFrames.Length); + + stackFrames = combinedStackFrames; + } + } + else + { + stackFrames = foreignExceptionsFrames; + } + + return new DispatchState(stackFrames); + } + + internal void RestoreDispatchState(in DispatchState state) + { + foreignExceptionsFrames = state.StackFrames; + + _stackTraceString = null; + } + + [StackTraceHidden] + internal void SetCurrentStackTrace() + { + // Check to see if the exception already has a stack set in it. + if (_traceIPs != null || _stackTraceString != null || _remoteStackTraceString != null) + { + ThrowHelper.ThrowInvalidOperationException(); + } + + // Store the current stack trace into the "remote" stack trace, which was originally introduced to support + // remoting of exceptions cross app-domain boundaries, and is thus concatenated into Exception.StackTrace + // when it's retrieved. + var sb = new StringBuilder(256); + new StackTrace(fNeedFileInfo: true).ToString(Diagnostics.StackTrace.TraceFormat.TrailingNewLine, sb); + sb.AppendLine(SR.Exception_EndStackTraceFromPreviousThrow); + _remoteStackTraceString = sb.ToString(); + } + + private string? CreateSourceName() + { + var st = new StackTrace(this, fNeedFileInfo: false); + if (st.FrameCount > 0) + { + StackFrame sf = st.GetFrame(0)!; + MethodBase method = sf.GetMethod(); + + Module module = method.Module; + RuntimeModule rtModule = module as RuntimeModule; + + if (rtModule == null) + { + var moduleBuilder = module as System.Reflection.Emit.ModuleBuilder; + if (moduleBuilder != null) + throw new NotImplementedException(); // TODO: rtModule = moduleBuilder.InternalModule; + else + throw new ArgumentException(SR.Argument_MustBeRuntimeReflectionObject); + } + + return rtModule.GetRuntimeAssembly().GetName().Name; // TODO: GetSimpleName (); + } + + return null; + } + + private static IDictionary CreateDataContainer() => new ListDictionaryInternal(); + + private static string? SerializationWatsonBuckets => null; + private string? SerializationRemoteStackTraceString => _remoteStackTraceString; + private string? SerializationStackTraceString => GetStackTrace(true); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/GC.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/GC.Mono.cs index 5894af3b338ff..dd0a348821261 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/GC.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/GC.Mono.cs @@ -7,273 +7,275 @@ namespace System { - public enum GCCollectionMode - { - Default = 0, - Forced = 1, - Optimized = 2 - } - - public enum GCNotificationStatus - { - Succeeded = 0, - Failed = 1, - Canceled = 2, - Timeout = 3, - NotApplicable = 4 - } - - public static partial class GC - { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static int GetCollectionCount (int generation); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static int GetMaxGeneration (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void InternalCollect (int generation); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void RecordPressure (long bytesAllocated); - - // TODO: Move following to ConditionalWeakTable - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static void register_ephemeron_array (Ephemeron[] array); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static object get_ephemeron_tombstone (); - - internal static readonly object EPHEMERON_TOMBSTONE = get_ephemeron_tombstone (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public static extern long GetAllocatedBytesForCurrentThread (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public static extern long GetTotalAllocatedBytes (bool precise = false); - - public static void AddMemoryPressure (long bytesAllocated) - { - if (bytesAllocated <= 0) - throw new ArgumentOutOfRangeException (nameof (bytesAllocated), SR.ArgumentOutOfRange_NeedPosNum); - if (IntPtr.Size == 4 && bytesAllocated > Int32.MaxValue) - throw new ArgumentOutOfRangeException (nameof (bytesAllocated), SR.ArgumentOutOfRange_MustBeNonNegInt32); - RecordPressure (bytesAllocated); - } - - public static void RemoveMemoryPressure (long bytesAllocated) - { - if (bytesAllocated <= 0) - throw new ArgumentOutOfRangeException (nameof (bytesAllocated), SR.ArgumentOutOfRange_NeedPosNum); - if (IntPtr.Size == 4 && bytesAllocated > Int32.MaxValue) - throw new ArgumentOutOfRangeException (nameof (bytesAllocated), SR.ArgumentOutOfRange_MustBeNonNegInt32); - RecordPressure (-bytesAllocated); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public static extern int GetGeneration (object obj); - - public static void Collect (int generation) - { - Collect (generation, GCCollectionMode.Default); - } - - public static void Collect () - { - InternalCollect (MaxGeneration); - } - - public static void Collect (int generation, GCCollectionMode mode) => Collect (generation, mode, true); - - public static void Collect (int generation, GCCollectionMode mode, bool blocking) => Collect (generation, mode, blocking, false); - - public static void Collect (int generation, GCCollectionMode mode, bool blocking, bool compacting) - { - if (generation < 0) - throw new ArgumentOutOfRangeException (nameof (generation), "generation", SR.ArgumentOutOfRange_GenericPositive); - if ((mode < GCCollectionMode.Default) || (mode > GCCollectionMode.Optimized)) - throw new ArgumentOutOfRangeException (nameof (mode), SR.ArgumentOutOfRange_Enum); - - InternalCollect (generation); - } - - public static int CollectionCount (int generation) - { - if (generation < 0) - throw new ArgumentOutOfRangeException (nameof (generation), SR.ArgumentOutOfRange_GenericPositive); - return GetCollectionCount (generation); - } - - [MethodImplAttribute (MethodImplOptions.NoInlining)] // disable optimizations - public static void KeepAlive (object obj) - { - } - - public static int GetGeneration (WeakReference wo) - { - object obj = wo.Target; - if (obj == null) - throw new ArgumentException (); - return GetGeneration (obj); - } - - public static int MaxGeneration { - get { - return GetMaxGeneration (); - } - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public static extern void WaitForPendingFinalizers (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern void _SuppressFinalize (object o); - - public static void SuppressFinalize (object obj) - { - if (obj == null) - throw new ArgumentNullException (nameof (obj)); - _SuppressFinalize (obj); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern void _ReRegisterForFinalize (object o); - - public static void ReRegisterForFinalize (object obj) - { - if (obj == null) - throw new ArgumentNullException (nameof (obj)); - _ReRegisterForFinalize (obj); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static long GetTotalMemory (bool forceFullCollection); - - static bool _RegisterForFullGCNotification (int maxGenerationPercentage, int largeObjectHeapPercentage) - { - throw new NotImplementedException (); - } - - static bool _CancelFullGCNotification () - { - throw new NotImplementedException (); - } - - static GCNotificationStatus _WaitForFullGCApproach (int millisecondsTimeout) - { - throw new NotImplementedException (); - } - - static GCNotificationStatus _WaitForFullGCComplete (int millisecondsTimeout) - { - throw new NotImplementedException (); - } - - public static void RegisterForFullGCNotification (int maxGenerationThreshold, int largeObjectHeapThreshold) - { - if ((maxGenerationThreshold <= 0) || (maxGenerationThreshold >= 100)) - throw new ArgumentOutOfRangeException (nameof (maxGenerationThreshold), - SR.Format (SR.ArgumentOutOfRange_Bounds_Lower_Upper, 1, 99)); - if ((largeObjectHeapThreshold <= 0) || (largeObjectHeapThreshold >= 100)) - throw new ArgumentOutOfRangeException (nameof (largeObjectHeapThreshold), - SR.Format (SR.ArgumentOutOfRange_Bounds_Lower_Upper, 1, 99)); - - if (!_RegisterForFullGCNotification (maxGenerationThreshold, largeObjectHeapThreshold)) - throw new InvalidOperationException (SR.InvalidOperation_NotWithConcurrentGC); - } - - public static void CancelFullGCNotification () - { - if (!_CancelFullGCNotification ()) - throw new InvalidOperationException (SR.InvalidOperation_NotWithConcurrentGC); - } - - public static GCNotificationStatus WaitForFullGCApproach () - { - return (GCNotificationStatus) _WaitForFullGCApproach (-1); - } - - public static GCNotificationStatus WaitForFullGCApproach (int millisecondsTimeout) - { - if (millisecondsTimeout < -1) - throw new ArgumentOutOfRangeException (nameof (millisecondsTimeout), SR.ArgumentOutOfRange_NeedNonNegOrNegative1); - - return _WaitForFullGCApproach (millisecondsTimeout); - } - - public static GCNotificationStatus WaitForFullGCComplete () - { - return _WaitForFullGCComplete (-1); - } - - public static GCNotificationStatus WaitForFullGCComplete (int millisecondsTimeout) - { - if (millisecondsTimeout < -1) - throw new ArgumentOutOfRangeException (nameof (millisecondsTimeout), SR.ArgumentOutOfRange_NeedNonNegOrNegative1); - return _WaitForFullGCComplete (millisecondsTimeout); - } - - static bool StartNoGCRegion (long totalSize, bool hasLohSize, long lohSize, bool disallowFullBlockingGC) - { - throw new NotImplementedException (); - } - - public static bool TryStartNoGCRegion (long totalSize) => StartNoGCRegion (totalSize, false, 0, false); - - public static bool TryStartNoGCRegion (long totalSize, long lohSize) => StartNoGCRegion (totalSize, true, lohSize, false); - - public static bool TryStartNoGCRegion (long totalSize, bool disallowFullBlockingGC) => StartNoGCRegion (totalSize, false, 0, disallowFullBlockingGC); - - public static bool TryStartNoGCRegion (long totalSize, long lohSize, bool disallowFullBlockingGC) => StartNoGCRegion (totalSize, true, lohSize, disallowFullBlockingGC); - - public static void EndNoGCRegion () - { - throw new NotImplementedException (); - } - - internal static ulong GetSegmentSize () - { - // coreclr default - return 1024 * 1024 * 16; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern void _GetGCMemoryInfo (out long highMemoryLoadThresholdBytes, - out long memoryLoadBytes, - out long totalAvailableMemoryBytes, - out long heapSizeBytes, - out long fragmentedBytes); - - public static GCMemoryInfo GetGCMemoryInfo () - { - _GetGCMemoryInfo (out long highMemoryLoadThresholdBytes, - out long memoryLoadBytes, - out long totalAvailableMemoryBytes, - out long heapSizeBytes, - out long fragmentedBytes ); - - return new GCMemoryInfo (highMemoryLoadThresholdBytes, memoryLoadBytes, totalAvailableMemoryBytes, heapSizeBytes, fragmentedBytes); - } - - public static T[] AllocateUninitializedArray (int length, bool pinned = false) - { - if (pinned) - throw new NotImplementedException (); - - // Mono only does explicit zeroning if the array is to big for the nursery, but less than 1 Mb - 4 kb. - // If it is bigger than that, we grab memoroy directly from the OS which comes pre-zeroed. - // Experimentation shows that if we just skip the zeroing in this case, we do not save a measurable - // amount of time. So we just allocate the normal way here. - // Revist if we change LOS implementation. - return new T [length]; - } - - public static T[] AllocateArray (int length, bool pinned = false) - { - if (pinned) - throw new NotImplementedException (); - - return new T [length]; - } - } + public enum GCCollectionMode + { + Default = 0, + Forced = 1, + Optimized = 2 + } + + public enum GCNotificationStatus + { + Succeeded = 0, + Failed = 1, + Canceled = 2, + Timeout = 3, + NotApplicable = 4 + } + + public static partial class GC + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int GetCollectionCount(int generation); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int GetMaxGeneration(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void InternalCollect(int generation); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void RecordPressure(long bytesAllocated); + + // TODO: Move following to ConditionalWeakTable + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern void register_ephemeron_array(Ephemeron[] array); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern object get_ephemeron_tombstone(); + + internal static readonly object EPHEMERON_TOMBSTONE = get_ephemeron_tombstone(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern long GetAllocatedBytesForCurrentThread(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern long GetTotalAllocatedBytes(bool precise = false); + + public static void AddMemoryPressure(long bytesAllocated) + { + if (bytesAllocated <= 0) + throw new ArgumentOutOfRangeException(nameof(bytesAllocated), SR.ArgumentOutOfRange_NeedPosNum); + if (IntPtr.Size == 4 && bytesAllocated > int.MaxValue) + throw new ArgumentOutOfRangeException(nameof(bytesAllocated), SR.ArgumentOutOfRange_MustBeNonNegInt32); + RecordPressure(bytesAllocated); + } + + public static void RemoveMemoryPressure(long bytesAllocated) + { + if (bytesAllocated <= 0) + throw new ArgumentOutOfRangeException(nameof(bytesAllocated), SR.ArgumentOutOfRange_NeedPosNum); + if (IntPtr.Size == 4 && bytesAllocated > int.MaxValue) + throw new ArgumentOutOfRangeException(nameof(bytesAllocated), SR.ArgumentOutOfRange_MustBeNonNegInt32); + RecordPressure(-bytesAllocated); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern int GetGeneration(object obj); + + public static void Collect(int generation) + { + Collect(generation, GCCollectionMode.Default); + } + + public static void Collect() + { + InternalCollect(MaxGeneration); + } + + public static void Collect(int generation, GCCollectionMode mode) => Collect(generation, mode, true); + + public static void Collect(int generation, GCCollectionMode mode, bool blocking) => Collect(generation, mode, blocking, false); + + public static void Collect(int generation, GCCollectionMode mode, bool blocking, bool compacting) + { + if (generation < 0) + throw new ArgumentOutOfRangeException(nameof(generation), "generation", SR.ArgumentOutOfRange_GenericPositive); + if ((mode < GCCollectionMode.Default) || (mode > GCCollectionMode.Optimized)) + throw new ArgumentOutOfRangeException(nameof(mode), SR.ArgumentOutOfRange_Enum); + + InternalCollect(generation); + } + + public static int CollectionCount(int generation) + { + if (generation < 0) + throw new ArgumentOutOfRangeException(nameof(generation), SR.ArgumentOutOfRange_GenericPositive); + return GetCollectionCount(generation); + } + + [MethodImplAttribute(MethodImplOptions.NoInlining)] // disable optimizations + public static void KeepAlive(object obj) + { + } + + public static int GetGeneration(WeakReference wo) + { + object obj = wo.Target; + if (obj == null) + throw new ArgumentException(); + return GetGeneration(obj); + } + + public static int MaxGeneration + { + get + { + return GetMaxGeneration(); + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern void WaitForPendingFinalizers(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void _SuppressFinalize(object o); + + public static void SuppressFinalize(object obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + _SuppressFinalize(obj); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void _ReRegisterForFinalize(object o); + + public static void ReRegisterForFinalize(object obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + _ReRegisterForFinalize(obj); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern long GetTotalMemory(bool forceFullCollection); + + private static bool _RegisterForFullGCNotification(int maxGenerationPercentage, int largeObjectHeapPercentage) + { + throw new NotImplementedException(); + } + + private static bool _CancelFullGCNotification() + { + throw new NotImplementedException(); + } + + private static GCNotificationStatus _WaitForFullGCApproach(int millisecondsTimeout) + { + throw new NotImplementedException(); + } + + private static GCNotificationStatus _WaitForFullGCComplete(int millisecondsTimeout) + { + throw new NotImplementedException(); + } + + public static void RegisterForFullGCNotification(int maxGenerationThreshold, int largeObjectHeapThreshold) + { + if ((maxGenerationThreshold <= 0) || (maxGenerationThreshold >= 100)) + throw new ArgumentOutOfRangeException(nameof(maxGenerationThreshold), + SR.Format(SR.ArgumentOutOfRange_Bounds_Lower_Upper, 1, 99)); + if ((largeObjectHeapThreshold <= 0) || (largeObjectHeapThreshold >= 100)) + throw new ArgumentOutOfRangeException(nameof(largeObjectHeapThreshold), + SR.Format(SR.ArgumentOutOfRange_Bounds_Lower_Upper, 1, 99)); + + if (!_RegisterForFullGCNotification(maxGenerationThreshold, largeObjectHeapThreshold)) + throw new InvalidOperationException(SR.InvalidOperation_NotWithConcurrentGC); + } + + public static void CancelFullGCNotification() + { + if (!_CancelFullGCNotification()) + throw new InvalidOperationException(SR.InvalidOperation_NotWithConcurrentGC); + } + + public static GCNotificationStatus WaitForFullGCApproach() + { + return (GCNotificationStatus)_WaitForFullGCApproach(-1); + } + + public static GCNotificationStatus WaitForFullGCApproach(int millisecondsTimeout) + { + if (millisecondsTimeout < -1) + throw new ArgumentOutOfRangeException(nameof(millisecondsTimeout), SR.ArgumentOutOfRange_NeedNonNegOrNegative1); + + return _WaitForFullGCApproach(millisecondsTimeout); + } + + public static GCNotificationStatus WaitForFullGCComplete() + { + return _WaitForFullGCComplete(-1); + } + + public static GCNotificationStatus WaitForFullGCComplete(int millisecondsTimeout) + { + if (millisecondsTimeout < -1) + throw new ArgumentOutOfRangeException(nameof(millisecondsTimeout), SR.ArgumentOutOfRange_NeedNonNegOrNegative1); + return _WaitForFullGCComplete(millisecondsTimeout); + } + + private static bool StartNoGCRegion(long totalSize, bool hasLohSize, long lohSize, bool disallowFullBlockingGC) + { + throw new NotImplementedException(); + } + + public static bool TryStartNoGCRegion(long totalSize) => StartNoGCRegion(totalSize, false, 0, false); + + public static bool TryStartNoGCRegion(long totalSize, long lohSize) => StartNoGCRegion(totalSize, true, lohSize, false); + + public static bool TryStartNoGCRegion(long totalSize, bool disallowFullBlockingGC) => StartNoGCRegion(totalSize, false, 0, disallowFullBlockingGC); + + public static bool TryStartNoGCRegion(long totalSize, long lohSize, bool disallowFullBlockingGC) => StartNoGCRegion(totalSize, true, lohSize, disallowFullBlockingGC); + + public static void EndNoGCRegion() + { + throw new NotImplementedException(); + } + + internal static ulong GetSegmentSize() + { + // coreclr default + return 1024 * 1024 * 16; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void _GetGCMemoryInfo(out long highMemoryLoadThresholdBytes, + out long memoryLoadBytes, + out long totalAvailableMemoryBytes, + out long heapSizeBytes, + out long fragmentedBytes); + + public static GCMemoryInfo GetGCMemoryInfo() + { + _GetGCMemoryInfo(out long highMemoryLoadThresholdBytes, + out long memoryLoadBytes, + out long totalAvailableMemoryBytes, + out long heapSizeBytes, + out long fragmentedBytes); + + return new GCMemoryInfo(highMemoryLoadThresholdBytes, memoryLoadBytes, totalAvailableMemoryBytes, heapSizeBytes, fragmentedBytes); + } + + public static T[] AllocateUninitializedArray(int length, bool pinned = false) + { + if (pinned) + throw new NotImplementedException(); + + // Mono only does explicit zeroning if the array is to big for the nursery, but less than 1 Mb - 4 kb. + // If it is bigger than that, we grab memoroy directly from the OS which comes pre-zeroed. + // Experimentation shows that if we just skip the zeroing in this case, we do not save a measurable + // amount of time. So we just allocate the normal way here. + // Revist if we change LOS implementation. + return new T[length]; + } + + public static T[] AllocateArray(int length, bool pinned = false) + { + if (pinned) + throw new NotImplementedException(); + + return new T[length]; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Mono.cs index 58b99e0ccc679..706c3a92a3372 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Mono.cs @@ -5,16 +5,16 @@ namespace System.Globalization { - internal static partial class GlobalizationMode - { - internal static bool Invariant { get; } = GetGlobalizationInvariantMode (); + internal static partial class GlobalizationMode + { + internal static bool Invariant { get; } = GetGlobalizationInvariantMode(); - static bool GetInvariantSwitchValue () - { - var val = Environment.GetEnvironmentVariable ("DOTNET_SYSTEM_GLOBALIZATION_INVARIANT"); - if (val != null) - return Boolean.IsTrueStringIgnoreCase (val) || val.Equals ("1"); - return false; - } - } + private static bool GetInvariantSwitchValue() + { + var val = Environment.GetEnvironmentVariable("DOTNET_SYSTEM_GLOBALIZATION_INVARIANT"); + if (val != null) + return bool.IsTrueStringIgnoreCase(val) || val.Equals("1"); + return false; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Unix.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Unix.Mono.cs index bdf132ea93386..c31e58411a852 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Unix.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Unix.Mono.cs @@ -6,28 +6,29 @@ namespace System.Globalization { - partial class GlobalizationMode - { - static bool GetGlobalizationInvariantMode () - { - bool invariantEnabled = GetInvariantSwitchValue (); - if (invariantEnabled) - return true; + internal partial class GlobalizationMode + { + private static bool GetGlobalizationInvariantMode() + { + bool invariantEnabled = GetInvariantSwitchValue(); + if (invariantEnabled) + return true; - LoadICU (); - return false; - } + LoadICU(); + return false; + } - // Keep this in a separate method to avoid loading the native lib in invariant mode - [MethodImplAttribute (MethodImplOptions.NoInlining)] - static void LoadICU () - { - int res = Interop.Globalization.LoadICU (); - if (res == 0) { - string message = "Couldn't find a valid ICU package installed on the system. " + - "Set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support."; - Environment.FailFast (message); - } - } - } + // Keep this in a separate method to avoid loading the native lib in invariant mode + [MethodImplAttribute(MethodImplOptions.NoInlining)] + private static void LoadICU() + { + int res = Interop.Globalization.LoadICU(); + if (res == 0) + { + string message = "Couldn't find a valid ICU package installed on the system. " + + "Set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support."; + Environment.FailFast(message); + } + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Windows.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Windows.Mono.cs index 2626142335823..326723995fed6 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Windows.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Globalization/GlobalizationMode.Windows.Mono.cs @@ -4,10 +4,11 @@ namespace System.Globalization { - partial class GlobalizationMode - { - static bool GetGlobalizationInvariantMode () { - return GetInvariantSwitchValue (); - } - } + internal partial class GlobalizationMode + { + private static bool GetGlobalizationInvariantMode() + { + return GetInvariantSwitchValue(); + } + } } \ No newline at end of file diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/IO/FileLoadException.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/IO/FileLoadException.Mono.cs index 0ec54d3b99869..bdb30b409a168 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/IO/FileLoadException.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/IO/FileLoadException.Mono.cs @@ -4,11 +4,11 @@ namespace System.IO { - partial class FileLoadException - { - internal static string FormatFileLoadExceptionMessage (string fileName, int hResult) - { - return ""; - } - } + public partial class FileLoadException + { + internal static string FormatFileLoadExceptionMessage(string fileName, int hResult) + { + return ""; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/IO/MonoIOError.cs b/src/mono/netcore/System.Private.CoreLib/src/System/IO/MonoIOError.cs index eec8215485439..6f27c713ddf6e 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/IO/MonoIOError.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/IO/MonoIOError.cs @@ -17,10 +17,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -34,1794 +34,1806 @@ namespace System.IO { - internal enum MonoIOError: int { - ERROR_SUCCESS = 0, - /* ERROR_INVALID_FUNCTION = 1, - */ ERROR_FILE_NOT_FOUND = 2, - ERROR_PATH_NOT_FOUND = 3, - ERROR_TOO_MANY_OPEN_FILES = 4, - ERROR_ACCESS_DENIED = 5, - ERROR_INVALID_HANDLE = 6, - /* ERROR_ARENA_TRASHED = 7, - ERROR_NOT_ENOUGH_MEMORY = 8, - ERROR_INVALID_BLOCK = 9, - ERROR_BAD_ENVIRONMENT = 10, - ERROR_BAD_FORMAT = 11, - ERROR_INVALID_ACCESS = 12, - ERROR_INVALID_DATA = 13, - ERROR_OUTOFMEMORY = 14, - */ ERROR_INVALID_DRIVE = 15, - /* ERROR_CURRENT_DIRECTORY = 16, - */ ERROR_NOT_SAME_DEVICE = 17, - ERROR_NO_MORE_FILES = 18, - /* ERROR_WRITE_PROTECT = 19, - ERROR_BAD_UNIT = 20, - */ - ERROR_NOT_READY = 21, - /* - ERROR_BAD_COMMAND = 22, - ERROR_CRC = 23, - ERROR_BAD_LENGTH = 24, - ERROR_SEEK = 25, - ERROR_NOT_DOS_DISK = 26, - ERROR_SECTOR_NOT_FOUND = 27, - ERROR_OUT_OF_PAPER = 28,*/ - ERROR_WRITE_FAULT = 29, - ERROR_READ_FAULT = 30, - ERROR_GEN_FAILURE = 31, - ERROR_SHARING_VIOLATION = 32, - ERROR_LOCK_VIOLATION = 33, - /* ERROR_WRONG_DISK = 34, - ERROR_SHARING_BUFFER_EXCEEDED = 36, - ERROR_HANDLE_EOF = 38, - */ ERROR_HANDLE_DISK_FULL = 39, - ERROR_NOT_SUPPORTED = 50, - /* ERROR_REM_NOT_LIST = 51, - ERROR_DUP_NAME = 52, - ERROR_BAD_NETPATH = 53, - ERROR_NETWORK_BUSY = 54, - ERROR_DEV_NOT_EXIST = 55, - ERROR_TOO_MANY_CMDS = 56, - ERROR_ADAP_HDW_ERR = 57, - ERROR_BAD_NET_RESP = 58, - ERROR_UNEXP_NET_ERR = 59, - ERROR_BAD_REM_ADAP = 60, - ERROR_PRINTQ_FULL = 61, - ERROR_NO_SPOOL_SPACE = 62, - ERROR_PRINT_CANCELLED = 63, - ERROR_NETNAME_DELETED = 64, - ERROR_NETWORK_ACCESS_DENIED = 65, - ERROR_BAD_DEV_TYPE = 66, - ERROR_BAD_NET_NAME = 67, - ERROR_TOO_MANY_NAMES = 68, - ERROR_TOO_MANY_SESS = 69, - ERROR_SHARING_PAUSED = 70, - ERROR_REQ_NOT_ACCEP = 71, - ERROR_REDIR_PAUSED = 72, - */ ERROR_FILE_EXISTS = 80, - ERROR_CANNOT_MAKE = 82, - /* ERROR_FAIL_I24 = 83, - ERROR_OUT_OF_STRUCTURES = 84, - ERROR_ALREADY_ASSIGNED = 85, - ERROR_INVALID_PASSWORD = 86, - */ ERROR_INVALID_PARAMETER = 87, - /* ERROR_NET_WRITE_FAULT = 88, - ERROR_NO_PROC_SLOTS = 89, - ERROR_TOO_MANY_SEMAPHORES = 100, - ERROR_EXCL_SEM_ALREADY_OWNED = 101, - ERROR_SEM_IS_SET = 102, - ERROR_TOO_MANY_SEM_REQUESTS = 103, - ERROR_INVALID_AT_INTERRUPT_TIME = 104, - ERROR_SEM_OWNER_DIED = 105, - ERROR_SEM_USER_LIMIT = 106, - ERROR_DISK_CHANGE = 107, - ERROR_DRIVE_LOCKED = 108, - */ ERROR_BROKEN_PIPE = 109, - /* ERROR_OPEN_FAILED = 110, - ERROR_BUFFER_OVERFLOW = 111, - ERROR_DISK_FULL = 112, - ERROR_NO_MORE_SEARCH_HANDLES = 113, - ERROR_INVALID_TARGET_HANDLE = 114, - ERROR_INVALID_CATEGORY = 117, - ERROR_INVALID_VERIFY_SWITCH = 118, - ERROR_BAD_DRIVER_LEVEL = 119, - ERROR_CALL_NOT_IMPLEMENTED = 120, - ERROR_SEM_TIMEOUT = 121, - ERROR_INSUFFICIENT_BUFFER = 122, - */ ERROR_INVALID_NAME = 123, - /* ERROR_INVALID_LEVEL = 124, - ERROR_NO_VOLUME_LABEL = 125, - ERROR_MOD_NOT_FOUND = 126, - ERROR_PROC_NOT_FOUND = 127, - ERROR_WAIT_NO_CHILDREN = 128, - ERROR_CHILD_NOT_COMPLETE = 129, - ERROR_DIRECT_ACCESS_HANDLE = 130, - ERROR_NEGATIVE_SEEK = 131, - ERROR_SEEK_ON_DEVICE = 132, - ERROR_IS_JOIN_TARGET = 133, - ERROR_IS_JOINED = 134, - ERROR_IS_SUBSTED = 135, - ERROR_NOT_JOINED = 136, - ERROR_NOT_SUBSTED = 137, - ERROR_JOIN_TO_JOIN = 138, - ERROR_SUBST_TO_SUBST = 139, - ERROR_JOIN_TO_SUBST = 140, - ERROR_SUBST_TO_JOIN = 141, - ERROR_BUSY_DRIVE = 142, - ERROR_SAME_DRIVE = 143, - ERROR_DIR_NOT_ROOT = 144, - */ - ERROR_DIR_NOT_EMPTY = 145, - /* - ERROR_IS_SUBST_PATH = 146, - ERROR_IS_JOIN_PATH = 147, - ERROR_PATH_BUSY = 148, - ERROR_IS_SUBST_TARGET = 149, - ERROR_SYSTEM_TRACE = 150, - ERROR_INVALID_EVENT_COUNT = 151, - ERROR_TOO_MANY_MUXWAITERS = 152, - ERROR_INVALID_LIST_FORMAT = 153, - ERROR_LABEL_TOO_LONG = 154, - ERROR_TOO_MANY_TCBS = 155, - ERROR_SIGNAL_REFUSED = 156, - ERROR_DISCARDED = 157, - ERROR_NOT_LOCKED = 158, - ERROR_BAD_THREADID_ADDR = 159, - ERROR_BAD_ARGUMENTS = 160, - ERROR_BAD_PATHNAME = 161, - ERROR_SIGNAL_PENDING = 162, - ERROR_MAX_THRDS_REACHED = 164, - ERROR_LOCK_FAILED = 167, - ERROR_BUSY = 170, - ERROR_CANCEL_VIOLATION = 173, - ERROR_ATOMIC_LOCKS_NOT_SUPPORTED = 174, - ERROR_INVALID_SEGMENT_NUMBER = 180, - ERROR_INVALID_ORDINAL = 182, - */ ERROR_ALREADY_EXISTS = 183, - /* ERROR_INVALID_FLAG_NUMBER = 186, - ERROR_SEM_NOT_FOUND = 187, - ERROR_INVALID_STARTING_CODESEG = 188, - ERROR_INVALID_STACKSEG = 189, - ERROR_INVALID_MODULETYPE = 190, - ERROR_INVALID_EXE_SIGNATURE = 191, - ERROR_EXE_MARKED_INVALID = 192, - ERROR_BAD_EXE_FORMAT = 193, - ERROR_ITERATED_DATA_EXCEEDS_64k = 194, - ERROR_INVALID_MINALLOCSIZE = 195, - ERROR_DYNLINK_FROM_INVALID_RING = 196, - ERROR_IOPL_NOT_ENABLED = 197, - ERROR_INVALID_SEGDPL = 198, - ERROR_AUTODATASEG_EXCEEDS_64k = 199, - ERROR_RING2SEG_MUST_BE_MOVABLE = 200, - ERROR_RELOC_CHAIN_XEEDS_SEGLIM = 201, - ERROR_INFLOOP_IN_RELOC_CHAIN = 202, - ERROR_ENVVAR_NOT_FOUND = 203, - ERROR_NO_SIGNAL_SENT = 205, - */ ERROR_FILENAME_EXCED_RANGE = 206, - /* ERROR_RING2_STACK_IN_USE = 207, - ERROR_META_EXPANSION_TOO_LONG = 208, - ERROR_INVALID_SIGNAL_NUMBER = 209, - ERROR_THREAD_1_INACTIVE = 210, - ERROR_LOCKED = 212, - ERROR_TOO_MANY_MODULES = 214, - ERROR_NESTING_NOT_ALLOWED = 215, - ERROR_EXE_MACHINE_TYPE_MISMATCH = 216, - ERROR_BAD_PIPE = 230, - ERROR_PIPE_BUSY = 231, - ERROR_NO_DATA = 232, - ERROR_PIPE_NOT_CONNECTED = 233, - ERROR_MORE_DATA = 234, - ERROR_VC_DISCONNECTED = 240, - ERROR_INVALID_EA_NAME = 254, - ERROR_EA_LIST_INCONSISTENT = 255, - WAIT_TIMEOUT = 258, - ERROR_NO_MORE_ITEMS = 259, - ERROR_CANNOT_COPY = 266, - */ ERROR_DIRECTORY = 267, - /* ERROR_EAS_DIDNT_FIT = 275, - ERROR_EA_FILE_CORRUPT = 276, - ERROR_EA_TABLE_FULL = 277, - ERROR_INVALID_EA_HANDLE = 278, - ERROR_EAS_NOT_SUPPORTED = 282, - ERROR_NOT_OWNER = 288, - ERROR_TOO_MANY_POSTS = 298, - ERROR_PARTIAL_COPY = 299, - ERROR_OPLOCK_NOT_GRANTED = 300, - ERROR_INVALID_OPLOCK_PROTOCOL = 301, - ERROR_DISK_TOO_FRAGMENTED = 302, - ERROR_DELETE_PENDING = 303, - ERROR_MR_MID_NOT_FOUND = 317, - ERROR_INVALID_ADDRESS = 487, - ERROR_ARITHMETIC_OVERFLOW = 534, - ERROR_PIPE_CONNECTED = 535, - ERROR_PIPE_LISTENING = 536, - ERROR_EA_ACCESS_DENIED = 994, - ERROR_OPERATION_ABORTED = 995, - ERROR_IO_INCOMPLETE = 996, - ERROR_IO_PENDING = 997, - ERROR_NOACCESS = 998, - ERROR_SWAPERROR = 999, - ERROR_STACK_OVERFLOW = 1001, - ERROR_INVALID_MESSAGE = 1002, - ERROR_CAN_NOT_COMPLETE = 1003, - ERROR_INVALID_FLAGS = 1004, - ERROR_UNRECOGNIZED_VOLUME = 1005, - ERROR_FILE_INVALID = 1006, - ERROR_FULLSCREEN_MODE = 1007, - ERROR_NO_TOKEN = 1008, - ERROR_BADDB = 1009, - ERROR_BADKEY = 1010, - ERROR_CANTOPEN = 1011, - ERROR_CANTREAD = 1012, - ERROR_CANTWRITE = 1013, - ERROR_REGISTRY_RECOVERED = 1014, - ERROR_REGISTRY_CORRUPT = 1015, - ERROR_REGISTRY_IO_FAILED = 1016, - ERROR_NOT_REGISTRY_FILE = 1017, - ERROR_KEY_DELETED = 1018, - ERROR_NO_LOG_SPACE = 1019, - ERROR_KEY_HAS_CHILDREN = 1020, - ERROR_CHILD_MUST_BE_VOLATILE = 1021, - ERROR_NOTIFY_ENUM_DIR = 1022, - ERROR_DEPENDENT_SERVICES_RUNNING = 1051, - ERROR_INVALID_SERVICE_CONTROL = 1052, - ERROR_SERVICE_REQUEST_TIMEOUT = 1053, - ERROR_SERVICE_NO_THREAD = 1054, - ERROR_SERVICE_DATABASE_LOCKED = 1055, - ERROR_SERVICE_ALREADY_RUNNING = 1056, - ERROR_INVALID_SERVICE_ACCOUNT = 1057, - ERROR_SERVICE_DISABLED = 1058, - ERROR_CIRCULAR_DEPENDENCY = 1059, - ERROR_SERVICE_DOES_NOT_EXIST = 1060, - ERROR_SERVICE_CANNOT_ACCEPT_CTRL = 1061, - ERROR_SERVICE_NOT_ACTIVE = 1062, - ERROR_FAILED_SERVICE_CONTROLLER_CONNECT = 1063, - ERROR_EXCEPTION_IN_SERVICE = 1064, - ERROR_DATABASE_DOES_NOT_EXIST = 1065, - ERROR_SERVICE_SPECIFIC_ERROR = 1066, - ERROR_PROCESS_ABORTED = 1067, - ERROR_SERVICE_DEPENDENCY_FAIL = 1068, - ERROR_SERVICE_LOGON_FAILED = 1069, - ERROR_SERVICE_START_HANG = 1070, - ERROR_INVALID_SERVICE_LOCK = 1071, - ERROR_SERVICE_MARKED_FOR_DELETE = 1072, - ERROR_SERVICE_EXISTS = 1073, - ERROR_ALREADY_RUNNING_LKG = 1074, - ERROR_SERVICE_DEPENDENCY_DELETED = 1075, - ERROR_BOOT_ALREADY_ACCEPTED = 1076, - ERROR_SERVICE_NEVER_STARTED = 1077, - ERROR_DUPLICATE_SERVICE_NAME = 1078, - ERROR_DIFFERENT_SERVICE_ACCOUNT = 1079, - ERROR_CANNOT_DETECT_DRIVER_FAILURE = 1080, - ERROR_CANNOT_DETECT_PROCESS_ABORT = 1081, - ERROR_NO_RECOVERY_PROGRAM = 1082, - ERROR_SERVICE_NOT_IN_EXE = 1083, - ERROR_NOT_SAFEBOOT_SERVICE = 1084, - ERROR_END_OF_MEDIA = 1100, - ERROR_FILEMARK_DETECTED = 1101, - ERROR_BEGINNING_OF_MEDIA = 1102, - ERROR_SETMARK_DETECTED = 1103, - ERROR_NO_DATA_DETECTED = 1104, - ERROR_PARTITION_FAILURE = 1105, - ERROR_INVALID_BLOCK_LENGTH = 1106, - ERROR_DEVICE_NOT_PARTITIONED = 1107, - ERROR_UNABLE_TO_LOCK_MEDIA = 1108, - ERROR_UNABLE_TO_UNLOAD_MEDIA = 1109, - ERROR_MEDIA_CHANGED = 1110, - ERROR_BUS_RESET = 1111, - ERROR_NO_MEDIA_IN_DRIVE = 1112, - ERROR_NO_UNICODE_TRANSLATION = 1113, - ERROR_DLL_INIT_FAILED = 1114, - ERROR_SHUTDOWN_IN_PROGRESS = 1115, - ERROR_NO_SHUTDOWN_IN_PROGRESS = 1116, - ERROR_IO_DEVICE = 1117, - ERROR_SERIAL_NO_DEVICE = 1118, - ERROR_IRQ_BUSY = 1119, - ERROR_MORE_WRITES = 1120, - ERROR_COUNTER_TIMEOUT = 1121, - ERROR_FLOPPY_ID_MARK_NOT_FOUND = 1122, - ERROR_FLOPPY_WRONG_CYLINDER = 1123, - ERROR_FLOPPY_UNKNOWN_ERROR = 1124, - ERROR_FLOPPY_BAD_REGISTERS = 1125, - ERROR_DISK_RECALIBRATE_FAILED = 1126, - ERROR_DISK_OPERATION_FAILED = 1127, - ERROR_DISK_RESET_FAILED = 1128, - ERROR_EOM_OVERFLOW = 1129, - ERROR_NOT_ENOUGH_SERVER_MEMORY = 1130, - ERROR_POSSIBLE_DEADLOCK = 1131, - ERROR_MAPPED_ALIGNMENT = 1132, - ERROR_SET_POWER_STATE_VETOED = 1140, - ERROR_SET_POWER_STATE_FAILED = 1141, - ERROR_TOO_MANY_LINKS = 1142, - ERROR_OLD_WIN_VERSION = 1150, - ERROR_APP_WRONG_OS = 1151, - ERROR_SINGLE_INSTANCE_APP = 1152, - ERROR_RMODE_APP = 1153, - ERROR_INVALID_DLL = 1154, - ERROR_NO_ASSOCIATION = 1155, - ERROR_DDE_FAIL = 1156, - ERROR_DLL_NOT_FOUND = 1157, - ERROR_NO_MORE_USER_HANDLES = 1158, - ERROR_MESSAGE_SYNC_ONLY = 1159, - ERROR_SOURCE_ELEMENT_EMPTY = 1160, - ERROR_DESTINATION_ELEMENT_FULL = 1161, - ERROR_ILLEGAL_ELEMENT_ADDRESS = 1162, - ERROR_MAGAZINE_NOT_PRESENT = 1163, - ERROR_DEVICE_REINITIALIZATION_NEEDED = 1164, - ERROR_DEVICE_REQUIRES_CLEANING = 1165, - ERROR_DEVICE_DOOR_OPEN = 1166, - ERROR_DEVICE_NOT_CONNECTED = 1167, - ERROR_NOT_FOUND = 1168, - ERROR_NO_MATCH = 1169, - ERROR_SET_NOT_FOUND = 1170, - ERROR_POINT_NOT_FOUND = 1171, - ERROR_NO_TRACKING_SERVICE = 1172, - ERROR_NO_VOLUME_ID = 1173, - ERROR_UNABLE_TO_REMOVE_REPLACED = 1175, - ERROR_UNABLE_TO_MOVE_REPLACEMENT = 1176, - ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 = 1177, - ERROR_JOURNAL_DELETE_IN_PROGRESS = 1178, - ERROR_JOURNAL_NOT_ACTIVE = 1179, - ERROR_POTENTIAL_FILE_FOUND = 1180, - ERROR_JOURNAL_ENTRY_DELETED = 1181, - ERROR_BAD_DEVICE = 1200, - ERROR_CONNECTION_UNAVAIL = 1201, - ERROR_DEVICE_ALREADY_REMEMBERED = 1202, - ERROR_NO_NET_OR_BAD_PATH = 1203, - ERROR_BAD_PROVIDER = 1204, - ERROR_CANNOT_OPEN_PROFILE = 1205, - ERROR_BAD_PROFILE = 1206, - ERROR_NOT_CONTAINER = 1207, - ERROR_EXTENDED_ERROR = 1208, - ERROR_INVALID_GROUPNAME = 1209, - ERROR_INVALID_COMPUTERNAME = 1210, - ERROR_INVALID_EVENTNAME = 1211, - ERROR_INVALID_DOMAINNAME = 1212, - ERROR_INVALID_SERVICENAME = 1213, - ERROR_INVALID_NETNAME = 1214, - ERROR_INVALID_SHARENAME = 1215, - ERROR_INVALID_PASSWORDNAME = 1216, - ERROR_INVALID_MESSAGENAME = 1217, - ERROR_INVALID_MESSAGEDEST = 1218, - ERROR_SESSION_CREDENTIAL_CONFLICT = 1219, - ERROR_REMOTE_SESSION_LIMIT_EXCEEDED = 1220, - ERROR_DUP_DOMAINNAME = 1221, - ERROR_NO_NETWORK = 1222, - ERROR_CANCELLED = 1223, - ERROR_USER_MAPPED_FILE = 1224, - ERROR_CONNECTION_REFUSED = 1225, - ERROR_GRACEFUL_DISCONNECT = 1226, - ERROR_ADDRESS_ALREADY_ASSOCIATED = 1227, - ERROR_ADDRESS_NOT_ASSOCIATED = 1228, - ERROR_CONNECTION_INVALID = 1229, - ERROR_CONNECTION_ACTIVE = 1230, - ERROR_NETWORK_UNREACHABLE = 1231, - ERROR_HOST_UNREACHABLE = 1232, - ERROR_PROTOCOL_UNREACHABLE = 1233, - ERROR_PORT_UNREACHABLE = 1234, - ERROR_REQUEST_ABORTED = 1235, - ERROR_CONNECTION_ABORTED = 1236, - ERROR_RETRY = 1237, - ERROR_CONNECTION_COUNT_LIMIT = 1238, - ERROR_LOGIN_TIME_RESTRICTION = 1239, - ERROR_LOGIN_WKSTA_RESTRICTION = 1240, - ERROR_INCORRECT_ADDRESS = 1241, - ERROR_ALREADY_REGISTERED = 1242, - ERROR_SERVICE_NOT_FOUND = 1243, - ERROR_NOT_AUTHENTICATED = 1244, - ERROR_NOT_LOGGED_ON = 1245, - ERROR_CONTINUE = 1246, - ERROR_ALREADY_INITIALIZED = 1247, - ERROR_NO_MORE_DEVICES = 1248, - ERROR_NO_SUCH_SITE = 1249, - ERROR_DOMAIN_CONTROLLER_EXISTS = 1250, - ERROR_ONLY_IF_CONNECTED = 1251, - ERROR_OVERRIDE_NOCHANGES = 1252, - ERROR_BAD_USER_PROFILE = 1253, - ERROR_NOT_SUPPORTED_ON_SBS = 1254, - ERROR_SERVER_SHUTDOWN_IN_PROGRESS = 1255, - ERROR_HOST_DOWN = 1256, - ERROR_NON_ACCOUNT_SID = 1257, - ERROR_NON_DOMAIN_SID = 1258, - ERROR_APPHELP_BLOCK = 1259, - ERROR_ACCESS_DISABLED_BY_POLICY = 1260, - ERROR_REG_NAT_CONSUMPTION = 1261, - ERROR_CSCSHARE_OFFLINE = 1262, - ERROR_PKINIT_FAILURE = 1263, - ERROR_SMARTCARD_SUBSYSTEM_FAILURE = 1264, - ERROR_DOWNGRADE_DETECTED = 1265, - SEC_E_SMARTCARD_CERT_REVOKED = 1266, - SEC_E_ISSUING_CA_UNTRUSTED = 1267, - SEC_E_REVOCATION_OFFLINE_C = 1268, - SEC_E_PKINIT_CLIENT_FAILUR = 1269, - SEC_E_SMARTCARD_CERT_EXPIRED = 1270, - ERROR_MACHINE_LOCKED = 1271, - ERROR_CALLBACK_SUPPLIED_INVALID_DATA = 1273, - ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED = 1274, - ERROR_DRIVER_BLOCKED = 1275, - ERROR_INVALID_IMPORT_OF_NON_DLL = 1276, - ERROR_NOT_ALL_ASSIGNED = 1300, - ERROR_SOME_NOT_MAPPED = 1301, - ERROR_NO_QUOTAS_FOR_ACCOUNT = 1302, - ERROR_LOCAL_USER_SESSION_KEY = 1303, - ERROR_NULL_LM_PASSWORD = 1304, - ERROR_UNKNOWN_REVISION = 1305, - ERROR_REVISION_MISMATCH = 1306, - ERROR_INVALID_OWNER = 1307, - ERROR_INVALID_PRIMARY_GROUP = 1308, - ERROR_NO_IMPERSONATION_TOKEN = 1309, - ERROR_CANT_DISABLE_MANDATORY = 1310, - ERROR_NO_LOGON_SERVERS = 1311, - ERROR_NO_SUCH_LOGON_SESSION = 1312, - ERROR_NO_SUCH_PRIVILEGE = 1313, - ERROR_PRIVILEGE_NOT_HELD = 1314, - ERROR_INVALID_ACCOUNT_NAME = 1315, - ERROR_USER_EXISTS = 1316, - ERROR_NO_SUCH_USER = 1317, - ERROR_GROUP_EXISTS = 1318, - ERROR_NO_SUCH_GROUP = 1319, - ERROR_MEMBER_IN_GROUP = 1320, - ERROR_MEMBER_NOT_IN_GROUP = 1321, - ERROR_LAST_ADMIN = 1322, - ERROR_WRONG_PASSWORD = 1323, - ERROR_ILL_FORMED_PASSWORD = 1324, - ERROR_PASSWORD_RESTRICTION = 1325, - ERROR_LOGON_FAILURE = 1326, - ERROR_ACCOUNT_RESTRICTION = 1327, - ERROR_INVALID_LOGON_HOURS = 1328, - ERROR_INVALID_WORKSTATION = 1329, - ERROR_PASSWORD_EXPIRED = 1330, - ERROR_ACCOUNT_DISABLED = 1331, - ERROR_NONE_MAPPED = 1332, - ERROR_TOO_MANY_LUIDS_REQUESTED = 1333, - ERROR_LUIDS_EXHAUSTED = 1334, - ERROR_INVALID_SUB_AUTHORITY = 1335, - ERROR_INVALID_ACL = 1336, - ERROR_INVALID_SID = 1337, - ERROR_INVALID_SECURITY_DESCR = 1338, - ERROR_BAD_INHERITANCE_ACL = 1340, - ERROR_SERVER_DISABLED = 1341, - ERROR_SERVER_NOT_DISABLED = 1342, - ERROR_INVALID_ID_AUTHORITY = 1343, - ERROR_ALLOTTED_SPACE_EXCEEDED = 1344, - ERROR_INVALID_GROUP_ATTRIBUTES = 1345, - ERROR_BAD_IMPERSONATION_LEVEL = 1346, - ERROR_CANT_OPEN_ANONYMOUS = 1347, - ERROR_BAD_VALIDATION_CLASS = 1348, - ERROR_BAD_TOKEN_TYPE = 1349, - ERROR_NO_SECURITY_ON_OBJECT = 1350, - ERROR_CANT_ACCESS_DOMAIN_INFO = 1351, - ERROR_INVALID_SERVER_STATE = 1352, - ERROR_INVALID_DOMAIN_STATE = 1353, - ERROR_INVALID_DOMAIN_ROLE = 1354, - ERROR_NO_SUCH_DOMAIN = 1355, - ERROR_DOMAIN_EXISTS = 1356, - ERROR_DOMAIN_LIMIT_EXCEEDED = 1357, - ERROR_INTERNAL_DB_CORRUPTION = 1358, - ERROR_INTERNAL_ERROR = 1359, - ERROR_GENERIC_NOT_MAPPED = 1360, - ERROR_BAD_DESCRIPTOR_FORMAT = 1361, - ERROR_NOT_LOGON_PROCESS = 1362, - ERROR_LOGON_SESSION_EXISTS = 1363, - ERROR_NO_SUCH_PACKAGE = 1364, - ERROR_BAD_LOGON_SESSION_STATE = 1365, - ERROR_LOGON_SESSION_COLLISION = 1366, - ERROR_INVALID_LOGON_TYPE = 1367, - ERROR_CANNOT_IMPERSONATE = 1368, - ERROR_RXACT_INVALID_STATE = 1369, - ERROR_RXACT_COMMIT_FAILURE = 1370, - ERROR_SPECIAL_ACCOUNT = 1371, - ERROR_SPECIAL_GROUP = 1372, - ERROR_SPECIAL_USER = 1373, - ERROR_MEMBERS_PRIMARY_GROUP = 1374, - ERROR_TOKEN_ALREADY_IN_USE = 1375, - ERROR_NO_SUCH_ALIAS = 1376, - ERROR_MEMBER_NOT_IN_ALIAS = 1377, - ERROR_MEMBER_IN_ALIAS = 1378, - ERROR_ALIAS_EXISTS = 1379, - ERROR_LOGON_NOT_GRANTED = 1380, - ERROR_TOO_MANY_SECRETS = 1381, - ERROR_SECRET_TOO_LONG = 1382, - ERROR_INTERNAL_DB_ERROR = 1383, - ERROR_TOO_MANY_CONTEXT_IDS = 1384, - ERROR_LOGON_TYPE_NOT_GRANTED = 1385, - ERROR_NT_CROSS_ENCRYPTION_REQUIRED = 1386, - ERROR_NO_SUCH_MEMBER = 1387, - ERROR_INVALID_MEMBER = 1388, - ERROR_TOO_MANY_SIDS = 1389, - ERROR_LM_CROSS_ENCRYPTION_REQUIRED = 1390, - ERROR_NO_INHERITANCE = 1391, - ERROR_FILE_CORRUPT = 1392, - ERROR_DISK_CORRUPT = 1393, - ERROR_NO_USER_SESSION_KEY = 1394, - ERROR_LICENSE_QUOTA_EXCEEDED = 1395, - ERROR_WRONG_TARGET_NAME = 1396, - ERROR_MUTUAL_AUTH_FAILED = 1397, - ERROR_TIME_SKEW = 1398, - ERROR_CURRENT_DOMAIN_NOT_ALLOWED = 1399, - ERROR_INVALID_WINDOW_HANDLE = 1400, - ERROR_INVALID_MENU_HANDLE = 1401, - ERROR_INVALID_CURSOR_HANDLE = 1402, - ERROR_INVALID_ACCEL_HANDLE = 1403, - ERROR_INVALID_HOOK_HANDLE = 1404, - ERROR_INVALID_DWP_HANDLE = 1405, - ERROR_TLW_WITH_WSCHILD = 1406, - ERROR_CANNOT_FIND_WND_CLASS = 1407, - ERROR_WINDOW_OF_OTHER_THREAD = 1408, - ERROR_HOTKEY_ALREADY_REGISTERED = 1409, - ERROR_CLASS_ALREADY_EXISTS = 1410, - ERROR_CLASS_DOES_NOT_EXIST = 1411, - ERROR_CLASS_HAS_WINDOWS = 1412, - ERROR_INVALID_INDEX = 1413, - ERROR_INVALID_ICON_HANDLE = 1414, - ERROR_PRIVATE_DIALOG_INDEX = 1415, - ERROR_LISTBOX_ID_NOT_FOUND = 1416, - ERROR_NO_WILDCARD_CHARACTERS = 1417, - ERROR_CLIPBOARD_NOT_OPEN = 1418, - ERROR_HOTKEY_NOT_REGISTERED = 1419, - ERROR_WINDOW_NOT_DIALOG = 1420, - ERROR_CONTROL_ID_NOT_FOUND = 1421, - ERROR_INVALID_COMBOBOX_MESSAGE = 1422, - ERROR_WINDOW_NOT_COMBOBOX = 1423, - ERROR_INVALID_EDIT_HEIGHT = 1424, - ERROR_DC_NOT_FOUND = 1425, - ERROR_INVALID_HOOK_FILTER = 1426, - ERROR_INVALID_FILTER_PROC = 1427, - ERROR_HOOK_NEEDS_HMOD = 1428, - ERROR_GLOBAL_ONLY_HOOK = 1429, - ERROR_JOURNAL_HOOK_SET = 1430, - ERROR_HOOK_NOT_INSTALLED = 1431, - ERROR_INVALID_LB_MESSAGE = 1432, - ERROR_SETCOUNT_ON_BAD_LB = 1433, - ERROR_LB_WITHOUT_TABSTOPS = 1434, - ERROR_DESTROY_OBJECT_OF_OTHER_THREAD = 1435, - ERROR_CHILD_WINDOW_MENU = 1436, - ERROR_NO_SYSTEM_MENU = 1437, - ERROR_INVALID_MSGBOX_STYLE = 1438, - ERROR_INVALID_SPI_VALUE = 1439, - ERROR_SCREEN_ALREADY_LOCKED = 1440, - ERROR_HWNDS_HAVE_DIFF_PARENT = 1441, - ERROR_NOT_CHILD_WINDOW = 1442, - ERROR_INVALID_GW_COMMAND = 1443, - ERROR_INVALID_THREAD_ID = 1444, - ERROR_NON_MDICHILD_WINDOW = 1445, - ERROR_POPUP_ALREADY_ACTIVE = 1446, - ERROR_NO_SCROLLBARS = 1447, - ERROR_INVALID_SCROLLBAR_RANGE = 1448, - ERROR_INVALID_SHOWWIN_COMMAND = 1449, - ERROR_NO_SYSTEM_RESOURCES = 1450, - ERROR_NONPAGED_SYSTEM_RESOURCES = 1451, - ERROR_PAGED_SYSTEM_RESOURCES = 1452, - ERROR_WORKING_SET_QUOTA = 1453, - ERROR_PAGEFILE_QUOTA = 1454, - ERROR_COMMITMENT_LIMIT = 1455, - ERROR_MENU_ITEM_NOT_FOUND = 1456, - ERROR_INVALID_KEYBOARD_HANDLE = 1457, - ERROR_HOOK_TYPE_NOT_ALLOWED = 1458, - ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION = 1459, - ERROR_TIMEOUT = 1460, - ERROR_INVALID_MONITOR_HANDLE = 1461, - ERROR_EVENTLOG_FILE_CORRUPT = 1500, - ERROR_EVENTLOG_CANT_START = 1501, - ERROR_LOG_FILE_FULL = 1502, - ERROR_EVENTLOG_FILE_CHANGED = 1503, - ERROR_INSTALL_SERVICE_FAILURE = 1601, - ERROR_INSTALL_USEREXIT = 1602, - ERROR_INSTALL_FAILURE = 1603, - ERROR_INSTALL_SUSPEND = 1604, - ERROR_UNKNOWN_PRODUCT = 1605, - ERROR_UNKNOWN_FEATURE = 1606, - ERROR_UNKNOWN_COMPONENT = 1607, - ERROR_UNKNOWN_PROPERTY = 1608, - ERROR_INVALID_HANDLE_STATE = 1609, - ERROR_BAD_CONFIGURATION = 1610, - ERROR_INDEX_ABSENT = 1611, - ERROR_INSTALL_SOURCE_ABSENT = 1612, - ERROR_INSTALL_PACKAGE_VERSION = 1613, - ERROR_PRODUCT_UNINSTALLED = 1614, - ERROR_BAD_QUERY_SYNTAX = 1615, - ERROR_INVALID_FIELD = 1616, - ERROR_DEVICE_REMOVED = 1617, - ERROR_INSTALL_ALREADY_RUNNING = 1618, - ERROR_INSTALL_PACKAGE_OPEN_FAILED = 1619, - ERROR_INSTALL_PACKAGE_INVALID = 1620, - ERROR_INSTALL_UI_FAILURE = 1621, - ERROR_INSTALL_LOG_FAILURE = 1622, - ERROR_INSTALL_LANGUAGE_UNSUPPORTED = 1623, - ERROR_INSTALL_TRANSFORM_FAILURE = 1624, - ERROR_INSTALL_PACKAGE_REJECTED = 1625, - ERROR_FUNCTION_NOT_CALLED = 1626, - ERROR_FUNCTION_FAILED = 1627, - ERROR_INVALID_TABLE = 1628, - ERROR_DATATYPE_MISMATCH = 1629, - ERROR_UNSUPPORTED_TYPE = 1630, - ERROR_CREATE_FAILED = 1631, - ERROR_INSTALL_TEMP_UNWRITABLE = 1632, - ERROR_INSTALL_PLATFORM_UNSUPPORTED = 1633, - ERROR_INSTALL_NOTUSED = 1634, - ERROR_PATCH_PACKAGE_OPEN_FAILED = 1635, - ERROR_PATCH_PACKAGE_INVALID = 1636, - ERROR_PATCH_PACKAGE_UNSUPPORTED = 1637, - ERROR_PRODUCT_VERSION = 1638, - ERROR_INVALID_COMMAND_LINE = 1639, - ERROR_INSTALL_REMOTE_DISALLOWED = 1640, - ERROR_SUCCESS_REBOOT_INITIATED = 1641, - ERROR_PATCH_TARGET_NOT_FOUND = 1642, - ERROR_PATCH_PACKAGE_REJECTED = 1643, - ERROR_INSTALL_TRANSFORM_REJECTED = 1644, - RPC_S_INVALID_STRING_BINDING = 1700, - RPC_S_WRONG_KIND_OF_BINDING = 1701, - RPC_S_INVALID_BINDING = 1702, - RPC_S_PROTSEQ_NOT_SUPPORTED = 1703, - RPC_S_INVALID_RPC_PROTSEQ = 1704, - RPC_S_INVALID_STRING_UUID = 1705, - RPC_S_INVALID_ENDPOINT_FORMAT = 1706, - RPC_S_INVALID_NET_ADDR = 1707, - RPC_S_NO_ENDPOINT_FOUND = 1708, - RPC_S_INVALID_TIMEOUT = 1709, - RPC_S_OBJECT_NOT_FOUND = 1710, - RPC_S_ALREADY_REGISTERED = 1711, - RPC_S_TYPE_ALREADY_REGISTERED = 1712, - RPC_S_ALREADY_LISTENING = 1713, - RPC_S_NO_PROTSEQS_REGISTERED = 1714, - RPC_S_NOT_LISTENING = 1715, - RPC_S_UNKNOWN_MGR_TYPE = 1716, - RPC_S_UNKNOWN_IF = 1717, - RPC_S_NO_BINDINGS = 1718, - RPC_S_NO_PROTSEQS = 1719, - RPC_S_CANT_CREATE_ENDPOINT = 1720, - RPC_S_OUT_OF_RESOURCES = 1721, - RPC_S_SERVER_UNAVAILABLE = 1722, - RPC_S_SERVER_TOO_BUSY = 1723, - RPC_S_INVALID_NETWORK_OPTIONS = 1724, - RPC_S_NO_CALL_ACTIVE = 1725, - RPC_S_CALL_FAILED = 1726, - RPC_S_CALL_FAILED_DNE = 1727, - RPC_S_PROTOCOL_ERROR = 1728, - RPC_S_UNSUPPORTED_TRANS_SYN = 1730, - RPC_S_UNSUPPORTED_TYPE = 1732, - RPC_S_INVALID_TAG = 1733, - RPC_S_INVALID_BOUND = 1734, - RPC_S_NO_ENTRY_NAME = 1735, - RPC_S_INVALID_NAME_SYNTAX = 1736, - RPC_S_UNSUPPORTED_NAME_SYNTAX = 1737, - RPC_S_UUID_NO_ADDRESS = 1739, - RPC_S_DUPLICATE_ENDPOINT = 1740, - RPC_S_UNKNOWN_AUTHN_TYPE = 1741, - RPC_S_MAX_CALLS_TOO_SMALL = 1742, - RPC_S_STRING_TOO_LONG = 1743, - RPC_S_PROTSEQ_NOT_FOUND = 1744, - RPC_S_PROCNUM_OUT_OF_RANGE = 1745, - RPC_S_BINDING_HAS_NO_AUTH = 1746, - RPC_S_UNKNOWN_AUTHN_SERVICE = 1747, - RPC_S_UNKNOWN_AUTHN_LEVEL = 1748, - RPC_S_INVALID_AUTH_IDENTITY = 1749, - RPC_S_UNKNOWN_AUTHZ_SERVICE = 1750, - EPT_S_INVALID_ENTRY = 1751, - EPT_S_CANT_PERFORM_OP = 1752, - EPT_S_NOT_REGISTERED = 1753, - RPC_S_NOTHING_TO_EXPORT = 1754, - RPC_S_INCOMPLETE_NAME = 1755, - RPC_S_INVALID_VERS_OPTION = 1756, - RPC_S_NO_MORE_MEMBERS = 1757, - RPC_S_NOT_ALL_OBJS_UNEXPORTED = 1758, - RPC_S_INTERFACE_NOT_FOUND = 1759, - RPC_S_ENTRY_ALREADY_EXISTS = 1760, - RPC_S_ENTRY_NOT_FOUND = 1761, - RPC_S_NAME_SERVICE_UNAVAILABLE = 1762, - RPC_S_INVALID_NAF_ID = 1763, - RPC_S_CANNOT_SUPPORT = 1764, - RPC_S_NO_CONTEXT_AVAILABLE = 1765, - RPC_S_INTERNAL_ERROR = 1766, - RPC_S_ZERO_DIVIDE = 1767, - RPC_S_ADDRESS_ERROR = 1768, - RPC_S_FP_DIV_ZERO = 1769, - RPC_S_FP_UNDERFLOW = 1770, - RPC_S_FP_OVERFLOW = 1771, - RPC_X_NO_MORE_ENTRIES = 1772, - RPC_X_SS_CHAR_TRANS_OPEN_FAIL = 1773, - RPC_X_SS_CHAR_TRANS_SHORT_FILE = 1774, - RPC_X_SS_IN_NULL_CONTEXT = 1775, - RPC_X_SS_CONTEXT_DAMAGED = 1777, - RPC_X_SS_HANDLES_MISMATCH = 1778, - RPC_X_SS_CANNOT_GET_CALL_HANDLE = 1779, - RPC_X_NULL_REF_POINTER = 1780, - RPC_X_ENUM_VALUE_OUT_OF_RANGE = 1781, - RPC_X_BYTE_COUNT_TOO_SMALL = 1782, - RPC_X_BAD_STUB_DATA = 1783, - ERROR_INVALID_USER_BUFFER = 1784, - ERROR_UNRECOGNIZED_MEDIA = 1785, - ERROR_NO_TRUST_LSA_SECRET = 1786, - ERROR_NO_TRUST_SAM_ACCOUNT = 1787, - ERROR_TRUSTED_DOMAIN_FAILURE = 1788, - ERROR_TRUSTED_RELATIONSHIP_FAILURE = 1789, - ERROR_TRUST_FAILURE = 1790, - RPC_S_CALL_IN_PROGRESS = 1791, - ERROR_NETLOGON_NOT_STARTED = 1792, - ERROR_ACCOUNT_EXPIRED = 1793, - ERROR_REDIRECTOR_HAS_OPEN_HANDLES = 1794, - ERROR_PRINTER_DRIVER_ALREADY_INSTALLED = 1795, - ERROR_UNKNOWN_PORT = 1796, - ERROR_UNKNOWN_PRINTER_DRIVER = 1797, - ERROR_UNKNOWN_PRINTPROCESSOR = 1798, - ERROR_INVALID_SEPARATOR_FILE = 1799, - ERROR_INVALID_PRIORITY = 1800, - ERROR_INVALID_PRINTER_NAME = 1801, - ERROR_PRINTER_ALREADY_EXISTS = 1802, - ERROR_INVALID_PRINTER_COMMAND = 1803, - ERROR_INVALID_DATATYPE = 1804, - ERROR_INVALID_ENVIRONMENT = 1805, - RPC_S_NO_MORE_BINDINGS = 1806, - ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = 1807, - ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT = 1808, - ERROR_NOLOGON_SERVER_TRUST_ACCOUNT = 1809, - ERROR_DOMAIN_TRUST_INCONSISTENT = 1810, - ERROR_SERVER_HAS_OPEN_HANDLES = 1811, - ERROR_RESOURCE_DATA_NOT_FOUND = 1812, - ERROR_RESOURCE_TYPE_NOT_FOUND = 1813, - ERROR_RESOURCE_NAME_NOT_FOUND = 1814, - ERROR_RESOURCE_LANG_NOT_FOUND = 1815, - ERROR_NOT_ENOUGH_QUOTA = 1816, - RPC_S_NO_INTERFACES = 1817, - RPC_S_CALL_CANCELLED = 1818, - RPC_S_BINDING_INCOMPLETE = 1819, - RPC_S_COMM_FAILURE = 1820, - RPC_S_UNSUPPORTED_AUTHN_LEVEL = 1821, - RPC_S_NO_PRINC_NAME = 1822, - RPC_S_NOT_RPC_ERROR = 1823, - RPC_S_UUID_LOCAL_ONLY = 1824, - RPC_S_SEC_PKG_ERROR = 1825, - RPC_S_NOT_CANCELLED = 1826, - RPC_X_INVALID_ES_ACTION = 1827, - RPC_X_WRONG_ES_VERSION = 1828, - RPC_X_WRONG_STUB_VERSION = 1829, - RPC_X_INVALID_PIPE_OBJECT = 1830, - RPC_X_WRONG_PIPE_ORDER = 1831, - RPC_X_WRONG_PIPE_VERSION = 1832, - RPC_S_GROUP_MEMBER_NOT_FOUND = 1898, - EPT_S_CANT_CREATE = 1899, - RPC_S_INVALID_OBJECT = 1900, - ERROR_INVALID_TIME = 1901, - ERROR_INVALID_FORM_NAME = 1902, - ERROR_INVALID_FORM_SIZE = 1903, - ERROR_ALREADY_WAITING = 1904, - ERROR_PRINTER_DELETED = 1905, - ERROR_INVALID_PRINTER_STATE = 1906, - ERROR_PASSWORD_MUST_CHANGE = 1907, - ERROR_DOMAIN_CONTROLLER_NOT_FOUND = 1908, - ERROR_ACCOUNT_LOCKED_OUT = 1909, - OR_INVALID_OXID = 1910, - OR_INVALID_OID = 1911, - OR_INVALID_SET = 1912, - RPC_S_SEND_INCOMPLETE = 1913, - RPC_S_INVALID_ASYNC_HANDLE = 1914, - RPC_S_INVALID_ASYNC_CALL = 1915, - RPC_X_PIPE_CLOSED = 1916, - RPC_X_PIPE_DISCIPLINE_ERROR = 1917, - RPC_X_PIPE_EMPTY = 1918, - ERROR_NO_SITENAME = 1919, - ERROR_CANT_ACCESS_FILE = 1920, - ERROR_CANT_RESOLVE_FILENAME = 1921, - RPC_S_ENTRY_TYPE_MISMATCH = 1922, - RPC_S_NOT_ALL_OBJS_EXPORTED = 1923, - RPC_S_INTERFACE_NOT_EXPORTED = 1924, - RPC_S_PROFILE_NOT_ADDED = 1925, - RPC_S_PRF_ELT_NOT_ADDED = 1926, - RPC_S_PRF_ELT_NOT_REMOVED = 1927, - RPC_S_GRP_ELT_NOT_ADDED = 1928, - RPC_S_GRP_ELT_NOT_REMOVED = 1929, - ERROR_KM_DRIVER_BLOCKED = 1930, - ERROR_CONTEXT_EXPIRED = 1931, - ERROR_INVALID_PIXEL_FORMAT = 2000, - ERROR_BAD_DRIVER = 2001, - ERROR_INVALID_WINDOW_STYLE = 2002, - ERROR_METAFILE_NOT_SUPPORTED = 2003, - ERROR_TRANSFORM_NOT_SUPPORTED = 2004, - ERROR_CLIPPING_NOT_SUPPORTED = 2005, - ERROR_INVALID_CMM = 2010, - ERROR_INVALID_PROFILE = 2011, - ERROR_TAG_NOT_FOUND = 2012, - ERROR_TAG_NOT_PRESENT = 2013, - ERROR_DUPLICATE_TAG = 2014, - ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE = 2015, - ERROR_PROFILE_NOT_FOUND = 2016, - ERROR_INVALID_COLORSPACE = 2017, - ERROR_ICM_NOT_ENABLED = 2018, - ERROR_DELETING_ICM_XFORM = 2019, - ERROR_INVALID_TRANSFORM = 2020, - ERROR_COLORSPACE_MISMATCH = 2021, - ERROR_INVALID_COLORINDEX = 2022, - ERROR_CONNECTED_OTHER_PASSWORD = 2108, - ERROR_CONNECTED_OTHER_PASSWORD_DEFAULT = 2109, - ERROR_BAD_USERNAME = 2202, - ERROR_NOT_CONNECTED = 2250, - ERROR_OPEN_FILES = 2401, - ERROR_ACTIVE_CONNECTIONS = 2402, - ERROR_DEVICE_IN_USE = 2404, - ERROR_UNKNOWN_PRINT_MONITOR = 3000, - ERROR_PRINTER_DRIVER_IN_USE = 3001, - ERROR_SPOOL_FILE_NOT_FOUND = 3002, - ERROR_SPL_NO_STARTDOC = 3003, - ERROR_SPL_NO_ADDJOB = 3004, - ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED = 3005, - ERROR_PRINT_MONITOR_ALREADY_INSTALLED = 3006, - ERROR_INVALID_PRINT_MONITOR = 3007, - ERROR_PRINT_MONITOR_IN_USE = 3008, - ERROR_PRINTER_HAS_JOBS_QUEUED = 3009, - ERROR_SUCCESS_REBOOT_REQUIRED = 3010, - ERROR_SUCCESS_RESTART_REQUIRED = 3011, - ERROR_PRINTER_NOT_FOUND = 3012, - ERROR_PRINTER_DRIVER_WARNED = 3013, - ERROR_PRINTER_DRIVER_BLOCKED = 3014, - ERROR_WINS_INTERNAL = 4000, - ERROR_CAN_NOT_DEL_LOCAL_WINS = 4001, - ERROR_STATIC_INIT = 4002, - ERROR_INC_BACKUP = 4003, - ERROR_FULL_BACKUP = 4004, - ERROR_REC_NON_EXISTENT = 4005, - ERROR_RPL_NOT_ALLOWED = 4006, - ERROR_DHCP_ADDRESS_CONFLICT = 4100, - ERROR_WMI_GUID_NOT_FOUND = 4200, - ERROR_WMI_INSTANCE_NOT_FOUND = 4201, - ERROR_WMI_ITEMID_NOT_FOUND = 4202, - ERROR_WMI_TRY_AGAIN = 4203, - ERROR_WMI_DP_NOT_FOUND = 4204, - ERROR_WMI_UNRESOLVED_INSTANCE_REF = 4205, - ERROR_WMI_ALREADY_ENABLED = 4206, - ERROR_WMI_GUID_DISCONNECTED = 4207, - ERROR_WMI_SERVER_UNAVAILABLE = 4208, - ERROR_WMI_DP_FAILED = 4209, - ERROR_WMI_INVALID_MOF = 4210, - ERROR_WMI_INVALID_REGINFO = 4211, - ERROR_WMI_ALREADY_DISABLED = 4212, - ERROR_WMI_READ_ONLY = 4213, - ERROR_WMI_SET_FAILURE = 4214, - ERROR_INVALID_MEDIA = 4300, - ERROR_INVALID_LIBRARY = 4301, - ERROR_INVALID_MEDIA_POOL = 4302, - ERROR_DRIVE_MEDIA_MISMATCH = 4303, - ERROR_MEDIA_OFFLINE = 4304, - ERROR_LIBRARY_OFFLINE = 4305, - ERROR_EMPTY = 4306, - ERROR_NOT_EMPTY = 4307, - ERROR_MEDIA_UNAVAILABLE = 4308, - ERROR_RESOURCE_DISABLED = 4309, - ERROR_INVALID_CLEANER = 4310, - ERROR_UNABLE_TO_CLEAN = 4311, - ERROR_OBJECT_NOT_FOUND = 4312, - ERROR_DATABASE_FAILURE = 4313, - ERROR_DATABASE_FULL = 4314, - ERROR_MEDIA_INCOMPATIBLE = 4315, - ERROR_RESOURCE_NOT_PRESENT = 4316, - ERROR_INVALID_OPERATION = 4317, - ERROR_MEDIA_NOT_AVAILABLE = 4318, - ERROR_DEVICE_NOT_AVAILABLE = 4319, - ERROR_REQUEST_REFUSED = 4320, - ERROR_INVALID_DRIVE_OBJECT = 4321, - ERROR_LIBRARY_FULL = 4322, - ERROR_MEDIUM_NOT_ACCESSIBLE = 4323, - ERROR_UNABLE_TO_LOAD_MEDIUM = 4324, - ERROR_UNABLE_TO_INVENTORY_DRIVE = 4325, - ERROR_UNABLE_TO_INVENTORY_SLOT = 4326, - ERROR_UNABLE_TO_INVENTORY_TRANSPORT = 4327, - ERROR_TRANSPORT_FULL = 4328, - ERROR_CONTROLLING_IEPORT = 4329, - ERROR_UNABLE_TO_EJECT_MOUNTED_MEDIA = 4330, - ERROR_CLEANER_SLOT_SET = 4331, - ERROR_CLEANER_SLOT_NOT_SET = 4332, - ERROR_CLEANER_CARTRIDGE_SPENT = 4333, - ERROR_UNEXPECTED_OMID = 4334, - ERROR_CANT_DELETE_LAST_ITEM = 4335, - ERROR_MESSAGE_EXCEEDS_MAX_SIZE = 4336, - ERROR_VOLUME_CONTAINS_SYS_FILES = 4337, - ERROR_INDIGENOUS_TYPE = 4338, - ERROR_NO_SUPPORTING_DRIVES = 4339, - ERROR_CLEANER_CARTRIDGE_INSTALLED = 4340, - ERROR_FILE_OFFLINE = 4350, - ERROR_REMOTE_STORAGE_NOT_ACTIVE = 4351, - ERROR_REMOTE_STORAGE_MEDIA_ERROR = 4352, - ERROR_NOT_A_REPARSE_POINT = 4390, - ERROR_REPARSE_ATTRIBUTE_CONFLICT = 4391, - ERROR_INVALID_REPARSE_DATA = 4392, - ERROR_REPARSE_TAG_INVALID = 4393, - ERROR_REPARSE_TAG_MISMATCH = 4394, - ERROR_VOLUME_NOT_SIS_ENABLED = 4500, - ERROR_DEPENDENT_RESOURCE_EXISTS = 5001, - ERROR_DEPENDENCY_NOT_FOUND = 5002, - ERROR_DEPENDENCY_ALREADY_EXISTS = 5003, - ERROR_RESOURCE_NOT_ONLINE = 5004, - ERROR_HOST_NODE_NOT_AVAILABLE = 5005, - ERROR_RESOURCE_NOT_AVAILABLE = 5006, - ERROR_RESOURCE_NOT_FOUND = 5007, - ERROR_SHUTDOWN_CLUSTER = 5008, - ERROR_CANT_EVICT_ACTIVE_NODE = 5009, - ERROR_OBJECT_ALREADY_EXISTS = 5010, - ERROR_OBJECT_IN_LIST = 5011, - ERROR_GROUP_NOT_AVAILABLE = 5012, - ERROR_GROUP_NOT_FOUND = 5013, - ERROR_GROUP_NOT_ONLINE = 5014, - ERROR_HOST_NODE_NOT_RESOURCE_OWNER = 5015, - ERROR_HOST_NODE_NOT_GROUP_OWNER = 5016, - ERROR_RESMON_CREATE_FAILED = 5017, - ERROR_RESMON_ONLINE_FAILED = 5018, - ERROR_RESOURCE_ONLINE = 5019, - ERROR_QUORUM_RESOURCE = 5020, - ERROR_NOT_QUORUM_CAPABLE = 5021, - ERROR_CLUSTER_SHUTTING_DOWN = 5022, - ERROR_INVALID_STATE = 5023, - ERROR_RESOURCE_PROPERTIES_STORED = 5024, - ERROR_NOT_QUORUM_CLASS = 5025, - ERROR_CORE_RESOURCE = 5026, - ERROR_QUORUM_RESOURCE_ONLINE_FAILED = 5027, - ERROR_QUORUMLOG_OPEN_FAILED = 5028, - ERROR_CLUSTERLOG_CORRUPT = 5029, - ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZE = 5030, - ERROR_CLUSTERLOG_EXCEEDS_MAXSIZE = 5031, - ERROR_CLUSTERLOG_CHKPOINT_NOT_FOUND = 5032, - ERROR_CLUSTERLOG_NOT_ENOUGH_SPACE = 5033, - ERROR_QUORUM_OWNER_ALIVE = 5034, - ERROR_NETWORK_NOT_AVAILABLE = 5035, - ERROR_NODE_NOT_AVAILABLE = 5036, - ERROR_ALL_NODES_NOT_AVAILABLE = 5037, - ERROR_RESOURCE_FAILED = 5038, - ERROR_CLUSTER_INVALID_NODE = 5039, - ERROR_CLUSTER_NODE_EXISTS = 5040, - ERROR_CLUSTER_JOIN_IN_PROGRESS = 5041, - ERROR_CLUSTER_NODE_NOT_FOUND = 5042, - ERROR_CLUSTER_LOCAL_NODE_NOT_FOUND = 5043, - ERROR_CLUSTER_NETWORK_EXISTS = 5044, - ERROR_CLUSTER_NETWORK_NOT_FOUND = 5045, - ERROR_CLUSTER_NETINTERFACE_EXISTS = 5046, - ERROR_CLUSTER_NETINTERFACE_NOT_FOUND = 5047, - ERROR_CLUSTER_INVALID_REQUEST = 5048, - ERROR_CLUSTER_INVALID_NETWORK_PROVIDER = 5049, - ERROR_CLUSTER_NODE_DOWN = 5050, - ERROR_CLUSTER_NODE_UNREACHABLE = 5051, - ERROR_CLUSTER_NODE_NOT_MEMBER = 5052, - ERROR_CLUSTER_JOIN_NOT_IN_PROGRESS = 5053, - ERROR_CLUSTER_INVALID_NETWORK = 5054, - ERROR_CLUSTER_NODE_UP = 5056, - ERROR_CLUSTER_IPADDR_IN_USE = 5057, - ERROR_CLUSTER_NODE_NOT_PAUSED = 5058, - ERROR_CLUSTER_NO_SECURITY_CONTEXT = 5059, - ERROR_CLUSTER_NETWORK_NOT_INTERNAL = 5060, - ERROR_CLUSTER_NODE_ALREADY_UP = 5061, - ERROR_CLUSTER_NODE_ALREADY_DOWN = 5062, - ERROR_CLUSTER_NETWORK_ALREADY_ONLINE = 5063, - ERROR_CLUSTER_NETWORK_ALREADY_OFFLINE = 5064, - ERROR_CLUSTER_NODE_ALREADY_MEMBER = 5065, - ERROR_CLUSTER_LAST_INTERNAL_NETWORK = 5066, - ERROR_CLUSTER_NETWORK_HAS_DEPENDENTS = 5067, - ERROR_INVALID_OPERATION_ON_QUORUM = 5068, - ERROR_DEPENDENCY_NOT_ALLOWED = 5069, - ERROR_CLUSTER_NODE_PAUSED = 5070, - ERROR_NODE_CANT_HOST_RESOURCE = 5071, - ERROR_CLUSTER_NODE_NOT_READY = 5072, - ERROR_CLUSTER_NODE_SHUTTING_DOWN = 5073, - ERROR_CLUSTER_JOIN_ABORTED = 5074, - ERROR_CLUSTER_INCOMPATIBLE_VERSIONS = 5075, - ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDED = 5076, - ERROR_CLUSTER_SYSTEM_CONFIG_CHANGED = 5077, - ERROR_CLUSTER_RESOURCE_TYPE_NOT_FOUND = 5078, - ERROR_CLUSTER_RESTYPE_NOT_SUPPORTED = 5079, - ERROR_CLUSTER_RESNAME_NOT_FOUND = 5080, - ERROR_CLUSTER_NO_RPC_PACKAGES_REGISTERED = 5081, - ERROR_CLUSTER_OWNER_NOT_IN_PREFLIST = 5082, - ERROR_CLUSTER_DATABASE_SEQMISMATCH = 5083, - ERROR_RESMON_INVALID_STATE = 5084, - ERROR_CLUSTER_GUM_NOT_LOCKER = 5085, - ERROR_QUORUM_DISK_NOT_FOUND = 5086, - ERROR_DATABASE_BACKUP_CORRUPT = 5087, - ERROR_CLUSTER_NODE_ALREADY_HAS_DFS_ROOT = 5088, - ERROR_RESOURCE_PROPERTY_UNCHANGEABLE = 5089, - ERROR_CLUSTER_MEMBERSHIP_INVALID_STATE = 5890, - ERROR_CLUSTER_QUORUMLOG_NOT_FOUND = 5891, - ERROR_CLUSTER_MEMBERSHIP_HALT = 5892, - ERROR_CLUSTER_INSTANCE_ID_MISMATCH = 5893, - ERROR_CLUSTER_NETWORK_NOT_FOUND_FOR_IP = 5894, - ERROR_CLUSTER_PROPERTY_DATA_TYPE_MISMATCH = 5895, - ERROR_CLUSTER_EVICT_WITHOUT_CLEANUP = 5896, - ERROR_CLUSTER_PARAMETER_MISMATCH = 5897, - ERROR_NODE_CANNOT_BE_CLUSTERED = 5898, - ERROR_CLUSTER_WRONG_OS_VERSION = 5899, - ERROR_CLUSTER_CANT_CREATE_DUP_CLUSTER_NAME = 5900, - */ - ERROR_ENCRYPTION_FAILED = 6000, - /* - ERROR_DECRYPTION_FAILED = 6001, - ERROR_FILE_ENCRYPTED = 6002, - ERROR_NO_RECOVERY_POLICY = 6003, - ERROR_NO_EFS = 6004, - ERROR_WRONG_EFS = 6005, - ERROR_NO_USER_KEYS = 6006, - ERROR_FILE_NOT_ENCRYPTED = 6007, - ERROR_NOT_EXPORT_FORMAT = 6008, - ERROR_FILE_READ_ONLY = 6009, - ERROR_DIR_EFS_DISALLOWED = 6010, - ERROR_EFS_SERVER_NOT_TRUSTED = 6011, - ERROR_BAD_RECOVERY_POLICY = 6012, - ERROR_EFS_ALG_BLOB_TOO_BIG = 6013, - ERROR_VOLUME_NOT_SUPPORT_EFS = 6014, - ERROR_EFS_DISABLED = 6015, - ERROR_EFS_VERSION_NOT_SUPPORT = 6016, - ERROR_NO_BROWSER_SERVERS_FOUND = 6118, - SCHED_E_SERVICE_NOT_LOCALSYSTEM = 6200, - ERROR_CTX_WINSTATION_NAME_INVALID = 7001, - ERROR_CTX_INVALID_PD = 7002, - ERROR_CTX_PD_NOT_FOUND = 7003, - ERROR_CTX_WD_NOT_FOUND = 7004, - ERROR_CTX_CANNOT_MAKE_EVENTLOG_ENTRY = 7005, - ERROR_CTX_SERVICE_NAME_COLLISION = 7006, - ERROR_CTX_CLOSE_PENDING = 7007, - ERROR_CTX_NO_OUTBUF = 7008, - ERROR_CTX_MODEM_INF_NOT_FOUND = 7009, - ERROR_CTX_INVALID_MODEMNAME = 7010, - ERROR_CTX_MODEM_RESPONSE_ERROR = 7011, - ERROR_CTX_MODEM_RESPONSE_TIMEOUT = 7012, - ERROR_CTX_MODEM_RESPONSE_NO_CARRIER = 7013, - ERROR_CTX_MODEM_RESPONSE_NO_DIALTONE = 7014, - ERROR_CTX_MODEM_RESPONSE_BUSY = 7015, - ERROR_CTX_MODEM_RESPONSE_VOICE = 7016, - ERROR_CTX_TD_ERROR = 7017, - ERROR_CTX_WINSTATION_NOT_FOUND = 7022, - ERROR_CTX_WINSTATION_ALREADY_EXISTS = 7023, - ERROR_CTX_WINSTATION_BUSY = 7024, - ERROR_CTX_BAD_VIDEO_MODE = 7025, - ERROR_CTX_GRAPHICS_INVALID = 7035, - ERROR_CTX_LOGON_DISABLED = 7037, - ERROR_CTX_NOT_CONSOLE = 7038, - ERROR_CTX_CLIENT_QUERY_TIMEOUT = 7040, - ERROR_CTX_CONSOLE_DISCONNECT = 7041, - ERROR_CTX_CONSOLE_CONNECT = 7042, - ERROR_CTX_SHADOW_DENIED = 7044, - ERROR_CTX_WINSTATION_ACCESS_DENIED = 7045, - ERROR_CTX_INVALID_WD = 7049, - ERROR_CTX_SHADOW_INVALID = 7050, - ERROR_CTX_SHADOW_DISABLED = 7051, - ERROR_CTX_CLIENT_LICENSE_IN_USE = 7052, - ERROR_CTX_CLIENT_LICENSE_NOT_SET = 7053, - ERROR_CTX_LICENSE_NOT_AVAILABLE = 7054, - ERROR_CTX_LICENSE_CLIENT_INVALID = 7055, - ERROR_CTX_LICENSE_EXPIRED = 7056, - ERROR_CTX_SHADOW_NOT_RUNNING = 7057, - ERROR_CTX_SHADOW_ENDED_BY_MODE_CHANGE = 7058, - FRS_ERR_INVALID_API_SEQUENCE = 8001, - FRS_ERR_STARTING_SERVICE = 8002, - FRS_ERR_STOPPING_SERVICE = 8003, - FRS_ERR_INTERNAL_API = 8004, - FRS_ERR_INTERNAL = 8005, - FRS_ERR_SERVICE_COMM = 8006, - FRS_ERR_INSUFFICIENT_PRIV = 8007, - FRS_ERR_AUTHENTICATION = 8008, - FRS_ERR_PARENT_INSUFFICIENT_PRIV = 8009, - FRS_ERR_PARENT_AUTHENTICATION = 8010, - FRS_ERR_CHILD_TO_PARENT_COMM = 8011, - FRS_ERR_PARENT_TO_CHILD_COMM = 8012, - FRS_ERR_SYSVOL_POPULATE = 8013, - FRS_ERR_SYSVOL_POPULATE_TIMEOUT = 8014, - FRS_ERR_SYSVOL_IS_BUSY = 8015, - FRS_ERR_SYSVOL_DEMOTE = 8016, - FRS_ERR_INVALID_SERVICE_PARAMETER = 8017, - ERROR_DS_NOT_INSTALLED = 8200, - ERROR_DS_MEMBERSHIP_EVALUATED_LOCALLY = 8201, - ERROR_DS_NO_ATTRIBUTE_OR_VALUE = 8202, - ERROR_DS_INVALID_ATTRIBUTE_SYNTAX = 8203, - ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED = 8204, - ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS = 8205, - ERROR_DS_BUSY = 8206, - ERROR_DS_UNAVAILABLE = 8207, - ERROR_DS_NO_RIDS_ALLOCATED = 8208, - ERROR_DS_NO_MORE_RIDS = 8209, - ERROR_DS_INCORRECT_ROLE_OWNER = 8210, - ERROR_DS_RIDMGR_INIT_ERROR = 8211, - ERROR_DS_OBJ_CLASS_VIOLATION = 8212, - ERROR_DS_CANT_ON_NON_LEAF = 8213, - ERROR_DS_CANT_ON_RDN = 8214, - ERROR_DS_CANT_MOD_OBJ_CLASS = 8215, - ERROR_DS_CROSS_DOM_MOVE_ERROR = 8216, - ERROR_DS_GC_NOT_AVAILABLE = 8217, - ERROR_SHARED_POLICY = 8218, - ERROR_POLICY_OBJECT_NOT_FOUND = 8219, - ERROR_POLICY_ONLY_IN_DS = 8220, - ERROR_PROMOTION_ACTIVE = 8221, - ERROR_NO_PROMOTION_ACTIVE = 8222, - ERROR_DS_OPERATIONS_ERROR = 8224, - ERROR_DS_PROTOCOL_ERROR = 8225, - ERROR_DS_TIMELIMIT_EXCEEDED = 8226, - ERROR_DS_SIZELIMIT_EXCEEDED = 8227, - ERROR_DS_ADMIN_LIMIT_EXCEEDED = 8228, - ERROR_DS_COMPARE_FALSE = 8229, - ERROR_DS_COMPARE_TRUE = 8230, - ERROR_DS_AUTH_METHOD_NOT_SUPPORTED = 8231, - ERROR_DS_STRONG_AUTH_REQUIRED = 8232, - ERROR_DS_INAPPROPRIATE_AUTH = 8233, - ERROR_DS_AUTH_UNKNOWN = 8234, - ERROR_DS_REFERRAL = 8235, - ERROR_DS_UNAVAILABLE_CRIT_EXTENSION = 8236, - ERROR_DS_CONFIDENTIALITY_REQUIRED = 8237, - ERROR_DS_INAPPROPRIATE_MATCHING = 8238, - ERROR_DS_CONSTRAINT_VIOLATION = 8239, - ERROR_DS_NO_SUCH_OBJECT = 8240, - ERROR_DS_ALIAS_PROBLEM = 8241, - ERROR_DS_INVALID_DN_SYNTAX = 8242, - ERROR_DS_IS_LEAF = 8243, - ERROR_DS_ALIAS_DEREF_PROBLEM = 8244, - ERROR_DS_UNWILLING_TO_PERFORM = 8245, - ERROR_DS_LOOP_DETECT = 8246, - ERROR_DS_NAMING_VIOLATION = 8247, - ERROR_DS_OBJECT_RESULTS_TOO_LARGE = 8248, - ERROR_DS_AFFECTS_MULTIPLE_DSAS = 8249, - ERROR_DS_SERVER_DOWN = 8250, - ERROR_DS_LOCAL_ERROR = 8251, - ERROR_DS_ENCODING_ERROR = 8252, - ERROR_DS_DECODING_ERROR = 8253, - ERROR_DS_FILTER_UNKNOWN = 8254, - ERROR_DS_PARAM_ERROR = 8255, - ERROR_DS_NOT_SUPPORTED = 8256, - ERROR_DS_NO_RESULTS_RETURNED = 8257, - ERROR_DS_CONTROL_NOT_FOUND = 8258, - ERROR_DS_CLIENT_LOOP = 8259, - ERROR_DS_REFERRAL_LIMIT_EXCEEDED = 8260, - ERROR_DS_SORT_CONTROL_MISSING = 8261, - ERROR_DS_OFFSET_RANGE_ERROR = 8262, - ERROR_DS_ROOT_MUST_BE_NC = 8301, - ERROR_DS_ADD_REPLICA_INHIBITED = 8302, - ERROR_DS_ATT_NOT_DEF_IN_SCHEMA = 8303, - ERROR_DS_MAX_OBJ_SIZE_EXCEEDED = 8304, - ERROR_DS_OBJ_STRING_NAME_EXISTS = 8305, - ERROR_DS_NO_RDN_DEFINED_IN_SCHEMA = 8306, - ERROR_DS_RDN_DOESNT_MATCH_SCHEMA = 8307, - ERROR_DS_NO_REQUESTED_ATTS_FOUND = 8308, - ERROR_DS_USER_BUFFER_TO_SMALL = 8309, - ERROR_DS_ATT_IS_NOT_ON_OBJ = 8310, - ERROR_DS_ILLEGAL_MOD_OPERATION = 8311, - ERROR_DS_OBJ_TOO_LARGE = 8312, - ERROR_DS_BAD_INSTANCE_TYPE = 8313, - ERROR_DS_MASTERDSA_REQUIRED = 8314, - ERROR_DS_OBJECT_CLASS_REQUIRED = 8315, - ERROR_DS_MISSING_REQUIRED_ATT = 8316, - ERROR_DS_ATT_NOT_DEF_FOR_CLASS = 8317, - ERROR_DS_ATT_ALREADY_EXISTS = 8318, - ERROR_DS_CANT_ADD_ATT_VALUES = 8320, - ERROR_DS_SINGLE_VALUE_CONSTRAINT = 8321, - ERROR_DS_RANGE_CONSTRAINT = 8322, - ERROR_DS_ATT_VAL_ALREADY_EXISTS = 8323, - ERROR_DS_CANT_REM_MISSING_ATT = 8324, - ERROR_DS_CANT_REM_MISSING_ATT_VAL = 8325, - ERROR_DS_ROOT_CANT_BE_SUBREF = 8326, - ERROR_DS_NO_CHAINING = 8327, - ERROR_DS_NO_CHAINED_EVAL = 8328, - ERROR_DS_NO_PARENT_OBJECT = 8329, - ERROR_DS_PARENT_IS_AN_ALIAS = 8330, - ERROR_DS_CANT_MIX_MASTER_AND_REPS = 8331, - ERROR_DS_CHILDREN_EXIST = 8332, - ERROR_DS_OBJ_NOT_FOUND = 8333, - ERROR_DS_ALIASED_OBJ_MISSING = 8334, - ERROR_DS_BAD_NAME_SYNTAX = 8335, - ERROR_DS_ALIAS_POINTS_TO_ALIAS = 8336, - ERROR_DS_CANT_DEREF_ALIAS = 8337, - ERROR_DS_OUT_OF_SCOPE = 8338, - ERROR_DS_OBJECT_BEING_REMOVED = 8339, - ERROR_DS_CANT_DELETE_DSA_OBJ = 8340, - ERROR_DS_GENERIC_ERROR = 8341, - ERROR_DS_DSA_MUST_BE_INT_MASTER = 8342, - ERROR_DS_CLASS_NOT_DSA = 8343, - ERROR_DS_INSUFF_ACCESS_RIGHTS = 8344, - ERROR_DS_ILLEGAL_SUPERIOR = 8345, - ERROR_DS_ATTRIBUTE_OWNED_BY_SAM = 8346, - ERROR_DS_NAME_TOO_MANY_PARTS = 8347, - ERROR_DS_NAME_TOO_LONG = 8348, - ERROR_DS_NAME_VALUE_TOO_LONG = 8349, - ERROR_DS_NAME_UNPARSEABLE = 8350, - ERROR_DS_NAME_TYPE_UNKNOWN = 8351, - ERROR_DS_NOT_AN_OBJECT = 8352, - ERROR_DS_SEC_DESC_TOO_SHORT = 8353, - ERROR_DS_SEC_DESC_INVALID = 8354, - ERROR_DS_NO_DELETED_NAME = 8355, - ERROR_DS_SUBREF_MUST_HAVE_PARENT = 8356, - ERROR_DS_NCNAME_MUST_BE_NC = 8357, - ERROR_DS_CANT_ADD_SYSTEM_ONLY = 8358, - ERROR_DS_CLASS_MUST_BE_CONCRETE = 8359, - ERROR_DS_INVALID_DMD = 8360, - ERROR_DS_OBJ_GUID_EXISTS = 8361, - ERROR_DS_NOT_ON_BACKLINK = 8362, - ERROR_DS_NO_CROSSREF_FOR_NC = 8363, - ERROR_DS_SHUTTING_DOWN = 8364, - ERROR_DS_UNKNOWN_OPERATION = 8365, - ERROR_DS_INVALID_ROLE_OWNER = 8366, - ERROR_DS_COULDNT_CONTACT_FSMO = 8367, - ERROR_DS_CROSS_NC_DN_RENAME = 8368, - ERROR_DS_CANT_MOD_SYSTEM_ONLY = 8369, - ERROR_DS_REPLICATOR_ONLY = 8370, - ERROR_DS_OBJ_CLASS_NOT_DEFINED = 8371, - ERROR_DS_OBJ_CLASS_NOT_SUBCLASS = 8372, - ERROR_DS_NAME_REFERENCE_INVALID = 8373, - ERROR_DS_CROSS_REF_EXISTS = 8374, - ERROR_DS_CANT_DEL_MASTER_CROSSREF = 8375, - ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEAD = 8376, - ERROR_DS_NOTIFY_FILTER_TOO_COMPLEX = 8377, - ERROR_DS_DUP_RDN = 8378, - ERROR_DS_DUP_OID = 8379, - ERROR_DS_DUP_MAPI_ID = 8380, - ERROR_DS_DUP_SCHEMA_ID_GUID = 8381, - ERROR_DS_DUP_LDAP_DISPLAY_NAME = 8382, - ERROR_DS_SEMANTIC_ATT_TEST = 8383, - ERROR_DS_SYNTAX_MISMATCH = 8384, - ERROR_DS_EXISTS_IN_MUST_HAVE = 8385, - ERROR_DS_EXISTS_IN_MAY_HAVE = 8386, - ERROR_DS_NONEXISTENT_MAY_HAVE = 8387, - ERROR_DS_NONEXISTENT_MUST_HAVE = 8388, - ERROR_DS_AUX_CLS_TEST_FAIL = 8389, - ERROR_DS_NONEXISTENT_POSS_SUP = 8390, - ERROR_DS_SUB_CLS_TEST_FAIL = 8391, - ERROR_DS_BAD_RDN_ATT_ID_SYNTAX = 8392, - ERROR_DS_EXISTS_IN_AUX_CLS = 8393, - ERROR_DS_EXISTS_IN_SUB_CLS = 8394, - ERROR_DS_EXISTS_IN_POSS_SUP = 8395, - ERROR_DS_RECALCSCHEMA_FAILED = 8396, - ERROR_DS_TREE_DELETE_NOT_FINISHED = 8397, - ERROR_DS_CANT_DELETE = 8398, - ERROR_DS_ATT_SCHEMA_REQ_ID = 8399, - ERROR_DS_BAD_ATT_SCHEMA_SYNTAX = 8400, - ERROR_DS_CANT_CACHE_ATT = 8401, - ERROR_DS_CANT_CACHE_CLASS = 8402, - ERROR_DS_CANT_REMOVE_ATT_CACHE = 8403, - ERROR_DS_CANT_REMOVE_CLASS_CACHE = 8404, - ERROR_DS_CANT_RETRIEVE_DN = 8405, - ERROR_DS_MISSING_SUPREF = 8406, - ERROR_DS_CANT_RETRIEVE_INSTANCE = 8407, - ERROR_DS_CODE_INCONSISTENCY = 8408, - ERROR_DS_DATABASE_ERROR = 8409, - ERROR_DS_GOVERNSID_MISSING = 8410, - ERROR_DS_MISSING_EXPECTED_ATT = 8411, - ERROR_DS_NCNAME_MISSING_CR_REF = 8412, - ERROR_DS_SECURITY_CHECKING_ERROR = 8413, - ERROR_DS_SCHEMA_NOT_LOADED = 8414, - ERROR_DS_SCHEMA_ALLOC_FAILED = 8415, - ERROR_DS_ATT_SCHEMA_REQ_SYNTAX = 8416, - ERROR_DS_GCVERIFY_ERROR = 8417, - ERROR_DS_DRA_SCHEMA_MISMATCH = 8418, - ERROR_DS_CANT_FIND_DSA_OBJ = 8419, - ERROR_DS_CANT_FIND_EXPECTED_NC = 8420, - ERROR_DS_CANT_FIND_NC_IN_CACHE = 8421, - ERROR_DS_CANT_RETRIEVE_CHILD = 8422, - ERROR_DS_SECURITY_ILLEGAL_MODIFY = 8423, - ERROR_DS_CANT_REPLACE_HIDDEN_REC = 8424, - ERROR_DS_BAD_HIERARCHY_FILE = 8425, - ERROR_DS_BUILD_HIERARCHY_TABLE_FAILED = 8426, - ERROR_DS_CONFIG_PARAM_MISSING = 8427, - ERROR_DS_COUNTING_AB_INDICES_FAILED = 8428, - ERROR_DS_HIERARCHY_TABLE_MALLOC_FAILED = 8429, - ERROR_DS_INTERNAL_FAILURE = 8430, - ERROR_DS_UNKNOWN_ERROR = 8431, - ERROR_DS_ROOT_REQUIRES_CLASS_TOP = 8432, - ERROR_DS_REFUSING_FSMO_ROLES = 8433, - ERROR_DS_MISSING_FSMO_SETTINGS = 8434, - ERROR_DS_UNABLE_TO_SURRENDER_ROLES = 8435, - ERROR_DS_DRA_GENERIC = 8436, - ERROR_DS_DRA_INVALID_PARAMETER = 8437, - ERROR_DS_DRA_BUSY = 8438, - ERROR_DS_DRA_BAD_DN = 8439, - ERROR_DS_DRA_BAD_NC = 8440, - ERROR_DS_DRA_DN_EXISTS = 8441, - ERROR_DS_DRA_INTERNAL_ERROR = 8442, - ERROR_DS_DRA_INCONSISTENT_DIT = 8443, - ERROR_DS_DRA_CONNECTION_FAILED = 8444, - ERROR_DS_DRA_BAD_INSTANCE_TYPE = 8445, - ERROR_DS_DRA_OUT_OF_MEM = 8446, - ERROR_DS_DRA_MAIL_PROBLEM = 8447, - ERROR_DS_DRA_REF_ALREADY_EXISTS = 8448, - ERROR_DS_DRA_REF_NOT_FOUND = 8449, - ERROR_DS_DRA_OBJ_IS_REP_SOURCE = 8450, - ERROR_DS_DRA_DB_ERROR = 8451, - ERROR_DS_DRA_NO_REPLICA = 8452, - ERROR_DS_DRA_ACCESS_DENIED = 8453, - ERROR_DS_DRA_NOT_SUPPORTED = 8454, - ERROR_DS_DRA_RPC_CANCELLED = 8455, - ERROR_DS_DRA_SOURCE_DISABLED = 8456, - ERROR_DS_DRA_SINK_DISABLED = 8457, - ERROR_DS_DRA_NAME_COLLISION = 8458, - ERROR_DS_DRA_SOURCE_REINSTALLED = 8459, - ERROR_DS_DRA_MISSING_PARENT = 8460, - ERROR_DS_DRA_PREEMPTED = 8461, - ERROR_DS_DRA_ABANDON_SYNC = 8462, - ERROR_DS_DRA_SHUTDOWN = 8463, - ERROR_DS_DRA_INCOMPATIBLE_PARTIAL_SET = 8464, - ERROR_DS_DRA_SOURCE_IS_PARTIAL_REPLICA = 8465, - ERROR_DS_DRA_EXTN_CONNECTION_FAILED = 8466, - ERROR_DS_INSTALL_SCHEMA_MISMATCH = 8467, - ERROR_DS_DUP_LINK_ID = 8468, - ERROR_DS_NAME_ERROR_RESOLVING = 8469, - ERROR_DS_NAME_ERROR_NOT_FOUND = 8470, - ERROR_DS_NAME_ERROR_NOT_UNIQUE = 8471, - ERROR_DS_NAME_ERROR_NO_MAPPING = 8472, - ERROR_DS_NAME_ERROR_DOMAIN_ONLY = 8473, - ERROR_DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING = 8474, - ERROR_DS_CONSTRUCTED_ATT_MOD = 8475, - ERROR_DS_WRONG_OM_OBJ_CLASS = 8476, - ERROR_DS_DRA_REPL_PENDING = 8477, - ERROR_DS_DS_REQUIRED = 8478, - ERROR_DS_INVALID_LDAP_DISPLAY_NAME = 8479, - ERROR_DS_NON_BASE_SEARCH = 8480, - ERROR_DS_CANT_RETRIEVE_ATTS = 8481, - ERROR_DS_BACKLINK_WITHOUT_LINK = 8482, - ERROR_DS_EPOCH_MISMATCH = 8483, - ERROR_DS_SRC_NAME_MISMATCH = 8484, - ERROR_DS_SRC_AND_DST_NC_IDENTICAL = 8485, - ERROR_DS_DST_NC_MISMATCH = 8486, - ERROR_DS_NOT_AUTHORITIVE_FOR_DST_NC = 8487, - ERROR_DS_SRC_GUID_MISMATCH = 8488, - ERROR_DS_CANT_MOVE_DELETED_OBJECT = 8489, - ERROR_DS_PDC_OPERATION_IN_PROGRESS = 8490, - ERROR_DS_CROSS_DOMAIN_CLEANUP_REQD = 8491, - ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATION = 8492, - ERROR_DS_CANT_WITH_ACCT_GROUP_MEMBERSHPS = 8493, - ERROR_DS_NC_MUST_HAVE_NC_PARENT = 8494, - ERROR_DS_DST_DOMAIN_NOT_NATIVE = 8496, - ERROR_DS_MISSING_INFRASTRUCTURE_CONTAINER = 8497, - ERROR_DS_CANT_MOVE_ACCOUNT_GROUP = 8498, - ERROR_DS_CANT_MOVE_RESOURCE_GROUP = 8499, - ERROR_DS_INVALID_SEARCH_FLAG = 8500, - ERROR_DS_NO_TREE_DELETE_ABOVE_NC = 8501, - ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE = 8502, - ERROR_DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETE = 8503, - ERROR_DS_SAM_INIT_FAILURE = 8504, - ERROR_DS_SENSITIVE_GROUP_VIOLATION = 8505, - ERROR_DS_CANT_MOD_PRIMARYGROUPID = 8506, - ERROR_DS_ILLEGAL_BASE_SCHEMA_MOD = 8507, - ERROR_DS_NONSAFE_SCHEMA_CHANGE = 8508, - ERROR_DS_SCHEMA_UPDATE_DISALLOWED = 8509, - ERROR_DS_CANT_CREATE_UNDER_SCHEMA = 8510, - ERROR_DS_INSTALL_NO_SRC_SCH_VERSION = 8511, - ERROR_DS_INSTALL_NO_SCH_VERSION_IN_INIFILE = 8512, - ERROR_DS_INVALID_GROUP_TYPE = 8513, - ERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN = 8514, - ERROR_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN = 8515, - ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER = 8516, - ERROR_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER = 8517, - ERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER = 8518, - ERROR_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER = 8519, - ERROR_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER = 8520, - ERROR_DS_HAVE_PRIMARY_MEMBERS = 8521, - ERROR_DS_STRING_SD_CONVERSION_FAILED = 8522, - ERROR_DS_NAMING_MASTER_GC = 8523, - ERROR_DS_LOOKUP_FAILURE = 8524, - ERROR_DS_COULDNT_UPDATE_SPNS = 8525, - ERROR_DS_CANT_RETRIEVE_SD = 8526, - ERROR_DS_KEY_NOT_UNIQUE = 8527, - ERROR_DS_WRONG_LINKED_ATT_SYNTAX = 8528, - ERROR_DS_SAM_NEED_BOOTKEY_PASSWORD = 8529, - ERROR_DS_SAM_NEED_BOOTKEY_FLOPPY = 8530, - ERROR_DS_CANT_START = 8531, - ERROR_DS_INIT_FAILURE = 8532, - ERROR_DS_NO_PKT_PRIVACY_ON_CONNECTION = 8533, - ERROR_DS_SOURCE_DOMAIN_IN_FOREST = 8534, - ERROR_DS_DESTINATION_DOMAIN_NOT_IN_FOREST = 8535, - ERROR_DS_DESTINATION_AUDITING_NOT_ENABLED = 8536, - ERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAIN = 8537, - ERROR_DS_SRC_OBJ_NOT_GROUP_OR_USER = 8538, - ERROR_DS_SRC_SID_EXISTS_IN_FOREST = 8539, - ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCH = 8540, - ERROR_SAM_INIT_FAILURE = 8541, - ERROR_DS_DRA_SCHEMA_INFO_SHIP = 8542, - ERROR_DS_DRA_SCHEMA_CONFLICT = 8543, - ERROR_DS_DRA_EARLIER_SCHEMA_CONLICT = 8544, - ERROR_DS_DRA_OBJ_NC_MISMATCH = 8545, - ERROR_DS_NC_STILL_HAS_DSAS = 8546, - ERROR_DS_GC_REQUIRED = 8547, - ERROR_DS_LOCAL_MEMBER_OF_LOCAL_ONLY = 8548, - ERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPS = 8549, - ERROR_DS_CANT_ADD_TO_GC = 8550, - ERROR_DS_NO_CHECKPOINT_WITH_PDC = 8551, - ERROR_DS_SOURCE_AUDITING_NOT_ENABLED = 8552, - ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NC = 8553, - ERROR_DS_INVALID_NAME_FOR_SPN = 8554, - ERROR_DS_FILTER_USES_CONTRUCTED_ATTRS = 8555, - ERROR_DS_UNICODEPWD_NOT_IN_QUOTES = 8556, - ERROR_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED = 8557, - ERROR_DS_MUST_BE_RUN_ON_DST_DC = 8558, - ERROR_DS_SRC_DC_MUST_BE_SP4_OR_GREATER = 8559, - ERROR_DS_CANT_TREE_DELETE_CRITICAL_OBJ = 8560, - ERROR_DS_INIT_FAILURE_CONSOLE = 8561, - ERROR_DS_SAM_INIT_FAILURE_CONSOLE = 8562, - ERROR_DS_FOREST_VERSION_TOO_HIGH = 8563, - ERROR_DS_DOMAIN_VERSION_TOO_HIGH = 8564, - ERROR_DS_FOREST_VERSION_TOO_LOW = 8565, - ERROR_DS_DOMAIN_VERSION_TOO_LOW = 8566, - ERROR_DS_INCOMPATIBLE_VERSION = 8567, - ERROR_DS_LOW_DSA_VERSION = 8568, - ERROR_DS_NO_BEHAVIOR_VERSION_IN_MIXEDDOMAIN = 8569, - ERROR_DS_NOT_SUPPORTED_SORT_ORDER = 8570, - ERROR_DS_NAME_NOT_UNIQUE = 8571, - ERROR_DS_MACHINE_ACCOUNT_CREATED_PRENT4 = 8572, - ERROR_DS_OUT_OF_VERSION_STORE = 8573, - ERROR_DS_INCOMPATIBLE_CONTROLS_USED = 8574, - ERROR_DS_NO_REF_DOMAIN = 8575, - ERROR_DS_RESERVED_LINK_ID = 8576, - ERROR_DS_LINK_ID_NOT_AVAILABLE = 8577, - ERROR_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER = 8578, - ERROR_DS_MODIFYDN_DISALLOWED_BY_INSTANCE_TYPE = 8579, - ERROR_DS_NO_OBJECT_MOVE_IN_SCHEMA_NC = 8580, - ERROR_DS_MODIFYDN_DISALLOWED_BY_FLAG = 8581, - ERROR_DS_MODIFYDN_WRONG_GRANDPARENT = 8582, - ERROR_DS_NAME_ERROR_TRUST_REFERRAL = 8583, - ERROR_NOT_SUPPORTED_ON_STANDARD_SERVER = 8584, - ERROR_DS_CANT_ACCESS_REMOTE_PART_OF_AD = 8585, - ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE = 8586, - ERROR_DS_THREAD_LIMIT_EXCEEDED = 8587, - ERROR_DS_NOT_CLOSEST = 8588, - ERROR_DS_CANT_DERIVE_SPN_WITHOUT_SERVER_REF = 8589, - ERROR_DS_SINGLE_USER_MODE_FAILED = 8590, - ERROR_DS_NTDSCRIPT_SYNTAX_ERROR = 8591, - ERROR_DS_NTDSCRIPT_PROCESS_ERROR = 8592, - ERROR_DS_DIFFERENT_REPL_EPOCHS = 8593, - ERROR_DS_DRS_EXTENSIONS_CHANGED = 8594, - ERROR_DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR = 8595, - ERROR_DS_NO_MSDS_INTID = 8596, - ERROR_DS_DUP_MSDS_INTID = 8597, - ERROR_DS_EXISTS_IN_RDNATTID = 8598, - ERROR_DS_AUTHORIZATION_FAILED = 8599, - ERROR_DS_INVALID_SCRIPT = 8600, - ERROR_DS_REMOTE_CROSSREF_OP_FAILED = 8601, - DNS_ERROR_RCODE_FORMAT_ERROR = 9001, - DNS_ERROR_RCODE_SERVER_FAILURE = 9002, - DNS_ERROR_RCODE_NAME_ERROR = 9003, - DNS_ERROR_RCODE_NOT_IMPLEMENTED = 9004, - DNS_ERROR_RCODE_REFUSED = 9005, - DNS_ERROR_RCODE_YXDOMAIN = 9006, - DNS_ERROR_RCODE_YXRRSET = 9007, - DNS_ERROR_RCODE_NXRRSET = 9008, - DNS_ERROR_RCODE_NOTAUTH = 9009, - DNS_ERROR_RCODE_NOTZONE = 9010, - DNS_ERROR_RCODE_BADSIG = 9016, - DNS_ERROR_RCODE_BADKEY = 9017, - DNS_ERROR_RCODE_BADTIME = 9018, - DNS_INFO_NO_RECORDS = 9501, - DNS_ERROR_BAD_PACKET = 9502, - DNS_ERROR_NO_PACKET = 9503, - DNS_ERROR_RCODE = 9504, - DNS_ERROR_UNSECURE_PACKET = 9505, - DNS_ERROR_INVALID_TYPE = 9551, - DNS_ERROR_INVALID_IP_ADDRESS = 9552, - DNS_ERROR_INVALID_PROPERTY = 9553, - DNS_ERROR_TRY_AGAIN_LATER = 9554, - DNS_ERROR_NOT_UNIQUE = 9555, - DNS_ERROR_NON_RFC_NAME = 9556, - DNS_STATUS_FQDN = 9557, - DNS_STATUS_DOTTED_NAME = 9558, - DNS_STATUS_SINGLE_PART_NAME = 9559, - DNS_ERROR_INVALID_NAME_CHAR = 9560, - DNS_ERROR_NUMERIC_NAME = 9561, - DNS_ERROR_NOT_ALLOWED_ON_ROOT_SERVER = 9562, - DNS_ERROR_ZONE_DOES_NOT_EXIST = 9601, - DNS_ERROR_NO_ZONE_INFO = 9602, - DNS_ERROR_INVALID_ZONE_OPERATION = 9603, - DNS_ERROR_ZONE_CONFIGURATION_ERROR = 9604, - DNS_ERROR_ZONE_HAS_NO_SOA_RECORD = 9605, - DNS_ERROR_ZONE_HAS_NO_NS_RECORDS = 9606, - DNS_ERROR_ZONE_LOCKED = 9607, - DNS_ERROR_ZONE_CREATION_FAILED = 9608, - DNS_ERROR_ZONE_ALREADY_EXISTS = 9609, - DNS_ERROR_AUTOZONE_ALREADY_EXISTS = 9610, - DNS_ERROR_INVALID_ZONE_TYPE = 9611, - DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP = 9612, - DNS_ERROR_ZONE_NOT_SECONDARY = 9613, - DNS_ERROR_NEED_SECONDARY_ADDRESSES = 9614, - DNS_ERROR_WINS_INIT_FAILED = 9615, - DNS_ERROR_NEED_WINS_SERVERS = 9616, - DNS_ERROR_NBSTAT_INIT_FAILED = 9617, - DNS_ERROR_SOA_DELETE_INVALID = 9618, - DNS_ERROR_FORWARDER_ALREADY_EXISTS = 9619, - DNS_ERROR_ZONE_REQUIRES_MASTER_IP = 9620, - DNS_ERROR_ZONE_IS_SHUTDOWN = 9621, - DNS_ERROR_PRIMARY_REQUIRES_DATAFILE = 9651, - DNS_ERROR_INVALID_DATAFILE_NAME = 9652, - DNS_ERROR_DATAFILE_OPEN_FAILURE = 9653, - DNS_ERROR_FILE_WRITEBACK_FAILED = 9654, - DNS_ERROR_DATAFILE_PARSING = 9655, - DNS_ERROR_RECORD_DOES_NOT_EXIST = 9701, - DNS_ERROR_RECORD_FORMAT = 9702, - DNS_ERROR_NODE_CREATION_FAILED = 9703, - DNS_ERROR_UNKNOWN_RECORD_TYPE = 9704, - DNS_ERROR_RECORD_TIMED_OUT = 9705, - DNS_ERROR_NAME_NOT_IN_ZONE = 9706, - DNS_ERROR_CNAME_LOOP = 9707, - DNS_ERROR_NODE_IS_CNAME = 9708, - DNS_ERROR_CNAME_COLLISION = 9709, - DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT = 9710, - DNS_ERROR_RECORD_ALREADY_EXISTS = 9711, - DNS_ERROR_SECONDARY_DATA = 9712, - DNS_ERROR_NO_CREATE_CACHE_DATA = 9713, - DNS_ERROR_NAME_DOES_NOT_EXIST = 9714, - DNS_WARNING_PTR_CREATE_FAILED = 9715, - DNS_WARNING_DOMAIN_UNDELETED = 9716, - DNS_ERROR_DS_UNAVAILABLE = 9717, - DNS_ERROR_DS_ZONE_ALREADY_EXISTS = 9718, - DNS_ERROR_NO_BOOTFILE_IF_DS_ZONE = 9719, - DNS_INFO_AXFR_COMPLETE = 9751, - DNS_ERROR_AXFR = 9752, - DNS_INFO_ADDED_LOCAL_WINS = 9753, - DNS_STATUS_CONTINUE_NEEDED = 9801, - DNS_ERROR_NO_TCPIP = 9851, - DNS_ERROR_NO_DNS_SERVERS = 9852, - DNS_ERROR_DP_DOES_NOT_EXIST = 9901, - DNS_ERROR_DP_ALREADY_EXISTS = 9902, - DNS_ERROR_DP_NOT_ENLISTED = 9903, - DNS_ERROR_DP_ALREADY_ENLISTED = 9904, - WSAEINTR = 10004, - WSAEBADF = 10009, - WSAEACCES = 10013, - WSAEFAULT = 10014, - WSAEINVAL = 10022, - WSAEMFILE = 10024, - WSAEWOULDBLOCK = 10035, - WSAEINPROGRESS = 10036, - WSAEALREADY = 10037, - WSAENOTSOCK = 10038, - WSAEDESTADDRREQ = 10039, - WSAEMSGSIZE = 10040, - WSAEPROTOTYPE = 10041, - WSAENOPROTOOPT = 10042, - WSAEPROTONOSUPPORT = 10043, - WSAESOCKTNOSUPPORT = 10044, - WSAEOPNOTSUPP = 10045, - WSAEPFNOSUPPORT = 10046, - WSAEAFNOSUPPORT = 10047, - WSAEADDRINUSE = 10048, - WSAEADDRNOTAVAIL = 10049, - WSAENETDOWN = 10050, - WSAENETUNREACH = 10051, - WSAENETRESET = 10052, - WSAECONNABORTED = 10053, - WSAECONNRESET = 10054, - WSAENOBUFS = 10055, - WSAEISCONN = 10056, - WSAENOTCONN = 10057, - WSAESHUTDOWN = 10058, - WSAETOOMANYREFS = 10059, - WSAETIMEDOUT = 10060, - WSAECONNREFUSED = 10061, - WSAELOOP = 10062, - WSAENAMETOOLONG = 10063, - WSAEHOSTDOWN = 10064, - WSAEHOSTUNREACH = 10065, - WSAENOTEMPTY = 10066, - WSAEPROCLIM = 10067, - WSAEUSERS = 10068, - WSAEDQUOT = 10069, - WSAESTALE = 10070, - WSAEREMOTE = 10071, - WSASYSNOTREADY = 10091, - WSAVERNOTSUPPORTED = 10092, - WSANOTINITIALISED = 10093, - WSAEDISCON = 10101, - WSAENOMORE = 10102, - WSAECANCELLED = 10103, - WSAEINVALIDPROCTABLE = 10104, - WSAEINVALIDPROVIDER = 10105, - WSAEPROVIDERFAILEDINIT = 10106, - WSASYSCALLFAILURE = 10107, - WSASERVICE_NOT_FOUND = 10108, - WSATYPE_NOT_FOUND = 10109, - WSA_E_NO_MORE = 10110, - WSA_E_CANCELLED = 10111, - WSAEREFUSED = 10112, - WSAHOST_NOT_FOUND = 11001, - WSATRY_AGAIN = 11002, - WSANO_RECOVERY = 11003, - WSANO_DATA = 11004, - WSA_QOS_RECEIVERS = 11005, - WSA_QOS_SENDERS = 11006, - WSA_QOS_NO_SENDERS = 11007, - WSA_QOS_NO_RECEIVERS = 11008, - WSA_QOS_REQUEST_CONFIRMED = 11009, - WSA_QOS_ADMISSION_FAILURE = 11010, - WSA_QOS_POLICY_FAILURE = 11011, - WSA_QOS_BAD_STYLE = 11012, - WSA_QOS_BAD_OBJECT = 11013, - WSA_QOS_TRAFFIC_CTRL_ERROR = 11014, - WSA_QOS_GENERIC_ERROR = 11015, - WSA_QOS_ESERVICETYPE = 11016, - WSA_QOS_EFLOWSPEC = 11017, - WSA_QOS_EPROVSPECBUF = 11018, - WSA_QOS_EFILTERSTYLE = 11019, - WSA_QOS_EFILTERTYPE = 11020, - WSA_QOS_EFILTERCOUNT = 11021, - WSA_QOS_EOBJLENGTH = 11022, - WSA_QOS_EFLOWCOUNT = 11023, - WSA_QOS_EUNKNOWNPSOBJ = 11024, - WSA_QOS_EPOLICYOBJ = 11025, - WSA_QOS_EFLOWDESC = 11026, - WSA_QOS_EPSFLOWSPEC = 11027, - WSA_QOS_EPSFILTERSPEC = 11028, - WSA_QOS_ESDMODEOBJ = 11029, - WSA_QOS_ESHAPERATEOBJ = 11030, - WSA_QOS_RESERVED_PETYPE = 11031, - ERROR_IPSEC_QM_POLICY_EXISTS = 13000, - ERROR_IPSEC_QM_POLICY_NOT_FOUND = 13001, - ERROR_IPSEC_QM_POLICY_IN_USE = 13002, - ERROR_IPSEC_MM_POLICY_EXISTS = 13003, - ERROR_IPSEC_MM_POLICY_NOT_FOUND = 13004, - ERROR_IPSEC_MM_POLICY_IN_USE = 13005, - ERROR_IPSEC_MM_FILTER_EXISTS = 13006, - ERROR_IPSEC_MM_FILTER_NOT_FOUND = 13007, - ERROR_IPSEC_TRANSPORT_FILTER_EXISTS = 13008, - ERROR_IPSEC_TRANSPORT_FILTER_NOT_FOUND = 13009, - ERROR_IPSEC_MM_AUTH_EXISTS = 13010, - ERROR_IPSEC_MM_AUTH_NOT_FOUND = 13011, - ERROR_IPSEC_MM_AUTH_IN_USE = 13012, - ERROR_IPSEC_DEFAULT_MM_POLICY_NOT_FOUND = 13013, - ERROR_IPSEC_DEFAULT_MM_AUTH_NOT_FOUND = 13014, - ERROR_IPSEC_DEFAULT_QM_POLICY_NOT_FOUND = 13015, - ERROR_IPSEC_TUNNEL_FILTER_EXISTS = 13016, - ERROR_IPSEC_TUNNEL_FILTER_NOT_FOUND = 13017, - ERROR_IPSEC_MM_FILTER_PENDING_DELETION = 13018, - ERROR_IPSEC_TRANSPORT_FILTER_PENDING_DELETION = 13019, - ERROR_IPSEC_TUNNEL_FILTER_PENDING_DELETION = 13020, - ERROR_IPSEC_MM_POLICY_PENDING_DELETION = 13021, - ERROR_IPSEC_MM_AUTH_PENDING_DELETION = 13022, - ERROR_IPSEC_QM_POLICY_PENDING_DELETION = 13023, - ERROR_IPSEC_IKE_AUTH_FAIL = 13801, - ERROR_IPSEC_IKE_ATTRIB_FAIL = 13802, - ERROR_IPSEC_IKE_NEGOTIATION_PENDING = 13803, - ERROR_IPSEC_IKE_GENERAL_PROCESSING_ERROR = 13804, - ERROR_IPSEC_IKE_TIMED_OUT = 13805, - ERROR_IPSEC_IKE_NO_CERT = 13806, - ERROR_IPSEC_IKE_SA_DELETED = 13807, - ERROR_IPSEC_IKE_SA_REAPED = 13808, - ERROR_IPSEC_IKE_MM_ACQUIRE_DROP = 13809, - ERROR_IPSEC_IKE_QM_ACQUIRE_DROP = 13810, - ERROR_IPSEC_IKE_QUEUE_DROP_MM = 13811, - ERROR_IPSEC_IKE_QUEUE_DROP_NO_MM = 13812, - ERROR_IPSEC_IKE_DROP_NO_RESPONSE = 13813, - ERROR_IPSEC_IKE_MM_DELAY_DROP = 13814, - ERROR_IPSEC_IKE_QM_DELAY_DROP = 13815, - ERROR_IPSEC_IKE_ERROR = 13816, - ERROR_IPSEC_IKE_CRL_FAILED = 13817, - ERROR_IPSEC_IKE_INVALID_KEY_USAGE = 13818, - ERROR_IPSEC_IKE_INVALID_CERT_TYPE = 13819, - ERROR_IPSEC_IKE_NO_PRIVATE_KEY = 13820, - ERROR_IPSEC_IKE_DH_FAIL = 13822, - ERROR_IPSEC_IKE_INVALID_HEADER = 13824, - ERROR_IPSEC_IKE_NO_POLICY = 13825, - ERROR_IPSEC_IKE_INVALID_SIGNATURE = 13826, - ERROR_IPSEC_IKE_KERBEROS_ERROR = 13827, - ERROR_IPSEC_IKE_NO_PUBLIC_KEY = 13828, - ERROR_IPSEC_IKE_PROCESS_ERR = 13829, - ERROR_IPSEC_IKE_PROCESS_ERR_SA = 13830, - ERROR_IPSEC_IKE_PROCESS_ERR_PROP = 13831, - ERROR_IPSEC_IKE_PROCESS_ERR_TRANS = 13832, - ERROR_IPSEC_IKE_PROCESS_ERR_KE = 13833, - ERROR_IPSEC_IKE_PROCESS_ERR_ID = 13834, - ERROR_IPSEC_IKE_PROCESS_ERR_CERT = 13835, - ERROR_IPSEC_IKE_PROCESS_ERR_CERT_REQ = 13836, - ERROR_IPSEC_IKE_PROCESS_ERR_HASH = 13837, - ERROR_IPSEC_IKE_PROCESS_ERR_SIG = 13838, - ERROR_IPSEC_IKE_PROCESS_ERR_NONCE = 13839, - ERROR_IPSEC_IKE_PROCESS_ERR_NOTIFY = 13840, - ERROR_IPSEC_IKE_PROCESS_ERR_DELETE = 13841, - ERROR_IPSEC_IKE_PROCESS_ERR_VENDOR = 13842, - ERROR_IPSEC_IKE_INVALID_PAYLOAD = 13843, - ERROR_IPSEC_IKE_LOAD_SOFT_SA = 13844, - ERROR_IPSEC_IKE_SOFT_SA_TORN_DOWN = 13845, - ERROR_IPSEC_IKE_INVALID_COOKIE = 13846, - ERROR_IPSEC_IKE_NO_PEER_CERT = 13847, - ERROR_IPSEC_IKE_PEER_CRL_FAILED = 13848, - ERROR_IPSEC_IKE_POLICY_CHANGE = 13849, - ERROR_IPSEC_IKE_NO_MM_POLICY = 13850, - ERROR_IPSEC_IKE_NOTCBPRIV = 13851, - ERROR_IPSEC_IKE_SECLOADFAIL = 13852, - ERROR_IPSEC_IKE_FAILSSPINIT = 13853, - ERROR_IPSEC_IKE_FAILQUERYSSP = 13854, - ERROR_IPSEC_IKE_SRVACQFAIL = 13855, - ERROR_IPSEC_IKE_SRVQUERYCRED = 13856, - ERROR_IPSEC_IKE_GETSPIFAIL = 13857, - ERROR_IPSEC_IKE_INVALID_FILTER = 13858, - ERROR_IPSEC_IKE_OUT_OF_MEMORY = 13859, - ERROR_IPSEC_IKE_ADD_UPDATE_KEY_FAILED = 13860, - ERROR_IPSEC_IKE_INVALID_POLICY = 13861, - ERROR_IPSEC_IKE_UNKNOWN_DOI = 13862, - ERROR_IPSEC_IKE_INVALID_SITUATION = 13863, - ERROR_IPSEC_IKE_DH_FAILURE = 13864, - ERROR_IPSEC_IKE_INVALID_GROUP = 13865, - ERROR_IPSEC_IKE_ENCRYPT = 13866, - ERROR_IPSEC_IKE_DECRYPT = 13867, - ERROR_IPSEC_IKE_POLICY_MATCH = 13868, - ERROR_IPSEC_IKE_UNSUPPORTED_ID = 13869, - ERROR_IPSEC_IKE_INVALID_HASH = 13870, - ERROR_IPSEC_IKE_INVALID_HASH_ALG = 13871, - ERROR_IPSEC_IKE_INVALID_HASH_SIZE = 13872, - ERROR_IPSEC_IKE_INVALID_ENCRYPT_ALG = 13873, - ERROR_IPSEC_IKE_INVALID_AUTH_ALG = 13874, - ERROR_IPSEC_IKE_INVALID_SIG = 13875, - ERROR_IPSEC_IKE_LOAD_FAILED = 13876, - ERROR_IPSEC_IKE_RPC_DELETE = 13877, - ERROR_IPSEC_IKE_BENIGN_REINIT = 13878, - ERROR_IPSEC_IKE_INVALID_RESPONDER_LIFETIME_NOTIFY = 13879, - ERROR_IPSEC_IKE_INVALID_CERT_KEYLEN = 13881, - ERROR_IPSEC_IKE_MM_LIMIT = 13882, - ERROR_IPSEC_IKE_NEGOTIATION_DISABLED = 13883, - ERROR_IPSEC_IKE_NEG_STATUS_END = 13884, - ERROR_SXS_SECTION_NOT_FOUND = 14000, - ERROR_SXS_CANT_GEN_ACTCTX = 14001, - ERROR_SXS_INVALID_ACTCTXDATA_FORMAT = 14002, - ERROR_SXS_ASSEMBLY_NOT_FOUND = 14003, - ERROR_SXS_MANIFEST_FORMAT_ERROR = 14004, - ERROR_SXS_MANIFEST_PARSE_ERROR = 14005, - ERROR_SXS_ACTIVATION_CONTEXT_DISABLED = 14006, - ERROR_SXS_KEY_NOT_FOUND = 14007, - ERROR_SXS_VERSION_CONFLICT = 14008, - ERROR_SXS_WRONG_SECTION_TYPE = 14009, - ERROR_SXS_THREAD_QUERIES_DISABLED = 14010, - ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET = 14011, - ERROR_SXS_UNKNOWN_ENCODING_GROUP = 14012, - ERROR_SXS_UNKNOWN_ENCODING = 14013, - ERROR_SXS_INVALID_XML_NAMESPACE_URI = 14014, - ERROR_SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED = 14015, - ERROR_SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED = 14016, - ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE = 14017, - ERROR_SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE = 14018, - ERROR_SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE = 14019, - ERROR_SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT = 14020, - ERROR_SXS_DUPLICATE_DLL_NAME = 14021, - ERROR_SXS_DUPLICATE_WINDOWCLASS_NAME = 14022, - ERROR_SXS_DUPLICATE_CLSID = 14023, - ERROR_SXS_DUPLICATE_IID = 14024, - ERROR_SXS_DUPLICATE_TLBID = 14025, - ERROR_SXS_DUPLICATE_PROGID = 14026, - ERROR_SXS_DUPLICATE_ASSEMBLY_NAME = 14027, - ERROR_SXS_FILE_HASH_MISMATCH = 14028, - ERROR_SXS_POLICY_PARSE_ERROR = 14029, - ERROR_SXS_XML_E_MISSINGQUOTE = 14030, - ERROR_SXS_XML_E_COMMENTSYNTAX = 14031, - ERROR_SXS_XML_E_BADSTARTNAMECHAR = 14032, - ERROR_SXS_XML_E_BADNAMECHAR = 14033, - ERROR_SXS_XML_E_BADCHARINSTRING = 14034, - ERROR_SXS_XML_E_XMLDECLSYNTAX = 14035, - ERROR_SXS_XML_E_BADCHARDATA = 14036, - ERROR_SXS_XML_E_MISSINGWHITESPACE = 14037, - ERROR_SXS_XML_E_EXPECTINGTAGEND = 14038, - ERROR_SXS_XML_E_MISSINGSEMICOLON = 14039, - ERROR_SXS_XML_E_UNBALANCEDPAREN = 14040, - ERROR_SXS_XML_E_INTERNALERROR = 14041, - ERROR_SXS_XML_E_UNEXPECTED_WHITESPACE = 14042, - ERROR_SXS_XML_E_INCOMPLETE_ENCODING = 14043, - ERROR_SXS_XML_E_MISSING_PAREN = 14044, - ERROR_SXS_XML_E_EXPECTINGCLOSEQUOTE = 14045, - ERROR_SXS_XML_E_MULTIPLE_COLONS = 14046, - ERROR_SXS_XML_E_INVALID_DECIMAL = 14047, - ERROR_SXS_XML_E_INVALID_HEXIDECIMAL = 14048, - ERROR_SXS_XML_E_INVALID_UNICODE = 14049, - ERROR_SXS_XML_E_WHITESPACEORQUESTIONMARK = 14050, - ERROR_SXS_XML_E_UNEXPECTEDENDTAG = 14051, - ERROR_SXS_XML_E_UNCLOSEDTAG = 14052, - ERROR_SXS_XML_E_DUPLICATEATTRIBUTE = 14053, - ERROR_SXS_XML_E_MULTIPLEROOTS = 14054, - ERROR_SXS_XML_E_INVALIDATROOTLEVEL = 14055, - ERROR_SXS_XML_E_BADXMLDECL = 14056, - ERROR_SXS_XML_E_MISSINGROOT = 14057, - ERROR_SXS_XML_E_UNEXPECTEDEOF = 14058, - ERROR_SXS_XML_E_BADPEREFINSUBSET = 14059, - ERROR_SXS_XML_E_UNCLOSEDSTARTTAG = 14060, - ERROR_SXS_XML_E_UNCLOSEDENDTAG = 14061, - ERROR_SXS_XML_E_UNCLOSEDSTRING = 14062, - ERROR_SXS_XML_E_UNCLOSEDCOMMENT = 14063, - ERROR_SXS_XML_E_UNCLOSEDDECL = 14064, - ERROR_SXS_XML_E_UNCLOSEDCDATA = 14065, - ERROR_SXS_XML_E_RESERVEDNAMESPACE = 14066, - ERROR_SXS_XML_E_INVALIDENCODING = 14067, - ERROR_SXS_XML_E_INVALIDSWITCH = 14068, - ERROR_SXS_XML_E_BADXMLCASE = 14069, - ERROR_SXS_XML_E_INVALID_STANDALONE = 14070, - ERROR_SXS_XML_E_UNEXPECTED_STANDALONE = 14071, - ERROR_SXS_XML_E_INVALID_VERSION = 14072, - ERROR_SXS_XML_E_MISSINGEQUALS = 14073, - ERROR_SXS_PROTECTION_RECOVERY_FAILED = 14074, - ERROR_SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT = 14075, - ERROR_SXS_PROTECTION_CATALOG_NOT_VALID = 14076, - ERROR_SXS_UNTRANSLATABLE_HRESULT = 14077, - ERROR_SXS_PROTECTION_CATALOG_FILE_MISSING = 14078, - ERROR_SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE = 14079, - ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME = 14080 */ - } + internal enum MonoIOError : int + { + ERROR_SUCCESS = 0, + /* ERROR_INVALID_FUNCTION = 1, + */ + ERROR_FILE_NOT_FOUND = 2, + ERROR_PATH_NOT_FOUND = 3, + ERROR_TOO_MANY_OPEN_FILES = 4, + ERROR_ACCESS_DENIED = 5, + ERROR_INVALID_HANDLE = 6, + /* ERROR_ARENA_TRASHED = 7, + ERROR_NOT_ENOUGH_MEMORY = 8, + ERROR_INVALID_BLOCK = 9, + ERROR_BAD_ENVIRONMENT = 10, + ERROR_BAD_FORMAT = 11, + ERROR_INVALID_ACCESS = 12, + ERROR_INVALID_DATA = 13, + ERROR_OUTOFMEMORY = 14, + */ + ERROR_INVALID_DRIVE = 15, + /* ERROR_CURRENT_DIRECTORY = 16, + */ + ERROR_NOT_SAME_DEVICE = 17, + ERROR_NO_MORE_FILES = 18, + /* ERROR_WRITE_PROTECT = 19, + ERROR_BAD_UNIT = 20, + */ + ERROR_NOT_READY = 21, + /* + ERROR_BAD_COMMAND = 22, + ERROR_CRC = 23, + ERROR_BAD_LENGTH = 24, + ERROR_SEEK = 25, + ERROR_NOT_DOS_DISK = 26, + ERROR_SECTOR_NOT_FOUND = 27, + ERROR_OUT_OF_PAPER = 28,*/ + ERROR_WRITE_FAULT = 29, + ERROR_READ_FAULT = 30, + ERROR_GEN_FAILURE = 31, + ERROR_SHARING_VIOLATION = 32, + ERROR_LOCK_VIOLATION = 33, + /* ERROR_WRONG_DISK = 34, + ERROR_SHARING_BUFFER_EXCEEDED = 36, + ERROR_HANDLE_EOF = 38, + */ + ERROR_HANDLE_DISK_FULL = 39, + ERROR_NOT_SUPPORTED = 50, + /* ERROR_REM_NOT_LIST = 51, + ERROR_DUP_NAME = 52, + ERROR_BAD_NETPATH = 53, + ERROR_NETWORK_BUSY = 54, + ERROR_DEV_NOT_EXIST = 55, + ERROR_TOO_MANY_CMDS = 56, + ERROR_ADAP_HDW_ERR = 57, + ERROR_BAD_NET_RESP = 58, + ERROR_UNEXP_NET_ERR = 59, + ERROR_BAD_REM_ADAP = 60, + ERROR_PRINTQ_FULL = 61, + ERROR_NO_SPOOL_SPACE = 62, + ERROR_PRINT_CANCELLED = 63, + ERROR_NETNAME_DELETED = 64, + ERROR_NETWORK_ACCESS_DENIED = 65, + ERROR_BAD_DEV_TYPE = 66, + ERROR_BAD_NET_NAME = 67, + ERROR_TOO_MANY_NAMES = 68, + ERROR_TOO_MANY_SESS = 69, + ERROR_SHARING_PAUSED = 70, + ERROR_REQ_NOT_ACCEP = 71, + ERROR_REDIR_PAUSED = 72, + */ + ERROR_FILE_EXISTS = 80, + ERROR_CANNOT_MAKE = 82, + /* ERROR_FAIL_I24 = 83, + ERROR_OUT_OF_STRUCTURES = 84, + ERROR_ALREADY_ASSIGNED = 85, + ERROR_INVALID_PASSWORD = 86, + */ + ERROR_INVALID_PARAMETER = 87, + /* ERROR_NET_WRITE_FAULT = 88, + ERROR_NO_PROC_SLOTS = 89, + ERROR_TOO_MANY_SEMAPHORES = 100, + ERROR_EXCL_SEM_ALREADY_OWNED = 101, + ERROR_SEM_IS_SET = 102, + ERROR_TOO_MANY_SEM_REQUESTS = 103, + ERROR_INVALID_AT_INTERRUPT_TIME = 104, + ERROR_SEM_OWNER_DIED = 105, + ERROR_SEM_USER_LIMIT = 106, + ERROR_DISK_CHANGE = 107, + ERROR_DRIVE_LOCKED = 108, + */ + ERROR_BROKEN_PIPE = 109, + /* ERROR_OPEN_FAILED = 110, + ERROR_BUFFER_OVERFLOW = 111, + ERROR_DISK_FULL = 112, + ERROR_NO_MORE_SEARCH_HANDLES = 113, + ERROR_INVALID_TARGET_HANDLE = 114, + ERROR_INVALID_CATEGORY = 117, + ERROR_INVALID_VERIFY_SWITCH = 118, + ERROR_BAD_DRIVER_LEVEL = 119, + ERROR_CALL_NOT_IMPLEMENTED = 120, + ERROR_SEM_TIMEOUT = 121, + ERROR_INSUFFICIENT_BUFFER = 122, + */ + ERROR_INVALID_NAME = 123, + /* ERROR_INVALID_LEVEL = 124, + ERROR_NO_VOLUME_LABEL = 125, + ERROR_MOD_NOT_FOUND = 126, + ERROR_PROC_NOT_FOUND = 127, + ERROR_WAIT_NO_CHILDREN = 128, + ERROR_CHILD_NOT_COMPLETE = 129, + ERROR_DIRECT_ACCESS_HANDLE = 130, + ERROR_NEGATIVE_SEEK = 131, + ERROR_SEEK_ON_DEVICE = 132, + ERROR_IS_JOIN_TARGET = 133, + ERROR_IS_JOINED = 134, + ERROR_IS_SUBSTED = 135, + ERROR_NOT_JOINED = 136, + ERROR_NOT_SUBSTED = 137, + ERROR_JOIN_TO_JOIN = 138, + ERROR_SUBST_TO_SUBST = 139, + ERROR_JOIN_TO_SUBST = 140, + ERROR_SUBST_TO_JOIN = 141, + ERROR_BUSY_DRIVE = 142, + ERROR_SAME_DRIVE = 143, + ERROR_DIR_NOT_ROOT = 144, + */ + ERROR_DIR_NOT_EMPTY = 145, + /* + ERROR_IS_SUBST_PATH = 146, + ERROR_IS_JOIN_PATH = 147, + ERROR_PATH_BUSY = 148, + ERROR_IS_SUBST_TARGET = 149, + ERROR_SYSTEM_TRACE = 150, + ERROR_INVALID_EVENT_COUNT = 151, + ERROR_TOO_MANY_MUXWAITERS = 152, + ERROR_INVALID_LIST_FORMAT = 153, + ERROR_LABEL_TOO_LONG = 154, + ERROR_TOO_MANY_TCBS = 155, + ERROR_SIGNAL_REFUSED = 156, + ERROR_DISCARDED = 157, + ERROR_NOT_LOCKED = 158, + ERROR_BAD_THREADID_ADDR = 159, + ERROR_BAD_ARGUMENTS = 160, + ERROR_BAD_PATHNAME = 161, + ERROR_SIGNAL_PENDING = 162, + ERROR_MAX_THRDS_REACHED = 164, + ERROR_LOCK_FAILED = 167, + ERROR_BUSY = 170, + ERROR_CANCEL_VIOLATION = 173, + ERROR_ATOMIC_LOCKS_NOT_SUPPORTED = 174, + ERROR_INVALID_SEGMENT_NUMBER = 180, + ERROR_INVALID_ORDINAL = 182, + */ + ERROR_ALREADY_EXISTS = 183, + /* ERROR_INVALID_FLAG_NUMBER = 186, + ERROR_SEM_NOT_FOUND = 187, + ERROR_INVALID_STARTING_CODESEG = 188, + ERROR_INVALID_STACKSEG = 189, + ERROR_INVALID_MODULETYPE = 190, + ERROR_INVALID_EXE_SIGNATURE = 191, + ERROR_EXE_MARKED_INVALID = 192, + ERROR_BAD_EXE_FORMAT = 193, + ERROR_ITERATED_DATA_EXCEEDS_64k = 194, + ERROR_INVALID_MINALLOCSIZE = 195, + ERROR_DYNLINK_FROM_INVALID_RING = 196, + ERROR_IOPL_NOT_ENABLED = 197, + ERROR_INVALID_SEGDPL = 198, + ERROR_AUTODATASEG_EXCEEDS_64k = 199, + ERROR_RING2SEG_MUST_BE_MOVABLE = 200, + ERROR_RELOC_CHAIN_XEEDS_SEGLIM = 201, + ERROR_INFLOOP_IN_RELOC_CHAIN = 202, + ERROR_ENVVAR_NOT_FOUND = 203, + ERROR_NO_SIGNAL_SENT = 205, + */ + ERROR_FILENAME_EXCED_RANGE = 206, + /* ERROR_RING2_STACK_IN_USE = 207, + ERROR_META_EXPANSION_TOO_LONG = 208, + ERROR_INVALID_SIGNAL_NUMBER = 209, + ERROR_THREAD_1_INACTIVE = 210, + ERROR_LOCKED = 212, + ERROR_TOO_MANY_MODULES = 214, + ERROR_NESTING_NOT_ALLOWED = 215, + ERROR_EXE_MACHINE_TYPE_MISMATCH = 216, + ERROR_BAD_PIPE = 230, + ERROR_PIPE_BUSY = 231, + ERROR_NO_DATA = 232, + ERROR_PIPE_NOT_CONNECTED = 233, + ERROR_MORE_DATA = 234, + ERROR_VC_DISCONNECTED = 240, + ERROR_INVALID_EA_NAME = 254, + ERROR_EA_LIST_INCONSISTENT = 255, + WAIT_TIMEOUT = 258, + ERROR_NO_MORE_ITEMS = 259, + ERROR_CANNOT_COPY = 266, + */ + ERROR_DIRECTORY = 267, + /* ERROR_EAS_DIDNT_FIT = 275, + ERROR_EA_FILE_CORRUPT = 276, + ERROR_EA_TABLE_FULL = 277, + ERROR_INVALID_EA_HANDLE = 278, + ERROR_EAS_NOT_SUPPORTED = 282, + ERROR_NOT_OWNER = 288, + ERROR_TOO_MANY_POSTS = 298, + ERROR_PARTIAL_COPY = 299, + ERROR_OPLOCK_NOT_GRANTED = 300, + ERROR_INVALID_OPLOCK_PROTOCOL = 301, + ERROR_DISK_TOO_FRAGMENTED = 302, + ERROR_DELETE_PENDING = 303, + ERROR_MR_MID_NOT_FOUND = 317, + ERROR_INVALID_ADDRESS = 487, + ERROR_ARITHMETIC_OVERFLOW = 534, + ERROR_PIPE_CONNECTED = 535, + ERROR_PIPE_LISTENING = 536, + ERROR_EA_ACCESS_DENIED = 994, + ERROR_OPERATION_ABORTED = 995, + ERROR_IO_INCOMPLETE = 996, + ERROR_IO_PENDING = 997, + ERROR_NOACCESS = 998, + ERROR_SWAPERROR = 999, + ERROR_STACK_OVERFLOW = 1001, + ERROR_INVALID_MESSAGE = 1002, + ERROR_CAN_NOT_COMPLETE = 1003, + ERROR_INVALID_FLAGS = 1004, + ERROR_UNRECOGNIZED_VOLUME = 1005, + ERROR_FILE_INVALID = 1006, + ERROR_FULLSCREEN_MODE = 1007, + ERROR_NO_TOKEN = 1008, + ERROR_BADDB = 1009, + ERROR_BADKEY = 1010, + ERROR_CANTOPEN = 1011, + ERROR_CANTREAD = 1012, + ERROR_CANTWRITE = 1013, + ERROR_REGISTRY_RECOVERED = 1014, + ERROR_REGISTRY_CORRUPT = 1015, + ERROR_REGISTRY_IO_FAILED = 1016, + ERROR_NOT_REGISTRY_FILE = 1017, + ERROR_KEY_DELETED = 1018, + ERROR_NO_LOG_SPACE = 1019, + ERROR_KEY_HAS_CHILDREN = 1020, + ERROR_CHILD_MUST_BE_VOLATILE = 1021, + ERROR_NOTIFY_ENUM_DIR = 1022, + ERROR_DEPENDENT_SERVICES_RUNNING = 1051, + ERROR_INVALID_SERVICE_CONTROL = 1052, + ERROR_SERVICE_REQUEST_TIMEOUT = 1053, + ERROR_SERVICE_NO_THREAD = 1054, + ERROR_SERVICE_DATABASE_LOCKED = 1055, + ERROR_SERVICE_ALREADY_RUNNING = 1056, + ERROR_INVALID_SERVICE_ACCOUNT = 1057, + ERROR_SERVICE_DISABLED = 1058, + ERROR_CIRCULAR_DEPENDENCY = 1059, + ERROR_SERVICE_DOES_NOT_EXIST = 1060, + ERROR_SERVICE_CANNOT_ACCEPT_CTRL = 1061, + ERROR_SERVICE_NOT_ACTIVE = 1062, + ERROR_FAILED_SERVICE_CONTROLLER_CONNECT = 1063, + ERROR_EXCEPTION_IN_SERVICE = 1064, + ERROR_DATABASE_DOES_NOT_EXIST = 1065, + ERROR_SERVICE_SPECIFIC_ERROR = 1066, + ERROR_PROCESS_ABORTED = 1067, + ERROR_SERVICE_DEPENDENCY_FAIL = 1068, + ERROR_SERVICE_LOGON_FAILED = 1069, + ERROR_SERVICE_START_HANG = 1070, + ERROR_INVALID_SERVICE_LOCK = 1071, + ERROR_SERVICE_MARKED_FOR_DELETE = 1072, + ERROR_SERVICE_EXISTS = 1073, + ERROR_ALREADY_RUNNING_LKG = 1074, + ERROR_SERVICE_DEPENDENCY_DELETED = 1075, + ERROR_BOOT_ALREADY_ACCEPTED = 1076, + ERROR_SERVICE_NEVER_STARTED = 1077, + ERROR_DUPLICATE_SERVICE_NAME = 1078, + ERROR_DIFFERENT_SERVICE_ACCOUNT = 1079, + ERROR_CANNOT_DETECT_DRIVER_FAILURE = 1080, + ERROR_CANNOT_DETECT_PROCESS_ABORT = 1081, + ERROR_NO_RECOVERY_PROGRAM = 1082, + ERROR_SERVICE_NOT_IN_EXE = 1083, + ERROR_NOT_SAFEBOOT_SERVICE = 1084, + ERROR_END_OF_MEDIA = 1100, + ERROR_FILEMARK_DETECTED = 1101, + ERROR_BEGINNING_OF_MEDIA = 1102, + ERROR_SETMARK_DETECTED = 1103, + ERROR_NO_DATA_DETECTED = 1104, + ERROR_PARTITION_FAILURE = 1105, + ERROR_INVALID_BLOCK_LENGTH = 1106, + ERROR_DEVICE_NOT_PARTITIONED = 1107, + ERROR_UNABLE_TO_LOCK_MEDIA = 1108, + ERROR_UNABLE_TO_UNLOAD_MEDIA = 1109, + ERROR_MEDIA_CHANGED = 1110, + ERROR_BUS_RESET = 1111, + ERROR_NO_MEDIA_IN_DRIVE = 1112, + ERROR_NO_UNICODE_TRANSLATION = 1113, + ERROR_DLL_INIT_FAILED = 1114, + ERROR_SHUTDOWN_IN_PROGRESS = 1115, + ERROR_NO_SHUTDOWN_IN_PROGRESS = 1116, + ERROR_IO_DEVICE = 1117, + ERROR_SERIAL_NO_DEVICE = 1118, + ERROR_IRQ_BUSY = 1119, + ERROR_MORE_WRITES = 1120, + ERROR_COUNTER_TIMEOUT = 1121, + ERROR_FLOPPY_ID_MARK_NOT_FOUND = 1122, + ERROR_FLOPPY_WRONG_CYLINDER = 1123, + ERROR_FLOPPY_UNKNOWN_ERROR = 1124, + ERROR_FLOPPY_BAD_REGISTERS = 1125, + ERROR_DISK_RECALIBRATE_FAILED = 1126, + ERROR_DISK_OPERATION_FAILED = 1127, + ERROR_DISK_RESET_FAILED = 1128, + ERROR_EOM_OVERFLOW = 1129, + ERROR_NOT_ENOUGH_SERVER_MEMORY = 1130, + ERROR_POSSIBLE_DEADLOCK = 1131, + ERROR_MAPPED_ALIGNMENT = 1132, + ERROR_SET_POWER_STATE_VETOED = 1140, + ERROR_SET_POWER_STATE_FAILED = 1141, + ERROR_TOO_MANY_LINKS = 1142, + ERROR_OLD_WIN_VERSION = 1150, + ERROR_APP_WRONG_OS = 1151, + ERROR_SINGLE_INSTANCE_APP = 1152, + ERROR_RMODE_APP = 1153, + ERROR_INVALID_DLL = 1154, + ERROR_NO_ASSOCIATION = 1155, + ERROR_DDE_FAIL = 1156, + ERROR_DLL_NOT_FOUND = 1157, + ERROR_NO_MORE_USER_HANDLES = 1158, + ERROR_MESSAGE_SYNC_ONLY = 1159, + ERROR_SOURCE_ELEMENT_EMPTY = 1160, + ERROR_DESTINATION_ELEMENT_FULL = 1161, + ERROR_ILLEGAL_ELEMENT_ADDRESS = 1162, + ERROR_MAGAZINE_NOT_PRESENT = 1163, + ERROR_DEVICE_REINITIALIZATION_NEEDED = 1164, + ERROR_DEVICE_REQUIRES_CLEANING = 1165, + ERROR_DEVICE_DOOR_OPEN = 1166, + ERROR_DEVICE_NOT_CONNECTED = 1167, + ERROR_NOT_FOUND = 1168, + ERROR_NO_MATCH = 1169, + ERROR_SET_NOT_FOUND = 1170, + ERROR_POINT_NOT_FOUND = 1171, + ERROR_NO_TRACKING_SERVICE = 1172, + ERROR_NO_VOLUME_ID = 1173, + ERROR_UNABLE_TO_REMOVE_REPLACED = 1175, + ERROR_UNABLE_TO_MOVE_REPLACEMENT = 1176, + ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 = 1177, + ERROR_JOURNAL_DELETE_IN_PROGRESS = 1178, + ERROR_JOURNAL_NOT_ACTIVE = 1179, + ERROR_POTENTIAL_FILE_FOUND = 1180, + ERROR_JOURNAL_ENTRY_DELETED = 1181, + ERROR_BAD_DEVICE = 1200, + ERROR_CONNECTION_UNAVAIL = 1201, + ERROR_DEVICE_ALREADY_REMEMBERED = 1202, + ERROR_NO_NET_OR_BAD_PATH = 1203, + ERROR_BAD_PROVIDER = 1204, + ERROR_CANNOT_OPEN_PROFILE = 1205, + ERROR_BAD_PROFILE = 1206, + ERROR_NOT_CONTAINER = 1207, + ERROR_EXTENDED_ERROR = 1208, + ERROR_INVALID_GROUPNAME = 1209, + ERROR_INVALID_COMPUTERNAME = 1210, + ERROR_INVALID_EVENTNAME = 1211, + ERROR_INVALID_DOMAINNAME = 1212, + ERROR_INVALID_SERVICENAME = 1213, + ERROR_INVALID_NETNAME = 1214, + ERROR_INVALID_SHARENAME = 1215, + ERROR_INVALID_PASSWORDNAME = 1216, + ERROR_INVALID_MESSAGENAME = 1217, + ERROR_INVALID_MESSAGEDEST = 1218, + ERROR_SESSION_CREDENTIAL_CONFLICT = 1219, + ERROR_REMOTE_SESSION_LIMIT_EXCEEDED = 1220, + ERROR_DUP_DOMAINNAME = 1221, + ERROR_NO_NETWORK = 1222, + ERROR_CANCELLED = 1223, + ERROR_USER_MAPPED_FILE = 1224, + ERROR_CONNECTION_REFUSED = 1225, + ERROR_GRACEFUL_DISCONNECT = 1226, + ERROR_ADDRESS_ALREADY_ASSOCIATED = 1227, + ERROR_ADDRESS_NOT_ASSOCIATED = 1228, + ERROR_CONNECTION_INVALID = 1229, + ERROR_CONNECTION_ACTIVE = 1230, + ERROR_NETWORK_UNREACHABLE = 1231, + ERROR_HOST_UNREACHABLE = 1232, + ERROR_PROTOCOL_UNREACHABLE = 1233, + ERROR_PORT_UNREACHABLE = 1234, + ERROR_REQUEST_ABORTED = 1235, + ERROR_CONNECTION_ABORTED = 1236, + ERROR_RETRY = 1237, + ERROR_CONNECTION_COUNT_LIMIT = 1238, + ERROR_LOGIN_TIME_RESTRICTION = 1239, + ERROR_LOGIN_WKSTA_RESTRICTION = 1240, + ERROR_INCORRECT_ADDRESS = 1241, + ERROR_ALREADY_REGISTERED = 1242, + ERROR_SERVICE_NOT_FOUND = 1243, + ERROR_NOT_AUTHENTICATED = 1244, + ERROR_NOT_LOGGED_ON = 1245, + ERROR_CONTINUE = 1246, + ERROR_ALREADY_INITIALIZED = 1247, + ERROR_NO_MORE_DEVICES = 1248, + ERROR_NO_SUCH_SITE = 1249, + ERROR_DOMAIN_CONTROLLER_EXISTS = 1250, + ERROR_ONLY_IF_CONNECTED = 1251, + ERROR_OVERRIDE_NOCHANGES = 1252, + ERROR_BAD_USER_PROFILE = 1253, + ERROR_NOT_SUPPORTED_ON_SBS = 1254, + ERROR_SERVER_SHUTDOWN_IN_PROGRESS = 1255, + ERROR_HOST_DOWN = 1256, + ERROR_NON_ACCOUNT_SID = 1257, + ERROR_NON_DOMAIN_SID = 1258, + ERROR_APPHELP_BLOCK = 1259, + ERROR_ACCESS_DISABLED_BY_POLICY = 1260, + ERROR_REG_NAT_CONSUMPTION = 1261, + ERROR_CSCSHARE_OFFLINE = 1262, + ERROR_PKINIT_FAILURE = 1263, + ERROR_SMARTCARD_SUBSYSTEM_FAILURE = 1264, + ERROR_DOWNGRADE_DETECTED = 1265, + SEC_E_SMARTCARD_CERT_REVOKED = 1266, + SEC_E_ISSUING_CA_UNTRUSTED = 1267, + SEC_E_REVOCATION_OFFLINE_C = 1268, + SEC_E_PKINIT_CLIENT_FAILUR = 1269, + SEC_E_SMARTCARD_CERT_EXPIRED = 1270, + ERROR_MACHINE_LOCKED = 1271, + ERROR_CALLBACK_SUPPLIED_INVALID_DATA = 1273, + ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED = 1274, + ERROR_DRIVER_BLOCKED = 1275, + ERROR_INVALID_IMPORT_OF_NON_DLL = 1276, + ERROR_NOT_ALL_ASSIGNED = 1300, + ERROR_SOME_NOT_MAPPED = 1301, + ERROR_NO_QUOTAS_FOR_ACCOUNT = 1302, + ERROR_LOCAL_USER_SESSION_KEY = 1303, + ERROR_NULL_LM_PASSWORD = 1304, + ERROR_UNKNOWN_REVISION = 1305, + ERROR_REVISION_MISMATCH = 1306, + ERROR_INVALID_OWNER = 1307, + ERROR_INVALID_PRIMARY_GROUP = 1308, + ERROR_NO_IMPERSONATION_TOKEN = 1309, + ERROR_CANT_DISABLE_MANDATORY = 1310, + ERROR_NO_LOGON_SERVERS = 1311, + ERROR_NO_SUCH_LOGON_SESSION = 1312, + ERROR_NO_SUCH_PRIVILEGE = 1313, + ERROR_PRIVILEGE_NOT_HELD = 1314, + ERROR_INVALID_ACCOUNT_NAME = 1315, + ERROR_USER_EXISTS = 1316, + ERROR_NO_SUCH_USER = 1317, + ERROR_GROUP_EXISTS = 1318, + ERROR_NO_SUCH_GROUP = 1319, + ERROR_MEMBER_IN_GROUP = 1320, + ERROR_MEMBER_NOT_IN_GROUP = 1321, + ERROR_LAST_ADMIN = 1322, + ERROR_WRONG_PASSWORD = 1323, + ERROR_ILL_FORMED_PASSWORD = 1324, + ERROR_PASSWORD_RESTRICTION = 1325, + ERROR_LOGON_FAILURE = 1326, + ERROR_ACCOUNT_RESTRICTION = 1327, + ERROR_INVALID_LOGON_HOURS = 1328, + ERROR_INVALID_WORKSTATION = 1329, + ERROR_PASSWORD_EXPIRED = 1330, + ERROR_ACCOUNT_DISABLED = 1331, + ERROR_NONE_MAPPED = 1332, + ERROR_TOO_MANY_LUIDS_REQUESTED = 1333, + ERROR_LUIDS_EXHAUSTED = 1334, + ERROR_INVALID_SUB_AUTHORITY = 1335, + ERROR_INVALID_ACL = 1336, + ERROR_INVALID_SID = 1337, + ERROR_INVALID_SECURITY_DESCR = 1338, + ERROR_BAD_INHERITANCE_ACL = 1340, + ERROR_SERVER_DISABLED = 1341, + ERROR_SERVER_NOT_DISABLED = 1342, + ERROR_INVALID_ID_AUTHORITY = 1343, + ERROR_ALLOTTED_SPACE_EXCEEDED = 1344, + ERROR_INVALID_GROUP_ATTRIBUTES = 1345, + ERROR_BAD_IMPERSONATION_LEVEL = 1346, + ERROR_CANT_OPEN_ANONYMOUS = 1347, + ERROR_BAD_VALIDATION_CLASS = 1348, + ERROR_BAD_TOKEN_TYPE = 1349, + ERROR_NO_SECURITY_ON_OBJECT = 1350, + ERROR_CANT_ACCESS_DOMAIN_INFO = 1351, + ERROR_INVALID_SERVER_STATE = 1352, + ERROR_INVALID_DOMAIN_STATE = 1353, + ERROR_INVALID_DOMAIN_ROLE = 1354, + ERROR_NO_SUCH_DOMAIN = 1355, + ERROR_DOMAIN_EXISTS = 1356, + ERROR_DOMAIN_LIMIT_EXCEEDED = 1357, + ERROR_INTERNAL_DB_CORRUPTION = 1358, + ERROR_INTERNAL_ERROR = 1359, + ERROR_GENERIC_NOT_MAPPED = 1360, + ERROR_BAD_DESCRIPTOR_FORMAT = 1361, + ERROR_NOT_LOGON_PROCESS = 1362, + ERROR_LOGON_SESSION_EXISTS = 1363, + ERROR_NO_SUCH_PACKAGE = 1364, + ERROR_BAD_LOGON_SESSION_STATE = 1365, + ERROR_LOGON_SESSION_COLLISION = 1366, + ERROR_INVALID_LOGON_TYPE = 1367, + ERROR_CANNOT_IMPERSONATE = 1368, + ERROR_RXACT_INVALID_STATE = 1369, + ERROR_RXACT_COMMIT_FAILURE = 1370, + ERROR_SPECIAL_ACCOUNT = 1371, + ERROR_SPECIAL_GROUP = 1372, + ERROR_SPECIAL_USER = 1373, + ERROR_MEMBERS_PRIMARY_GROUP = 1374, + ERROR_TOKEN_ALREADY_IN_USE = 1375, + ERROR_NO_SUCH_ALIAS = 1376, + ERROR_MEMBER_NOT_IN_ALIAS = 1377, + ERROR_MEMBER_IN_ALIAS = 1378, + ERROR_ALIAS_EXISTS = 1379, + ERROR_LOGON_NOT_GRANTED = 1380, + ERROR_TOO_MANY_SECRETS = 1381, + ERROR_SECRET_TOO_LONG = 1382, + ERROR_INTERNAL_DB_ERROR = 1383, + ERROR_TOO_MANY_CONTEXT_IDS = 1384, + ERROR_LOGON_TYPE_NOT_GRANTED = 1385, + ERROR_NT_CROSS_ENCRYPTION_REQUIRED = 1386, + ERROR_NO_SUCH_MEMBER = 1387, + ERROR_INVALID_MEMBER = 1388, + ERROR_TOO_MANY_SIDS = 1389, + ERROR_LM_CROSS_ENCRYPTION_REQUIRED = 1390, + ERROR_NO_INHERITANCE = 1391, + ERROR_FILE_CORRUPT = 1392, + ERROR_DISK_CORRUPT = 1393, + ERROR_NO_USER_SESSION_KEY = 1394, + ERROR_LICENSE_QUOTA_EXCEEDED = 1395, + ERROR_WRONG_TARGET_NAME = 1396, + ERROR_MUTUAL_AUTH_FAILED = 1397, + ERROR_TIME_SKEW = 1398, + ERROR_CURRENT_DOMAIN_NOT_ALLOWED = 1399, + ERROR_INVALID_WINDOW_HANDLE = 1400, + ERROR_INVALID_MENU_HANDLE = 1401, + ERROR_INVALID_CURSOR_HANDLE = 1402, + ERROR_INVALID_ACCEL_HANDLE = 1403, + ERROR_INVALID_HOOK_HANDLE = 1404, + ERROR_INVALID_DWP_HANDLE = 1405, + ERROR_TLW_WITH_WSCHILD = 1406, + ERROR_CANNOT_FIND_WND_CLASS = 1407, + ERROR_WINDOW_OF_OTHER_THREAD = 1408, + ERROR_HOTKEY_ALREADY_REGISTERED = 1409, + ERROR_CLASS_ALREADY_EXISTS = 1410, + ERROR_CLASS_DOES_NOT_EXIST = 1411, + ERROR_CLASS_HAS_WINDOWS = 1412, + ERROR_INVALID_INDEX = 1413, + ERROR_INVALID_ICON_HANDLE = 1414, + ERROR_PRIVATE_DIALOG_INDEX = 1415, + ERROR_LISTBOX_ID_NOT_FOUND = 1416, + ERROR_NO_WILDCARD_CHARACTERS = 1417, + ERROR_CLIPBOARD_NOT_OPEN = 1418, + ERROR_HOTKEY_NOT_REGISTERED = 1419, + ERROR_WINDOW_NOT_DIALOG = 1420, + ERROR_CONTROL_ID_NOT_FOUND = 1421, + ERROR_INVALID_COMBOBOX_MESSAGE = 1422, + ERROR_WINDOW_NOT_COMBOBOX = 1423, + ERROR_INVALID_EDIT_HEIGHT = 1424, + ERROR_DC_NOT_FOUND = 1425, + ERROR_INVALID_HOOK_FILTER = 1426, + ERROR_INVALID_FILTER_PROC = 1427, + ERROR_HOOK_NEEDS_HMOD = 1428, + ERROR_GLOBAL_ONLY_HOOK = 1429, + ERROR_JOURNAL_HOOK_SET = 1430, + ERROR_HOOK_NOT_INSTALLED = 1431, + ERROR_INVALID_LB_MESSAGE = 1432, + ERROR_SETCOUNT_ON_BAD_LB = 1433, + ERROR_LB_WITHOUT_TABSTOPS = 1434, + ERROR_DESTROY_OBJECT_OF_OTHER_THREAD = 1435, + ERROR_CHILD_WINDOW_MENU = 1436, + ERROR_NO_SYSTEM_MENU = 1437, + ERROR_INVALID_MSGBOX_STYLE = 1438, + ERROR_INVALID_SPI_VALUE = 1439, + ERROR_SCREEN_ALREADY_LOCKED = 1440, + ERROR_HWNDS_HAVE_DIFF_PARENT = 1441, + ERROR_NOT_CHILD_WINDOW = 1442, + ERROR_INVALID_GW_COMMAND = 1443, + ERROR_INVALID_THREAD_ID = 1444, + ERROR_NON_MDICHILD_WINDOW = 1445, + ERROR_POPUP_ALREADY_ACTIVE = 1446, + ERROR_NO_SCROLLBARS = 1447, + ERROR_INVALID_SCROLLBAR_RANGE = 1448, + ERROR_INVALID_SHOWWIN_COMMAND = 1449, + ERROR_NO_SYSTEM_RESOURCES = 1450, + ERROR_NONPAGED_SYSTEM_RESOURCES = 1451, + ERROR_PAGED_SYSTEM_RESOURCES = 1452, + ERROR_WORKING_SET_QUOTA = 1453, + ERROR_PAGEFILE_QUOTA = 1454, + ERROR_COMMITMENT_LIMIT = 1455, + ERROR_MENU_ITEM_NOT_FOUND = 1456, + ERROR_INVALID_KEYBOARD_HANDLE = 1457, + ERROR_HOOK_TYPE_NOT_ALLOWED = 1458, + ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION = 1459, + ERROR_TIMEOUT = 1460, + ERROR_INVALID_MONITOR_HANDLE = 1461, + ERROR_EVENTLOG_FILE_CORRUPT = 1500, + ERROR_EVENTLOG_CANT_START = 1501, + ERROR_LOG_FILE_FULL = 1502, + ERROR_EVENTLOG_FILE_CHANGED = 1503, + ERROR_INSTALL_SERVICE_FAILURE = 1601, + ERROR_INSTALL_USEREXIT = 1602, + ERROR_INSTALL_FAILURE = 1603, + ERROR_INSTALL_SUSPEND = 1604, + ERROR_UNKNOWN_PRODUCT = 1605, + ERROR_UNKNOWN_FEATURE = 1606, + ERROR_UNKNOWN_COMPONENT = 1607, + ERROR_UNKNOWN_PROPERTY = 1608, + ERROR_INVALID_HANDLE_STATE = 1609, + ERROR_BAD_CONFIGURATION = 1610, + ERROR_INDEX_ABSENT = 1611, + ERROR_INSTALL_SOURCE_ABSENT = 1612, + ERROR_INSTALL_PACKAGE_VERSION = 1613, + ERROR_PRODUCT_UNINSTALLED = 1614, + ERROR_BAD_QUERY_SYNTAX = 1615, + ERROR_INVALID_FIELD = 1616, + ERROR_DEVICE_REMOVED = 1617, + ERROR_INSTALL_ALREADY_RUNNING = 1618, + ERROR_INSTALL_PACKAGE_OPEN_FAILED = 1619, + ERROR_INSTALL_PACKAGE_INVALID = 1620, + ERROR_INSTALL_UI_FAILURE = 1621, + ERROR_INSTALL_LOG_FAILURE = 1622, + ERROR_INSTALL_LANGUAGE_UNSUPPORTED = 1623, + ERROR_INSTALL_TRANSFORM_FAILURE = 1624, + ERROR_INSTALL_PACKAGE_REJECTED = 1625, + ERROR_FUNCTION_NOT_CALLED = 1626, + ERROR_FUNCTION_FAILED = 1627, + ERROR_INVALID_TABLE = 1628, + ERROR_DATATYPE_MISMATCH = 1629, + ERROR_UNSUPPORTED_TYPE = 1630, + ERROR_CREATE_FAILED = 1631, + ERROR_INSTALL_TEMP_UNWRITABLE = 1632, + ERROR_INSTALL_PLATFORM_UNSUPPORTED = 1633, + ERROR_INSTALL_NOTUSED = 1634, + ERROR_PATCH_PACKAGE_OPEN_FAILED = 1635, + ERROR_PATCH_PACKAGE_INVALID = 1636, + ERROR_PATCH_PACKAGE_UNSUPPORTED = 1637, + ERROR_PRODUCT_VERSION = 1638, + ERROR_INVALID_COMMAND_LINE = 1639, + ERROR_INSTALL_REMOTE_DISALLOWED = 1640, + ERROR_SUCCESS_REBOOT_INITIATED = 1641, + ERROR_PATCH_TARGET_NOT_FOUND = 1642, + ERROR_PATCH_PACKAGE_REJECTED = 1643, + ERROR_INSTALL_TRANSFORM_REJECTED = 1644, + RPC_S_INVALID_STRING_BINDING = 1700, + RPC_S_WRONG_KIND_OF_BINDING = 1701, + RPC_S_INVALID_BINDING = 1702, + RPC_S_PROTSEQ_NOT_SUPPORTED = 1703, + RPC_S_INVALID_RPC_PROTSEQ = 1704, + RPC_S_INVALID_STRING_UUID = 1705, + RPC_S_INVALID_ENDPOINT_FORMAT = 1706, + RPC_S_INVALID_NET_ADDR = 1707, + RPC_S_NO_ENDPOINT_FOUND = 1708, + RPC_S_INVALID_TIMEOUT = 1709, + RPC_S_OBJECT_NOT_FOUND = 1710, + RPC_S_ALREADY_REGISTERED = 1711, + RPC_S_TYPE_ALREADY_REGISTERED = 1712, + RPC_S_ALREADY_LISTENING = 1713, + RPC_S_NO_PROTSEQS_REGISTERED = 1714, + RPC_S_NOT_LISTENING = 1715, + RPC_S_UNKNOWN_MGR_TYPE = 1716, + RPC_S_UNKNOWN_IF = 1717, + RPC_S_NO_BINDINGS = 1718, + RPC_S_NO_PROTSEQS = 1719, + RPC_S_CANT_CREATE_ENDPOINT = 1720, + RPC_S_OUT_OF_RESOURCES = 1721, + RPC_S_SERVER_UNAVAILABLE = 1722, + RPC_S_SERVER_TOO_BUSY = 1723, + RPC_S_INVALID_NETWORK_OPTIONS = 1724, + RPC_S_NO_CALL_ACTIVE = 1725, + RPC_S_CALL_FAILED = 1726, + RPC_S_CALL_FAILED_DNE = 1727, + RPC_S_PROTOCOL_ERROR = 1728, + RPC_S_UNSUPPORTED_TRANS_SYN = 1730, + RPC_S_UNSUPPORTED_TYPE = 1732, + RPC_S_INVALID_TAG = 1733, + RPC_S_INVALID_BOUND = 1734, + RPC_S_NO_ENTRY_NAME = 1735, + RPC_S_INVALID_NAME_SYNTAX = 1736, + RPC_S_UNSUPPORTED_NAME_SYNTAX = 1737, + RPC_S_UUID_NO_ADDRESS = 1739, + RPC_S_DUPLICATE_ENDPOINT = 1740, + RPC_S_UNKNOWN_AUTHN_TYPE = 1741, + RPC_S_MAX_CALLS_TOO_SMALL = 1742, + RPC_S_STRING_TOO_LONG = 1743, + RPC_S_PROTSEQ_NOT_FOUND = 1744, + RPC_S_PROCNUM_OUT_OF_RANGE = 1745, + RPC_S_BINDING_HAS_NO_AUTH = 1746, + RPC_S_UNKNOWN_AUTHN_SERVICE = 1747, + RPC_S_UNKNOWN_AUTHN_LEVEL = 1748, + RPC_S_INVALID_AUTH_IDENTITY = 1749, + RPC_S_UNKNOWN_AUTHZ_SERVICE = 1750, + EPT_S_INVALID_ENTRY = 1751, + EPT_S_CANT_PERFORM_OP = 1752, + EPT_S_NOT_REGISTERED = 1753, + RPC_S_NOTHING_TO_EXPORT = 1754, + RPC_S_INCOMPLETE_NAME = 1755, + RPC_S_INVALID_VERS_OPTION = 1756, + RPC_S_NO_MORE_MEMBERS = 1757, + RPC_S_NOT_ALL_OBJS_UNEXPORTED = 1758, + RPC_S_INTERFACE_NOT_FOUND = 1759, + RPC_S_ENTRY_ALREADY_EXISTS = 1760, + RPC_S_ENTRY_NOT_FOUND = 1761, + RPC_S_NAME_SERVICE_UNAVAILABLE = 1762, + RPC_S_INVALID_NAF_ID = 1763, + RPC_S_CANNOT_SUPPORT = 1764, + RPC_S_NO_CONTEXT_AVAILABLE = 1765, + RPC_S_INTERNAL_ERROR = 1766, + RPC_S_ZERO_DIVIDE = 1767, + RPC_S_ADDRESS_ERROR = 1768, + RPC_S_FP_DIV_ZERO = 1769, + RPC_S_FP_UNDERFLOW = 1770, + RPC_S_FP_OVERFLOW = 1771, + RPC_X_NO_MORE_ENTRIES = 1772, + RPC_X_SS_CHAR_TRANS_OPEN_FAIL = 1773, + RPC_X_SS_CHAR_TRANS_SHORT_FILE = 1774, + RPC_X_SS_IN_NULL_CONTEXT = 1775, + RPC_X_SS_CONTEXT_DAMAGED = 1777, + RPC_X_SS_HANDLES_MISMATCH = 1778, + RPC_X_SS_CANNOT_GET_CALL_HANDLE = 1779, + RPC_X_NULL_REF_POINTER = 1780, + RPC_X_ENUM_VALUE_OUT_OF_RANGE = 1781, + RPC_X_BYTE_COUNT_TOO_SMALL = 1782, + RPC_X_BAD_STUB_DATA = 1783, + ERROR_INVALID_USER_BUFFER = 1784, + ERROR_UNRECOGNIZED_MEDIA = 1785, + ERROR_NO_TRUST_LSA_SECRET = 1786, + ERROR_NO_TRUST_SAM_ACCOUNT = 1787, + ERROR_TRUSTED_DOMAIN_FAILURE = 1788, + ERROR_TRUSTED_RELATIONSHIP_FAILURE = 1789, + ERROR_TRUST_FAILURE = 1790, + RPC_S_CALL_IN_PROGRESS = 1791, + ERROR_NETLOGON_NOT_STARTED = 1792, + ERROR_ACCOUNT_EXPIRED = 1793, + ERROR_REDIRECTOR_HAS_OPEN_HANDLES = 1794, + ERROR_PRINTER_DRIVER_ALREADY_INSTALLED = 1795, + ERROR_UNKNOWN_PORT = 1796, + ERROR_UNKNOWN_PRINTER_DRIVER = 1797, + ERROR_UNKNOWN_PRINTPROCESSOR = 1798, + ERROR_INVALID_SEPARATOR_FILE = 1799, + ERROR_INVALID_PRIORITY = 1800, + ERROR_INVALID_PRINTER_NAME = 1801, + ERROR_PRINTER_ALREADY_EXISTS = 1802, + ERROR_INVALID_PRINTER_COMMAND = 1803, + ERROR_INVALID_DATATYPE = 1804, + ERROR_INVALID_ENVIRONMENT = 1805, + RPC_S_NO_MORE_BINDINGS = 1806, + ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = 1807, + ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT = 1808, + ERROR_NOLOGON_SERVER_TRUST_ACCOUNT = 1809, + ERROR_DOMAIN_TRUST_INCONSISTENT = 1810, + ERROR_SERVER_HAS_OPEN_HANDLES = 1811, + ERROR_RESOURCE_DATA_NOT_FOUND = 1812, + ERROR_RESOURCE_TYPE_NOT_FOUND = 1813, + ERROR_RESOURCE_NAME_NOT_FOUND = 1814, + ERROR_RESOURCE_LANG_NOT_FOUND = 1815, + ERROR_NOT_ENOUGH_QUOTA = 1816, + RPC_S_NO_INTERFACES = 1817, + RPC_S_CALL_CANCELLED = 1818, + RPC_S_BINDING_INCOMPLETE = 1819, + RPC_S_COMM_FAILURE = 1820, + RPC_S_UNSUPPORTED_AUTHN_LEVEL = 1821, + RPC_S_NO_PRINC_NAME = 1822, + RPC_S_NOT_RPC_ERROR = 1823, + RPC_S_UUID_LOCAL_ONLY = 1824, + RPC_S_SEC_PKG_ERROR = 1825, + RPC_S_NOT_CANCELLED = 1826, + RPC_X_INVALID_ES_ACTION = 1827, + RPC_X_WRONG_ES_VERSION = 1828, + RPC_X_WRONG_STUB_VERSION = 1829, + RPC_X_INVALID_PIPE_OBJECT = 1830, + RPC_X_WRONG_PIPE_ORDER = 1831, + RPC_X_WRONG_PIPE_VERSION = 1832, + RPC_S_GROUP_MEMBER_NOT_FOUND = 1898, + EPT_S_CANT_CREATE = 1899, + RPC_S_INVALID_OBJECT = 1900, + ERROR_INVALID_TIME = 1901, + ERROR_INVALID_FORM_NAME = 1902, + ERROR_INVALID_FORM_SIZE = 1903, + ERROR_ALREADY_WAITING = 1904, + ERROR_PRINTER_DELETED = 1905, + ERROR_INVALID_PRINTER_STATE = 1906, + ERROR_PASSWORD_MUST_CHANGE = 1907, + ERROR_DOMAIN_CONTROLLER_NOT_FOUND = 1908, + ERROR_ACCOUNT_LOCKED_OUT = 1909, + OR_INVALID_OXID = 1910, + OR_INVALID_OID = 1911, + OR_INVALID_SET = 1912, + RPC_S_SEND_INCOMPLETE = 1913, + RPC_S_INVALID_ASYNC_HANDLE = 1914, + RPC_S_INVALID_ASYNC_CALL = 1915, + RPC_X_PIPE_CLOSED = 1916, + RPC_X_PIPE_DISCIPLINE_ERROR = 1917, + RPC_X_PIPE_EMPTY = 1918, + ERROR_NO_SITENAME = 1919, + ERROR_CANT_ACCESS_FILE = 1920, + ERROR_CANT_RESOLVE_FILENAME = 1921, + RPC_S_ENTRY_TYPE_MISMATCH = 1922, + RPC_S_NOT_ALL_OBJS_EXPORTED = 1923, + RPC_S_INTERFACE_NOT_EXPORTED = 1924, + RPC_S_PROFILE_NOT_ADDED = 1925, + RPC_S_PRF_ELT_NOT_ADDED = 1926, + RPC_S_PRF_ELT_NOT_REMOVED = 1927, + RPC_S_GRP_ELT_NOT_ADDED = 1928, + RPC_S_GRP_ELT_NOT_REMOVED = 1929, + ERROR_KM_DRIVER_BLOCKED = 1930, + ERROR_CONTEXT_EXPIRED = 1931, + ERROR_INVALID_PIXEL_FORMAT = 2000, + ERROR_BAD_DRIVER = 2001, + ERROR_INVALID_WINDOW_STYLE = 2002, + ERROR_METAFILE_NOT_SUPPORTED = 2003, + ERROR_TRANSFORM_NOT_SUPPORTED = 2004, + ERROR_CLIPPING_NOT_SUPPORTED = 2005, + ERROR_INVALID_CMM = 2010, + ERROR_INVALID_PROFILE = 2011, + ERROR_TAG_NOT_FOUND = 2012, + ERROR_TAG_NOT_PRESENT = 2013, + ERROR_DUPLICATE_TAG = 2014, + ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE = 2015, + ERROR_PROFILE_NOT_FOUND = 2016, + ERROR_INVALID_COLORSPACE = 2017, + ERROR_ICM_NOT_ENABLED = 2018, + ERROR_DELETING_ICM_XFORM = 2019, + ERROR_INVALID_TRANSFORM = 2020, + ERROR_COLORSPACE_MISMATCH = 2021, + ERROR_INVALID_COLORINDEX = 2022, + ERROR_CONNECTED_OTHER_PASSWORD = 2108, + ERROR_CONNECTED_OTHER_PASSWORD_DEFAULT = 2109, + ERROR_BAD_USERNAME = 2202, + ERROR_NOT_CONNECTED = 2250, + ERROR_OPEN_FILES = 2401, + ERROR_ACTIVE_CONNECTIONS = 2402, + ERROR_DEVICE_IN_USE = 2404, + ERROR_UNKNOWN_PRINT_MONITOR = 3000, + ERROR_PRINTER_DRIVER_IN_USE = 3001, + ERROR_SPOOL_FILE_NOT_FOUND = 3002, + ERROR_SPL_NO_STARTDOC = 3003, + ERROR_SPL_NO_ADDJOB = 3004, + ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED = 3005, + ERROR_PRINT_MONITOR_ALREADY_INSTALLED = 3006, + ERROR_INVALID_PRINT_MONITOR = 3007, + ERROR_PRINT_MONITOR_IN_USE = 3008, + ERROR_PRINTER_HAS_JOBS_QUEUED = 3009, + ERROR_SUCCESS_REBOOT_REQUIRED = 3010, + ERROR_SUCCESS_RESTART_REQUIRED = 3011, + ERROR_PRINTER_NOT_FOUND = 3012, + ERROR_PRINTER_DRIVER_WARNED = 3013, + ERROR_PRINTER_DRIVER_BLOCKED = 3014, + ERROR_WINS_INTERNAL = 4000, + ERROR_CAN_NOT_DEL_LOCAL_WINS = 4001, + ERROR_STATIC_INIT = 4002, + ERROR_INC_BACKUP = 4003, + ERROR_FULL_BACKUP = 4004, + ERROR_REC_NON_EXISTENT = 4005, + ERROR_RPL_NOT_ALLOWED = 4006, + ERROR_DHCP_ADDRESS_CONFLICT = 4100, + ERROR_WMI_GUID_NOT_FOUND = 4200, + ERROR_WMI_INSTANCE_NOT_FOUND = 4201, + ERROR_WMI_ITEMID_NOT_FOUND = 4202, + ERROR_WMI_TRY_AGAIN = 4203, + ERROR_WMI_DP_NOT_FOUND = 4204, + ERROR_WMI_UNRESOLVED_INSTANCE_REF = 4205, + ERROR_WMI_ALREADY_ENABLED = 4206, + ERROR_WMI_GUID_DISCONNECTED = 4207, + ERROR_WMI_SERVER_UNAVAILABLE = 4208, + ERROR_WMI_DP_FAILED = 4209, + ERROR_WMI_INVALID_MOF = 4210, + ERROR_WMI_INVALID_REGINFO = 4211, + ERROR_WMI_ALREADY_DISABLED = 4212, + ERROR_WMI_READ_ONLY = 4213, + ERROR_WMI_SET_FAILURE = 4214, + ERROR_INVALID_MEDIA = 4300, + ERROR_INVALID_LIBRARY = 4301, + ERROR_INVALID_MEDIA_POOL = 4302, + ERROR_DRIVE_MEDIA_MISMATCH = 4303, + ERROR_MEDIA_OFFLINE = 4304, + ERROR_LIBRARY_OFFLINE = 4305, + ERROR_EMPTY = 4306, + ERROR_NOT_EMPTY = 4307, + ERROR_MEDIA_UNAVAILABLE = 4308, + ERROR_RESOURCE_DISABLED = 4309, + ERROR_INVALID_CLEANER = 4310, + ERROR_UNABLE_TO_CLEAN = 4311, + ERROR_OBJECT_NOT_FOUND = 4312, + ERROR_DATABASE_FAILURE = 4313, + ERROR_DATABASE_FULL = 4314, + ERROR_MEDIA_INCOMPATIBLE = 4315, + ERROR_RESOURCE_NOT_PRESENT = 4316, + ERROR_INVALID_OPERATION = 4317, + ERROR_MEDIA_NOT_AVAILABLE = 4318, + ERROR_DEVICE_NOT_AVAILABLE = 4319, + ERROR_REQUEST_REFUSED = 4320, + ERROR_INVALID_DRIVE_OBJECT = 4321, + ERROR_LIBRARY_FULL = 4322, + ERROR_MEDIUM_NOT_ACCESSIBLE = 4323, + ERROR_UNABLE_TO_LOAD_MEDIUM = 4324, + ERROR_UNABLE_TO_INVENTORY_DRIVE = 4325, + ERROR_UNABLE_TO_INVENTORY_SLOT = 4326, + ERROR_UNABLE_TO_INVENTORY_TRANSPORT = 4327, + ERROR_TRANSPORT_FULL = 4328, + ERROR_CONTROLLING_IEPORT = 4329, + ERROR_UNABLE_TO_EJECT_MOUNTED_MEDIA = 4330, + ERROR_CLEANER_SLOT_SET = 4331, + ERROR_CLEANER_SLOT_NOT_SET = 4332, + ERROR_CLEANER_CARTRIDGE_SPENT = 4333, + ERROR_UNEXPECTED_OMID = 4334, + ERROR_CANT_DELETE_LAST_ITEM = 4335, + ERROR_MESSAGE_EXCEEDS_MAX_SIZE = 4336, + ERROR_VOLUME_CONTAINS_SYS_FILES = 4337, + ERROR_INDIGENOUS_TYPE = 4338, + ERROR_NO_SUPPORTING_DRIVES = 4339, + ERROR_CLEANER_CARTRIDGE_INSTALLED = 4340, + ERROR_FILE_OFFLINE = 4350, + ERROR_REMOTE_STORAGE_NOT_ACTIVE = 4351, + ERROR_REMOTE_STORAGE_MEDIA_ERROR = 4352, + ERROR_NOT_A_REPARSE_POINT = 4390, + ERROR_REPARSE_ATTRIBUTE_CONFLICT = 4391, + ERROR_INVALID_REPARSE_DATA = 4392, + ERROR_REPARSE_TAG_INVALID = 4393, + ERROR_REPARSE_TAG_MISMATCH = 4394, + ERROR_VOLUME_NOT_SIS_ENABLED = 4500, + ERROR_DEPENDENT_RESOURCE_EXISTS = 5001, + ERROR_DEPENDENCY_NOT_FOUND = 5002, + ERROR_DEPENDENCY_ALREADY_EXISTS = 5003, + ERROR_RESOURCE_NOT_ONLINE = 5004, + ERROR_HOST_NODE_NOT_AVAILABLE = 5005, + ERROR_RESOURCE_NOT_AVAILABLE = 5006, + ERROR_RESOURCE_NOT_FOUND = 5007, + ERROR_SHUTDOWN_CLUSTER = 5008, + ERROR_CANT_EVICT_ACTIVE_NODE = 5009, + ERROR_OBJECT_ALREADY_EXISTS = 5010, + ERROR_OBJECT_IN_LIST = 5011, + ERROR_GROUP_NOT_AVAILABLE = 5012, + ERROR_GROUP_NOT_FOUND = 5013, + ERROR_GROUP_NOT_ONLINE = 5014, + ERROR_HOST_NODE_NOT_RESOURCE_OWNER = 5015, + ERROR_HOST_NODE_NOT_GROUP_OWNER = 5016, + ERROR_RESMON_CREATE_FAILED = 5017, + ERROR_RESMON_ONLINE_FAILED = 5018, + ERROR_RESOURCE_ONLINE = 5019, + ERROR_QUORUM_RESOURCE = 5020, + ERROR_NOT_QUORUM_CAPABLE = 5021, + ERROR_CLUSTER_SHUTTING_DOWN = 5022, + ERROR_INVALID_STATE = 5023, + ERROR_RESOURCE_PROPERTIES_STORED = 5024, + ERROR_NOT_QUORUM_CLASS = 5025, + ERROR_CORE_RESOURCE = 5026, + ERROR_QUORUM_RESOURCE_ONLINE_FAILED = 5027, + ERROR_QUORUMLOG_OPEN_FAILED = 5028, + ERROR_CLUSTERLOG_CORRUPT = 5029, + ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZE = 5030, + ERROR_CLUSTERLOG_EXCEEDS_MAXSIZE = 5031, + ERROR_CLUSTERLOG_CHKPOINT_NOT_FOUND = 5032, + ERROR_CLUSTERLOG_NOT_ENOUGH_SPACE = 5033, + ERROR_QUORUM_OWNER_ALIVE = 5034, + ERROR_NETWORK_NOT_AVAILABLE = 5035, + ERROR_NODE_NOT_AVAILABLE = 5036, + ERROR_ALL_NODES_NOT_AVAILABLE = 5037, + ERROR_RESOURCE_FAILED = 5038, + ERROR_CLUSTER_INVALID_NODE = 5039, + ERROR_CLUSTER_NODE_EXISTS = 5040, + ERROR_CLUSTER_JOIN_IN_PROGRESS = 5041, + ERROR_CLUSTER_NODE_NOT_FOUND = 5042, + ERROR_CLUSTER_LOCAL_NODE_NOT_FOUND = 5043, + ERROR_CLUSTER_NETWORK_EXISTS = 5044, + ERROR_CLUSTER_NETWORK_NOT_FOUND = 5045, + ERROR_CLUSTER_NETINTERFACE_EXISTS = 5046, + ERROR_CLUSTER_NETINTERFACE_NOT_FOUND = 5047, + ERROR_CLUSTER_INVALID_REQUEST = 5048, + ERROR_CLUSTER_INVALID_NETWORK_PROVIDER = 5049, + ERROR_CLUSTER_NODE_DOWN = 5050, + ERROR_CLUSTER_NODE_UNREACHABLE = 5051, + ERROR_CLUSTER_NODE_NOT_MEMBER = 5052, + ERROR_CLUSTER_JOIN_NOT_IN_PROGRESS = 5053, + ERROR_CLUSTER_INVALID_NETWORK = 5054, + ERROR_CLUSTER_NODE_UP = 5056, + ERROR_CLUSTER_IPADDR_IN_USE = 5057, + ERROR_CLUSTER_NODE_NOT_PAUSED = 5058, + ERROR_CLUSTER_NO_SECURITY_CONTEXT = 5059, + ERROR_CLUSTER_NETWORK_NOT_INTERNAL = 5060, + ERROR_CLUSTER_NODE_ALREADY_UP = 5061, + ERROR_CLUSTER_NODE_ALREADY_DOWN = 5062, + ERROR_CLUSTER_NETWORK_ALREADY_ONLINE = 5063, + ERROR_CLUSTER_NETWORK_ALREADY_OFFLINE = 5064, + ERROR_CLUSTER_NODE_ALREADY_MEMBER = 5065, + ERROR_CLUSTER_LAST_INTERNAL_NETWORK = 5066, + ERROR_CLUSTER_NETWORK_HAS_DEPENDENTS = 5067, + ERROR_INVALID_OPERATION_ON_QUORUM = 5068, + ERROR_DEPENDENCY_NOT_ALLOWED = 5069, + ERROR_CLUSTER_NODE_PAUSED = 5070, + ERROR_NODE_CANT_HOST_RESOURCE = 5071, + ERROR_CLUSTER_NODE_NOT_READY = 5072, + ERROR_CLUSTER_NODE_SHUTTING_DOWN = 5073, + ERROR_CLUSTER_JOIN_ABORTED = 5074, + ERROR_CLUSTER_INCOMPATIBLE_VERSIONS = 5075, + ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDED = 5076, + ERROR_CLUSTER_SYSTEM_CONFIG_CHANGED = 5077, + ERROR_CLUSTER_RESOURCE_TYPE_NOT_FOUND = 5078, + ERROR_CLUSTER_RESTYPE_NOT_SUPPORTED = 5079, + ERROR_CLUSTER_RESNAME_NOT_FOUND = 5080, + ERROR_CLUSTER_NO_RPC_PACKAGES_REGISTERED = 5081, + ERROR_CLUSTER_OWNER_NOT_IN_PREFLIST = 5082, + ERROR_CLUSTER_DATABASE_SEQMISMATCH = 5083, + ERROR_RESMON_INVALID_STATE = 5084, + ERROR_CLUSTER_GUM_NOT_LOCKER = 5085, + ERROR_QUORUM_DISK_NOT_FOUND = 5086, + ERROR_DATABASE_BACKUP_CORRUPT = 5087, + ERROR_CLUSTER_NODE_ALREADY_HAS_DFS_ROOT = 5088, + ERROR_RESOURCE_PROPERTY_UNCHANGEABLE = 5089, + ERROR_CLUSTER_MEMBERSHIP_INVALID_STATE = 5890, + ERROR_CLUSTER_QUORUMLOG_NOT_FOUND = 5891, + ERROR_CLUSTER_MEMBERSHIP_HALT = 5892, + ERROR_CLUSTER_INSTANCE_ID_MISMATCH = 5893, + ERROR_CLUSTER_NETWORK_NOT_FOUND_FOR_IP = 5894, + ERROR_CLUSTER_PROPERTY_DATA_TYPE_MISMATCH = 5895, + ERROR_CLUSTER_EVICT_WITHOUT_CLEANUP = 5896, + ERROR_CLUSTER_PARAMETER_MISMATCH = 5897, + ERROR_NODE_CANNOT_BE_CLUSTERED = 5898, + ERROR_CLUSTER_WRONG_OS_VERSION = 5899, + ERROR_CLUSTER_CANT_CREATE_DUP_CLUSTER_NAME = 5900, + */ + ERROR_ENCRYPTION_FAILED = 6000, + /* + ERROR_DECRYPTION_FAILED = 6001, + ERROR_FILE_ENCRYPTED = 6002, + ERROR_NO_RECOVERY_POLICY = 6003, + ERROR_NO_EFS = 6004, + ERROR_WRONG_EFS = 6005, + ERROR_NO_USER_KEYS = 6006, + ERROR_FILE_NOT_ENCRYPTED = 6007, + ERROR_NOT_EXPORT_FORMAT = 6008, + ERROR_FILE_READ_ONLY = 6009, + ERROR_DIR_EFS_DISALLOWED = 6010, + ERROR_EFS_SERVER_NOT_TRUSTED = 6011, + ERROR_BAD_RECOVERY_POLICY = 6012, + ERROR_EFS_ALG_BLOB_TOO_BIG = 6013, + ERROR_VOLUME_NOT_SUPPORT_EFS = 6014, + ERROR_EFS_DISABLED = 6015, + ERROR_EFS_VERSION_NOT_SUPPORT = 6016, + ERROR_NO_BROWSER_SERVERS_FOUND = 6118, + SCHED_E_SERVICE_NOT_LOCALSYSTEM = 6200, + ERROR_CTX_WINSTATION_NAME_INVALID = 7001, + ERROR_CTX_INVALID_PD = 7002, + ERROR_CTX_PD_NOT_FOUND = 7003, + ERROR_CTX_WD_NOT_FOUND = 7004, + ERROR_CTX_CANNOT_MAKE_EVENTLOG_ENTRY = 7005, + ERROR_CTX_SERVICE_NAME_COLLISION = 7006, + ERROR_CTX_CLOSE_PENDING = 7007, + ERROR_CTX_NO_OUTBUF = 7008, + ERROR_CTX_MODEM_INF_NOT_FOUND = 7009, + ERROR_CTX_INVALID_MODEMNAME = 7010, + ERROR_CTX_MODEM_RESPONSE_ERROR = 7011, + ERROR_CTX_MODEM_RESPONSE_TIMEOUT = 7012, + ERROR_CTX_MODEM_RESPONSE_NO_CARRIER = 7013, + ERROR_CTX_MODEM_RESPONSE_NO_DIALTONE = 7014, + ERROR_CTX_MODEM_RESPONSE_BUSY = 7015, + ERROR_CTX_MODEM_RESPONSE_VOICE = 7016, + ERROR_CTX_TD_ERROR = 7017, + ERROR_CTX_WINSTATION_NOT_FOUND = 7022, + ERROR_CTX_WINSTATION_ALREADY_EXISTS = 7023, + ERROR_CTX_WINSTATION_BUSY = 7024, + ERROR_CTX_BAD_VIDEO_MODE = 7025, + ERROR_CTX_GRAPHICS_INVALID = 7035, + ERROR_CTX_LOGON_DISABLED = 7037, + ERROR_CTX_NOT_CONSOLE = 7038, + ERROR_CTX_CLIENT_QUERY_TIMEOUT = 7040, + ERROR_CTX_CONSOLE_DISCONNECT = 7041, + ERROR_CTX_CONSOLE_CONNECT = 7042, + ERROR_CTX_SHADOW_DENIED = 7044, + ERROR_CTX_WINSTATION_ACCESS_DENIED = 7045, + ERROR_CTX_INVALID_WD = 7049, + ERROR_CTX_SHADOW_INVALID = 7050, + ERROR_CTX_SHADOW_DISABLED = 7051, + ERROR_CTX_CLIENT_LICENSE_IN_USE = 7052, + ERROR_CTX_CLIENT_LICENSE_NOT_SET = 7053, + ERROR_CTX_LICENSE_NOT_AVAILABLE = 7054, + ERROR_CTX_LICENSE_CLIENT_INVALID = 7055, + ERROR_CTX_LICENSE_EXPIRED = 7056, + ERROR_CTX_SHADOW_NOT_RUNNING = 7057, + ERROR_CTX_SHADOW_ENDED_BY_MODE_CHANGE = 7058, + FRS_ERR_INVALID_API_SEQUENCE = 8001, + FRS_ERR_STARTING_SERVICE = 8002, + FRS_ERR_STOPPING_SERVICE = 8003, + FRS_ERR_INTERNAL_API = 8004, + FRS_ERR_INTERNAL = 8005, + FRS_ERR_SERVICE_COMM = 8006, + FRS_ERR_INSUFFICIENT_PRIV = 8007, + FRS_ERR_AUTHENTICATION = 8008, + FRS_ERR_PARENT_INSUFFICIENT_PRIV = 8009, + FRS_ERR_PARENT_AUTHENTICATION = 8010, + FRS_ERR_CHILD_TO_PARENT_COMM = 8011, + FRS_ERR_PARENT_TO_CHILD_COMM = 8012, + FRS_ERR_SYSVOL_POPULATE = 8013, + FRS_ERR_SYSVOL_POPULATE_TIMEOUT = 8014, + FRS_ERR_SYSVOL_IS_BUSY = 8015, + FRS_ERR_SYSVOL_DEMOTE = 8016, + FRS_ERR_INVALID_SERVICE_PARAMETER = 8017, + ERROR_DS_NOT_INSTALLED = 8200, + ERROR_DS_MEMBERSHIP_EVALUATED_LOCALLY = 8201, + ERROR_DS_NO_ATTRIBUTE_OR_VALUE = 8202, + ERROR_DS_INVALID_ATTRIBUTE_SYNTAX = 8203, + ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED = 8204, + ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS = 8205, + ERROR_DS_BUSY = 8206, + ERROR_DS_UNAVAILABLE = 8207, + ERROR_DS_NO_RIDS_ALLOCATED = 8208, + ERROR_DS_NO_MORE_RIDS = 8209, + ERROR_DS_INCORRECT_ROLE_OWNER = 8210, + ERROR_DS_RIDMGR_INIT_ERROR = 8211, + ERROR_DS_OBJ_CLASS_VIOLATION = 8212, + ERROR_DS_CANT_ON_NON_LEAF = 8213, + ERROR_DS_CANT_ON_RDN = 8214, + ERROR_DS_CANT_MOD_OBJ_CLASS = 8215, + ERROR_DS_CROSS_DOM_MOVE_ERROR = 8216, + ERROR_DS_GC_NOT_AVAILABLE = 8217, + ERROR_SHARED_POLICY = 8218, + ERROR_POLICY_OBJECT_NOT_FOUND = 8219, + ERROR_POLICY_ONLY_IN_DS = 8220, + ERROR_PROMOTION_ACTIVE = 8221, + ERROR_NO_PROMOTION_ACTIVE = 8222, + ERROR_DS_OPERATIONS_ERROR = 8224, + ERROR_DS_PROTOCOL_ERROR = 8225, + ERROR_DS_TIMELIMIT_EXCEEDED = 8226, + ERROR_DS_SIZELIMIT_EXCEEDED = 8227, + ERROR_DS_ADMIN_LIMIT_EXCEEDED = 8228, + ERROR_DS_COMPARE_FALSE = 8229, + ERROR_DS_COMPARE_TRUE = 8230, + ERROR_DS_AUTH_METHOD_NOT_SUPPORTED = 8231, + ERROR_DS_STRONG_AUTH_REQUIRED = 8232, + ERROR_DS_INAPPROPRIATE_AUTH = 8233, + ERROR_DS_AUTH_UNKNOWN = 8234, + ERROR_DS_REFERRAL = 8235, + ERROR_DS_UNAVAILABLE_CRIT_EXTENSION = 8236, + ERROR_DS_CONFIDENTIALITY_REQUIRED = 8237, + ERROR_DS_INAPPROPRIATE_MATCHING = 8238, + ERROR_DS_CONSTRAINT_VIOLATION = 8239, + ERROR_DS_NO_SUCH_OBJECT = 8240, + ERROR_DS_ALIAS_PROBLEM = 8241, + ERROR_DS_INVALID_DN_SYNTAX = 8242, + ERROR_DS_IS_LEAF = 8243, + ERROR_DS_ALIAS_DEREF_PROBLEM = 8244, + ERROR_DS_UNWILLING_TO_PERFORM = 8245, + ERROR_DS_LOOP_DETECT = 8246, + ERROR_DS_NAMING_VIOLATION = 8247, + ERROR_DS_OBJECT_RESULTS_TOO_LARGE = 8248, + ERROR_DS_AFFECTS_MULTIPLE_DSAS = 8249, + ERROR_DS_SERVER_DOWN = 8250, + ERROR_DS_LOCAL_ERROR = 8251, + ERROR_DS_ENCODING_ERROR = 8252, + ERROR_DS_DECODING_ERROR = 8253, + ERROR_DS_FILTER_UNKNOWN = 8254, + ERROR_DS_PARAM_ERROR = 8255, + ERROR_DS_NOT_SUPPORTED = 8256, + ERROR_DS_NO_RESULTS_RETURNED = 8257, + ERROR_DS_CONTROL_NOT_FOUND = 8258, + ERROR_DS_CLIENT_LOOP = 8259, + ERROR_DS_REFERRAL_LIMIT_EXCEEDED = 8260, + ERROR_DS_SORT_CONTROL_MISSING = 8261, + ERROR_DS_OFFSET_RANGE_ERROR = 8262, + ERROR_DS_ROOT_MUST_BE_NC = 8301, + ERROR_DS_ADD_REPLICA_INHIBITED = 8302, + ERROR_DS_ATT_NOT_DEF_IN_SCHEMA = 8303, + ERROR_DS_MAX_OBJ_SIZE_EXCEEDED = 8304, + ERROR_DS_OBJ_STRING_NAME_EXISTS = 8305, + ERROR_DS_NO_RDN_DEFINED_IN_SCHEMA = 8306, + ERROR_DS_RDN_DOESNT_MATCH_SCHEMA = 8307, + ERROR_DS_NO_REQUESTED_ATTS_FOUND = 8308, + ERROR_DS_USER_BUFFER_TO_SMALL = 8309, + ERROR_DS_ATT_IS_NOT_ON_OBJ = 8310, + ERROR_DS_ILLEGAL_MOD_OPERATION = 8311, + ERROR_DS_OBJ_TOO_LARGE = 8312, + ERROR_DS_BAD_INSTANCE_TYPE = 8313, + ERROR_DS_MASTERDSA_REQUIRED = 8314, + ERROR_DS_OBJECT_CLASS_REQUIRED = 8315, + ERROR_DS_MISSING_REQUIRED_ATT = 8316, + ERROR_DS_ATT_NOT_DEF_FOR_CLASS = 8317, + ERROR_DS_ATT_ALREADY_EXISTS = 8318, + ERROR_DS_CANT_ADD_ATT_VALUES = 8320, + ERROR_DS_SINGLE_VALUE_CONSTRAINT = 8321, + ERROR_DS_RANGE_CONSTRAINT = 8322, + ERROR_DS_ATT_VAL_ALREADY_EXISTS = 8323, + ERROR_DS_CANT_REM_MISSING_ATT = 8324, + ERROR_DS_CANT_REM_MISSING_ATT_VAL = 8325, + ERROR_DS_ROOT_CANT_BE_SUBREF = 8326, + ERROR_DS_NO_CHAINING = 8327, + ERROR_DS_NO_CHAINED_EVAL = 8328, + ERROR_DS_NO_PARENT_OBJECT = 8329, + ERROR_DS_PARENT_IS_AN_ALIAS = 8330, + ERROR_DS_CANT_MIX_MASTER_AND_REPS = 8331, + ERROR_DS_CHILDREN_EXIST = 8332, + ERROR_DS_OBJ_NOT_FOUND = 8333, + ERROR_DS_ALIASED_OBJ_MISSING = 8334, + ERROR_DS_BAD_NAME_SYNTAX = 8335, + ERROR_DS_ALIAS_POINTS_TO_ALIAS = 8336, + ERROR_DS_CANT_DEREF_ALIAS = 8337, + ERROR_DS_OUT_OF_SCOPE = 8338, + ERROR_DS_OBJECT_BEING_REMOVED = 8339, + ERROR_DS_CANT_DELETE_DSA_OBJ = 8340, + ERROR_DS_GENERIC_ERROR = 8341, + ERROR_DS_DSA_MUST_BE_INT_MASTER = 8342, + ERROR_DS_CLASS_NOT_DSA = 8343, + ERROR_DS_INSUFF_ACCESS_RIGHTS = 8344, + ERROR_DS_ILLEGAL_SUPERIOR = 8345, + ERROR_DS_ATTRIBUTE_OWNED_BY_SAM = 8346, + ERROR_DS_NAME_TOO_MANY_PARTS = 8347, + ERROR_DS_NAME_TOO_LONG = 8348, + ERROR_DS_NAME_VALUE_TOO_LONG = 8349, + ERROR_DS_NAME_UNPARSEABLE = 8350, + ERROR_DS_NAME_TYPE_UNKNOWN = 8351, + ERROR_DS_NOT_AN_OBJECT = 8352, + ERROR_DS_SEC_DESC_TOO_SHORT = 8353, + ERROR_DS_SEC_DESC_INVALID = 8354, + ERROR_DS_NO_DELETED_NAME = 8355, + ERROR_DS_SUBREF_MUST_HAVE_PARENT = 8356, + ERROR_DS_NCNAME_MUST_BE_NC = 8357, + ERROR_DS_CANT_ADD_SYSTEM_ONLY = 8358, + ERROR_DS_CLASS_MUST_BE_CONCRETE = 8359, + ERROR_DS_INVALID_DMD = 8360, + ERROR_DS_OBJ_GUID_EXISTS = 8361, + ERROR_DS_NOT_ON_BACKLINK = 8362, + ERROR_DS_NO_CROSSREF_FOR_NC = 8363, + ERROR_DS_SHUTTING_DOWN = 8364, + ERROR_DS_UNKNOWN_OPERATION = 8365, + ERROR_DS_INVALID_ROLE_OWNER = 8366, + ERROR_DS_COULDNT_CONTACT_FSMO = 8367, + ERROR_DS_CROSS_NC_DN_RENAME = 8368, + ERROR_DS_CANT_MOD_SYSTEM_ONLY = 8369, + ERROR_DS_REPLICATOR_ONLY = 8370, + ERROR_DS_OBJ_CLASS_NOT_DEFINED = 8371, + ERROR_DS_OBJ_CLASS_NOT_SUBCLASS = 8372, + ERROR_DS_NAME_REFERENCE_INVALID = 8373, + ERROR_DS_CROSS_REF_EXISTS = 8374, + ERROR_DS_CANT_DEL_MASTER_CROSSREF = 8375, + ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEAD = 8376, + ERROR_DS_NOTIFY_FILTER_TOO_COMPLEX = 8377, + ERROR_DS_DUP_RDN = 8378, + ERROR_DS_DUP_OID = 8379, + ERROR_DS_DUP_MAPI_ID = 8380, + ERROR_DS_DUP_SCHEMA_ID_GUID = 8381, + ERROR_DS_DUP_LDAP_DISPLAY_NAME = 8382, + ERROR_DS_SEMANTIC_ATT_TEST = 8383, + ERROR_DS_SYNTAX_MISMATCH = 8384, + ERROR_DS_EXISTS_IN_MUST_HAVE = 8385, + ERROR_DS_EXISTS_IN_MAY_HAVE = 8386, + ERROR_DS_NONEXISTENT_MAY_HAVE = 8387, + ERROR_DS_NONEXISTENT_MUST_HAVE = 8388, + ERROR_DS_AUX_CLS_TEST_FAIL = 8389, + ERROR_DS_NONEXISTENT_POSS_SUP = 8390, + ERROR_DS_SUB_CLS_TEST_FAIL = 8391, + ERROR_DS_BAD_RDN_ATT_ID_SYNTAX = 8392, + ERROR_DS_EXISTS_IN_AUX_CLS = 8393, + ERROR_DS_EXISTS_IN_SUB_CLS = 8394, + ERROR_DS_EXISTS_IN_POSS_SUP = 8395, + ERROR_DS_RECALCSCHEMA_FAILED = 8396, + ERROR_DS_TREE_DELETE_NOT_FINISHED = 8397, + ERROR_DS_CANT_DELETE = 8398, + ERROR_DS_ATT_SCHEMA_REQ_ID = 8399, + ERROR_DS_BAD_ATT_SCHEMA_SYNTAX = 8400, + ERROR_DS_CANT_CACHE_ATT = 8401, + ERROR_DS_CANT_CACHE_CLASS = 8402, + ERROR_DS_CANT_REMOVE_ATT_CACHE = 8403, + ERROR_DS_CANT_REMOVE_CLASS_CACHE = 8404, + ERROR_DS_CANT_RETRIEVE_DN = 8405, + ERROR_DS_MISSING_SUPREF = 8406, + ERROR_DS_CANT_RETRIEVE_INSTANCE = 8407, + ERROR_DS_CODE_INCONSISTENCY = 8408, + ERROR_DS_DATABASE_ERROR = 8409, + ERROR_DS_GOVERNSID_MISSING = 8410, + ERROR_DS_MISSING_EXPECTED_ATT = 8411, + ERROR_DS_NCNAME_MISSING_CR_REF = 8412, + ERROR_DS_SECURITY_CHECKING_ERROR = 8413, + ERROR_DS_SCHEMA_NOT_LOADED = 8414, + ERROR_DS_SCHEMA_ALLOC_FAILED = 8415, + ERROR_DS_ATT_SCHEMA_REQ_SYNTAX = 8416, + ERROR_DS_GCVERIFY_ERROR = 8417, + ERROR_DS_DRA_SCHEMA_MISMATCH = 8418, + ERROR_DS_CANT_FIND_DSA_OBJ = 8419, + ERROR_DS_CANT_FIND_EXPECTED_NC = 8420, + ERROR_DS_CANT_FIND_NC_IN_CACHE = 8421, + ERROR_DS_CANT_RETRIEVE_CHILD = 8422, + ERROR_DS_SECURITY_ILLEGAL_MODIFY = 8423, + ERROR_DS_CANT_REPLACE_HIDDEN_REC = 8424, + ERROR_DS_BAD_HIERARCHY_FILE = 8425, + ERROR_DS_BUILD_HIERARCHY_TABLE_FAILED = 8426, + ERROR_DS_CONFIG_PARAM_MISSING = 8427, + ERROR_DS_COUNTING_AB_INDICES_FAILED = 8428, + ERROR_DS_HIERARCHY_TABLE_MALLOC_FAILED = 8429, + ERROR_DS_INTERNAL_FAILURE = 8430, + ERROR_DS_UNKNOWN_ERROR = 8431, + ERROR_DS_ROOT_REQUIRES_CLASS_TOP = 8432, + ERROR_DS_REFUSING_FSMO_ROLES = 8433, + ERROR_DS_MISSING_FSMO_SETTINGS = 8434, + ERROR_DS_UNABLE_TO_SURRENDER_ROLES = 8435, + ERROR_DS_DRA_GENERIC = 8436, + ERROR_DS_DRA_INVALID_PARAMETER = 8437, + ERROR_DS_DRA_BUSY = 8438, + ERROR_DS_DRA_BAD_DN = 8439, + ERROR_DS_DRA_BAD_NC = 8440, + ERROR_DS_DRA_DN_EXISTS = 8441, + ERROR_DS_DRA_INTERNAL_ERROR = 8442, + ERROR_DS_DRA_INCONSISTENT_DIT = 8443, + ERROR_DS_DRA_CONNECTION_FAILED = 8444, + ERROR_DS_DRA_BAD_INSTANCE_TYPE = 8445, + ERROR_DS_DRA_OUT_OF_MEM = 8446, + ERROR_DS_DRA_MAIL_PROBLEM = 8447, + ERROR_DS_DRA_REF_ALREADY_EXISTS = 8448, + ERROR_DS_DRA_REF_NOT_FOUND = 8449, + ERROR_DS_DRA_OBJ_IS_REP_SOURCE = 8450, + ERROR_DS_DRA_DB_ERROR = 8451, + ERROR_DS_DRA_NO_REPLICA = 8452, + ERROR_DS_DRA_ACCESS_DENIED = 8453, + ERROR_DS_DRA_NOT_SUPPORTED = 8454, + ERROR_DS_DRA_RPC_CANCELLED = 8455, + ERROR_DS_DRA_SOURCE_DISABLED = 8456, + ERROR_DS_DRA_SINK_DISABLED = 8457, + ERROR_DS_DRA_NAME_COLLISION = 8458, + ERROR_DS_DRA_SOURCE_REINSTALLED = 8459, + ERROR_DS_DRA_MISSING_PARENT = 8460, + ERROR_DS_DRA_PREEMPTED = 8461, + ERROR_DS_DRA_ABANDON_SYNC = 8462, + ERROR_DS_DRA_SHUTDOWN = 8463, + ERROR_DS_DRA_INCOMPATIBLE_PARTIAL_SET = 8464, + ERROR_DS_DRA_SOURCE_IS_PARTIAL_REPLICA = 8465, + ERROR_DS_DRA_EXTN_CONNECTION_FAILED = 8466, + ERROR_DS_INSTALL_SCHEMA_MISMATCH = 8467, + ERROR_DS_DUP_LINK_ID = 8468, + ERROR_DS_NAME_ERROR_RESOLVING = 8469, + ERROR_DS_NAME_ERROR_NOT_FOUND = 8470, + ERROR_DS_NAME_ERROR_NOT_UNIQUE = 8471, + ERROR_DS_NAME_ERROR_NO_MAPPING = 8472, + ERROR_DS_NAME_ERROR_DOMAIN_ONLY = 8473, + ERROR_DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING = 8474, + ERROR_DS_CONSTRUCTED_ATT_MOD = 8475, + ERROR_DS_WRONG_OM_OBJ_CLASS = 8476, + ERROR_DS_DRA_REPL_PENDING = 8477, + ERROR_DS_DS_REQUIRED = 8478, + ERROR_DS_INVALID_LDAP_DISPLAY_NAME = 8479, + ERROR_DS_NON_BASE_SEARCH = 8480, + ERROR_DS_CANT_RETRIEVE_ATTS = 8481, + ERROR_DS_BACKLINK_WITHOUT_LINK = 8482, + ERROR_DS_EPOCH_MISMATCH = 8483, + ERROR_DS_SRC_NAME_MISMATCH = 8484, + ERROR_DS_SRC_AND_DST_NC_IDENTICAL = 8485, + ERROR_DS_DST_NC_MISMATCH = 8486, + ERROR_DS_NOT_AUTHORITIVE_FOR_DST_NC = 8487, + ERROR_DS_SRC_GUID_MISMATCH = 8488, + ERROR_DS_CANT_MOVE_DELETED_OBJECT = 8489, + ERROR_DS_PDC_OPERATION_IN_PROGRESS = 8490, + ERROR_DS_CROSS_DOMAIN_CLEANUP_REQD = 8491, + ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATION = 8492, + ERROR_DS_CANT_WITH_ACCT_GROUP_MEMBERSHPS = 8493, + ERROR_DS_NC_MUST_HAVE_NC_PARENT = 8494, + ERROR_DS_DST_DOMAIN_NOT_NATIVE = 8496, + ERROR_DS_MISSING_INFRASTRUCTURE_CONTAINER = 8497, + ERROR_DS_CANT_MOVE_ACCOUNT_GROUP = 8498, + ERROR_DS_CANT_MOVE_RESOURCE_GROUP = 8499, + ERROR_DS_INVALID_SEARCH_FLAG = 8500, + ERROR_DS_NO_TREE_DELETE_ABOVE_NC = 8501, + ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE = 8502, + ERROR_DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETE = 8503, + ERROR_DS_SAM_INIT_FAILURE = 8504, + ERROR_DS_SENSITIVE_GROUP_VIOLATION = 8505, + ERROR_DS_CANT_MOD_PRIMARYGROUPID = 8506, + ERROR_DS_ILLEGAL_BASE_SCHEMA_MOD = 8507, + ERROR_DS_NONSAFE_SCHEMA_CHANGE = 8508, + ERROR_DS_SCHEMA_UPDATE_DISALLOWED = 8509, + ERROR_DS_CANT_CREATE_UNDER_SCHEMA = 8510, + ERROR_DS_INSTALL_NO_SRC_SCH_VERSION = 8511, + ERROR_DS_INSTALL_NO_SCH_VERSION_IN_INIFILE = 8512, + ERROR_DS_INVALID_GROUP_TYPE = 8513, + ERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN = 8514, + ERROR_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN = 8515, + ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER = 8516, + ERROR_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER = 8517, + ERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER = 8518, + ERROR_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER = 8519, + ERROR_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER = 8520, + ERROR_DS_HAVE_PRIMARY_MEMBERS = 8521, + ERROR_DS_STRING_SD_CONVERSION_FAILED = 8522, + ERROR_DS_NAMING_MASTER_GC = 8523, + ERROR_DS_LOOKUP_FAILURE = 8524, + ERROR_DS_COULDNT_UPDATE_SPNS = 8525, + ERROR_DS_CANT_RETRIEVE_SD = 8526, + ERROR_DS_KEY_NOT_UNIQUE = 8527, + ERROR_DS_WRONG_LINKED_ATT_SYNTAX = 8528, + ERROR_DS_SAM_NEED_BOOTKEY_PASSWORD = 8529, + ERROR_DS_SAM_NEED_BOOTKEY_FLOPPY = 8530, + ERROR_DS_CANT_START = 8531, + ERROR_DS_INIT_FAILURE = 8532, + ERROR_DS_NO_PKT_PRIVACY_ON_CONNECTION = 8533, + ERROR_DS_SOURCE_DOMAIN_IN_FOREST = 8534, + ERROR_DS_DESTINATION_DOMAIN_NOT_IN_FOREST = 8535, + ERROR_DS_DESTINATION_AUDITING_NOT_ENABLED = 8536, + ERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAIN = 8537, + ERROR_DS_SRC_OBJ_NOT_GROUP_OR_USER = 8538, + ERROR_DS_SRC_SID_EXISTS_IN_FOREST = 8539, + ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCH = 8540, + ERROR_SAM_INIT_FAILURE = 8541, + ERROR_DS_DRA_SCHEMA_INFO_SHIP = 8542, + ERROR_DS_DRA_SCHEMA_CONFLICT = 8543, + ERROR_DS_DRA_EARLIER_SCHEMA_CONLICT = 8544, + ERROR_DS_DRA_OBJ_NC_MISMATCH = 8545, + ERROR_DS_NC_STILL_HAS_DSAS = 8546, + ERROR_DS_GC_REQUIRED = 8547, + ERROR_DS_LOCAL_MEMBER_OF_LOCAL_ONLY = 8548, + ERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPS = 8549, + ERROR_DS_CANT_ADD_TO_GC = 8550, + ERROR_DS_NO_CHECKPOINT_WITH_PDC = 8551, + ERROR_DS_SOURCE_AUDITING_NOT_ENABLED = 8552, + ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NC = 8553, + ERROR_DS_INVALID_NAME_FOR_SPN = 8554, + ERROR_DS_FILTER_USES_CONTRUCTED_ATTRS = 8555, + ERROR_DS_UNICODEPWD_NOT_IN_QUOTES = 8556, + ERROR_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED = 8557, + ERROR_DS_MUST_BE_RUN_ON_DST_DC = 8558, + ERROR_DS_SRC_DC_MUST_BE_SP4_OR_GREATER = 8559, + ERROR_DS_CANT_TREE_DELETE_CRITICAL_OBJ = 8560, + ERROR_DS_INIT_FAILURE_CONSOLE = 8561, + ERROR_DS_SAM_INIT_FAILURE_CONSOLE = 8562, + ERROR_DS_FOREST_VERSION_TOO_HIGH = 8563, + ERROR_DS_DOMAIN_VERSION_TOO_HIGH = 8564, + ERROR_DS_FOREST_VERSION_TOO_LOW = 8565, + ERROR_DS_DOMAIN_VERSION_TOO_LOW = 8566, + ERROR_DS_INCOMPATIBLE_VERSION = 8567, + ERROR_DS_LOW_DSA_VERSION = 8568, + ERROR_DS_NO_BEHAVIOR_VERSION_IN_MIXEDDOMAIN = 8569, + ERROR_DS_NOT_SUPPORTED_SORT_ORDER = 8570, + ERROR_DS_NAME_NOT_UNIQUE = 8571, + ERROR_DS_MACHINE_ACCOUNT_CREATED_PRENT4 = 8572, + ERROR_DS_OUT_OF_VERSION_STORE = 8573, + ERROR_DS_INCOMPATIBLE_CONTROLS_USED = 8574, + ERROR_DS_NO_REF_DOMAIN = 8575, + ERROR_DS_RESERVED_LINK_ID = 8576, + ERROR_DS_LINK_ID_NOT_AVAILABLE = 8577, + ERROR_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER = 8578, + ERROR_DS_MODIFYDN_DISALLOWED_BY_INSTANCE_TYPE = 8579, + ERROR_DS_NO_OBJECT_MOVE_IN_SCHEMA_NC = 8580, + ERROR_DS_MODIFYDN_DISALLOWED_BY_FLAG = 8581, + ERROR_DS_MODIFYDN_WRONG_GRANDPARENT = 8582, + ERROR_DS_NAME_ERROR_TRUST_REFERRAL = 8583, + ERROR_NOT_SUPPORTED_ON_STANDARD_SERVER = 8584, + ERROR_DS_CANT_ACCESS_REMOTE_PART_OF_AD = 8585, + ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE = 8586, + ERROR_DS_THREAD_LIMIT_EXCEEDED = 8587, + ERROR_DS_NOT_CLOSEST = 8588, + ERROR_DS_CANT_DERIVE_SPN_WITHOUT_SERVER_REF = 8589, + ERROR_DS_SINGLE_USER_MODE_FAILED = 8590, + ERROR_DS_NTDSCRIPT_SYNTAX_ERROR = 8591, + ERROR_DS_NTDSCRIPT_PROCESS_ERROR = 8592, + ERROR_DS_DIFFERENT_REPL_EPOCHS = 8593, + ERROR_DS_DRS_EXTENSIONS_CHANGED = 8594, + ERROR_DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR = 8595, + ERROR_DS_NO_MSDS_INTID = 8596, + ERROR_DS_DUP_MSDS_INTID = 8597, + ERROR_DS_EXISTS_IN_RDNATTID = 8598, + ERROR_DS_AUTHORIZATION_FAILED = 8599, + ERROR_DS_INVALID_SCRIPT = 8600, + ERROR_DS_REMOTE_CROSSREF_OP_FAILED = 8601, + DNS_ERROR_RCODE_FORMAT_ERROR = 9001, + DNS_ERROR_RCODE_SERVER_FAILURE = 9002, + DNS_ERROR_RCODE_NAME_ERROR = 9003, + DNS_ERROR_RCODE_NOT_IMPLEMENTED = 9004, + DNS_ERROR_RCODE_REFUSED = 9005, + DNS_ERROR_RCODE_YXDOMAIN = 9006, + DNS_ERROR_RCODE_YXRRSET = 9007, + DNS_ERROR_RCODE_NXRRSET = 9008, + DNS_ERROR_RCODE_NOTAUTH = 9009, + DNS_ERROR_RCODE_NOTZONE = 9010, + DNS_ERROR_RCODE_BADSIG = 9016, + DNS_ERROR_RCODE_BADKEY = 9017, + DNS_ERROR_RCODE_BADTIME = 9018, + DNS_INFO_NO_RECORDS = 9501, + DNS_ERROR_BAD_PACKET = 9502, + DNS_ERROR_NO_PACKET = 9503, + DNS_ERROR_RCODE = 9504, + DNS_ERROR_UNSECURE_PACKET = 9505, + DNS_ERROR_INVALID_TYPE = 9551, + DNS_ERROR_INVALID_IP_ADDRESS = 9552, + DNS_ERROR_INVALID_PROPERTY = 9553, + DNS_ERROR_TRY_AGAIN_LATER = 9554, + DNS_ERROR_NOT_UNIQUE = 9555, + DNS_ERROR_NON_RFC_NAME = 9556, + DNS_STATUS_FQDN = 9557, + DNS_STATUS_DOTTED_NAME = 9558, + DNS_STATUS_SINGLE_PART_NAME = 9559, + DNS_ERROR_INVALID_NAME_CHAR = 9560, + DNS_ERROR_NUMERIC_NAME = 9561, + DNS_ERROR_NOT_ALLOWED_ON_ROOT_SERVER = 9562, + DNS_ERROR_ZONE_DOES_NOT_EXIST = 9601, + DNS_ERROR_NO_ZONE_INFO = 9602, + DNS_ERROR_INVALID_ZONE_OPERATION = 9603, + DNS_ERROR_ZONE_CONFIGURATION_ERROR = 9604, + DNS_ERROR_ZONE_HAS_NO_SOA_RECORD = 9605, + DNS_ERROR_ZONE_HAS_NO_NS_RECORDS = 9606, + DNS_ERROR_ZONE_LOCKED = 9607, + DNS_ERROR_ZONE_CREATION_FAILED = 9608, + DNS_ERROR_ZONE_ALREADY_EXISTS = 9609, + DNS_ERROR_AUTOZONE_ALREADY_EXISTS = 9610, + DNS_ERROR_INVALID_ZONE_TYPE = 9611, + DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP = 9612, + DNS_ERROR_ZONE_NOT_SECONDARY = 9613, + DNS_ERROR_NEED_SECONDARY_ADDRESSES = 9614, + DNS_ERROR_WINS_INIT_FAILED = 9615, + DNS_ERROR_NEED_WINS_SERVERS = 9616, + DNS_ERROR_NBSTAT_INIT_FAILED = 9617, + DNS_ERROR_SOA_DELETE_INVALID = 9618, + DNS_ERROR_FORWARDER_ALREADY_EXISTS = 9619, + DNS_ERROR_ZONE_REQUIRES_MASTER_IP = 9620, + DNS_ERROR_ZONE_IS_SHUTDOWN = 9621, + DNS_ERROR_PRIMARY_REQUIRES_DATAFILE = 9651, + DNS_ERROR_INVALID_DATAFILE_NAME = 9652, + DNS_ERROR_DATAFILE_OPEN_FAILURE = 9653, + DNS_ERROR_FILE_WRITEBACK_FAILED = 9654, + DNS_ERROR_DATAFILE_PARSING = 9655, + DNS_ERROR_RECORD_DOES_NOT_EXIST = 9701, + DNS_ERROR_RECORD_FORMAT = 9702, + DNS_ERROR_NODE_CREATION_FAILED = 9703, + DNS_ERROR_UNKNOWN_RECORD_TYPE = 9704, + DNS_ERROR_RECORD_TIMED_OUT = 9705, + DNS_ERROR_NAME_NOT_IN_ZONE = 9706, + DNS_ERROR_CNAME_LOOP = 9707, + DNS_ERROR_NODE_IS_CNAME = 9708, + DNS_ERROR_CNAME_COLLISION = 9709, + DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT = 9710, + DNS_ERROR_RECORD_ALREADY_EXISTS = 9711, + DNS_ERROR_SECONDARY_DATA = 9712, + DNS_ERROR_NO_CREATE_CACHE_DATA = 9713, + DNS_ERROR_NAME_DOES_NOT_EXIST = 9714, + DNS_WARNING_PTR_CREATE_FAILED = 9715, + DNS_WARNING_DOMAIN_UNDELETED = 9716, + DNS_ERROR_DS_UNAVAILABLE = 9717, + DNS_ERROR_DS_ZONE_ALREADY_EXISTS = 9718, + DNS_ERROR_NO_BOOTFILE_IF_DS_ZONE = 9719, + DNS_INFO_AXFR_COMPLETE = 9751, + DNS_ERROR_AXFR = 9752, + DNS_INFO_ADDED_LOCAL_WINS = 9753, + DNS_STATUS_CONTINUE_NEEDED = 9801, + DNS_ERROR_NO_TCPIP = 9851, + DNS_ERROR_NO_DNS_SERVERS = 9852, + DNS_ERROR_DP_DOES_NOT_EXIST = 9901, + DNS_ERROR_DP_ALREADY_EXISTS = 9902, + DNS_ERROR_DP_NOT_ENLISTED = 9903, + DNS_ERROR_DP_ALREADY_ENLISTED = 9904, + WSAEINTR = 10004, + WSAEBADF = 10009, + WSAEACCES = 10013, + WSAEFAULT = 10014, + WSAEINVAL = 10022, + WSAEMFILE = 10024, + WSAEWOULDBLOCK = 10035, + WSAEINPROGRESS = 10036, + WSAEALREADY = 10037, + WSAENOTSOCK = 10038, + WSAEDESTADDRREQ = 10039, + WSAEMSGSIZE = 10040, + WSAEPROTOTYPE = 10041, + WSAENOPROTOOPT = 10042, + WSAEPROTONOSUPPORT = 10043, + WSAESOCKTNOSUPPORT = 10044, + WSAEOPNOTSUPP = 10045, + WSAEPFNOSUPPORT = 10046, + WSAEAFNOSUPPORT = 10047, + WSAEADDRINUSE = 10048, + WSAEADDRNOTAVAIL = 10049, + WSAENETDOWN = 10050, + WSAENETUNREACH = 10051, + WSAENETRESET = 10052, + WSAECONNABORTED = 10053, + WSAECONNRESET = 10054, + WSAENOBUFS = 10055, + WSAEISCONN = 10056, + WSAENOTCONN = 10057, + WSAESHUTDOWN = 10058, + WSAETOOMANYREFS = 10059, + WSAETIMEDOUT = 10060, + WSAECONNREFUSED = 10061, + WSAELOOP = 10062, + WSAENAMETOOLONG = 10063, + WSAEHOSTDOWN = 10064, + WSAEHOSTUNREACH = 10065, + WSAENOTEMPTY = 10066, + WSAEPROCLIM = 10067, + WSAEUSERS = 10068, + WSAEDQUOT = 10069, + WSAESTALE = 10070, + WSAEREMOTE = 10071, + WSASYSNOTREADY = 10091, + WSAVERNOTSUPPORTED = 10092, + WSANOTINITIALISED = 10093, + WSAEDISCON = 10101, + WSAENOMORE = 10102, + WSAECANCELLED = 10103, + WSAEINVALIDPROCTABLE = 10104, + WSAEINVALIDPROVIDER = 10105, + WSAEPROVIDERFAILEDINIT = 10106, + WSASYSCALLFAILURE = 10107, + WSASERVICE_NOT_FOUND = 10108, + WSATYPE_NOT_FOUND = 10109, + WSA_E_NO_MORE = 10110, + WSA_E_CANCELLED = 10111, + WSAEREFUSED = 10112, + WSAHOST_NOT_FOUND = 11001, + WSATRY_AGAIN = 11002, + WSANO_RECOVERY = 11003, + WSANO_DATA = 11004, + WSA_QOS_RECEIVERS = 11005, + WSA_QOS_SENDERS = 11006, + WSA_QOS_NO_SENDERS = 11007, + WSA_QOS_NO_RECEIVERS = 11008, + WSA_QOS_REQUEST_CONFIRMED = 11009, + WSA_QOS_ADMISSION_FAILURE = 11010, + WSA_QOS_POLICY_FAILURE = 11011, + WSA_QOS_BAD_STYLE = 11012, + WSA_QOS_BAD_OBJECT = 11013, + WSA_QOS_TRAFFIC_CTRL_ERROR = 11014, + WSA_QOS_GENERIC_ERROR = 11015, + WSA_QOS_ESERVICETYPE = 11016, + WSA_QOS_EFLOWSPEC = 11017, + WSA_QOS_EPROVSPECBUF = 11018, + WSA_QOS_EFILTERSTYLE = 11019, + WSA_QOS_EFILTERTYPE = 11020, + WSA_QOS_EFILTERCOUNT = 11021, + WSA_QOS_EOBJLENGTH = 11022, + WSA_QOS_EFLOWCOUNT = 11023, + WSA_QOS_EUNKNOWNPSOBJ = 11024, + WSA_QOS_EPOLICYOBJ = 11025, + WSA_QOS_EFLOWDESC = 11026, + WSA_QOS_EPSFLOWSPEC = 11027, + WSA_QOS_EPSFILTERSPEC = 11028, + WSA_QOS_ESDMODEOBJ = 11029, + WSA_QOS_ESHAPERATEOBJ = 11030, + WSA_QOS_RESERVED_PETYPE = 11031, + ERROR_IPSEC_QM_POLICY_EXISTS = 13000, + ERROR_IPSEC_QM_POLICY_NOT_FOUND = 13001, + ERROR_IPSEC_QM_POLICY_IN_USE = 13002, + ERROR_IPSEC_MM_POLICY_EXISTS = 13003, + ERROR_IPSEC_MM_POLICY_NOT_FOUND = 13004, + ERROR_IPSEC_MM_POLICY_IN_USE = 13005, + ERROR_IPSEC_MM_FILTER_EXISTS = 13006, + ERROR_IPSEC_MM_FILTER_NOT_FOUND = 13007, + ERROR_IPSEC_TRANSPORT_FILTER_EXISTS = 13008, + ERROR_IPSEC_TRANSPORT_FILTER_NOT_FOUND = 13009, + ERROR_IPSEC_MM_AUTH_EXISTS = 13010, + ERROR_IPSEC_MM_AUTH_NOT_FOUND = 13011, + ERROR_IPSEC_MM_AUTH_IN_USE = 13012, + ERROR_IPSEC_DEFAULT_MM_POLICY_NOT_FOUND = 13013, + ERROR_IPSEC_DEFAULT_MM_AUTH_NOT_FOUND = 13014, + ERROR_IPSEC_DEFAULT_QM_POLICY_NOT_FOUND = 13015, + ERROR_IPSEC_TUNNEL_FILTER_EXISTS = 13016, + ERROR_IPSEC_TUNNEL_FILTER_NOT_FOUND = 13017, + ERROR_IPSEC_MM_FILTER_PENDING_DELETION = 13018, + ERROR_IPSEC_TRANSPORT_FILTER_PENDING_DELETION = 13019, + ERROR_IPSEC_TUNNEL_FILTER_PENDING_DELETION = 13020, + ERROR_IPSEC_MM_POLICY_PENDING_DELETION = 13021, + ERROR_IPSEC_MM_AUTH_PENDING_DELETION = 13022, + ERROR_IPSEC_QM_POLICY_PENDING_DELETION = 13023, + ERROR_IPSEC_IKE_AUTH_FAIL = 13801, + ERROR_IPSEC_IKE_ATTRIB_FAIL = 13802, + ERROR_IPSEC_IKE_NEGOTIATION_PENDING = 13803, + ERROR_IPSEC_IKE_GENERAL_PROCESSING_ERROR = 13804, + ERROR_IPSEC_IKE_TIMED_OUT = 13805, + ERROR_IPSEC_IKE_NO_CERT = 13806, + ERROR_IPSEC_IKE_SA_DELETED = 13807, + ERROR_IPSEC_IKE_SA_REAPED = 13808, + ERROR_IPSEC_IKE_MM_ACQUIRE_DROP = 13809, + ERROR_IPSEC_IKE_QM_ACQUIRE_DROP = 13810, + ERROR_IPSEC_IKE_QUEUE_DROP_MM = 13811, + ERROR_IPSEC_IKE_QUEUE_DROP_NO_MM = 13812, + ERROR_IPSEC_IKE_DROP_NO_RESPONSE = 13813, + ERROR_IPSEC_IKE_MM_DELAY_DROP = 13814, + ERROR_IPSEC_IKE_QM_DELAY_DROP = 13815, + ERROR_IPSEC_IKE_ERROR = 13816, + ERROR_IPSEC_IKE_CRL_FAILED = 13817, + ERROR_IPSEC_IKE_INVALID_KEY_USAGE = 13818, + ERROR_IPSEC_IKE_INVALID_CERT_TYPE = 13819, + ERROR_IPSEC_IKE_NO_PRIVATE_KEY = 13820, + ERROR_IPSEC_IKE_DH_FAIL = 13822, + ERROR_IPSEC_IKE_INVALID_HEADER = 13824, + ERROR_IPSEC_IKE_NO_POLICY = 13825, + ERROR_IPSEC_IKE_INVALID_SIGNATURE = 13826, + ERROR_IPSEC_IKE_KERBEROS_ERROR = 13827, + ERROR_IPSEC_IKE_NO_PUBLIC_KEY = 13828, + ERROR_IPSEC_IKE_PROCESS_ERR = 13829, + ERROR_IPSEC_IKE_PROCESS_ERR_SA = 13830, + ERROR_IPSEC_IKE_PROCESS_ERR_PROP = 13831, + ERROR_IPSEC_IKE_PROCESS_ERR_TRANS = 13832, + ERROR_IPSEC_IKE_PROCESS_ERR_KE = 13833, + ERROR_IPSEC_IKE_PROCESS_ERR_ID = 13834, + ERROR_IPSEC_IKE_PROCESS_ERR_CERT = 13835, + ERROR_IPSEC_IKE_PROCESS_ERR_CERT_REQ = 13836, + ERROR_IPSEC_IKE_PROCESS_ERR_HASH = 13837, + ERROR_IPSEC_IKE_PROCESS_ERR_SIG = 13838, + ERROR_IPSEC_IKE_PROCESS_ERR_NONCE = 13839, + ERROR_IPSEC_IKE_PROCESS_ERR_NOTIFY = 13840, + ERROR_IPSEC_IKE_PROCESS_ERR_DELETE = 13841, + ERROR_IPSEC_IKE_PROCESS_ERR_VENDOR = 13842, + ERROR_IPSEC_IKE_INVALID_PAYLOAD = 13843, + ERROR_IPSEC_IKE_LOAD_SOFT_SA = 13844, + ERROR_IPSEC_IKE_SOFT_SA_TORN_DOWN = 13845, + ERROR_IPSEC_IKE_INVALID_COOKIE = 13846, + ERROR_IPSEC_IKE_NO_PEER_CERT = 13847, + ERROR_IPSEC_IKE_PEER_CRL_FAILED = 13848, + ERROR_IPSEC_IKE_POLICY_CHANGE = 13849, + ERROR_IPSEC_IKE_NO_MM_POLICY = 13850, + ERROR_IPSEC_IKE_NOTCBPRIV = 13851, + ERROR_IPSEC_IKE_SECLOADFAIL = 13852, + ERROR_IPSEC_IKE_FAILSSPINIT = 13853, + ERROR_IPSEC_IKE_FAILQUERYSSP = 13854, + ERROR_IPSEC_IKE_SRVACQFAIL = 13855, + ERROR_IPSEC_IKE_SRVQUERYCRED = 13856, + ERROR_IPSEC_IKE_GETSPIFAIL = 13857, + ERROR_IPSEC_IKE_INVALID_FILTER = 13858, + ERROR_IPSEC_IKE_OUT_OF_MEMORY = 13859, + ERROR_IPSEC_IKE_ADD_UPDATE_KEY_FAILED = 13860, + ERROR_IPSEC_IKE_INVALID_POLICY = 13861, + ERROR_IPSEC_IKE_UNKNOWN_DOI = 13862, + ERROR_IPSEC_IKE_INVALID_SITUATION = 13863, + ERROR_IPSEC_IKE_DH_FAILURE = 13864, + ERROR_IPSEC_IKE_INVALID_GROUP = 13865, + ERROR_IPSEC_IKE_ENCRYPT = 13866, + ERROR_IPSEC_IKE_DECRYPT = 13867, + ERROR_IPSEC_IKE_POLICY_MATCH = 13868, + ERROR_IPSEC_IKE_UNSUPPORTED_ID = 13869, + ERROR_IPSEC_IKE_INVALID_HASH = 13870, + ERROR_IPSEC_IKE_INVALID_HASH_ALG = 13871, + ERROR_IPSEC_IKE_INVALID_HASH_SIZE = 13872, + ERROR_IPSEC_IKE_INVALID_ENCRYPT_ALG = 13873, + ERROR_IPSEC_IKE_INVALID_AUTH_ALG = 13874, + ERROR_IPSEC_IKE_INVALID_SIG = 13875, + ERROR_IPSEC_IKE_LOAD_FAILED = 13876, + ERROR_IPSEC_IKE_RPC_DELETE = 13877, + ERROR_IPSEC_IKE_BENIGN_REINIT = 13878, + ERROR_IPSEC_IKE_INVALID_RESPONDER_LIFETIME_NOTIFY = 13879, + ERROR_IPSEC_IKE_INVALID_CERT_KEYLEN = 13881, + ERROR_IPSEC_IKE_MM_LIMIT = 13882, + ERROR_IPSEC_IKE_NEGOTIATION_DISABLED = 13883, + ERROR_IPSEC_IKE_NEG_STATUS_END = 13884, + ERROR_SXS_SECTION_NOT_FOUND = 14000, + ERROR_SXS_CANT_GEN_ACTCTX = 14001, + ERROR_SXS_INVALID_ACTCTXDATA_FORMAT = 14002, + ERROR_SXS_ASSEMBLY_NOT_FOUND = 14003, + ERROR_SXS_MANIFEST_FORMAT_ERROR = 14004, + ERROR_SXS_MANIFEST_PARSE_ERROR = 14005, + ERROR_SXS_ACTIVATION_CONTEXT_DISABLED = 14006, + ERROR_SXS_KEY_NOT_FOUND = 14007, + ERROR_SXS_VERSION_CONFLICT = 14008, + ERROR_SXS_WRONG_SECTION_TYPE = 14009, + ERROR_SXS_THREAD_QUERIES_DISABLED = 14010, + ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET = 14011, + ERROR_SXS_UNKNOWN_ENCODING_GROUP = 14012, + ERROR_SXS_UNKNOWN_ENCODING = 14013, + ERROR_SXS_INVALID_XML_NAMESPACE_URI = 14014, + ERROR_SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED = 14015, + ERROR_SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED = 14016, + ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE = 14017, + ERROR_SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE = 14018, + ERROR_SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE = 14019, + ERROR_SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT = 14020, + ERROR_SXS_DUPLICATE_DLL_NAME = 14021, + ERROR_SXS_DUPLICATE_WINDOWCLASS_NAME = 14022, + ERROR_SXS_DUPLICATE_CLSID = 14023, + ERROR_SXS_DUPLICATE_IID = 14024, + ERROR_SXS_DUPLICATE_TLBID = 14025, + ERROR_SXS_DUPLICATE_PROGID = 14026, + ERROR_SXS_DUPLICATE_ASSEMBLY_NAME = 14027, + ERROR_SXS_FILE_HASH_MISMATCH = 14028, + ERROR_SXS_POLICY_PARSE_ERROR = 14029, + ERROR_SXS_XML_E_MISSINGQUOTE = 14030, + ERROR_SXS_XML_E_COMMENTSYNTAX = 14031, + ERROR_SXS_XML_E_BADSTARTNAMECHAR = 14032, + ERROR_SXS_XML_E_BADNAMECHAR = 14033, + ERROR_SXS_XML_E_BADCHARINSTRING = 14034, + ERROR_SXS_XML_E_XMLDECLSYNTAX = 14035, + ERROR_SXS_XML_E_BADCHARDATA = 14036, + ERROR_SXS_XML_E_MISSINGWHITESPACE = 14037, + ERROR_SXS_XML_E_EXPECTINGTAGEND = 14038, + ERROR_SXS_XML_E_MISSINGSEMICOLON = 14039, + ERROR_SXS_XML_E_UNBALANCEDPAREN = 14040, + ERROR_SXS_XML_E_INTERNALERROR = 14041, + ERROR_SXS_XML_E_UNEXPECTED_WHITESPACE = 14042, + ERROR_SXS_XML_E_INCOMPLETE_ENCODING = 14043, + ERROR_SXS_XML_E_MISSING_PAREN = 14044, + ERROR_SXS_XML_E_EXPECTINGCLOSEQUOTE = 14045, + ERROR_SXS_XML_E_MULTIPLE_COLONS = 14046, + ERROR_SXS_XML_E_INVALID_DECIMAL = 14047, + ERROR_SXS_XML_E_INVALID_HEXIDECIMAL = 14048, + ERROR_SXS_XML_E_INVALID_UNICODE = 14049, + ERROR_SXS_XML_E_WHITESPACEORQUESTIONMARK = 14050, + ERROR_SXS_XML_E_UNEXPECTEDENDTAG = 14051, + ERROR_SXS_XML_E_UNCLOSEDTAG = 14052, + ERROR_SXS_XML_E_DUPLICATEATTRIBUTE = 14053, + ERROR_SXS_XML_E_MULTIPLEROOTS = 14054, + ERROR_SXS_XML_E_INVALIDATROOTLEVEL = 14055, + ERROR_SXS_XML_E_BADXMLDECL = 14056, + ERROR_SXS_XML_E_MISSINGROOT = 14057, + ERROR_SXS_XML_E_UNEXPECTEDEOF = 14058, + ERROR_SXS_XML_E_BADPEREFINSUBSET = 14059, + ERROR_SXS_XML_E_UNCLOSEDSTARTTAG = 14060, + ERROR_SXS_XML_E_UNCLOSEDENDTAG = 14061, + ERROR_SXS_XML_E_UNCLOSEDSTRING = 14062, + ERROR_SXS_XML_E_UNCLOSEDCOMMENT = 14063, + ERROR_SXS_XML_E_UNCLOSEDDECL = 14064, + ERROR_SXS_XML_E_UNCLOSEDCDATA = 14065, + ERROR_SXS_XML_E_RESERVEDNAMESPACE = 14066, + ERROR_SXS_XML_E_INVALIDENCODING = 14067, + ERROR_SXS_XML_E_INVALIDSWITCH = 14068, + ERROR_SXS_XML_E_BADXMLCASE = 14069, + ERROR_SXS_XML_E_INVALID_STANDALONE = 14070, + ERROR_SXS_XML_E_UNEXPECTED_STANDALONE = 14071, + ERROR_SXS_XML_E_INVALID_VERSION = 14072, + ERROR_SXS_XML_E_MISSINGEQUALS = 14073, + ERROR_SXS_PROTECTION_RECOVERY_FAILED = 14074, + ERROR_SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT = 14075, + ERROR_SXS_PROTECTION_CATALOG_NOT_VALID = 14076, + ERROR_SXS_UNTRANSLATABLE_HRESULT = 14077, + ERROR_SXS_PROTECTION_CATALOG_FILE_MISSING = 14078, + ERROR_SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE = 14079, + ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME = 14080 */ + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/IO/Stream.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/IO/Stream.Mono.cs index 3e0c4e47a02f2..f9263a9ebe9c6 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/IO/Stream.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/IO/Stream.Mono.cs @@ -6,12 +6,12 @@ namespace System.IO { - partial class Stream - { - [MethodImpl (MethodImplOptions.InternalCall)] - extern bool HasOverriddenBeginEndRead (); + public partial class Stream + { + [MethodImpl(MethodImplOptions.InternalCall)] + private extern bool HasOverriddenBeginEndRead(); - [MethodImpl (MethodImplOptions.InternalCall)] - extern bool HasOverriddenBeginEndWrite (); - } + [MethodImpl(MethodImplOptions.InternalCall)] + private extern bool HasOverriddenBeginEndWrite(); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Math.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Math.Mono.cs index 6f6fe9eb724f8..2dbef98775bef 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Math.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Math.Mono.cs @@ -6,94 +6,94 @@ namespace System { - partial class Math - { - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Abs (double value); + public partial class Math + { + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Abs(double value); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Abs (float value); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Abs(float value); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Acos (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Acos(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Acosh (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Acosh(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Asin (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Asin(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Asinh (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Asinh(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Atan (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Atan(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Atan2 (double y, double x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Atan2(double y, double x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Atanh (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Atanh(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Cbrt (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Cbrt(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Ceiling (double a); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Ceiling(double a); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Cos (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Cos(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Cosh (double value); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Cosh(double value); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Exp (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Exp(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Floor (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Floor(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Log (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Log(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Log10 (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Log10(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Pow (double x, double y); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Pow(double x, double y); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Sin (double a); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Sin(double a); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Sinh (double value); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Sinh(double value); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Sqrt (double d); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Sqrt(double d); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Tan (double a); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Tan(double a); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Tanh (double value); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Tanh(double value); - [Intrinsic] - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double FusedMultiplyAdd (double x, double y, double z); + [Intrinsic] + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double FusedMultiplyAdd(double x, double y, double z); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern int ILogB (double x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern int ILogB(double x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double Log2 (double x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double Log2(double x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern double ScaleB (double x, int n); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern double ScaleB(double x, int n); - [MethodImpl (MethodImplOptions.InternalCall)] - static extern double FMod(double x, double y); - - [MethodImpl (MethodImplOptions.InternalCall)] - static extern unsafe double ModF(double x, double* intptr); - } + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern double FMod(double x, double y); + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern unsafe double ModF(double x, double* intptr); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/MathF.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/MathF.Mono.cs index 16d0434381404..a290898fbd5dd 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/MathF.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/MathF.Mono.cs @@ -6,88 +6,88 @@ namespace System { - partial class MathF - { - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Acos (float x); + public partial class MathF + { + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Acos(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Acosh (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Acosh(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Asin (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Asin(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Asinh (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Asinh(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Atan (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Atan(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Atan2 (float y, float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Atan2(float y, float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Atanh (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Atanh(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Cbrt (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Cbrt(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Ceiling (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Ceiling(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Cos (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Cos(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Cosh (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Cosh(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Exp (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Exp(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Floor (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Floor(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Log (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Log(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Log10 (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Log10(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Pow (float x, float y); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Pow(float x, float y); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Sin (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Sin(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Sinh (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Sinh(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Sqrt (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Sqrt(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Tan (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Tan(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Tanh (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Tanh(float x); - [Intrinsic] - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float FusedMultiplyAdd (float x, float y, float z); + [Intrinsic] + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float FusedMultiplyAdd(float x, float y, float z); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern int ILogB (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern int ILogB(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float Log2 (float x); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float Log2(float x); - [MethodImpl (MethodImplOptions.InternalCall)] - public static extern float ScaleB (float x, int n); + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern float ScaleB(float x, int n); - [MethodImpl (MethodImplOptions.InternalCall)] - static extern float FMod (float x, float y); - - [MethodImpl (MethodImplOptions.InternalCall)] - static extern unsafe float ModF (float x, float* intptr); - } + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern float FMod(float x, float y); + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern unsafe float ModF(float x, float* intptr); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/MissingMemberException.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/MissingMemberException.Mono.cs index a346eea450b2f..0d9e17e9346be 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/MissingMemberException.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/MissingMemberException.Mono.cs @@ -4,11 +4,11 @@ namespace System { - partial class MissingMemberException - { - internal static string FormatSignature (byte[] signature) - { - return ""; - } - } + public partial class MissingMemberException + { + internal static string FormatSignature(byte[] signature) + { + return ""; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/ModuleHandle.cs b/src/mono/netcore/System.Private.CoreLib/src/System/ModuleHandle.cs index ce0e6a1e4dd5a..2ef76dbdbc79f 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/ModuleHandle.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/ModuleHandle.cs @@ -7,136 +7,139 @@ namespace System { - public struct ModuleHandle - { - readonly IntPtr value; - - public static readonly ModuleHandle EmptyHandle = new ModuleHandle (IntPtr.Zero); - - internal ModuleHandle (IntPtr v) - { - value = v; - } - - internal IntPtr Value { - get { - return value; - } - } - - public int MDStreamVersion { - get { - if (value == IntPtr.Zero) - throw new ArgumentNullException (String.Empty, "Invalid handle"); - return RuntimeModule.GetMDStreamVersion (value); - } - } - - public RuntimeFieldHandle ResolveFieldHandle (int fieldToken) - { - return ResolveFieldHandle (fieldToken, null, null); - } - - public RuntimeMethodHandle ResolveMethodHandle (int methodToken) - { - return ResolveMethodHandle (methodToken, null, null); - } - - public RuntimeTypeHandle ResolveTypeHandle (int typeToken) - { - return ResolveTypeHandle (typeToken, null, null); - } - - static IntPtr[]? ptrs_from_handles (RuntimeTypeHandle[]? handles) - { - if (handles == null) - return null; - - var res = new IntPtr [handles.Length]; - for (int i = 0; i < handles.Length; ++i) - res [i] = handles [i].Value; - return res; - } - - public RuntimeTypeHandle ResolveTypeHandle (int typeToken, RuntimeTypeHandle[]? typeInstantiationContext, RuntimeTypeHandle[]? methodInstantiationContext) - { - ResolveTokenError error; - if (value == IntPtr.Zero) - throw new ArgumentNullException (String.Empty, "Invalid handle"); - IntPtr res = RuntimeModule.ResolveTypeToken (value, typeToken, ptrs_from_handles (typeInstantiationContext), ptrs_from_handles (methodInstantiationContext), out error); - if (res == IntPtr.Zero) - throw new TypeLoadException (String.Format ("Could not load type '0x{0:x}' from assembly '0x{1:x}'", typeToken, value.ToInt64 ())); - else - return new RuntimeTypeHandle (res); - } - - public RuntimeMethodHandle ResolveMethodHandle (int methodToken, RuntimeTypeHandle[]? typeInstantiationContext, RuntimeTypeHandle[]? methodInstantiationContext) - { - ResolveTokenError error; - if (value == IntPtr.Zero) - throw new ArgumentNullException (String.Empty, "Invalid handle"); - IntPtr res = RuntimeModule.ResolveMethodToken (value, methodToken, ptrs_from_handles (typeInstantiationContext), ptrs_from_handles (methodInstantiationContext), out error); - if (res == IntPtr.Zero) - throw new Exception (String.Format ("Could not load method '0x{0:x}' from assembly '0x{1:x}'", methodToken, value.ToInt64 ())); - else - return new RuntimeMethodHandle (res); - } - - public RuntimeFieldHandle ResolveFieldHandle (int fieldToken, RuntimeTypeHandle[]? typeInstantiationContext, RuntimeTypeHandle[]? methodInstantiationContext) - { - ResolveTokenError error; - if (value == IntPtr.Zero) - throw new ArgumentNullException (String.Empty, "Invalid handle"); - - IntPtr res = RuntimeModule.ResolveFieldToken (value, fieldToken, ptrs_from_handles (typeInstantiationContext), ptrs_from_handles (methodInstantiationContext), out error); - if (res == IntPtr.Zero) - throw new Exception (String.Format ("Could not load field '0x{0:x}' from assembly '0x{1:x}'", fieldToken, value.ToInt64 ())); - else - return new RuntimeFieldHandle (res); - } - - public RuntimeFieldHandle GetRuntimeFieldHandleFromMetadataToken (int fieldToken) - { - return ResolveFieldHandle (fieldToken); - } - - public RuntimeMethodHandle GetRuntimeMethodHandleFromMetadataToken (int methodToken) - { - return ResolveMethodHandle (methodToken); - } - - public RuntimeTypeHandle GetRuntimeTypeHandleFromMetadataToken (int typeToken) - { - return ResolveTypeHandle (typeToken); - } - - public override bool Equals (object? obj) - { - if (obj == null || GetType () != obj.GetType ()) - return false; - - return value == ((ModuleHandle)obj).Value; - } - - public bool Equals (ModuleHandle handle) - { - return value == handle.Value; - } - - public override int GetHashCode () - { - return value.GetHashCode (); - } - - public static bool operator == (ModuleHandle left, ModuleHandle right) - { - return Equals (left, right); - } - - public static bool operator != (ModuleHandle left, ModuleHandle right) - { - return !Equals (left, right); - } - } + public struct ModuleHandle + { + private readonly IntPtr value; + + public static readonly ModuleHandle EmptyHandle = new ModuleHandle(IntPtr.Zero); + + internal ModuleHandle(IntPtr v) + { + value = v; + } + + internal IntPtr Value + { + get + { + return value; + } + } + + public int MDStreamVersion + { + get + { + if (value == IntPtr.Zero) + throw new ArgumentNullException(string.Empty, "Invalid handle"); + return RuntimeModule.GetMDStreamVersion(value); + } + } + + public RuntimeFieldHandle ResolveFieldHandle(int fieldToken) + { + return ResolveFieldHandle(fieldToken, null, null); + } + + public RuntimeMethodHandle ResolveMethodHandle(int methodToken) + { + return ResolveMethodHandle(methodToken, null, null); + } + + public RuntimeTypeHandle ResolveTypeHandle(int typeToken) + { + return ResolveTypeHandle(typeToken, null, null); + } + + private static IntPtr[]? ptrs_from_handles(RuntimeTypeHandle[]? handles) + { + if (handles == null) + return null; + + var res = new IntPtr[handles.Length]; + for (int i = 0; i < handles.Length; ++i) + res[i] = handles[i].Value; + return res; + } + + public RuntimeTypeHandle ResolveTypeHandle(int typeToken, RuntimeTypeHandle[]? typeInstantiationContext, RuntimeTypeHandle[]? methodInstantiationContext) + { + ResolveTokenError error; + if (value == IntPtr.Zero) + throw new ArgumentNullException(string.Empty, "Invalid handle"); + IntPtr res = RuntimeModule.ResolveTypeToken(value, typeToken, ptrs_from_handles(typeInstantiationContext), ptrs_from_handles(methodInstantiationContext), out error); + if (res == IntPtr.Zero) + throw new TypeLoadException(string.Format("Could not load type '0x{0:x}' from assembly '0x{1:x}'", typeToken, value.ToInt64())); + else + return new RuntimeTypeHandle(res); + } + + public RuntimeMethodHandle ResolveMethodHandle(int methodToken, RuntimeTypeHandle[]? typeInstantiationContext, RuntimeTypeHandle[]? methodInstantiationContext) + { + ResolveTokenError error; + if (value == IntPtr.Zero) + throw new ArgumentNullException(string.Empty, "Invalid handle"); + IntPtr res = RuntimeModule.ResolveMethodToken(value, methodToken, ptrs_from_handles(typeInstantiationContext), ptrs_from_handles(methodInstantiationContext), out error); + if (res == IntPtr.Zero) + throw new Exception(string.Format("Could not load method '0x{0:x}' from assembly '0x{1:x}'", methodToken, value.ToInt64())); + else + return new RuntimeMethodHandle(res); + } + + public RuntimeFieldHandle ResolveFieldHandle(int fieldToken, RuntimeTypeHandle[]? typeInstantiationContext, RuntimeTypeHandle[]? methodInstantiationContext) + { + ResolveTokenError error; + if (value == IntPtr.Zero) + throw new ArgumentNullException(string.Empty, "Invalid handle"); + + IntPtr res = RuntimeModule.ResolveFieldToken(value, fieldToken, ptrs_from_handles(typeInstantiationContext), ptrs_from_handles(methodInstantiationContext), out error); + if (res == IntPtr.Zero) + throw new Exception(string.Format("Could not load field '0x{0:x}' from assembly '0x{1:x}'", fieldToken, value.ToInt64())); + else + return new RuntimeFieldHandle(res); + } + + public RuntimeFieldHandle GetRuntimeFieldHandleFromMetadataToken(int fieldToken) + { + return ResolveFieldHandle(fieldToken); + } + + public RuntimeMethodHandle GetRuntimeMethodHandleFromMetadataToken(int methodToken) + { + return ResolveMethodHandle(methodToken); + } + + public RuntimeTypeHandle GetRuntimeTypeHandleFromMetadataToken(int typeToken) + { + return ResolveTypeHandle(typeToken); + } + + public override bool Equals(object? obj) + { + if (obj == null || GetType() != obj.GetType()) + return false; + + return value == ((ModuleHandle)obj).Value; + } + + public bool Equals(ModuleHandle handle) + { + return value == handle.Value; + } + + public override int GetHashCode() + { + return value.GetHashCode(); + } + + public static bool operator ==(ModuleHandle left, ModuleHandle right) + { + return Equals(left, right); + } + + public static bool operator !=(ModuleHandle left, ModuleHandle right) + { + return !Equals(left, right); + } + } } - diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/MulticastDelegate.cs b/src/mono/netcore/System.Private.CoreLib/src/System/MulticastDelegate.cs index 5205ef060e291..553ee17c1a70f 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/MulticastDelegate.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/MulticastDelegate.cs @@ -9,254 +9,284 @@ namespace System { - [StructLayout (LayoutKind.Sequential)] - public abstract class MulticastDelegate : Delegate - { - Delegate[]? delegates; - - protected MulticastDelegate (object target, string method) - : base (target, method) - { - } - - protected MulticastDelegate (Type target, string method) - : base (target, method) - { - } - - public override void GetObjectData (SerializationInfo info, StreamingContext context) - { - throw new SerializationException (SR.Serialization_DelegatesNotSupported); - } - - protected sealed override object? DynamicInvokeImpl (object?[]? args) - { - if (delegates == null) { - return base.DynamicInvokeImpl (args); - } else { - object r; - int i = 0, len = delegates.Length; - do { - r = delegates [i].DynamicInvoke (args); - } while (++i < len); - return r; - } - } - - // Some high-performance applications use this internal property - // to avoid using a slow path to determine if there is more than one handler - // This brings an API that we removed in f410e545e2db0e0dc338673a6b10a5cfd2d3340f - // which some users depeneded on - // - // This is an example of code that used this: - // https://gist.github.com/migueldeicaza/cd99938c2a4372e7e5d5 - // - // Do not remove this API - internal bool HasSingleTarget { - get { return delegates == null; } - } - - // - // Equals: two multicast delegates are equal if their base is equal - // and their invocations list is equal. - // - public sealed override bool Equals (object? obj) - { - if (!base.Equals (obj)) - return false; - - if (!(obj is MulticastDelegate d)) - return false; - - if (delegates == null && d.delegates == null) { - return true; - } else if (delegates == null ^ d.delegates == null) { - return false; - } else { - if (delegates.Length != d.delegates.Length) - return false; - - for (int i = 0; i < delegates.Length; ++i) { - if (!delegates [i].Equals (d.delegates [i])) - return false; - } - - return true; - } - } - - // - // FIXME: This could use some improvements. - // - public sealed override int GetHashCode () - { - return base.GetHashCode (); - } - - protected override MethodInfo GetMethodImpl () - { - if (delegates != null) - return delegates [delegates.Length - 1].Method; - - return base.GetMethodImpl (); - } - - // - // Return, in order of invocation, the invocation list - // of a MulticastDelegate - // - public sealed override Delegate[] GetInvocationList () - { - if (delegates != null) - return (Delegate[]) delegates.Clone (); - else - return new Delegate[1] { this }; - } - - // - // Combines this MulticastDelegate with the (Multicast)Delegate `follow'. - // This does _not_ combine with Delegates. ECMA states the whole delegate - // thing should have better been a simple System.Delegate class. - // Compiler generated delegates are always MulticastDelegates. - // - protected sealed override Delegate CombineImpl (Delegate? follow) - { - if (follow == null) - return this; - - MulticastDelegate other = (MulticastDelegate) follow; - - MulticastDelegate ret = AllocDelegateLike_internal (this); - - if (delegates == null && other.delegates == null) { - ret.delegates = new Delegate [2] { this, other }; - } else if (delegates == null) { - ret.delegates = new Delegate [1 + other.delegates.Length]; - - ret.delegates [0] = this; - Array.Copy (other.delegates, 0, ret.delegates, 1, other.delegates.Length); - } else if (other.delegates == null) { - ret.delegates = new Delegate [delegates.Length + 1]; - - Array.Copy (delegates, 0, ret.delegates, 0, delegates.Length); - ret.delegates [ret.delegates.Length - 1] = other; - } else { - ret.delegates = new Delegate [delegates.Length + other.delegates.Length]; - - Array.Copy (delegates, 0, ret.delegates, 0, delegates.Length); - Array.Copy (other.delegates, 0, ret.delegates, delegates.Length, other.delegates.Length); - } - - return ret; - } - - /* Based on the Boyer–Moore string search algorithm */ - int LastIndexOf (Delegate[] haystack, Delegate[] needle) - { - if (haystack.Length < needle.Length) - return -1; - - if (haystack.Length == needle.Length) { - for (int i = 0; i < haystack.Length; ++i) - if (!haystack [i].Equals (needle [i])) - return -1; - - return 0; - } - - for (int i = haystack.Length - needle.Length, j; i >= 0;) { - for (j = 0; needle [j].Equals (haystack [i]); ++i, ++j) { - if (j == needle.Length - 1) - return i - j; - } - - i -= j + 1; - } - - return -1; - } - - protected sealed override Delegate RemoveImpl (Delegate value) - { - if (value == null) - return this; - - MulticastDelegate other = (MulticastDelegate) value; - - if (delegates == null && other.delegates == null) { - /* if they are not equal and the current one is not - * a multicastdelegate then we cannot delete it */ - return this.Equals (other) ? null : this; - } else if (delegates == null) { - foreach (var d in other.delegates) { - if (this.Equals (d)) - return null; - } - return this; - } else if (other.delegates == null) { - int idx = Array.LastIndexOf (delegates, other); - if (idx == -1) - return this; - - if (delegates.Length <= 1) { - /* delegates.Length should never be equal or - * lower than 1, it should be 2 or greater */ - throw new InvalidOperationException (); - } - - if (delegates.Length == 2) - return delegates [idx == 0 ? 1 : 0]; - - MulticastDelegate ret = AllocDelegateLike_internal (this); - ret.delegates = new Delegate [delegates.Length - 1]; - - Array.Copy (delegates, ret.delegates, idx); - Array.Copy (delegates, idx + 1, ret.delegates, idx, delegates.Length - idx - 1); - - return ret; - } else { - /* wild case : remove MulticastDelegate from MulticastDelegate - * complexity is O(m + n), with n the number of elements in - * this.delegates and m the number of elements in other.delegates */ - - if (delegates.Equals (other.delegates)) - return null; - - /* we need to remove elements from the end to the beginning, as - * the addition and removal of delegates behaves like a stack */ - int idx = LastIndexOf (delegates, other.delegates); - if (idx == -1) - return this; - - MulticastDelegate ret = AllocDelegateLike_internal (this); - ret.delegates = new Delegate [delegates.Length - other.delegates.Length]; - - Array.Copy (delegates, ret.delegates, idx); - Array.Copy (delegates, idx + other.delegates.Length, ret.delegates, idx, delegates.Length - idx - other.delegates.Length); - - return ret; - } - } - - public static bool operator == (MulticastDelegate d1, MulticastDelegate d2) - { - if (d1 == null) - return d2 == null; - - return d1.Equals (d2); - } - - public static bool operator != (MulticastDelegate d1, MulticastDelegate d2) - { - if (d1 == null) - return d2 != null; - - return !d1.Equals (d2); - } - - internal override object GetTarget() - { - return delegates?.Length > 0 ? delegates [delegates.Length - 1].GetTarget () : base.GetTarget (); - } - } + [StructLayout(LayoutKind.Sequential)] + public abstract class MulticastDelegate : Delegate + { + private Delegate[]? delegates; + + protected MulticastDelegate(object target, string method) + : base(target, method) + { + } + + protected MulticastDelegate(Type target, string method) + : base(target, method) + { + } + + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + throw new SerializationException(SR.Serialization_DelegatesNotSupported); + } + + protected sealed override object? DynamicInvokeImpl(object?[]? args) + { + if (delegates == null) + { + return base.DynamicInvokeImpl(args); + } + else + { + object r; + int i = 0, len = delegates.Length; + do + { + r = delegates[i].DynamicInvoke(args); + } while (++i < len); + return r; + } + } + + // Some high-performance applications use this internal property + // to avoid using a slow path to determine if there is more than one handler + // This brings an API that we removed in f410e545e2db0e0dc338673a6b10a5cfd2d3340f + // which some users depeneded on + // + // This is an example of code that used this: + // https://gist.github.com/migueldeicaza/cd99938c2a4372e7e5d5 + // + // Do not remove this API + internal bool HasSingleTarget + { + get { return delegates == null; } + } + + // + // Equals: two multicast delegates are equal if their base is equal + // and their invocations list is equal. + // + public sealed override bool Equals(object? obj) + { + if (!base.Equals(obj)) + return false; + + if (!(obj is MulticastDelegate d)) + return false; + + if (delegates == null && d.delegates == null) + { + return true; + } + else if (delegates == null ^ d.delegates == null) + { + return false; + } + else + { + if (delegates.Length != d.delegates.Length) + return false; + + for (int i = 0; i < delegates.Length; ++i) + { + if (!delegates[i].Equals(d.delegates[i])) + return false; + } + + return true; + } + } + + // + // FIXME: This could use some improvements. + // + public sealed override int GetHashCode() + { + return base.GetHashCode(); + } + + protected override MethodInfo GetMethodImpl() + { + if (delegates != null) + return delegates[delegates.Length - 1].Method; + + return base.GetMethodImpl(); + } + + // + // Return, in order of invocation, the invocation list + // of a MulticastDelegate + // + public sealed override Delegate[] GetInvocationList() + { + if (delegates != null) + return (Delegate[])delegates.Clone(); + else + return new Delegate[1] { this }; + } + + // + // Combines this MulticastDelegate with the (Multicast)Delegate `follow'. + // This does _not_ combine with Delegates. ECMA states the whole delegate + // thing should have better been a simple System.Delegate class. + // Compiler generated delegates are always MulticastDelegates. + // + protected sealed override Delegate CombineImpl(Delegate? follow) + { + if (follow == null) + return this; + + MulticastDelegate other = (MulticastDelegate)follow; + + MulticastDelegate ret = AllocDelegateLike_internal(this); + + if (delegates == null && other.delegates == null) + { + ret.delegates = new Delegate[2] { this, other }; + } + else if (delegates == null) + { + ret.delegates = new Delegate[1 + other.delegates.Length]; + + ret.delegates[0] = this; + Array.Copy(other.delegates, 0, ret.delegates, 1, other.delegates.Length); + } + else if (other.delegates == null) + { + ret.delegates = new Delegate[delegates.Length + 1]; + + Array.Copy(delegates, 0, ret.delegates, 0, delegates.Length); + ret.delegates[ret.delegates.Length - 1] = other; + } + else + { + ret.delegates = new Delegate[delegates.Length + other.delegates.Length]; + + Array.Copy(delegates, 0, ret.delegates, 0, delegates.Length); + Array.Copy(other.delegates, 0, ret.delegates, delegates.Length, other.delegates.Length); + } + + return ret; + } + + /* Based on the Boyer–Moore string search algorithm */ + private int LastIndexOf(Delegate[] haystack, Delegate[] needle) + { + if (haystack.Length < needle.Length) + return -1; + + if (haystack.Length == needle.Length) + { + for (int i = 0; i < haystack.Length; ++i) + if (!haystack[i].Equals(needle[i])) + return -1; + + return 0; + } + + for (int i = haystack.Length - needle.Length, j; i >= 0;) + { + for (j = 0; needle[j].Equals(haystack[i]); ++i, ++j) + { + if (j == needle.Length - 1) + return i - j; + } + + i -= j + 1; + } + + return -1; + } + + protected sealed override Delegate RemoveImpl(Delegate value) + { + if (value == null) + return this; + + MulticastDelegate other = (MulticastDelegate)value; + + if (delegates == null && other.delegates == null) + { + /* if they are not equal and the current one is not + * a multicastdelegate then we cannot delete it */ + return this.Equals(other) ? null : this; + } + else if (delegates == null) + { + foreach (var d in other.delegates) + { + if (this.Equals(d)) + return null; + } + return this; + } + else if (other.delegates == null) + { + int idx = Array.LastIndexOf(delegates, other); + if (idx == -1) + return this; + + if (delegates.Length <= 1) + { + /* delegates.Length should never be equal or + * lower than 1, it should be 2 or greater */ + throw new InvalidOperationException(); + } + + if (delegates.Length == 2) + return delegates[idx == 0 ? 1 : 0]; + + MulticastDelegate ret = AllocDelegateLike_internal(this); + ret.delegates = new Delegate[delegates.Length - 1]; + + Array.Copy(delegates, ret.delegates, idx); + Array.Copy(delegates, idx + 1, ret.delegates, idx, delegates.Length - idx - 1); + + return ret; + } + else + { + /* wild case : remove MulticastDelegate from MulticastDelegate + * complexity is O(m + n), with n the number of elements in + * this.delegates and m the number of elements in other.delegates */ + + if (delegates.Equals(other.delegates)) + return null; + + /* we need to remove elements from the end to the beginning, as + * the addition and removal of delegates behaves like a stack */ + int idx = LastIndexOf(delegates, other.delegates); + if (idx == -1) + return this; + + MulticastDelegate ret = AllocDelegateLike_internal(this); + ret.delegates = new Delegate[delegates.Length - other.delegates.Length]; + + Array.Copy(delegates, ret.delegates, idx); + Array.Copy(delegates, idx + other.delegates.Length, ret.delegates, idx, delegates.Length - idx - other.delegates.Length); + + return ret; + } + } + + public static bool operator ==(MulticastDelegate d1, MulticastDelegate d2) + { + if (d1 == null) + return d2 == null; + + return d1.Equals(d2); + } + + public static bool operator !=(MulticastDelegate d1, MulticastDelegate d2) + { + if (d1 == null) + return d2 != null; + + return !d1.Equals(d2); + } + + internal override object GetTarget() + { + return delegates?.Length > 0 ? delegates[delegates.Length - 1].GetTarget() : base.GetTarget(); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/NotImplemented.cs b/src/mono/netcore/System.Private.CoreLib/src/System/NotImplemented.cs index 5a2690e97f688..f36f6cbd625c0 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/NotImplemented.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/NotImplemented.cs @@ -26,4 +26,3 @@ internal static Exception ByDesign } } } - diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Nullable.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Nullable.Mono.cs index 8958c0fab8b49..8a2f8ba2a3bc9 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Nullable.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Nullable.Mono.cs @@ -4,38 +4,38 @@ namespace System { - partial struct Nullable - { - // - // These are called by the JIT - // + public partial struct Nullable + { + // + // These are called by the JIT + // - // - // JIT implementation of box valuetype System.Nullable`1 - // - static object? Box (T? o) - { - if (!o.hasValue) - return null; + // + // JIT implementation of box valuetype System.Nullable`1 + // + private static object? Box(T? o) + { + if (!o.hasValue) + return null; - return o.value; - } - - static T? Unbox (object o) - { - if (o == null) - return null; - return (T) o; - } + return o.value; + } - static T? UnboxExact (object o) - { - if (o == null) - return null; - if (o.GetType() != typeof (T)) - throw new InvalidCastException(); + private static T? Unbox(object o) + { + if (o == null) + return null; + return (T)o; + } - return (T) o; - } - } + private static T? UnboxExact(object o) + { + if (o == null) + return null; + if (o.GetType() != typeof(T)) + throw new InvalidCastException(); + + return (T)o; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Object.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Object.Mono.cs index a34de194d20ba..f781a0b84837f 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Object.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Object.Mono.cs @@ -6,17 +6,17 @@ namespace System { - partial class Object - { - [Intrinsic] - public Type GetType () => GetType (); + public partial class Object + { + [Intrinsic] + public Type GetType() => GetType(); - [MethodImplAttribute (MethodImplOptions.InternalCall)] - protected extern object MemberwiseClone (); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + protected extern object MemberwiseClone(); - [Intrinsic] - internal ref byte GetRawData () => ref GetRawData (); + [Intrinsic] + internal ref byte GetRawData() => ref GetRawData(); - internal object CloneInternal () => MemberwiseClone (); - } + internal object CloneInternal() => MemberwiseClone(); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Assembly.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Assembly.Mono.cs index a8ac7339b9c86..97ca9ad6e6697 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Assembly.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Assembly.Mono.cs @@ -10,88 +10,91 @@ namespace System.Reflection { - [StructLayout (LayoutKind.Sequential)] - partial class Assembly - { - internal bool IsRuntimeImplemented () => this is RuntimeAssembly; - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly? LoadWithPartialName (string partialName) - { - if (partialName == null) - throw new ArgumentNullException (nameof (partialName)); - - if (partialName.Length == 0 || partialName [0] == '\0') - throw new ArgumentException (SR.Format_StringZeroLength, nameof (partialName)); - - try { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeAssembly.InternalLoad (partialName, ref stackMark, IntPtr.Zero); - } catch (FileNotFoundException) { - return null; - } - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly GetExecutingAssembly() - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return GetExecutingAssembly(ref stackMark); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern RuntimeAssembly GetExecutingAssembly (ref StackCrawlMark stackMark); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public static extern Assembly GetCallingAssembly (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern Assembly GetEntryAssemblyNative (); - - private static Assembly? GetEntryAssemblyInternal () - { - return GetEntryAssemblyNative (); - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly Load (string assemblyString) - { - if (assemblyString == null) - throw new ArgumentNullException (nameof (assemblyString)); - - var name = new AssemblyName (assemblyString); - // TODO: trigger assemblyFromResolveEvent - - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return Load (name, ref stackMark, AssemblyLoadContext.CurrentContextualReflectionContext); - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly Load (AssemblyName assemblyRef) - { - if (assemblyRef == null) - throw new ArgumentNullException (nameof (assemblyRef)); - - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return Load (assemblyRef, ref stackMark, AssemblyLoadContext.CurrentContextualReflectionContext); - } - - internal static Assembly Load (AssemblyName assemblyRef, ref StackCrawlMark stackMark, AssemblyLoadContext assemblyLoadContext) - { - // TODO: pass AssemblyName - var assembly = InternalLoad (assemblyRef.FullName, ref stackMark, assemblyLoadContext != null ? assemblyLoadContext.NativeALC : IntPtr.Zero); - if (assembly == null) - throw new FileNotFoundException (null, assemblyRef.Name); - return assembly; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern Assembly InternalLoad (string assemblyName, ref StackCrawlMark stackMark, IntPtr ptrLoadContextBinder); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern Type InternalGetType (Module module, string name, bool throwOnError, bool ignoreCase); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static void InternalGetAssemblyName (string assemblyFile, out Mono.MonoAssemblyName aname, out string codebase); - } + [StructLayout(LayoutKind.Sequential)] + public partial class Assembly + { + internal bool IsRuntimeImplemented() => this is RuntimeAssembly; + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Assembly? LoadWithPartialName(string partialName) + { + if (partialName == null) + throw new ArgumentNullException(nameof(partialName)); + + if (partialName.Length == 0 || partialName[0] == '\0') + throw new ArgumentException(SR.Format_StringZeroLength, nameof(partialName)); + + try + { + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return InternalLoad(partialName, ref stackMark, IntPtr.Zero); + } + catch (FileNotFoundException) + { + return null; + } + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Assembly GetExecutingAssembly() + { + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return GetExecutingAssembly(ref stackMark); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern RuntimeAssembly GetExecutingAssembly(ref StackCrawlMark stackMark); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern Assembly GetCallingAssembly(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern Assembly GetEntryAssemblyNative(); + + private static Assembly? GetEntryAssemblyInternal() + { + return GetEntryAssemblyNative(); + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Assembly Load(string assemblyString) + { + if (assemblyString == null) + throw new ArgumentNullException(nameof(assemblyString)); + + var name = new AssemblyName(assemblyString); + // TODO: trigger assemblyFromResolveEvent + + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return Load(name, ref stackMark, AssemblyLoadContext.CurrentContextualReflectionContext); + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Assembly Load(AssemblyName assemblyRef) + { + if (assemblyRef == null) + throw new ArgumentNullException(nameof(assemblyRef)); + + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return Load(assemblyRef, ref stackMark, AssemblyLoadContext.CurrentContextualReflectionContext); + } + + internal static Assembly Load(AssemblyName assemblyRef, ref StackCrawlMark stackMark, AssemblyLoadContext assemblyLoadContext) + { + // TODO: pass AssemblyName + var assembly = InternalLoad(assemblyRef.FullName, ref stackMark, assemblyLoadContext != null ? assemblyLoadContext.NativeALC : IntPtr.Zero); + if (assembly == null) + throw new FileNotFoundException(null, assemblyRef.Name); + return assembly; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern Assembly InternalLoad(string assemblyName, ref StackCrawlMark stackMark, IntPtr ptrLoadContextBinder); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern Type InternalGetType(Module module, string name, bool throwOnError, bool ignoreCase); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern void InternalGetAssemblyName(string assemblyFile, out Mono.MonoAssemblyName aname, out string codebase); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/AssemblyName.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/AssemblyName.Mono.cs index 5d93f5c726244..718a1e2436d9e 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/AssemblyName.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/AssemblyName.Mono.cs @@ -11,125 +11,143 @@ namespace System.Reflection { - [StructLayout (LayoutKind.Sequential)] - partial class AssemblyName - { - public AssemblyName (string assemblyName) + [StructLayout(LayoutKind.Sequential)] + public partial class AssemblyName + { + public AssemblyName(string assemblyName) { if (assemblyName == null) - throw new ArgumentNullException (nameof (assemblyName)); - if (assemblyName.Length == 0 || assemblyName [0] == '\0') - throw new ArgumentException (SR.Format_StringZeroLength); - - using (var name = RuntimeMarshal.MarshalString (assemblyName)) { - // TODO: Should use CoreRT AssemblyNameParser - if (!ParseAssemblyName (name.Value, out var nativeName, out var isVersionDefined, out var isTokenDefined)) - throw new FileLoadException ("The assembly name is invalid."); - - try { - unsafe { - FillName (&nativeName, null, isVersionDefined, false, isTokenDefined); - } - } finally { - RuntimeMarshal.FreeAssemblyName (ref nativeName, false); - } - } + throw new ArgumentNullException(nameof(assemblyName)); + if (assemblyName.Length == 0 || assemblyName[0] == '\0') + throw new ArgumentException(SR.Format_StringZeroLength); + + using (var name = RuntimeMarshal.MarshalString(assemblyName)) + { + // TODO: Should use CoreRT AssemblyNameParser + if (!ParseAssemblyName(name.Value, out var nativeName, out var isVersionDefined, out var isTokenDefined)) + throw new FileLoadException("The assembly name is invalid."); + + try + { + unsafe + { + FillName(&nativeName, null, isVersionDefined, false, isTokenDefined); + } + } + finally + { + RuntimeMarshal.FreeAssemblyName(ref nativeName, false); + } + } } - unsafe byte [] ComputePublicKeyToken () - { - if (_publicKey == null) - return null; - if (_publicKey.Length == 0) - return Array.Empty(); - - var token = new byte [8]; - fixed (byte* pkt = token) - fixed (byte *pk = _publicKey) - get_public_token (pkt, pk, _publicKey.Length); - return token; - } - - internal static AssemblyName Create (IntPtr monoAssembly, string codeBase) - { - AssemblyName aname = new AssemblyName (); - unsafe { - MonoAssemblyName *native = GetNativeName (monoAssembly); - aname.FillName (native, codeBase, true, true, true); - } - return aname; - } - - internal unsafe void FillName (MonoAssemblyName *native, string codeBase, bool addVersion, bool addPublickey, bool defaultToken) - { - _name = RuntimeMarshal.PtrToUtf8String (native->name); - - _flags = (AssemblyNameFlags) native->flags; - - _hashAlgorithm = (AssemblyHashAlgorithm) native->hash_alg; - - _versionCompatibility = AssemblyVersionCompatibility.SameMachine; - - if (addVersion) { - var build = native->build == 65535 ? -1 : native->build; - var revision = native->revision == 65535 ? -1 : native->revision; - - if (build == -1) - _version = new Version (native->major, native->minor); - else if (revision == -1) - _version = new Version (native->major, native->minor, build); - else - _version = new Version (native->major, native->minor, build, revision); - } - - _codeBase = codeBase; - - if (native->culture != IntPtr.Zero) - _cultureInfo = CultureInfo.GetCultureInfo (RuntimeMarshal.PtrToUtf8String (native->culture)); - - if (native->public_key != IntPtr.Zero) { - _publicKey = RuntimeMarshal.DecodeBlobArray (native->public_key); - _flags |= AssemblyNameFlags.PublicKey; - } else if (addPublickey) { - _publicKey = Array.Empty (); - _flags |= AssemblyNameFlags.PublicKey; - } - - // MonoAssemblyName keeps the public key token as an hexadecimal string - if (native->public_key_token [0] != 0) { - var keyToken = new byte [8]; - for (int i = 0, j = 0; i < 8; ++i) { - keyToken [i] = (byte) (RuntimeMarshal.AsciHexDigitValue (native->public_key_token [j++]) << 4); - keyToken [i] |= (byte) RuntimeMarshal.AsciHexDigitValue (native->public_key_token [j++]); - } - _publicKeyToken = keyToken; - } else if (defaultToken) { - _publicKeyToken = Array.Empty (); - } - } - - static AssemblyName GetFileInformationCore (string assemblyFile) - { - unsafe { - Assembly.InternalGetAssemblyName (Path.GetFullPath (assemblyFile), out var nativeName, out var codebase); - - var aname = new AssemblyName (); - try { - aname.FillName (&nativeName, codebase, true, false, true); - return aname; - } finally { - RuntimeMarshal.FreeAssemblyName (ref nativeName, false); - } - } - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern unsafe void get_public_token (byte* token, byte* pubkey, int len); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern unsafe MonoAssemblyName* GetNativeName (IntPtr assemblyPtr); - - [MethodImpl (MethodImplOptions.InternalCall)] - static extern bool ParseAssemblyName (IntPtr name, out MonoAssemblyName aname, out bool is_version_definited, out bool is_token_defined); - } + private unsafe byte[] ComputePublicKeyToken() + { + if (_publicKey == null) + return null; + if (_publicKey.Length == 0) + return Array.Empty(); + + var token = new byte[8]; + fixed (byte* pkt = token) + fixed (byte* pk = _publicKey) + get_public_token(pkt, pk, _publicKey.Length); + return token; + } + + internal static AssemblyName Create(IntPtr monoAssembly, string codeBase) + { + AssemblyName aname = new AssemblyName(); + unsafe + { + MonoAssemblyName* native = GetNativeName(monoAssembly); + aname.FillName(native, codeBase, true, true, true); + } + return aname; + } + + internal unsafe void FillName(MonoAssemblyName* native, string codeBase, bool addVersion, bool addPublickey, bool defaultToken) + { + _name = RuntimeMarshal.PtrToUtf8String(native->name); + + _flags = (AssemblyNameFlags)native->flags; + + _hashAlgorithm = (AssemblyHashAlgorithm)native->hash_alg; + + _versionCompatibility = AssemblyVersionCompatibility.SameMachine; + + if (addVersion) + { + var build = native->build == 65535 ? -1 : native->build; + var revision = native->revision == 65535 ? -1 : native->revision; + + if (build == -1) + _version = new Version(native->major, native->minor); + else if (revision == -1) + _version = new Version(native->major, native->minor, build); + else + _version = new Version(native->major, native->minor, build, revision); + } + + _codeBase = codeBase; + + if (native->culture != IntPtr.Zero) + _cultureInfo = CultureInfo.GetCultureInfo(RuntimeMarshal.PtrToUtf8String(native->culture)); + + if (native->public_key != IntPtr.Zero) + { + _publicKey = RuntimeMarshal.DecodeBlobArray(native->public_key); + _flags |= AssemblyNameFlags.PublicKey; + } + else if (addPublickey) + { + _publicKey = Array.Empty(); + _flags |= AssemblyNameFlags.PublicKey; + } + + // MonoAssemblyName keeps the public key token as an hexadecimal string + if (native->public_key_token[0] != 0) + { + var keyToken = new byte[8]; + for (int i = 0, j = 0; i < 8; ++i) + { + keyToken[i] = (byte)(RuntimeMarshal.AsciHexDigitValue(native->public_key_token[j++]) << 4); + keyToken[i] |= (byte)RuntimeMarshal.AsciHexDigitValue(native->public_key_token[j++]); + } + _publicKeyToken = keyToken; + } + else if (defaultToken) + { + _publicKeyToken = Array.Empty(); + } + } + + private static AssemblyName GetFileInformationCore(string assemblyFile) + { + unsafe + { + Assembly.InternalGetAssemblyName(Path.GetFullPath(assemblyFile), out var nativeName, out var codebase); + + var aname = new AssemblyName(); + try + { + aname.FillName(&nativeName, codebase, true, false, true); + return aname; + } + finally + { + RuntimeMarshal.FreeAssemblyName(ref nativeName, false); + } + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern unsafe void get_public_token(byte* token, byte* pubkey, int len); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern unsafe MonoAssemblyName* GetNativeName(IntPtr assemblyPtr); + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern bool ParseAssemblyName(IntPtr name, out MonoAssemblyName aname, out bool is_version_definited, out bool is_token_defined); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttribute.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttribute.cs index 03880d38c8733..3fde27fb5335c 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttribute.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttribute.cs @@ -10,10 +10,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -33,688 +33,740 @@ namespace System.Reflection { - static class CustomAttribute - { - static Assembly corlib; - [ThreadStatic] - static Dictionary usage_cache; - - /* Treat as user types all corlib types extending System.Type that are not RuntimeType and TypeBuilder */ - static bool IsUserCattrProvider (object obj) - { - Type type = obj as Type; - if ((type is RuntimeType) || (RuntimeFeature.IsDynamicCodeSupported && type?.IsTypeBuilder () == true)) - return false; - if ((obj is Type)) - return true; - if (corlib == null) - corlib = typeof (int).Assembly; - return obj.GetType ().Assembly != corlib; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern Attribute[] GetCustomAttributesInternal (ICustomAttributeProvider obj, Type attributeType, bool pseudoAttrs); - - internal static object[] GetPseudoCustomAttributes (ICustomAttributeProvider obj, Type attributeType) { - object[] pseudoAttrs = null; - /* FIXME: Add other types */ - if (obj is RuntimeMethodInfo monoMethod) - pseudoAttrs = monoMethod.GetPseudoCustomAttributes (); - else if (obj is RuntimeFieldInfo fieldInfo) - pseudoAttrs = fieldInfo.GetPseudoCustomAttributes (); - else if (obj is RuntimeParameterInfo monoParamInfo) - pseudoAttrs = monoParamInfo.GetPseudoCustomAttributes (); - else if (obj is Type t) - pseudoAttrs = GetPseudoCustomAttributes (t); - - if ((attributeType != null) && (pseudoAttrs != null)) { - for (int i = 0; i < pseudoAttrs.Length; ++i) - if (attributeType.IsAssignableFrom (pseudoAttrs [i].GetType ())) - if (pseudoAttrs.Length == 1) - return pseudoAttrs; - else - return new object [] { pseudoAttrs [i] }; - return Array.Empty (); - } - - return pseudoAttrs; - } - - static object[] GetPseudoCustomAttributes (Type type) - { - int count = 0; - var Attributes = type.Attributes; - - /* IsSerializable returns true for delegates/enums as well */ - if ((Attributes & TypeAttributes.Serializable) != 0) - count ++; - if ((Attributes & TypeAttributes.Import) != 0) - count ++; - - if (count == 0) - return null; - object[] attrs = new object [count]; - count = 0; - - if ((Attributes & TypeAttributes.Serializable) != 0) - attrs [count ++] = new SerializableAttribute (); - if ((Attributes & TypeAttributes.Import) != 0) - attrs [count ++] = new ComImportAttribute (); - - return attrs; - } - - internal static object[] GetCustomAttributesBase (ICustomAttributeProvider obj, Type attributeType, bool inheritedOnly) - { - object[] attrs; - - if (IsUserCattrProvider (obj)) - attrs = obj.GetCustomAttributes (attributeType, true); - else - attrs = GetCustomAttributesInternal (obj, attributeType, false); - - // - // All pseudo custom attributes are Inherited = false hence we can avoid - // building attributes array which would be discarded by inherited checks - // - if (!inheritedOnly) { - object[] pseudoAttrs = GetPseudoCustomAttributes (obj, attributeType); - if (pseudoAttrs != null) { - object[] res = new Attribute [attrs.Length + pseudoAttrs.Length]; - System.Array.Copy (attrs, res, attrs.Length); - System.Array.Copy (pseudoAttrs, 0, res, attrs.Length, pseudoAttrs.Length); - return res; - } - } - - return attrs; - } - - internal static object[] GetCustomAttributes (ICustomAttributeProvider obj, Type attributeType, bool inherit) - { - if (obj == null) - throw new ArgumentNullException (nameof (obj)); - if (attributeType == null) - throw new ArgumentNullException (nameof (attributeType)); - if (!attributeType.IsSubclassOf (typeof (Attribute)) && attributeType != typeof (Attribute)&& attributeType != typeof (CustomAttribute) && attributeType != typeof (System.Object)) - throw new ArgumentException (SR.Argument_MustHaveAttributeBaseClass + " " + attributeType.FullName); - - if (attributeType == typeof (CustomAttribute)) - attributeType = null; - if (attributeType == typeof (Attribute)) - attributeType = null; - if (attributeType == typeof (System.Object)) - attributeType = null; - - object[] r; - object[] res = GetCustomAttributesBase (obj, attributeType, false); - // shortcut - if (!inherit && res.Length == 1) { - if (res [0] == null) - throw new CustomAttributeFormatException ("Invalid custom attribute format"); - - if (attributeType != null) { - if (attributeType.IsAssignableFrom (res[0].GetType ())) { - r = (object[]) Array.CreateInstance (attributeType, 1); - r[0] = res[0]; - } else { - r = (object[]) Array.CreateInstance (attributeType, 0); - } - } else { - r = (object[]) Array.CreateInstance (res[0].GetType (), 1); - r[0] = res[0]; - } - return r; - } - - if (inherit && GetBase (obj) == null) - inherit = false; - - // if AttributeType is sealed, and Inherited is set to false, then - // there's no use in scanning base types - if ((attributeType != null && attributeType.IsSealed) && inherit) { - AttributeUsageAttribute usageAttribute = RetrieveAttributeUsage ( - attributeType); - if (!usageAttribute.Inherited) - inherit = false; - } - - var initialSize = Math.Max (res.Length, 16); - List a = null; - ICustomAttributeProvider btype = obj; - object[] array; - - /* Non-inherit case */ - if (!inherit) { - if (attributeType == null) { - foreach (object attr in res) { - if (attr == null) - throw new CustomAttributeFormatException ("Invalid custom attribute format"); - } - var result = new Attribute [res.Length]; - res.CopyTo (result, 0); - return result; - } - - a = new List (initialSize); - foreach (object attr in res) { - if (attr == null) - throw new CustomAttributeFormatException ("Invalid custom attribute format"); - - Type attrType = attr.GetType (); - if (attributeType != null && !attributeType.IsAssignableFrom (attrType)) - continue; - a.Add (attr); - } - - if (attributeType == null || attributeType.IsValueType) - array = new Attribute [a.Count]; - else - array = Array.CreateInstance (attributeType, a.Count) as object[]; - a.CopyTo (array, 0); - return array; - } - - /* Inherit case */ - var attributeInfos = new Dictionary (initialSize); - int inheritanceLevel = 0; - a = new List (initialSize); - - do { - foreach (object attr in res) { - AttributeUsageAttribute usage; - if (attr == null) - throw new CustomAttributeFormatException ("Invalid custom attribute format"); - - Type attrType = attr.GetType (); - if (attributeType != null) { - if (!attributeType.IsAssignableFrom (attrType)) - continue; - } - - AttributeInfo firstAttribute; - if (attributeInfos.TryGetValue (attrType, out firstAttribute)) - usage = firstAttribute.Usage; - else - usage = RetrieveAttributeUsage (attrType); - - // only add attribute to the list of attributes if - // - we are on the first inheritance level, or the attribute can be inherited anyway - // and ( - // - multiple attributes of the type are allowed - // or ( - // - this is the first attribute we've discovered - // or - // - the attribute is on same inheritance level than the first - // attribute that was discovered for this attribute type )) - if ((inheritanceLevel == 0 || usage.Inherited) && (usage.AllowMultiple || - (firstAttribute == null || (firstAttribute != null - && firstAttribute.InheritanceLevel == inheritanceLevel)))) - a.Add (attr); - - if (firstAttribute == null) - attributeInfos.Add (attrType, new AttributeInfo (usage, inheritanceLevel)); - } - - if ((btype = GetBase (btype)) != null) { - inheritanceLevel++; - res = GetCustomAttributesBase (btype, attributeType, true); - } - } while (inherit && btype != null); - - if (attributeType == null || attributeType.IsValueType) - array = new Attribute [a.Count]; - else - array = Array.CreateInstance (attributeType, a.Count) as object[]; - - // copy attributes to array - a.CopyTo (array, 0); - - return array; - } - - internal static object[] GetCustomAttributes (ICustomAttributeProvider obj, bool inherit) - { - if (obj == null) - throw new ArgumentNullException ("obj"); - - if (!inherit) - return (object[]) GetCustomAttributesBase (obj, null, false).Clone (); - - return GetCustomAttributes (obj, typeof (CustomAttribute), inherit); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - [PreserveDependency(".ctor(System.Reflection.ConstructorInfo,System.Reflection.Assembly,System.IntPtr,System.UInt32)", "System.Reflection.CustomAttributeData")] - [PreserveDependency(".ctor(System.Reflection.MemberInfo,System.Object)", "System.Reflection.CustomAttributeNamedArgument")] - [PreserveDependency(".ctor(System.Type,System.Object)", "System.Reflection.CustomAttributeTypedArgument")] - static extern CustomAttributeData [] GetCustomAttributesDataInternal (ICustomAttributeProvider obj); - - internal static IList GetCustomAttributesData (ICustomAttributeProvider obj, bool inherit = false) - { - if (obj == null) - throw new ArgumentNullException (nameof (obj)); - - if (!inherit) - return GetCustomAttributesDataBase (obj, null, false); - - return GetCustomAttributesData (obj, typeof (CustomAttribute), inherit); - } - - internal static IList GetCustomAttributesData (ICustomAttributeProvider obj, Type attributeType, bool inherit) - { - if (obj == null) - throw new ArgumentNullException (nameof (obj)); - if (attributeType == null) - throw new ArgumentNullException (nameof (attributeType)); - - if (attributeType == typeof (CustomAttribute)) - attributeType = null; - - const string Message = "Invalid custom attribute data format"; - IList r; - IList res = GetCustomAttributesDataBase (obj, attributeType, false); - // shortcut - if (!inherit && res.Count == 1) { - if (res [0] == null) - throw new CustomAttributeFormatException (Message); - if (attributeType != null) { - if (attributeType.IsAssignableFrom (res [0].AttributeType)) - r = new CustomAttributeData[] { res [0] }; - else - r = Array.Empty (); - } else { - r = new CustomAttributeData[] { res [0] }; - } - - return r; - } - - if (inherit && GetBase (obj) == null) - inherit = false; - - // if AttributeType is sealed, and Inherited is set to false, then - // there's no use in scanning base types - if ((attributeType != null && attributeType.IsSealed) && inherit) { - var usageAttribute = RetrieveAttributeUsage (attributeType); - if (!usageAttribute.Inherited) - inherit = false; - } - - var initialSize = Math.Max (res.Count, 16); - List a = null; - ICustomAttributeProvider btype = obj; - - /* Non-inherit case */ - if (!inherit) { - if (attributeType == null) { - foreach (CustomAttributeData attrData in res) { - if (attrData == null) - throw new CustomAttributeFormatException (Message); - } - - var result = new CustomAttributeData [res.Count]; - res.CopyTo (result, 0); - return result; - } else { - a = new List (initialSize); - foreach (CustomAttributeData attrData in res) { - if (attrData == null) - throw new CustomAttributeFormatException (Message); - if (!attributeType.IsAssignableFrom (attrData.AttributeType)) - continue; - a.Add (attrData); - } - - return a.ToArray (); - } - } - - /* Inherit case */ - var attributeInfos = new Dictionary (initialSize); - int inheritanceLevel = 0; - a = new List (initialSize); - - do { - foreach (CustomAttributeData attrData in res) { - AttributeUsageAttribute usage; - if (attrData == null) - throw new CustomAttributeFormatException (Message); - - Type attrType = attrData.AttributeType; - if (attributeType != null) { - if (!attributeType.IsAssignableFrom (attrType)) - continue; - } - - AttributeInfo firstAttribute; - if (attributeInfos.TryGetValue (attrType, out firstAttribute)) - usage = firstAttribute.Usage; - else - usage = RetrieveAttributeUsage (attrType); - - // The same as for CustomAttributes. - // - // Only add attribute to the list of attributes if - // - we are on the first inheritance level, or the attribute can be inherited anyway - // and ( - // - multiple attributes of the type are allowed - // or ( - // - this is the first attribute we've discovered - // or - // - the attribute is on same inheritance level than the first - // attribute that was discovered for this attribute type )) - if ((inheritanceLevel == 0 || usage.Inherited) && (usage.AllowMultiple || - (firstAttribute == null || (firstAttribute != null - && firstAttribute.InheritanceLevel == inheritanceLevel)))) - a.Add(attrData); - - if (firstAttribute == null) - attributeInfos.Add (attrType, new AttributeInfo (usage, inheritanceLevel)); - } - - if ((btype = GetBase (btype)) != null) { - inheritanceLevel++; - res = GetCustomAttributesDataBase (btype, attributeType, true); - } - } while (inherit && btype != null); - - return a.ToArray (); - } - - internal static IList GetCustomAttributesDataBase (ICustomAttributeProvider obj, Type attributeType, bool inheritedOnly) - { - CustomAttributeData[] attrsData; - if (IsUserCattrProvider (obj)) { - //FIXME resolve this case if it makes sense. Assign empty array for now. - //attrsData = obj.GetCustomAttributesData(attributeType, true); - attrsData = Array.Empty (); - } else - attrsData = GetCustomAttributesDataInternal (obj); - - // - // All pseudo custom attributes are Inherited = false hence we can avoid - // building attributes data array which would be discarded by inherited checks - // - if (!inheritedOnly) { - CustomAttributeData[] pseudoAttrsData = GetPseudoCustomAttributesData (obj, attributeType); - if (pseudoAttrsData != null) { - if (attrsData.Length == 0) - return Array.AsReadOnly (pseudoAttrsData); - CustomAttributeData[] res = new CustomAttributeData [attrsData.Length + pseudoAttrsData.Length]; - Array.Copy (attrsData, res, attrsData.Length); - Array.Copy (pseudoAttrsData, 0, res, attrsData.Length, pseudoAttrsData.Length); - return Array.AsReadOnly (res); - } - } - - return Array.AsReadOnly (attrsData); - } - - internal static CustomAttributeData[] GetPseudoCustomAttributesData (ICustomAttributeProvider obj, Type attributeType) - { - CustomAttributeData[] pseudoAttrsData = null; - - /* FIXME: Add other types */ - if (obj is RuntimeMethodInfo monoMethod) - pseudoAttrsData = monoMethod.GetPseudoCustomAttributesData (); - else if (obj is RuntimeFieldInfo fieldInfo) - pseudoAttrsData = fieldInfo.GetPseudoCustomAttributesData (); - else if (obj is RuntimeParameterInfo monoParamInfo) - pseudoAttrsData = monoParamInfo.GetPseudoCustomAttributesData (); - else if (obj is Type t) - pseudoAttrsData = GetPseudoCustomAttributesData (t); - - if ((attributeType != null) && (pseudoAttrsData != null)) { - for (int i = 0; i < pseudoAttrsData.Length; ++i) { - if (attributeType.IsAssignableFrom (pseudoAttrsData [i].AttributeType)) { - if (pseudoAttrsData.Length == 1) - return pseudoAttrsData; - else - return new CustomAttributeData[] { pseudoAttrsData[i] }; - } - } - - return Array.Empty (); - } - - return pseudoAttrsData; - } - - static CustomAttributeData[] GetPseudoCustomAttributesData (Type type) - { - int count = 0; - var Attributes = type.Attributes; - - /* IsSerializable returns true for delegates/enums as well */ - if ((Attributes & TypeAttributes.Serializable) != 0) - count++; - if ((Attributes & TypeAttributes.Import) != 0) - count++; - - if (count == 0) - return null; - CustomAttributeData[] attrsData = new CustomAttributeData [count]; - count = 0; - - if ((Attributes & TypeAttributes.Serializable) != 0) - attrsData [count++] = new CustomAttributeData ((typeof (SerializableAttribute)).GetConstructor (Type.EmptyTypes)); - if ((Attributes & TypeAttributes.Import) != 0) - attrsData [count++] = new CustomAttributeData ((typeof (ComImportAttribute)).GetConstructor (Type.EmptyTypes)); - - return attrsData; - } - - internal static bool IsDefined (ICustomAttributeProvider obj, Type attributeType, bool inherit) - { - if (attributeType == null) - throw new ArgumentNullException (nameof (attributeType)); - if (!attributeType.IsSubclassOf (typeof (Attribute)) && attributeType != typeof (Attribute)) - throw new ArgumentException (SR.Argument_MustHaveAttributeBaseClass + " " + attributeType.FullName); - - AttributeUsageAttribute usage = null; - do { - if (IsUserCattrProvider (obj)) - return obj.IsDefined (attributeType, inherit); - - if (IsDefinedInternal (obj, attributeType)) - return true; - - object[] pseudoAttrs = GetPseudoCustomAttributes (obj, attributeType); - if (pseudoAttrs != null) { - for (int i = 0; i < pseudoAttrs.Length; ++i) - if (attributeType.IsAssignableFrom (pseudoAttrs[i].GetType ())) - return true; - } - - if (usage == null) { - if (!inherit) - return false; - - usage = RetrieveAttributeUsage (attributeType); - if (!usage.Inherited) - return false; - } - - obj = GetBase (obj); - } while (obj != null); - - return false; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern bool IsDefinedInternal (ICustomAttributeProvider obj, Type AttributeType); - - static PropertyInfo GetBasePropertyDefinition (RuntimePropertyInfo property) - { - MethodInfo method = property.GetGetMethod (true); - if (method == null || !method.IsVirtual) - method = property.GetSetMethod (true); - if (method == null || !method.IsVirtual) - return null; - - MethodInfo baseMethod = ((RuntimeMethodInfo)method).GetBaseMethod (); - if (baseMethod != null && baseMethod != method) { - ParameterInfo[] parameters = property.GetIndexParameters (); - if (parameters != null && parameters.Length > 0) { - Type[] paramTypes = new Type[parameters.Length]; - for (int i=0; i < paramTypes.Length; i++) - paramTypes[i] = parameters[i].ParameterType; - return baseMethod.DeclaringType.GetProperty (property.Name, property.PropertyType, - paramTypes); - } else { - return baseMethod.DeclaringType.GetProperty (property.Name, property.PropertyType); - } - } - return null; - - } - - static EventInfo GetBaseEventDefinition (RuntimeEventInfo evt) - { - MethodInfo method = evt.GetAddMethod (true); - if (method == null || !method.IsVirtual) - method = evt.GetRaiseMethod (true); - if (method == null || !method.IsVirtual) - method = evt.GetRemoveMethod (true); - if (method == null || !method.IsVirtual) - return null; - - MethodInfo baseMethod = ((RuntimeMethodInfo)method).GetBaseMethod (); - if (baseMethod != null && baseMethod != method) { - BindingFlags flags = method.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; - flags |= method.IsStatic ? BindingFlags.Static : BindingFlags.Instance; - - return baseMethod.DeclaringType.GetEvent (evt.Name, flags); - } - return null; - } - - // Handles Type, RuntimePropertyInfo and RuntimeMethodInfo. - // The runtime has also cases for RuntimeEventInfo, RuntimeFieldInfo, Assembly and ParameterInfo, - // but for those we return null here. - static ICustomAttributeProvider GetBase (ICustomAttributeProvider obj) - { - if (obj == null) - return null; - - if (obj is Type) - return ((Type) obj).BaseType; - - MethodInfo method = null; - if (obj is RuntimePropertyInfo) - return GetBasePropertyDefinition ((RuntimePropertyInfo) obj); - else if (obj is RuntimeEventInfo) - return GetBaseEventDefinition ((RuntimeEventInfo)obj); - else if (obj is RuntimeMethodInfo) - method = (MethodInfo) obj; - if (obj is RuntimeParameterInfo parinfo) { - var member = parinfo.Member; - if (member is MethodInfo) { - method = (MethodInfo)member; - MethodInfo bmethod = ((RuntimeMethodInfo)method).GetBaseMethod (); - if (bmethod == method) - return null; - return bmethod.GetParameters ()[parinfo.Position]; - } - } - /* - * ParameterInfo -> null - * Assembly -> null - * RuntimeEventInfo -> null - * RuntimeFieldInfo -> null - */ - if (method == null || !method.IsVirtual) - return null; - - MethodInfo baseMethod = ((RuntimeMethodInfo)method).GetBaseMethod (); - if (baseMethod == method) - return null; - - return baseMethod; - } - - private static AttributeUsageAttribute RetrieveAttributeUsageNoCache (Type attributeType) - { - if (attributeType == typeof (AttributeUsageAttribute)) - /* Avoid endless recursion */ - return new AttributeUsageAttribute (AttributeTargets.Class); - - AttributeUsageAttribute usageAttribute = null; - object[] attribs = GetCustomAttributes (attributeType, typeof(AttributeUsageAttribute), false); - if (attribs.Length == 0) - { - // if no AttributeUsage was defined on the attribute level, then - // try to retrieve if from its base type - if (attributeType.BaseType != null) - { - usageAttribute = RetrieveAttributeUsage (attributeType.BaseType); - - } - if (usageAttribute != null) - { - // return AttributeUsage of base class - return usageAttribute; - - } - // return default AttributeUsageAttribute if no AttributeUsage - // was defined on attribute, or its base class - return DefaultAttributeUsage; - } - // check if more than one AttributeUsageAttribute has been specified - // on the type - // NOTE: compilers should prevent this, but that doesn't prevent - // anyone from using IL ofcourse - if (attribs.Length > 1) - { - throw new FormatException ("Duplicate AttributeUsageAttribute cannot be specified on an attribute type."); - } - - return ((AttributeUsageAttribute) attribs[0]); - } - - static AttributeUsageAttribute RetrieveAttributeUsage (Type attributeType) - { - AttributeUsageAttribute usageAttribute = null; - /* Usage a thread-local cache to speed this up, since it is called a lot from GetCustomAttributes () */ - if (usage_cache == null) - usage_cache = new Dictionary (); - if (usage_cache.TryGetValue (attributeType, out usageAttribute)) - return usageAttribute; - usageAttribute = RetrieveAttributeUsageNoCache (attributeType); - usage_cache [attributeType] = usageAttribute; - return usageAttribute; - } - - private static readonly AttributeUsageAttribute DefaultAttributeUsage = - new AttributeUsageAttribute (AttributeTargets.All); - - private class AttributeInfo - { - private AttributeUsageAttribute _usage; - private int _inheritanceLevel; - - public AttributeInfo (AttributeUsageAttribute usage, int inheritanceLevel) - { - _usage = usage; - _inheritanceLevel = inheritanceLevel; - } - - public AttributeUsageAttribute Usage - { - get - { - return _usage; - } - } - - public int InheritanceLevel - { - get - { - return _inheritanceLevel; - } - } - } - } + internal static class CustomAttribute + { + private static Assembly corlib; + [ThreadStatic] + private static Dictionary usage_cache; + + /* Treat as user types all corlib types extending System.Type that are not RuntimeType and TypeBuilder */ + private static bool IsUserCattrProvider(object obj) + { + Type type = obj as Type; + if ((type is RuntimeType) || (RuntimeFeature.IsDynamicCodeSupported && type?.IsTypeBuilder() == true)) + return false; + if ((obj is Type)) + return true; + if (corlib == null) + corlib = typeof(int).Assembly; + return obj.GetType().Assembly != corlib; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern Attribute[] GetCustomAttributesInternal(ICustomAttributeProvider obj, Type attributeType, bool pseudoAttrs); + + internal static object[] GetPseudoCustomAttributes(ICustomAttributeProvider obj, Type attributeType) + { + object[] pseudoAttrs = null; + /* FIXME: Add other types */ + if (obj is RuntimeMethodInfo monoMethod) + pseudoAttrs = monoMethod.GetPseudoCustomAttributes(); + else if (obj is RuntimeFieldInfo fieldInfo) + pseudoAttrs = fieldInfo.GetPseudoCustomAttributes(); + else if (obj is RuntimeParameterInfo monoParamInfo) + pseudoAttrs = monoParamInfo.GetPseudoCustomAttributes(); + else if (obj is Type t) + pseudoAttrs = GetPseudoCustomAttributes(t); + + if ((attributeType != null) && (pseudoAttrs != null)) + { + for (int i = 0; i < pseudoAttrs.Length; ++i) + if (attributeType.IsAssignableFrom(pseudoAttrs[i].GetType())) + if (pseudoAttrs.Length == 1) + return pseudoAttrs; + else + return new object[] { pseudoAttrs[i] }; + return Array.Empty(); + } + + return pseudoAttrs; + } + + private static object[] GetPseudoCustomAttributes(Type type) + { + int count = 0; + var Attributes = type.Attributes; + + /* IsSerializable returns true for delegates/enums as well */ + if ((Attributes & TypeAttributes.Serializable) != 0) + count++; + if ((Attributes & TypeAttributes.Import) != 0) + count++; + + if (count == 0) + return null; + object[] attrs = new object[count]; + count = 0; + + if ((Attributes & TypeAttributes.Serializable) != 0) + attrs[count++] = new SerializableAttribute(); + if ((Attributes & TypeAttributes.Import) != 0) + attrs[count++] = new ComImportAttribute(); + + return attrs; + } + + internal static object[] GetCustomAttributesBase(ICustomAttributeProvider obj, Type attributeType, bool inheritedOnly) + { + object[] attrs; + + if (IsUserCattrProvider(obj)) + attrs = obj.GetCustomAttributes(attributeType, true); + else + attrs = GetCustomAttributesInternal(obj, attributeType, false); + + // + // All pseudo custom attributes are Inherited = false hence we can avoid + // building attributes array which would be discarded by inherited checks + // + if (!inheritedOnly) + { + object[] pseudoAttrs = GetPseudoCustomAttributes(obj, attributeType); + if (pseudoAttrs != null) + { + object[] res = new Attribute[attrs.Length + pseudoAttrs.Length]; + Array.Copy(attrs, res, attrs.Length); + Array.Copy(pseudoAttrs, 0, res, attrs.Length, pseudoAttrs.Length); + return res; + } + } + + return attrs; + } + + internal static object[] GetCustomAttributes(ICustomAttributeProvider obj, Type attributeType, bool inherit) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + if (attributeType == null) + throw new ArgumentNullException(nameof(attributeType)); + if (!attributeType.IsSubclassOf(typeof(Attribute)) && attributeType != typeof(Attribute) && attributeType != typeof(CustomAttribute) && attributeType != typeof(object)) + throw new ArgumentException(SR.Argument_MustHaveAttributeBaseClass + " " + attributeType.FullName); + + if (attributeType == typeof(CustomAttribute)) + attributeType = null; + if (attributeType == typeof(Attribute)) + attributeType = null; + if (attributeType == typeof(object)) + attributeType = null; + + object[] r; + object[] res = GetCustomAttributesBase(obj, attributeType, false); + // shortcut + if (!inherit && res.Length == 1) + { + if (res[0] == null) + throw new CustomAttributeFormatException("Invalid custom attribute format"); + + if (attributeType != null) + { + if (attributeType.IsAssignableFrom(res[0].GetType())) + { + r = (object[])Array.CreateInstance(attributeType, 1); + r[0] = res[0]; + } + else + { + r = (object[])Array.CreateInstance(attributeType, 0); + } + } + else + { + r = (object[])Array.CreateInstance(res[0].GetType(), 1); + r[0] = res[0]; + } + return r; + } + + if (inherit && GetBase(obj) == null) + inherit = false; + + // if AttributeType is sealed, and Inherited is set to false, then + // there's no use in scanning base types + if ((attributeType != null && attributeType.IsSealed) && inherit) + { + AttributeUsageAttribute usageAttribute = RetrieveAttributeUsage( + attributeType); + if (!usageAttribute.Inherited) + inherit = false; + } + + var initialSize = Math.Max(res.Length, 16); + List a = null; + ICustomAttributeProvider btype = obj; + object[] array; + + /* Non-inherit case */ + if (!inherit) + { + if (attributeType == null) + { + foreach (object attr in res) + { + if (attr == null) + throw new CustomAttributeFormatException("Invalid custom attribute format"); + } + var result = new Attribute[res.Length]; + res.CopyTo(result, 0); + return result; + } + + a = new List(initialSize); + foreach (object attr in res) + { + if (attr == null) + throw new CustomAttributeFormatException("Invalid custom attribute format"); + + Type attrType = attr.GetType(); + if (attributeType != null && !attributeType.IsAssignableFrom(attrType)) + continue; + a.Add(attr); + } + + if (attributeType == null || attributeType.IsValueType) + array = new Attribute[a.Count]; + else + array = Array.CreateInstance(attributeType, a.Count) as object[]; + a.CopyTo(array, 0); + return array; + } + + /* Inherit case */ + var attributeInfos = new Dictionary(initialSize); + int inheritanceLevel = 0; + a = new List(initialSize); + + do + { + foreach (object attr in res) + { + AttributeUsageAttribute usage; + if (attr == null) + throw new CustomAttributeFormatException("Invalid custom attribute format"); + + Type attrType = attr.GetType(); + if (attributeType != null) + { + if (!attributeType.IsAssignableFrom(attrType)) + continue; + } + + AttributeInfo firstAttribute; + if (attributeInfos.TryGetValue(attrType, out firstAttribute)) + usage = firstAttribute.Usage; + else + usage = RetrieveAttributeUsage(attrType); + + // only add attribute to the list of attributes if + // - we are on the first inheritance level, or the attribute can be inherited anyway + // and ( + // - multiple attributes of the type are allowed + // or ( + // - this is the first attribute we've discovered + // or + // - the attribute is on same inheritance level than the first + // attribute that was discovered for this attribute type )) + if ((inheritanceLevel == 0 || usage.Inherited) && (usage.AllowMultiple || + (firstAttribute == null || (firstAttribute != null + && firstAttribute.InheritanceLevel == inheritanceLevel)))) + a.Add(attr); + + if (firstAttribute == null) + attributeInfos.Add(attrType, new AttributeInfo(usage, inheritanceLevel)); + } + + if ((btype = GetBase(btype)) != null) + { + inheritanceLevel++; + res = GetCustomAttributesBase(btype, attributeType, true); + } + } while (inherit && btype != null); + + if (attributeType == null || attributeType.IsValueType) + array = new Attribute[a.Count]; + else + array = Array.CreateInstance(attributeType, a.Count) as object[]; + + // copy attributes to array + a.CopyTo(array, 0); + + return array; + } + + internal static object[] GetCustomAttributes(ICustomAttributeProvider obj, bool inherit) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + if (!inherit) + return (object[])GetCustomAttributesBase(obj, null, false).Clone(); + + return GetCustomAttributes(obj, typeof(CustomAttribute), inherit); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + [PreserveDependency(".ctor(System.Reflection.ConstructorInfo,System.Reflection.Assembly,System.IntPtr,System.UInt32)", "System.Reflection.CustomAttributeData")] + [PreserveDependency(".ctor(System.Reflection.MemberInfo,System.Object)", "System.Reflection.CustomAttributeNamedArgument")] + [PreserveDependency(".ctor(System.Type,System.Object)", "System.Reflection.CustomAttributeTypedArgument")] + private static extern CustomAttributeData[] GetCustomAttributesDataInternal(ICustomAttributeProvider obj); + + internal static IList GetCustomAttributesData(ICustomAttributeProvider obj, bool inherit = false) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + if (!inherit) + return GetCustomAttributesDataBase(obj, null, false); + + return GetCustomAttributesData(obj, typeof(CustomAttribute), inherit); + } + + internal static IList GetCustomAttributesData(ICustomAttributeProvider obj, Type attributeType, bool inherit) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + if (attributeType == null) + throw new ArgumentNullException(nameof(attributeType)); + + if (attributeType == typeof(CustomAttribute)) + attributeType = null; + + const string Message = "Invalid custom attribute data format"; + IList r; + IList res = GetCustomAttributesDataBase(obj, attributeType, false); + // shortcut + if (!inherit && res.Count == 1) + { + if (res[0] == null) + throw new CustomAttributeFormatException(Message); + if (attributeType != null) + { + if (attributeType.IsAssignableFrom(res[0].AttributeType)) + r = new CustomAttributeData[] { res[0] }; + else + r = Array.Empty(); + } + else + { + r = new CustomAttributeData[] { res[0] }; + } + + return r; + } + + if (inherit && GetBase(obj) == null) + inherit = false; + + // if AttributeType is sealed, and Inherited is set to false, then + // there's no use in scanning base types + if ((attributeType != null && attributeType.IsSealed) && inherit) + { + var usageAttribute = RetrieveAttributeUsage(attributeType); + if (!usageAttribute.Inherited) + inherit = false; + } + + var initialSize = Math.Max(res.Count, 16); + List a = null; + ICustomAttributeProvider btype = obj; + + /* Non-inherit case */ + if (!inherit) + { + if (attributeType == null) + { + foreach (CustomAttributeData attrData in res) + { + if (attrData == null) + throw new CustomAttributeFormatException(Message); + } + + var result = new CustomAttributeData[res.Count]; + res.CopyTo(result, 0); + return result; + } + else + { + a = new List(initialSize); + foreach (CustomAttributeData attrData in res) + { + if (attrData == null) + throw new CustomAttributeFormatException(Message); + if (!attributeType.IsAssignableFrom(attrData.AttributeType)) + continue; + a.Add(attrData); + } + + return a.ToArray(); + } + } + + /* Inherit case */ + var attributeInfos = new Dictionary(initialSize); + int inheritanceLevel = 0; + a = new List(initialSize); + + do + { + foreach (CustomAttributeData attrData in res) + { + AttributeUsageAttribute usage; + if (attrData == null) + throw new CustomAttributeFormatException(Message); + + Type attrType = attrData.AttributeType; + if (attributeType != null) + { + if (!attributeType.IsAssignableFrom(attrType)) + continue; + } + + AttributeInfo firstAttribute; + if (attributeInfos.TryGetValue(attrType, out firstAttribute)) + usage = firstAttribute.Usage; + else + usage = RetrieveAttributeUsage(attrType); + + // The same as for CustomAttributes. + // + // Only add attribute to the list of attributes if + // - we are on the first inheritance level, or the attribute can be inherited anyway + // and ( + // - multiple attributes of the type are allowed + // or ( + // - this is the first attribute we've discovered + // or + // - the attribute is on same inheritance level than the first + // attribute that was discovered for this attribute type )) + if ((inheritanceLevel == 0 || usage.Inherited) && (usage.AllowMultiple || + (firstAttribute == null || (firstAttribute != null + && firstAttribute.InheritanceLevel == inheritanceLevel)))) + a.Add(attrData); + + if (firstAttribute == null) + attributeInfos.Add(attrType, new AttributeInfo(usage, inheritanceLevel)); + } + + if ((btype = GetBase(btype)) != null) + { + inheritanceLevel++; + res = GetCustomAttributesDataBase(btype, attributeType, true); + } + } while (inherit && btype != null); + + return a.ToArray(); + } + + internal static IList GetCustomAttributesDataBase(ICustomAttributeProvider obj, Type attributeType, bool inheritedOnly) + { + CustomAttributeData[] attrsData; + if (IsUserCattrProvider(obj)) + { + //FIXME resolve this case if it makes sense. Assign empty array for now. + //attrsData = obj.GetCustomAttributesData(attributeType, true); + attrsData = Array.Empty(); + } + else + attrsData = GetCustomAttributesDataInternal(obj); + + // + // All pseudo custom attributes are Inherited = false hence we can avoid + // building attributes data array which would be discarded by inherited checks + // + if (!inheritedOnly) + { + CustomAttributeData[] pseudoAttrsData = GetPseudoCustomAttributesData(obj, attributeType); + if (pseudoAttrsData != null) + { + if (attrsData.Length == 0) + return Array.AsReadOnly(pseudoAttrsData); + CustomAttributeData[] res = new CustomAttributeData[attrsData.Length + pseudoAttrsData.Length]; + Array.Copy(attrsData, res, attrsData.Length); + Array.Copy(pseudoAttrsData, 0, res, attrsData.Length, pseudoAttrsData.Length); + return Array.AsReadOnly(res); + } + } + + return Array.AsReadOnly(attrsData); + } + + internal static CustomAttributeData[] GetPseudoCustomAttributesData(ICustomAttributeProvider obj, Type attributeType) + { + CustomAttributeData[] pseudoAttrsData = null; + + /* FIXME: Add other types */ + if (obj is RuntimeMethodInfo monoMethod) + pseudoAttrsData = monoMethod.GetPseudoCustomAttributesData(); + else if (obj is RuntimeFieldInfo fieldInfo) + pseudoAttrsData = fieldInfo.GetPseudoCustomAttributesData(); + else if (obj is RuntimeParameterInfo monoParamInfo) + pseudoAttrsData = monoParamInfo.GetPseudoCustomAttributesData(); + else if (obj is Type t) + pseudoAttrsData = GetPseudoCustomAttributesData(t); + + if ((attributeType != null) && (pseudoAttrsData != null)) + { + for (int i = 0; i < pseudoAttrsData.Length; ++i) + { + if (attributeType.IsAssignableFrom(pseudoAttrsData[i].AttributeType)) + { + if (pseudoAttrsData.Length == 1) + return pseudoAttrsData; + else + return new CustomAttributeData[] { pseudoAttrsData[i] }; + } + } + + return Array.Empty(); + } + + return pseudoAttrsData; + } + + private static CustomAttributeData[] GetPseudoCustomAttributesData(Type type) + { + int count = 0; + var Attributes = type.Attributes; + + /* IsSerializable returns true for delegates/enums as well */ + if ((Attributes & TypeAttributes.Serializable) != 0) + count++; + if ((Attributes & TypeAttributes.Import) != 0) + count++; + + if (count == 0) + return null; + CustomAttributeData[] attrsData = new CustomAttributeData[count]; + count = 0; + + if ((Attributes & TypeAttributes.Serializable) != 0) + attrsData[count++] = new CustomAttributeData((typeof(SerializableAttribute)).GetConstructor(Type.EmptyTypes)); + if ((Attributes & TypeAttributes.Import) != 0) + attrsData[count++] = new CustomAttributeData((typeof(ComImportAttribute)).GetConstructor(Type.EmptyTypes)); + + return attrsData; + } + + internal static bool IsDefined(ICustomAttributeProvider obj, Type attributeType, bool inherit) + { + if (attributeType == null) + throw new ArgumentNullException(nameof(attributeType)); + if (!attributeType.IsSubclassOf(typeof(Attribute)) && attributeType != typeof(Attribute)) + throw new ArgumentException(SR.Argument_MustHaveAttributeBaseClass + " " + attributeType.FullName); + + AttributeUsageAttribute usage = null; + do + { + if (IsUserCattrProvider(obj)) + return obj.IsDefined(attributeType, inherit); + + if (IsDefinedInternal(obj, attributeType)) + return true; + + object[] pseudoAttrs = GetPseudoCustomAttributes(obj, attributeType); + if (pseudoAttrs != null) + { + for (int i = 0; i < pseudoAttrs.Length; ++i) + if (attributeType.IsAssignableFrom(pseudoAttrs[i].GetType())) + return true; + } + + if (usage == null) + { + if (!inherit) + return false; + + usage = RetrieveAttributeUsage(attributeType); + if (!usage.Inherited) + return false; + } + + obj = GetBase(obj); + } while (obj != null); + + return false; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool IsDefinedInternal(ICustomAttributeProvider obj, Type AttributeType); + + private static PropertyInfo GetBasePropertyDefinition(RuntimePropertyInfo property) + { + MethodInfo method = property.GetGetMethod(true); + if (method == null || !method.IsVirtual) + method = property.GetSetMethod(true); + if (method == null || !method.IsVirtual) + return null; + + MethodInfo baseMethod = ((RuntimeMethodInfo)method).GetBaseMethod(); + if (baseMethod != null && baseMethod != method) + { + ParameterInfo[] parameters = property.GetIndexParameters(); + if (parameters != null && parameters.Length > 0) + { + Type[] paramTypes = new Type[parameters.Length]; + for (int i = 0; i < paramTypes.Length; i++) + paramTypes[i] = parameters[i].ParameterType; + return baseMethod.DeclaringType.GetProperty(property.Name, property.PropertyType, + paramTypes); + } + else + { + return baseMethod.DeclaringType.GetProperty(property.Name, property.PropertyType); + } + } + return null; + + } + + private static EventInfo GetBaseEventDefinition(RuntimeEventInfo evt) + { + MethodInfo method = evt.GetAddMethod(true); + if (method == null || !method.IsVirtual) + method = evt.GetRaiseMethod(true); + if (method == null || !method.IsVirtual) + method = evt.GetRemoveMethod(true); + if (method == null || !method.IsVirtual) + return null; + + MethodInfo baseMethod = ((RuntimeMethodInfo)method).GetBaseMethod(); + if (baseMethod != null && baseMethod != method) + { + BindingFlags flags = method.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; + flags |= method.IsStatic ? BindingFlags.Static : BindingFlags.Instance; + + return baseMethod.DeclaringType.GetEvent(evt.Name, flags); + } + return null; + } + + // Handles Type, RuntimePropertyInfo and RuntimeMethodInfo. + // The runtime has also cases for RuntimeEventInfo, RuntimeFieldInfo, Assembly and ParameterInfo, + // but for those we return null here. + private static ICustomAttributeProvider GetBase(ICustomAttributeProvider obj) + { + if (obj == null) + return null; + + if (obj is Type) + return ((Type)obj).BaseType; + + MethodInfo method = null; + if (obj is RuntimePropertyInfo) + return GetBasePropertyDefinition((RuntimePropertyInfo)obj); + else if (obj is RuntimeEventInfo) + return GetBaseEventDefinition((RuntimeEventInfo)obj); + else if (obj is RuntimeMethodInfo) + method = (MethodInfo)obj; + if (obj is RuntimeParameterInfo parinfo) + { + var member = parinfo.Member; + if (member is MethodInfo) + { + method = (MethodInfo)member; + MethodInfo bmethod = ((RuntimeMethodInfo)method).GetBaseMethod(); + if (bmethod == method) + return null; + return bmethod.GetParameters()[parinfo.Position]; + } + } + /* + * ParameterInfo -> null + * Assembly -> null + * RuntimeEventInfo -> null + * RuntimeFieldInfo -> null + */ + if (method == null || !method.IsVirtual) + return null; + + MethodInfo baseMethod = ((RuntimeMethodInfo)method).GetBaseMethod(); + if (baseMethod == method) + return null; + + return baseMethod; + } + + private static AttributeUsageAttribute RetrieveAttributeUsageNoCache(Type attributeType) + { + if (attributeType == typeof(AttributeUsageAttribute)) + /* Avoid endless recursion */ + return new AttributeUsageAttribute(AttributeTargets.Class); + + AttributeUsageAttribute usageAttribute = null; + object[] attribs = GetCustomAttributes(attributeType, typeof(AttributeUsageAttribute), false); + if (attribs.Length == 0) + { + // if no AttributeUsage was defined on the attribute level, then + // try to retrieve if from its base type + if (attributeType.BaseType != null) + { + usageAttribute = RetrieveAttributeUsage(attributeType.BaseType); + + } + if (usageAttribute != null) + { + // return AttributeUsage of base class + return usageAttribute; + + } + // return default AttributeUsageAttribute if no AttributeUsage + // was defined on attribute, or its base class + return DefaultAttributeUsage; + } + // check if more than one AttributeUsageAttribute has been specified + // on the type + // NOTE: compilers should prevent this, but that doesn't prevent + // anyone from using IL ofcourse + if (attribs.Length > 1) + { + throw new FormatException("Duplicate AttributeUsageAttribute cannot be specified on an attribute type."); + } + + return ((AttributeUsageAttribute)attribs[0]); + } + + private static AttributeUsageAttribute RetrieveAttributeUsage(Type attributeType) + { + AttributeUsageAttribute usageAttribute = null; + /* Usage a thread-local cache to speed this up, since it is called a lot from GetCustomAttributes () */ + if (usage_cache == null) + usage_cache = new Dictionary(); + if (usage_cache.TryGetValue(attributeType, out usageAttribute)) + return usageAttribute; + usageAttribute = RetrieveAttributeUsageNoCache(attributeType); + usage_cache[attributeType] = usageAttribute; + return usageAttribute; + } + + private static readonly AttributeUsageAttribute DefaultAttributeUsage = + new AttributeUsageAttribute(AttributeTargets.All); + + private class AttributeInfo + { + private AttributeUsageAttribute _usage; + private int _inheritanceLevel; + + public AttributeInfo(AttributeUsageAttribute usage, int inheritanceLevel) + { + _usage = usage; + _inheritanceLevel = inheritanceLevel; + } + + public AttributeUsageAttribute Usage + { + get + { + return _usage; + } + } + + public int InheritanceLevel + { + get + { + return _inheritanceLevel; + } + } + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttributeData.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttributeData.cs index 979a5215091be..6b011450235d8 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttributeData.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttributeData.cs @@ -12,10 +12,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,156 +32,170 @@ namespace System.Reflection { - public class CustomAttributeData - { - class LazyCAttrData { - internal Assembly assembly; - internal IntPtr data; - internal uint data_length; - } - - ConstructorInfo ctorInfo; - IList ctorArgs; - IList namedArgs; - LazyCAttrData lazyData; - - protected CustomAttributeData () - { - } - - // custom-attrs.c:create_custom_attr_data () - internal CustomAttributeData (ConstructorInfo ctorInfo, Assembly assembly, IntPtr data, uint data_length) - { - this.ctorInfo = ctorInfo; - this.lazyData = new LazyCAttrData (); - this.lazyData.assembly = assembly; - this.lazyData.data = data; - this.lazyData.data_length = data_length; - } - - internal CustomAttributeData (ConstructorInfo ctorInfo) - : this (ctorInfo, Array.Empty (), Array.Empty ()) - { - } - - internal CustomAttributeData (ConstructorInfo ctorInfo, IList ctorArgs, IList namedArgs) - { - this.ctorInfo = ctorInfo; - this.ctorArgs = ctorArgs; - this.namedArgs = namedArgs; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern void ResolveArgumentsInternal (ConstructorInfo ctor, Assembly assembly, IntPtr data, uint data_length, out object[] ctorArgs, out object[] namedArgs); - - void ResolveArguments () - { - object[] ctor_args, named_args; - if (lazyData == null) - return; - - ResolveArgumentsInternal (ctorInfo, lazyData.assembly, lazyData.data, lazyData.data_length, out ctor_args, out named_args); - - this.ctorArgs = Array.AsReadOnly - (ctor_args != null ? UnboxValues (ctor_args) : Array.Empty()); - this.namedArgs = Array.AsReadOnly - (named_args != null ? UnboxValues (named_args) : Array.Empty()); - - lazyData = null; - } - - public - virtual - ConstructorInfo Constructor { - get { - return ctorInfo; - } - } - - public - virtual - IList ConstructorArguments { - get { - ResolveArguments (); - return ctorArgs; - } - } - - public - virtual - IList NamedArguments { - get { - ResolveArguments (); - return namedArgs; - } - } - - public static IList GetCustomAttributes (Assembly target) { - return CustomAttribute.GetCustomAttributesData (target); - } - - public static IList GetCustomAttributes (MemberInfo target) { - return CustomAttribute.GetCustomAttributesData (target); - } - - internal static IList GetCustomAttributesInternal (RuntimeType target) { - return CustomAttribute.GetCustomAttributesData (target); - } - - public static IList GetCustomAttributes (Module target) { - return CustomAttribute.GetCustomAttributesData (target); - } - - public static IList GetCustomAttributes (ParameterInfo target) { - return CustomAttribute.GetCustomAttributesData (target); - } - - virtual public Type AttributeType { - get { return ctorInfo.DeclaringType; } - } - - public override string ToString () - { - ResolveArguments (); - - StringBuilder sb = new StringBuilder (); - - sb.Append ("[" + ctorInfo.DeclaringType.FullName + "("); - for (int i = 0; i < ctorArgs.Count; i++) { - sb.Append (ctorArgs [i].ToString ()); - if (i + 1 < ctorArgs.Count) - sb.Append (", "); - } - - if (namedArgs.Count > 0) - sb.Append (", "); - - for (int j = 0; j < namedArgs.Count; j++) { - sb.Append (namedArgs [j].ToString ()); - if (j + 1 < namedArgs.Count) - sb.Append (", "); - } - sb.AppendFormat (")]"); - - return sb.ToString (); - } - - static T [] UnboxValues (object [] values) - { - T [] retval = new T [values.Length]; - for (int i = 0; i < values.Length; i++) - retval [i] = (T) values [i]; - - return retval; - } - - public override int GetHashCode () => base.GetHashCode (); - - public override bool Equals (object? obj) - { - return obj == (object)this; - } - } + public class CustomAttributeData + { + private class LazyCAttrData + { + internal Assembly assembly; + internal IntPtr data; + internal uint data_length; + } + + private ConstructorInfo ctorInfo; + private IList ctorArgs; + private IList namedArgs; + private LazyCAttrData lazyData; + + protected CustomAttributeData() + { + } + + // custom-attrs.c:create_custom_attr_data () + internal CustomAttributeData(ConstructorInfo ctorInfo, Assembly assembly, IntPtr data, uint data_length) + { + this.ctorInfo = ctorInfo; + this.lazyData = new LazyCAttrData(); + this.lazyData.assembly = assembly; + this.lazyData.data = data; + this.lazyData.data_length = data_length; + } + + internal CustomAttributeData(ConstructorInfo ctorInfo) + : this(ctorInfo, Array.Empty(), Array.Empty()) + { + } + + internal CustomAttributeData(ConstructorInfo ctorInfo, IList ctorArgs, IList namedArgs) + { + this.ctorInfo = ctorInfo; + this.ctorArgs = ctorArgs; + this.namedArgs = namedArgs; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void ResolveArgumentsInternal(ConstructorInfo ctor, Assembly assembly, IntPtr data, uint data_length, out object[] ctorArgs, out object[] namedArgs); + + private void ResolveArguments() + { + object[] ctor_args, named_args; + if (lazyData == null) + return; + + ResolveArgumentsInternal(ctorInfo, lazyData.assembly, lazyData.data, lazyData.data_length, out ctor_args, out named_args); + + this.ctorArgs = Array.AsReadOnly + (ctor_args != null ? UnboxValues(ctor_args) : Array.Empty()); + this.namedArgs = Array.AsReadOnly + (named_args != null ? UnboxValues(named_args) : Array.Empty()); + + lazyData = null; + } + + public + virtual + ConstructorInfo Constructor + { + get + { + return ctorInfo; + } + } + + public + virtual + IList ConstructorArguments + { + get + { + ResolveArguments(); + return ctorArgs; + } + } + + public + virtual + IList NamedArguments + { + get + { + ResolveArguments(); + return namedArgs; + } + } + + public static IList GetCustomAttributes(Assembly target) + { + return CustomAttribute.GetCustomAttributesData(target); + } + + public static IList GetCustomAttributes(MemberInfo target) + { + return CustomAttribute.GetCustomAttributesData(target); + } + + internal static IList GetCustomAttributesInternal(RuntimeType target) + { + return CustomAttribute.GetCustomAttributesData(target); + } + + public static IList GetCustomAttributes(Module target) + { + return CustomAttribute.GetCustomAttributesData(target); + } + + public static IList GetCustomAttributes(ParameterInfo target) + { + return CustomAttribute.GetCustomAttributesData(target); + } + + public virtual Type AttributeType + { + get { return ctorInfo.DeclaringType; } + } + + public override string ToString() + { + ResolveArguments(); + + StringBuilder sb = new StringBuilder(); + + sb.Append("[" + ctorInfo.DeclaringType.FullName + "("); + for (int i = 0; i < ctorArgs.Count; i++) + { + sb.Append(ctorArgs[i].ToString()); + if (i + 1 < ctorArgs.Count) + sb.Append(", "); + } + + if (namedArgs.Count > 0) + sb.Append(", "); + + for (int j = 0; j < namedArgs.Count; j++) + { + sb.Append(namedArgs[j].ToString()); + if (j + 1 < namedArgs.Count) + sb.Append(", "); + } + sb.AppendFormat(")]"); + + return sb.ToString(); + } + + private static T[] UnboxValues(object[] values) + { + T[] retval = new T[values.Length]; + for (int i = 0; i < values.Length; i++) + retval[i] = (T)values[i]; + + return retval; + } + + public override int GetHashCode() => base.GetHashCode(); + + public override bool Equals(object? obj) + { + return obj == (object)this; + } + } } - diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttributeTypedArgument.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttributeTypedArgument.Mono.cs index 27b08f8372a27..1a21b67ccabbe 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttributeTypedArgument.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/CustomAttributeTypedArgument.Mono.cs @@ -4,12 +4,12 @@ namespace System.Reflection { - partial struct CustomAttributeTypedArgument + public partial struct CustomAttributeTypedArgument { - static object CanonicalizeValue (object value) + private static object CanonicalizeValue(object value) { - if (value.GetType ().IsEnum) - return ((Enum) value).GetValue (); + if (value.GetType().IsEnum) + return ((Enum)value).GetValue(); return value; } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs index f15997d582313..6fad5aa52ce3e 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit/AssemblyBuilder.cs // @@ -19,10 +17,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,6 +30,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; @@ -48,544 +47,598 @@ namespace System.Reflection.Emit { - internal class GenericInstanceKey { - Type gtd; - internal Type[] args; - int hash_code; - - internal GenericInstanceKey (Type gtd, Type[] args) - { - this.gtd = gtd; - this.args = args; - - hash_code = gtd.GetHashCode (); - for (int i = 0; i < args.Length; ++i) - hash_code ^= args [i].GetHashCode (); - } - - static bool IsBoundedVector (Type type) { - ArrayType at = type as ArrayType; - if (at != null) - return at.GetEffectiveRank () == 1; - return type.ToString ().EndsWith ("[*]", StringComparison.Ordinal); /*Super uggly hack, SR doesn't allow one to query for it */ - } - - static bool TypeEquals (Type a, Type b) { - if (a == b) - return true; - - if (a.HasElementType) { - if (!b.HasElementType) - return false; - if (!TypeEquals (a.GetElementType (), b.GetElementType ())) - return false; - if (a.IsArray) { - if (!b.IsArray) - return false; - int rank = a.GetArrayRank (); - if (rank != b.GetArrayRank ()) - return false; - if (rank == 1 && IsBoundedVector (a) != IsBoundedVector (b)) - return false; - } else if (a.IsByRef) { - if (!b.IsByRef) - return false; - } else if (a.IsPointer) { - if (!b.IsPointer) - return false; - } - return true; - } - - if (a.IsGenericType) { - if (!b.IsGenericType) - return false; - if (a.IsGenericParameter) - return a == b; - if (a.IsGenericParameter) //previous test should have caught it - return false; - - if (a.IsGenericTypeDefinition) { - if (!b.IsGenericTypeDefinition) - return false; - } else { - if (b.IsGenericTypeDefinition) - return false; - if (!TypeEquals (a.GetGenericTypeDefinition (), b.GetGenericTypeDefinition ())) - return false; - - Type[] argsA = a.GetGenericArguments (); - Type[] argsB = b.GetGenericArguments (); - for (int i = 0; i < argsA.Length; ++i) { - if (!TypeEquals (argsA [i], argsB [i])) - return false; - } - } - } - - /* - Now only non-generic, non compound types are left. To properly deal with user - types we would have to call UnderlyingSystemType, but we let them have their - own instantiation as this is MS behavior and mcs (pre C# 4.0, at least) doesn't - depend on proper UT canonicalization. - */ - return a == b; - } - - public override bool Equals (object obj) - { - GenericInstanceKey other = obj as GenericInstanceKey; - if (other == null) - return false; - if (gtd != other.gtd) - return false; - for (int i = 0; i < args.Length; ++i) { - Type a = args [i]; - Type b = other.args [i]; - /* - We must cannonicalize as much as we can. Using equals means that some resulting types - won't have the exact same types as the argument ones. - For example, flyweight types used array, pointer and byref will should this behavior. - MCS seens to be resilient to this problem so hopefully this won't show up. - */ - if (a != b && !a.Equals (b)) - return false; - } - return true; - } - - public override int GetHashCode () - { - return hash_code; - } - } - - [StructLayout (LayoutKind.Sequential)] - public sealed partial class AssemblyBuilder : Assembly - { - // - // AssemblyBuilder inherits from Assembly, but the runtime thinks its layout inherits from RuntimeAssembly - // - #region Sync with RuntimeAssembly.cs and ReflectionAssembly in object-internals.h + internal class GenericInstanceKey + { + private Type gtd; + internal Type[] args; + private int hash_code; + + internal GenericInstanceKey(Type gtd, Type[] args) + { + this.gtd = gtd; + this.args = args; + + hash_code = gtd.GetHashCode(); + for (int i = 0; i < args.Length; ++i) + hash_code ^= args[i].GetHashCode(); + } + + private static bool IsBoundedVector(Type type) + { + ArrayType at = type as ArrayType; + if (at != null) + return at.GetEffectiveRank() == 1; + return type.ToString().EndsWith("[*]", StringComparison.Ordinal); /*Super uggly hack, SR doesn't allow one to query for it */ + } + + private static bool TypeEquals(Type a, Type b) + { + if (a == b) + return true; + + if (a.HasElementType) + { + if (!b.HasElementType) + return false; + if (!TypeEquals(a.GetElementType(), b.GetElementType())) + return false; + if (a.IsArray) + { + if (!b.IsArray) + return false; + int rank = a.GetArrayRank(); + if (rank != b.GetArrayRank()) + return false; + if (rank == 1 && IsBoundedVector(a) != IsBoundedVector(b)) + return false; + } + else if (a.IsByRef) + { + if (!b.IsByRef) + return false; + } + else if (a.IsPointer) + { + if (!b.IsPointer) + return false; + } + return true; + } + + if (a.IsGenericType) + { + if (!b.IsGenericType) + return false; + if (a.IsGenericParameter) + return a == b; + if (a.IsGenericParameter) //previous test should have caught it + return false; + + if (a.IsGenericTypeDefinition) + { + if (!b.IsGenericTypeDefinition) + return false; + } + else + { + if (b.IsGenericTypeDefinition) + return false; + if (!TypeEquals(a.GetGenericTypeDefinition(), b.GetGenericTypeDefinition())) + return false; + + Type[] argsA = a.GetGenericArguments(); + Type[] argsB = b.GetGenericArguments(); + for (int i = 0; i < argsA.Length; ++i) + { + if (!TypeEquals(argsA[i], argsB[i])) + return false; + } + } + } + + /* + Now only non-generic, non compound types are left. To properly deal with user + types we would have to call UnderlyingSystemType, but we let them have their + own instantiation as this is MS behavior and mcs (pre C# 4.0, at least) doesn't + depend on proper UT canonicalization. + */ + return a == b; + } + + public override bool Equals(object obj) + { + GenericInstanceKey other = obj as GenericInstanceKey; + if (other == null) + return false; + if (gtd != other.gtd) + return false; + for (int i = 0; i < args.Length; ++i) + { + Type a = args[i]; + Type b = other.args[i]; + /* + We must cannonicalize as much as we can. Using equals means that some resulting types + won't have the exact same types as the argument ones. + For example, flyweight types used array, pointer and byref will should this behavior. + MCS seens to be resilient to this problem so hopefully this won't show up. + */ + if (a != b && !a.Equals(b)) + return false; + } + return true; + } + + public override int GetHashCode() + { + return hash_code; + } + } + + [StructLayout(LayoutKind.Sequential)] + public sealed partial class AssemblyBuilder : Assembly + { + // + // AssemblyBuilder inherits from Assembly, but the runtime thinks its layout inherits from RuntimeAssembly + // + #region Sync with RuntimeAssembly.cs and ReflectionAssembly in object-internals.h #pragma warning disable 649 - internal IntPtr _mono_assembly; + internal IntPtr _mono_assembly; #pragma warning restore 649 - object _evidence; - #endregion + private object _evidence; + #endregion #pragma warning disable 169, 414, 649 - #region Sync with object-internals.h - private UIntPtr dynamic_assembly; /* GC-tracked */ - private MethodInfo entry_point; - private ModuleBuilder[] modules; - private string name; - private string dir; - private CustomAttributeBuilder[] cattrs; - private object resources; - byte[] public_key; - string version; - string culture; - uint algid; - uint flags; - PEFileKinds pekind = PEFileKinds.Dll; - bool delay_sign; - uint access; - Module[] loaded_modules; - object win32_resources; - private object permissions_minimum; - private object permissions_optional; - private object permissions_refused; - PortableExecutableKinds peKind; - ImageFileMachine machine; - bool corlib_internal; - Type[] type_forwarders; - byte[] pktoken; - #endregion + #region Sync with object-internals.h + private UIntPtr dynamic_assembly; /* GC-tracked */ + private MethodInfo entry_point; + private ModuleBuilder[] modules; + private string name; + private string dir; + private CustomAttributeBuilder[] cattrs; + private object resources; + private byte[] public_key; + private string version; + private string culture; + private uint algid; + private uint flags; + private PEFileKinds pekind = PEFileKinds.Dll; + private bool delay_sign; + private uint access; + private Module[] loaded_modules; + private object win32_resources; + private object permissions_minimum; + private object permissions_optional; + private object permissions_refused; + private PortableExecutableKinds peKind; + private ImageFileMachine machine; + private bool corlib_internal; + private Type[] type_forwarders; + private byte[] pktoken; + #endregion #pragma warning restore 169, 414, 649 - AssemblyName aname; - string assemblyName; - bool created; - string versioninfo_culture; - ModuleBuilder manifest_module; - bool manifest_module_used; - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern void basic_init (AssemblyBuilder ab); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern void UpdateNativeCustomAttributes (AssemblyBuilder ab); - - [PreserveDependency ("RuntimeResolve", "System.Reflection.Emit.ModuleBuilder")] - internal AssemblyBuilder (AssemblyName n, string directory, AssemblyBuilderAccess access, bool corlib_internal) - { - aname = (AssemblyName)n.Clone (); - - if (!Enum.IsDefined (typeof (AssemblyBuilderAccess), access)) - throw new ArgumentException (string.Format (CultureInfo.InvariantCulture, - "Argument value {0} is not valid.", (int) access), - "access"); - - name = n.Name; - this.access = (uint)access; - flags = (uint) n.Flags; - - dir = directory; - - /* Set defaults from n */ - if (n.CultureInfo != null) { - culture = n.CultureInfo.Name; - versioninfo_culture = n.CultureInfo.Name; - } - Version v = n.Version; - if (v != null) { - version = v.ToString (); - } - - basic_init (this); - - // Netcore only allows one module per assembly - manifest_module = new ModuleBuilder (this, "RefEmit_InMemoryManifestModule", false); - modules = new ModuleBuilder [] { manifest_module }; - } - - public override string CodeBase { - get { throw not_supported (); } - } - - public override MethodInfo EntryPoint { - get { - return entry_point; - } - } - - public override string Location { - get { - throw not_supported (); - } - } - - public override bool ReflectionOnly { - get { return base.ReflectionOnly; } - } - - public static AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access) - { - if (name == null) - throw new ArgumentNullException ("name"); - - return new AssemblyBuilder (name, null, access, false); - } - - public static AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, IEnumerable assemblyAttributes) - { - var ab = DefineDynamicAssembly (name, access); - if (assemblyAttributes != null) { - foreach (var attr in assemblyAttributes) - ab.SetCustomAttribute (attr); - } - - return ab; - } - - public ModuleBuilder DefineDynamicModule (string name) - { - return DefineDynamicModule (name, false); - } - - public ModuleBuilder DefineDynamicModule (string name, bool emitSymbolInfo) - { - if (name == null) - throw new ArgumentNullException ("name"); - if (name.Length == 0) - throw new ArgumentException ("Empty name is not legal.", "name"); - if (name[0] == '\0') - throw new ArgumentException (SR.Argument_InvalidName, nameof (name)); - - if (manifest_module_used) - throw new InvalidOperationException (SR.InvalidOperation_NoMultiModuleAssembly); - manifest_module_used = true; - return manifest_module; - } - - public ModuleBuilder GetDynamicModule (string name) - { - if (name == null) - throw new ArgumentNullException ("name"); - if (name.Length == 0) - throw new ArgumentException ("Empty name is not legal.", "name"); - - if (modules != null) - for (int i = 0; i < modules.Length; ++i) - if (modules [i].name == name) - return modules [i]; - return null; - } - - public override Type[] GetExportedTypes () - { - throw not_supported (); - } - - public override FileStream GetFile (string name) - { - throw not_supported (); - } - - public override FileStream[] GetFiles(bool getResourceModules) { - throw not_supported (); - } - - public override ManifestResourceInfo GetManifestResourceInfo(string resourceName) { - throw not_supported (); - } - - public override string[] GetManifestResourceNames() { - throw not_supported (); - } - - public override Stream GetManifestResourceStream(string name) { - throw not_supported (); - } - public override Stream GetManifestResourceStream(Type type, string name) { - throw not_supported (); - } - - public override bool IsCollectible { - get { - return access == (uint)AssemblyBuilderAccess.RunAndCollect; - } - } - - internal string AssemblyDir { - get { - return dir; - } - } - - public void SetCustomAttribute( CustomAttributeBuilder customBuilder) - { - if (customBuilder == null) - throw new ArgumentNullException ("customBuilder"); - - if (cattrs != null) { - CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1]; - cattrs.CopyTo (new_array, 0); - new_array [cattrs.Length] = customBuilder; - cattrs = new_array; - } else { - cattrs = new CustomAttributeBuilder [1]; - cattrs [0] = customBuilder; - } - - /* - Only update the native list of custom attributes if we're adding one that is known to change dynamic execution behavior. - */ - if (customBuilder.Ctor != null && customBuilder.Ctor.DeclaringType == typeof (System.Runtime.CompilerServices.RuntimeCompatibilityAttribute)) - UpdateNativeCustomAttributes (this); - } - - [ComVisible (true)] - public void SetCustomAttribute ( ConstructorInfo con, byte[] binaryAttribute) { - if (con == null) - throw new ArgumentNullException ("con"); - if (binaryAttribute == null) - throw new ArgumentNullException ("binaryAttribute"); - - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } - - private Exception not_supported () { - // Strange message but this is what MS.NET prints... - return new NotSupportedException ("The invoked member is not supported in a dynamic module."); - } - - private String create_assembly_version (String version) { - String[] parts = version.Split ('.'); - int[] ver = new int [4] { 0, 0, 0, 0 }; - - if ((parts.Length < 0) || (parts.Length > 4)) - throw new ArgumentException ("The version specified '" + version + "' is invalid"); - - for (int i = 0; i < parts.Length; ++i) { - if (parts [i] == "*") { - DateTime now = DateTime.Now; - - if (i == 2) { - ver [2] = (now - new DateTime (2000, 1, 1)).Days; - if (parts.Length == 3) - ver [3] = (now.Second + (now.Minute * 60) + (now.Hour * 3600)) / 2; - } - else - if (i == 3) - ver [3] = (now.Second + (now.Minute * 60) + (now.Hour * 3600)) / 2; - else - throw new ArgumentException ("The version specified '" + version + "' is invalid"); - } - else { - try { - ver [i] = Int32.Parse (parts [i]); - } - catch (FormatException) { - throw new ArgumentException ("The version specified '" + version + "' is invalid"); - } - } - } - - return ver [0] + "." + ver [1] + "." + ver [2] + "." + ver [3]; - } - - private string GetCultureString (string str) - { - return (str == "neutral" ? String.Empty : str); - } - - /*Warning, @typeArguments must be a mscorlib internal array. So make a copy before passing it in*/ - internal Type MakeGenericType (Type gtd, Type[] typeArguments) - { - return new TypeBuilderInstantiation (gtd, typeArguments); - } - - public override Type GetType (string name, bool throwOnError, bool ignoreCase) - { - if (name == null) - throw new ArgumentNullException (name); - if (name.Length == 0) - throw new ArgumentException ("Name cannot be empty", nameof (name)); - - var res = InternalGetType (null, name, throwOnError, ignoreCase); - if (res is TypeBuilder) { - if (throwOnError) - throw new TypeLoadException (string.Format ("Could not load type '{0}' from assembly '{1}'", name, this.name)); - return null; - } - return res; - } - - public override Module GetModule (String name) - { - if (name == null) - throw new ArgumentNullException ("name"); - if (name.Length == 0) - throw new ArgumentException ("Name can't be empty"); - - if (modules == null) - return null; - - foreach (Module module in modules) { - if (module.ScopeName == name) - return module; - } - - return null; - } - - public override Module[] GetModules (bool getResourceModules) - { - return (Module[])modules.Clone (); - } - - public override AssemblyName GetName (bool copiedName) - { - return AssemblyName.Create (_mono_assembly, null); - } - - // FIXME: "This always returns an empty array" - public override AssemblyName[] GetReferencedAssemblies () - { - throw new NotImplementedException (); + private AssemblyName aname; + private string assemblyName; + private bool created; + private string versioninfo_culture; + private ModuleBuilder manifest_module; + private bool manifest_module_used; + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void basic_init(AssemblyBuilder ab); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void UpdateNativeCustomAttributes(AssemblyBuilder ab); + + [PreserveDependency("RuntimeResolve", "System.Reflection.Emit.ModuleBuilder")] + internal AssemblyBuilder(AssemblyName n, string directory, AssemblyBuilderAccess access, bool corlib_internal) + { + aname = (AssemblyName)n.Clone(); + + if (!Enum.IsDefined(typeof(AssemblyBuilderAccess), access)) + throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, + "Argument value {0} is not valid.", (int)access), + nameof(access)); + + name = n.Name; + this.access = (uint)access; + flags = (uint)n.Flags; + + dir = directory; + + /* Set defaults from n */ + if (n.CultureInfo != null) + { + culture = n.CultureInfo.Name; + versioninfo_culture = n.CultureInfo.Name; + } + Version v = n.Version; + if (v != null) + { + version = v.ToString(); + } + + basic_init(this); + + // Netcore only allows one module per assembly + manifest_module = new ModuleBuilder(this, "RefEmit_InMemoryManifestModule", false); + modules = new ModuleBuilder[] { manifest_module }; + } + + public override string CodeBase + { + get { throw not_supported(); } + } + + public override MethodInfo EntryPoint + { + get + { + return entry_point; + } + } + + public override string Location + { + get + { + throw not_supported(); + } + } + + public override bool ReflectionOnly + { + get { return base.ReflectionOnly; } + } + + public static AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + + return new AssemblyBuilder(name, null, access, false); + } + + public static AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, IEnumerable assemblyAttributes) + { + var ab = DefineDynamicAssembly(name, access); + if (assemblyAttributes != null) + { + foreach (var attr in assemblyAttributes) + ab.SetCustomAttribute(attr); + } + + return ab; + } + + public ModuleBuilder DefineDynamicModule(string name) + { + return DefineDynamicModule(name, false); + } + + public ModuleBuilder DefineDynamicModule(string name, bool emitSymbolInfo) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + if (name.Length == 0) + throw new ArgumentException("Empty name is not legal.", nameof(name)); + if (name[0] == '\0') + throw new ArgumentException(SR.Argument_InvalidName, nameof(name)); + + if (manifest_module_used) + throw new InvalidOperationException(SR.InvalidOperation_NoMultiModuleAssembly); + manifest_module_used = true; + return manifest_module; + } + + public ModuleBuilder GetDynamicModule(string name) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + if (name.Length == 0) + throw new ArgumentException("Empty name is not legal.", nameof(name)); + + if (modules != null) + for (int i = 0; i < modules.Length; ++i) + if (modules[i].name == name) + return modules[i]; + return null; + } + + public override Type[] GetExportedTypes() + { + throw not_supported(); + } + + public override FileStream GetFile(string name) + { + throw not_supported(); + } + + public override FileStream[] GetFiles(bool getResourceModules) + { + throw not_supported(); + } + + public override ManifestResourceInfo GetManifestResourceInfo(string resourceName) + { + throw not_supported(); + } + + public override string[] GetManifestResourceNames() + { + throw not_supported(); + } + + public override Stream GetManifestResourceStream(string name) + { + throw not_supported(); + } + public override Stream GetManifestResourceStream(Type type, string name) + { + throw not_supported(); + } + + public override bool IsCollectible + { + get + { + return access == (uint)AssemblyBuilderAccess.RunAndCollect; + } + } + + internal string AssemblyDir + { + get + { + return dir; + } + } + + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + if (customBuilder == null) + throw new ArgumentNullException(nameof(customBuilder)); + + if (cattrs != null) + { + CustomAttributeBuilder[] new_array = new CustomAttributeBuilder[cattrs.Length + 1]; + cattrs.CopyTo(new_array, 0); + new_array[cattrs.Length] = customBuilder; + cattrs = new_array; + } + else + { + cattrs = new CustomAttributeBuilder[1]; + cattrs[0] = customBuilder; + } + + /* + Only update the native list of custom attributes if we're adding one that is known to change dynamic execution behavior. + */ + if (customBuilder.Ctor != null && customBuilder.Ctor.DeclaringType == typeof(System.Runtime.CompilerServices.RuntimeCompatibilityAttribute)) + UpdateNativeCustomAttributes(this); + } + + [ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + if (con == null) + throw new ArgumentNullException(nameof(con)); + if (binaryAttribute == null) + throw new ArgumentNullException(nameof(binaryAttribute)); + + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } + + private Exception not_supported() + { + // Strange message but this is what MS.NET prints... + return new NotSupportedException("The invoked member is not supported in a dynamic module."); + } + + private string create_assembly_version(string version) + { + string[] parts = version.Split('.'); + int[] ver = new int[4] { 0, 0, 0, 0 }; + + if ((parts.Length < 0) || (parts.Length > 4)) + throw new ArgumentException("The version specified '" + version + "' is invalid"); + + for (int i = 0; i < parts.Length; ++i) + { + if (parts[i] == "*") + { + DateTime now = DateTime.Now; + + if (i == 2) + { + ver[2] = (now - new DateTime(2000, 1, 1)).Days; + if (parts.Length == 3) + ver[3] = (now.Second + (now.Minute * 60) + (now.Hour * 3600)) / 2; + } + else + if (i == 3) + ver[3] = (now.Second + (now.Minute * 60) + (now.Hour * 3600)) / 2; + else + throw new ArgumentException("The version specified '" + version + "' is invalid"); + } + else + { + try + { + ver[i] = int.Parse(parts[i]); + } + catch (FormatException) + { + throw new ArgumentException("The version specified '" + version + "' is invalid"); + } + } + } + + return ver[0] + "." + ver[1] + "." + ver[2] + "." + ver[3]; + } + + private string GetCultureString(string str) + { + return (str == "neutral" ? string.Empty : str); + } + + /*Warning, @typeArguments must be a mscorlib internal array. So make a copy before passing it in*/ + internal Type MakeGenericType(Type gtd, Type[] typeArguments) + { + return new TypeBuilderInstantiation(gtd, typeArguments); + } + + public override Type GetType(string name, bool throwOnError, bool ignoreCase) + { + if (name == null) + throw new ArgumentNullException(name); + if (name.Length == 0) + throw new ArgumentException("Name cannot be empty", nameof(name)); + + var res = InternalGetType(null, name, throwOnError, ignoreCase); + if (res is TypeBuilder) + { + if (throwOnError) + throw new TypeLoadException(string.Format("Could not load type '{0}' from assembly '{1}'", name, this.name)); + return null; + } + return res; + } + + public override Module GetModule(string name) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + if (name.Length == 0) + throw new ArgumentException("Name can't be empty"); + + if (modules == null) + return null; + + foreach (Module module in modules) + { + if (module.ScopeName == name) + return module; + } + + return null; + } + + public override Module[] GetModules(bool getResourceModules) + { + return (Module[])modules.Clone(); + } + + public override AssemblyName GetName(bool copiedName) + { + return AssemblyName.Create(_mono_assembly, null); + } + + // FIXME: "This always returns an empty array" + public override AssemblyName[] GetReferencedAssemblies() + { + throw new NotImplementedException(); #if FALSE return GetReferencedAssemblies (this); #endif - } - - public override Module[] GetLoadedModules (bool getResourceModules) - { - return GetModules (getResourceModules); - } - - //FIXME MS has issues loading satelite assemblies from SRE - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public override Assembly GetSatelliteAssembly (CultureInfo culture) - { - throw new NotImplementedException (); + } + + public override Module[] GetLoadedModules(bool getResourceModules) + { + return GetModules(getResourceModules); + } + + //FIXME MS has issues loading satelite assemblies from SRE + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public override Assembly GetSatelliteAssembly(CultureInfo culture) + { + throw new NotImplementedException(); #if FALSE StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; return GetSatelliteAssembly (culture, null, true, ref stackMark); #endif - } + } - //FIXME MS has issues loading satelite assemblies from SRE - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public override Assembly GetSatelliteAssembly (CultureInfo culture, Version version) - { - throw new NotImplementedException (); + //FIXME MS has issues loading satelite assemblies from SRE + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public override Assembly GetSatelliteAssembly(CultureInfo culture, Version version) + { + throw new NotImplementedException(); #if FALSE StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; return GetSatelliteAssembly (culture, version, true, ref stackMark); #endif - } - - public override Module ManifestModule { - get { - return manifest_module; - } - } - - public override bool GlobalAssemblyCache { - get { - return false; - } - } - - public override bool IsDynamic { - get { return true; } - } - - public override bool Equals (object obj) - { - return base.Equals (obj); - } - - public override int GetHashCode () - { - return base.GetHashCode (); - } - - public override string ToString () - { - if (assemblyName != null) - return assemblyName; - - assemblyName = FullName; - return assemblyName; - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - return CustomAttribute.IsDefined (this, attributeType, inherit); - } - - public override object[] GetCustomAttributes (bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, inherit); - } - - public override object[] GetCustomAttributes (Type attributeType, bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - } - - public override IList GetCustomAttributesData () - { - return CustomAttributeData.GetCustomAttributes (this); - } - - public override string FullName { - get { - return aname.ToString (); - } - } - } + } + + public override Module ManifestModule + { + get + { + return manifest_module; + } + } + + public override bool GlobalAssemblyCache + { + get + { + return false; + } + } + + public override bool IsDynamic + { + get { return true; } + } + + public override bool Equals(object obj) + { + return base.Equals(obj); + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public override string ToString() + { + if (assemblyName != null) + return assemblyName; + + assemblyName = FullName; + return assemblyName; + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + return CustomAttribute.IsDefined(this, attributeType, inherit); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, inherit); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + } + + public override IList GetCustomAttributesData() + { + return CustomAttributeData.GetCustomAttributes(this); + } + + public override string FullName + { + get + { + return aname.ToString(); + } + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.Mono.cs index 7874748a0a27a..3d55f212e7e53 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit.ConstructorBuilder.cs // @@ -19,10 +17,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,6 +30,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Collections.Generic; @@ -41,333 +40,367 @@ using System.Runtime.InteropServices; using System.Diagnostics.SymbolStore; -namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public sealed partial class ConstructorBuilder : ConstructorInfo { - +namespace System.Reflection.Emit +{ + [StructLayout(LayoutKind.Sequential)] + public sealed partial class ConstructorBuilder : ConstructorInfo + { + #pragma warning disable 169, 414 - private RuntimeMethodHandle mhandle; - private ILGenerator ilgen; - internal Type[] parameters; - private MethodAttributes attrs; - private MethodImplAttributes iattrs; - private int table_idx; - private CallingConventions call_conv; - private TypeBuilder type; - internal ParameterBuilder[] pinfo; - private CustomAttributeBuilder[] cattrs; - private bool init_locals = true; - private Type[][] paramModReq; - private Type[][] paramModOpt; - private object permissions; + private RuntimeMethodHandle mhandle; + private ILGenerator ilgen; + internal Type[] parameters; + private MethodAttributes attrs; + private MethodImplAttributes iattrs; + private int table_idx; + private CallingConventions call_conv; + private TypeBuilder type; + internal ParameterBuilder[] pinfo; + private CustomAttributeBuilder[] cattrs; + private bool init_locals = true; + private Type[][] paramModReq; + private Type[][] paramModOpt; + private object permissions; #pragma warning restore 169, 414 - internal bool finished; - - internal ConstructorBuilder (TypeBuilder tb, MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes, Type[][] paramModReq, Type[][] paramModOpt) - { - attrs = attributes | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName; - call_conv = callingConvention; - if (parameterTypes != null) { - for (int i = 0; i < parameterTypes.Length; ++i) - if (parameterTypes [i] == null) - throw new ArgumentException ("Elements of the parameterTypes array cannot be null", "parameterTypes"); - - this.parameters = new Type [parameterTypes.Length]; - System.Array.Copy (parameterTypes, this.parameters, parameterTypes.Length); - } - type = tb; - this.paramModReq = paramModReq; - this.paramModOpt = paramModOpt; - table_idx = get_next_table_index (this, 0x06, 1); - - ((ModuleBuilder) tb.Module).RegisterToken (this, GetToken ().Token); - } - - // FIXME: - public override CallingConventions CallingConvention { - get { - return call_conv; - } - } - - public bool InitLocals { - get { - return init_locals; - } - set { - init_locals = value; - } - } - - internal TypeBuilder TypeBuilder { - get { - return type; - } - } - - public override MethodImplAttributes GetMethodImplementationFlags () - { - return iattrs; - } - - public override ParameterInfo[] GetParameters () - { - if (!type.is_created) - throw not_created (); - - return GetParametersInternal (); - } - - internal override ParameterInfo [] GetParametersInternal () - { - if (parameters == null) - return Array.Empty (); - - ParameterInfo [] retval = new ParameterInfo [parameters.Length]; - for (int i = 0; i < parameters.Length; i++) - retval [i] = RuntimeParameterInfo.New (pinfo?[i + 1], parameters [i], this, i + 1); - - return retval; - } - - internal override int GetParametersCount () - { - if (parameters == null) - return 0; - - return parameters.Length; - } - - internal override Type GetParameterType (int pos) { - return parameters [pos]; - } - - internal MethodBase RuntimeResolve () { - return type.RuntimeResolve ().GetConstructor (this); - } - - public override Object Invoke (Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - { - throw not_supported (); - } - - public override object Invoke (BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) - { - throw not_supported (); - } - - public override RuntimeMethodHandle MethodHandle { - get { - throw not_supported (); - } - } - - public override MethodAttributes Attributes { - get { - return attrs; - } - } - - public override Type ReflectedType { - get { - return type; - } - } - - public override Type DeclaringType { - get { - return type; - } - } - - public override string Name { - get { - return (attrs & MethodAttributes.Static) != 0 ? ConstructorInfo.TypeConstructorName : ConstructorInfo.ConstructorName; - } - } - - public string Signature { - get { - return "constructor signature"; - } - } - - public ParameterBuilder DefineParameter (int iSequence, ParameterAttributes attributes, string strParamName) - { - // The 0th ParameterBuilder does not correspond to an - // actual parameter, but .NETFramework lets you define - // it anyway. It is not useful. - if (iSequence < 0 || iSequence > GetParametersCount ()) - throw new ArgumentOutOfRangeException ("iSequence"); - if (type.is_created) - throw not_after_created (); - - ParameterBuilder pb = new ParameterBuilder (this, iSequence, attributes, strParamName); - if (pinfo == null) - pinfo = new ParameterBuilder [parameters.Length + 1]; - pinfo [iSequence] = pb; - return pb; - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - throw not_supported (); - } - - public override object [] GetCustomAttributes (bool inherit) - { - throw not_supported (); - } - - public override object [] GetCustomAttributes (Type attributeType, bool inherit) - { - throw not_supported (); - } - - public ILGenerator GetILGenerator () - { - return GetILGenerator (64); - } - - public ILGenerator GetILGenerator (int streamSize) - { - if (finished) - throw new InvalidOperationException (); - if (ilgen != null) - return ilgen; - if (!(((attrs & (MethodAttributes.Abstract | MethodAttributes.PinvokeImpl)) == 0) && ((iattrs & (MethodImplAttributes.Runtime | MethodImplAttributes.InternalCall)) == 0))) - throw new InvalidOperationException (); - ilgen = new ILGenerator (type.Module, ((ModuleBuilder)type.Module).GetTokenGenerator (), streamSize); - return ilgen; - } - - public void SetCustomAttribute (CustomAttributeBuilder customBuilder) - { - if (customBuilder == null) - throw new ArgumentNullException ("customBuilder"); - - string attrname = customBuilder.Ctor.ReflectedType.FullName; - if (attrname == "System.Runtime.CompilerServices.MethodImplAttribute") { - byte[] data = customBuilder.Data; - int impla; // the (stupid) ctor takes a short or an int ... - impla = (int)data [2]; - impla |= ((int)data [3]) << 8; - SetImplementationFlags ((MethodImplAttributes)impla); - return; - } - if (cattrs != null) { - CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1]; - cattrs.CopyTo (new_array, 0); - new_array [cattrs.Length] = customBuilder; - cattrs = new_array; - } else { - cattrs = new CustomAttributeBuilder [1]; - cattrs [0] = customBuilder; - } - } - - [ComVisible (true)] - public void SetCustomAttribute (ConstructorInfo con, byte[] binaryAttribute) - { - if (con == null) - throw new ArgumentNullException ("con"); - if (binaryAttribute == null) - throw new ArgumentNullException ("binaryAttribute"); - - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } - - public void SetImplementationFlags (MethodImplAttributes attributes) - { - if (type.is_created) - throw not_after_created (); - - iattrs = attributes; - } - - public Module GetModule () - { - return type.Module; - } - - public MethodToken GetToken () - { - return new MethodToken (0x06000000 | table_idx); - } - - public override Module Module { - get { - return GetModule (); - } - } - - public override string ToString () - { - return "ConstructorBuilder ['" + type.Name + "']"; - } - - internal void fixup () - { - if (((attrs & (MethodAttributes.Abstract | MethodAttributes.PinvokeImpl)) == 0) && ((iattrs & (MethodImplAttributes.Runtime | MethodImplAttributes.InternalCall)) == 0)) { - if ((ilgen == null) || (ilgen.ILOffset == 0)) - throw new InvalidOperationException ("Method '" + Name + "' does not have a method body."); - } - if (IsStatic && - ((call_conv & CallingConventions.VarArgs) != 0 || - (call_conv & CallingConventions.HasThis) != 0)) - throw new TypeLoadException (); - if (ilgen != null) - ilgen.label_fixup (this); - } - - internal void ResolveUserTypes () { - TypeBuilder.ResolveUserTypes (parameters); - if (paramModReq != null) { - foreach (var types in paramModReq) - TypeBuilder.ResolveUserTypes (types); - } - if (paramModOpt != null) { - foreach (var types in paramModOpt) - TypeBuilder.ResolveUserTypes (types); - } - } -/* - internal void GenerateDebugInfo (ISymbolWriter symbolWriter) - { - if (ilgen != null && ilgen.HasDebugInfo) { - SymbolToken token = new SymbolToken (GetToken().Token); - symbolWriter.OpenMethod (token); - symbolWriter.SetSymAttribute (token, "__name", System.Text.Encoding.UTF8.GetBytes (Name)); - ilgen.GenerateDebugInfo (symbolWriter); - symbolWriter.CloseMethod (); - } - } -*/ - internal override int get_next_table_index (object obj, int table, int count) - { - return type.get_next_table_index (obj, table, count); - } - - private void RejectIfCreated () - { - if (type.is_created) - throw new InvalidOperationException ("Type definition of the method is complete."); - } - - private Exception not_supported () - { - return new NotSupportedException ("The invoked member is not supported in a dynamic module."); - } - - private Exception not_after_created () - { - return new InvalidOperationException ("Unable to change after type has been created."); - } - - private Exception not_created () - { - return new NotSupportedException ("The type is not yet created."); - } - } + internal bool finished; + + internal ConstructorBuilder(TypeBuilder tb, MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes, Type[][] paramModReq, Type[][] paramModOpt) + { + attrs = attributes | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName; + call_conv = callingConvention; + if (parameterTypes != null) + { + for (int i = 0; i < parameterTypes.Length; ++i) + if (parameterTypes[i] == null) + throw new ArgumentException("Elements of the parameterTypes array cannot be null", nameof(parameterTypes)); + + this.parameters = new Type[parameterTypes.Length]; + Array.Copy(parameterTypes, this.parameters, parameterTypes.Length); + } + type = tb; + this.paramModReq = paramModReq; + this.paramModOpt = paramModOpt; + table_idx = get_next_table_index(this, 0x06, 1); + + ((ModuleBuilder)tb.Module).RegisterToken(this, GetToken().Token); + } + + // FIXME: + public override CallingConventions CallingConvention + { + get + { + return call_conv; + } + } + + public bool InitLocals + { + get + { + return init_locals; + } + set + { + init_locals = value; + } + } + + internal TypeBuilder TypeBuilder + { + get + { + return type; + } + } + + public override MethodImplAttributes GetMethodImplementationFlags() + { + return iattrs; + } + + public override ParameterInfo[] GetParameters() + { + if (!type.is_created) + throw not_created(); + + return GetParametersInternal(); + } + + internal override ParameterInfo[] GetParametersInternal() + { + if (parameters == null) + return Array.Empty(); + + ParameterInfo[] retval = new ParameterInfo[parameters.Length]; + for (int i = 0; i < parameters.Length; i++) + retval[i] = RuntimeParameterInfo.New(pinfo?[i + 1], parameters[i], this, i + 1); + + return retval; + } + + internal override int GetParametersCount() + { + if (parameters == null) + return 0; + + return parameters.Length; + } + + internal override Type GetParameterType(int pos) + { + return parameters[pos]; + } + + internal MethodBase RuntimeResolve() + { + return type.RuntimeResolve().GetConstructor(this); + } + + public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) + { + throw not_supported(); + } + + public override object Invoke(BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) + { + throw not_supported(); + } + + public override RuntimeMethodHandle MethodHandle + { + get + { + throw not_supported(); + } + } + + public override MethodAttributes Attributes + { + get + { + return attrs; + } + } + + public override Type ReflectedType + { + get + { + return type; + } + } + + public override Type DeclaringType + { + get + { + return type; + } + } + + public override string Name + { + get + { + return (attrs & MethodAttributes.Static) != 0 ? TypeConstructorName : ConstructorName; + } + } + + public string Signature + { + get + { + return "constructor signature"; + } + } + + public ParameterBuilder DefineParameter(int iSequence, ParameterAttributes attributes, string strParamName) + { + // The 0th ParameterBuilder does not correspond to an + // actual parameter, but .NETFramework lets you define + // it anyway. It is not useful. + if (iSequence < 0 || iSequence > GetParametersCount()) + throw new ArgumentOutOfRangeException(nameof(iSequence)); + if (type.is_created) + throw not_after_created(); + + ParameterBuilder pb = new ParameterBuilder(this, iSequence, attributes, strParamName); + if (pinfo == null) + pinfo = new ParameterBuilder[parameters.Length + 1]; + pinfo[iSequence] = pb; + return pb; + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + throw not_supported(); + } + + public override object[] GetCustomAttributes(bool inherit) + { + throw not_supported(); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + throw not_supported(); + } + + public ILGenerator GetILGenerator() + { + return GetILGenerator(64); + } + + public ILGenerator GetILGenerator(int streamSize) + { + if (finished) + throw new InvalidOperationException(); + if (ilgen != null) + return ilgen; + if (!(((attrs & (MethodAttributes.Abstract | MethodAttributes.PinvokeImpl)) == 0) && ((iattrs & (MethodImplAttributes.Runtime | MethodImplAttributes.InternalCall)) == 0))) + throw new InvalidOperationException(); + ilgen = new ILGenerator(type.Module, ((ModuleBuilder)type.Module).GetTokenGenerator(), streamSize); + return ilgen; + } + + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + if (customBuilder == null) + throw new ArgumentNullException(nameof(customBuilder)); + + string attrname = customBuilder.Ctor.ReflectedType.FullName; + if (attrname == "System.Runtime.CompilerServices.MethodImplAttribute") + { + byte[] data = customBuilder.Data; + int impla; // the (stupid) ctor takes a short or an int ... + impla = (int)data[2]; + impla |= ((int)data[3]) << 8; + SetImplementationFlags((MethodImplAttributes)impla); + return; + } + if (cattrs != null) + { + CustomAttributeBuilder[] new_array = new CustomAttributeBuilder[cattrs.Length + 1]; + cattrs.CopyTo(new_array, 0); + new_array[cattrs.Length] = customBuilder; + cattrs = new_array; + } + else + { + cattrs = new CustomAttributeBuilder[1]; + cattrs[0] = customBuilder; + } + } + + [ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + if (con == null) + throw new ArgumentNullException(nameof(con)); + if (binaryAttribute == null) + throw new ArgumentNullException(nameof(binaryAttribute)); + + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } + + public void SetImplementationFlags(MethodImplAttributes attributes) + { + if (type.is_created) + throw not_after_created(); + + iattrs = attributes; + } + + public Module GetModule() + { + return type.Module; + } + + public MethodToken GetToken() + { + return new MethodToken(0x06000000 | table_idx); + } + + public override Module Module + { + get + { + return GetModule(); + } + } + + public override string ToString() + { + return "ConstructorBuilder ['" + type.Name + "']"; + } + + internal void fixup() + { + if (((attrs & (MethodAttributes.Abstract | MethodAttributes.PinvokeImpl)) == 0) && ((iattrs & (MethodImplAttributes.Runtime | MethodImplAttributes.InternalCall)) == 0)) + { + if ((ilgen == null) || (ilgen.ILOffset == 0)) + throw new InvalidOperationException("Method '" + Name + "' does not have a method body."); + } + if (IsStatic && + ((call_conv & CallingConventions.VarArgs) != 0 || + (call_conv & CallingConventions.HasThis) != 0)) + throw new TypeLoadException(); + if (ilgen != null) + ilgen.label_fixup(this); + } + + internal void ResolveUserTypes() + { + TypeBuilder.ResolveUserTypes(parameters); + if (paramModReq != null) + { + foreach (var types in paramModReq) + TypeBuilder.ResolveUserTypes(types); + } + if (paramModOpt != null) + { + foreach (var types in paramModOpt) + TypeBuilder.ResolveUserTypes(types); + } + } + /* + internal void GenerateDebugInfo (ISymbolWriter symbolWriter) + { + if (ilgen != null && ilgen.HasDebugInfo) { + SymbolToken token = new SymbolToken (GetToken().Token); + symbolWriter.OpenMethod (token); + symbolWriter.SetSymAttribute (token, "__name", System.Text.Encoding.UTF8.GetBytes (Name)); + ilgen.GenerateDebugInfo (symbolWriter); + symbolWriter.CloseMethod (); + } + } + */ + internal override int get_next_table_index(object obj, int table, int count) + { + return type.get_next_table_index(obj, table, count); + } + + private void RejectIfCreated() + { + if (type.is_created) + throw new InvalidOperationException("Type definition of the method is complete."); + } + + private Exception not_supported() + { + return new NotSupportedException("The invoked member is not supported in a dynamic module."); + } + + private Exception not_after_created() + { + return new InvalidOperationException("Unable to change after type has been created."); + } + + private Exception not_created() + { + return new NotSupportedException("The type is not yet created."); + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorOnTypeBuilderInst.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorOnTypeBuilderInst.cs index 835f161f25b6c..1dbccc9b6d7bb 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorOnTypeBuilderInst.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorOnTypeBuilderInst.cs @@ -1,4 +1,3 @@ -#nullable disable // // System.Reflection.Emit/ConstructorOnTypeBuilderInst.cs // @@ -15,10 +14,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -28,6 +27,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Globalization; @@ -36,192 +36,225 @@ namespace System.Reflection.Emit { - /* - * This class represents a ctor of an instantiation of a generic type builder. - */ - [StructLayout (LayoutKind.Sequential)] - internal class ConstructorOnTypeBuilderInst : ConstructorInfo - { - #region Keep in sync with object-internals.h - internal TypeBuilderInstantiation instantiation; - internal ConstructorInfo cb; - #endregion - - public ConstructorOnTypeBuilderInst (TypeBuilderInstantiation instantiation, ConstructorInfo cb) - { - this.instantiation = instantiation; - this.cb = cb; - } - - // - // MemberInfo members - // - - public override Type DeclaringType { - get { - return instantiation; - } - } - - public override string Name { - get { - return cb.Name; - } - } - - public override Type ReflectedType { - get { - return instantiation; - } - } - - public override Module Module { - get { - return cb.Module; - } - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - return cb.IsDefined (attributeType, inherit); - } - - public override object [] GetCustomAttributes (bool inherit) - { - return cb.GetCustomAttributes (inherit); - } - - public override object [] GetCustomAttributes (Type attributeType, bool inherit) - { - return cb.GetCustomAttributes (attributeType, inherit); - } - - // - // MethodBase members - // - - public override MethodImplAttributes GetMethodImplementationFlags () - { - return cb.GetMethodImplementationFlags (); - } - - public override ParameterInfo[] GetParameters () - { - /*FIXME, maybe the right thing to do when the type is creates is to retrieve from the inflated type*/ - if (!instantiation.IsCreated) - throw new NotSupportedException (); - - return GetParametersInternal (); - } - - internal override ParameterInfo[] GetParametersInternal () - { - ParameterInfo [] res; - if (cb is ConstructorBuilder) { - ConstructorBuilder cbuilder = (ConstructorBuilder)cb; - res = new ParameterInfo [cbuilder.parameters.Length]; - for (int i = 0; i < cbuilder.parameters.Length; i++) { - Type type = instantiation.InflateType (cbuilder.parameters [i]); - res [i] = RuntimeParameterInfo.New (cbuilder.pinfo?[i], type, this, i + 1); - } - } else { - ParameterInfo[] parms = cb.GetParameters (); - res = new ParameterInfo [parms.Length]; - for (int i = 0; i < parms.Length; i++) { - Type type = instantiation.InflateType (parms [i].ParameterType); - res [i] = RuntimeParameterInfo.New (parms [i], type, this, i + 1); - } - } - return res; - } - - internal override Type[] GetParameterTypes () { - if (cb is ConstructorBuilder) { - return (cb as ConstructorBuilder).parameters; - } else { - ParameterInfo[] parms = cb.GetParameters (); - var res = new Type [parms.Length]; - for (int i = 0; i < parms.Length; i++) { - res [i] = parms [i].ParameterType; - } - return res; - } - } - - // Called from the runtime to return the corresponding finished ConstructorInfo object - internal ConstructorInfo RuntimeResolve () { - var type = instantiation.InternalResolve (); - return type.GetConstructor (cb); - } - - public override int MetadataToken { - get { - return base.MetadataToken; - } - } - - internal override int GetParametersCount () - { - return cb.GetParametersCount (); - } - - public override Object Invoke (Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - { - return cb.Invoke (obj, invokeAttr, binder, parameters, - culture); - } - - public override RuntimeMethodHandle MethodHandle { - get { - return cb.MethodHandle; - } - } - - public override MethodAttributes Attributes { - get { - return cb.Attributes; - } - } - - public override CallingConventions CallingConvention { - get { - return cb.CallingConvention; - } - } - - public override Type [] GetGenericArguments () - { - return cb.GetGenericArguments (); - } - - public override bool ContainsGenericParameters { - get { - return false; - } - } - - public override bool IsGenericMethodDefinition { - get { - return false; - } - } - - public override bool IsGenericMethod { - get { - return false; - } - } - - // - // MethodBase members - // - - public override object Invoke (BindingFlags invokeAttr, Binder binder, object[] parameters, - CultureInfo culture) - { - throw new InvalidOperationException (); - } - } + /* + * This class represents a ctor of an instantiation of a generic type builder. + */ + [StructLayout(LayoutKind.Sequential)] + internal class ConstructorOnTypeBuilderInst : ConstructorInfo + { + #region Keep in sync with object-internals.h + internal TypeBuilderInstantiation instantiation; + internal ConstructorInfo cb; + #endregion + + public ConstructorOnTypeBuilderInst(TypeBuilderInstantiation instantiation, ConstructorInfo cb) + { + this.instantiation = instantiation; + this.cb = cb; + } + + // + // MemberInfo members + // + + public override Type DeclaringType + { + get + { + return instantiation; + } + } + + public override string Name + { + get + { + return cb.Name; + } + } + + public override Type ReflectedType + { + get + { + return instantiation; + } + } + + public override Module Module + { + get + { + return cb.Module; + } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + return cb.IsDefined(attributeType, inherit); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return cb.GetCustomAttributes(inherit); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return cb.GetCustomAttributes(attributeType, inherit); + } + + // + // MethodBase members + // + + public override MethodImplAttributes GetMethodImplementationFlags() + { + return cb.GetMethodImplementationFlags(); + } + + public override ParameterInfo[] GetParameters() + { + /*FIXME, maybe the right thing to do when the type is creates is to retrieve from the inflated type*/ + if (!instantiation.IsCreated) + throw new NotSupportedException(); + + return GetParametersInternal(); + } + + internal override ParameterInfo[] GetParametersInternal() + { + ParameterInfo[] res; + if (cb is ConstructorBuilder) + { + ConstructorBuilder cbuilder = (ConstructorBuilder)cb; + res = new ParameterInfo[cbuilder.parameters.Length]; + for (int i = 0; i < cbuilder.parameters.Length; i++) + { + Type type = instantiation.InflateType(cbuilder.parameters[i]); + res[i] = RuntimeParameterInfo.New(cbuilder.pinfo?[i], type, this, i + 1); + } + } + else + { + ParameterInfo[] parms = cb.GetParameters(); + res = new ParameterInfo[parms.Length]; + for (int i = 0; i < parms.Length; i++) + { + Type type = instantiation.InflateType(parms[i].ParameterType); + res[i] = RuntimeParameterInfo.New(parms[i], type, this, i + 1); + } + } + return res; + } + + internal override Type[] GetParameterTypes() + { + if (cb is ConstructorBuilder) + { + return (cb as ConstructorBuilder).parameters; + } + else + { + ParameterInfo[] parms = cb.GetParameters(); + var res = new Type[parms.Length]; + for (int i = 0; i < parms.Length; i++) + { + res[i] = parms[i].ParameterType; + } + return res; + } + } + + // Called from the runtime to return the corresponding finished ConstructorInfo object + internal ConstructorInfo RuntimeResolve() + { + var type = instantiation.InternalResolve(); + return type.GetConstructor(cb); + } + + public override int MetadataToken + { + get + { + return base.MetadataToken; + } + } + + internal override int GetParametersCount() + { + return cb.GetParametersCount(); + } + + public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) + { + return cb.Invoke(obj, invokeAttr, binder, parameters, + culture); + } + + public override RuntimeMethodHandle MethodHandle + { + get + { + return cb.MethodHandle; + } + } + + public override MethodAttributes Attributes + { + get + { + return cb.Attributes; + } + } + + public override CallingConventions CallingConvention + { + get + { + return cb.CallingConvention; + } + } + + public override Type[] GetGenericArguments() + { + return cb.GetGenericArguments(); + } + + public override bool ContainsGenericParameters + { + get + { + return false; + } + } + + public override bool IsGenericMethodDefinition + { + get + { + return false; + } + } + + public override bool IsGenericMethod + { + get + { + return false; + } + } + + // + // MethodBase members + // + + public override object Invoke(BindingFlags invokeAttr, Binder binder, object[] parameters, + CultureInfo culture) + { + throw new InvalidOperationException(); + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/CustomAttributeBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/CustomAttributeBuilder.Mono.cs index 8c75be019e843..6f9c751d1da7b 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/CustomAttributeBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/CustomAttributeBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,6 +30,7 @@ // (C) 2001 Ximian, Inc. http://www.ximian.com // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; @@ -39,514 +38,556 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public partial class CustomAttributeBuilder { - ConstructorInfo ctor; - byte[] data; - object [] args; - PropertyInfo [] namedProperties; - object [] propertyValues; - FieldInfo [] namedFields; - object [] fieldValues; - - internal ConstructorInfo Ctor { - get {return ctor;} - } - - internal byte[] Data { - get {return data;} - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern byte[] GetBlob(Assembly asmb, ConstructorInfo con, object[] constructorArgs, PropertyInfo[] namedProperties, object[] propertyValues, FieldInfo[] namedFields, object[] fieldValues); - - internal object Invoke () - { - object result = ctor.Invoke (args); - - for (int i=0; i < namedFields.Length; i++) - namedFields [i].SetValue (result, fieldValues [i]); - - for (int i=0; i < namedProperties.Length; i++) - namedProperties [i].SetValue (result, propertyValues [i]); - - return result; - } - - internal CustomAttributeBuilder( ConstructorInfo con, byte[] binaryAttribute) { - if (con == null) - throw new ArgumentNullException ("con"); - if (binaryAttribute == null) - throw new ArgumentNullException ("binaryAttribute"); - ctor = con; - data = (byte[])binaryAttribute.Clone (); - /* should we check that the user supplied data is correct? */ - } - - public CustomAttributeBuilder( ConstructorInfo con, object[] constructorArgs) - { - Initialize (con, constructorArgs, new PropertyInfo [0], new object [0], - new FieldInfo [0], new object [0]); - } - public CustomAttributeBuilder( ConstructorInfo con, object[] constructorArgs, - FieldInfo[] namedFields, object[] fieldValues) - { - Initialize (con, constructorArgs, new PropertyInfo [0], new object [0], - namedFields, fieldValues); - } - public CustomAttributeBuilder( ConstructorInfo con, object[] constructorArgs, - PropertyInfo[] namedProperties, object[] propertyValues) - { - Initialize (con, constructorArgs, namedProperties, propertyValues, new FieldInfo [0], - new object [0]); - } - public CustomAttributeBuilder( ConstructorInfo con, object[] constructorArgs, - PropertyInfo[] namedProperties, object[] propertyValues, - FieldInfo[] namedFields, object[] fieldValues) - { - Initialize (con, constructorArgs, namedProperties, propertyValues, namedFields, fieldValues); - } - - private bool IsValidType (Type t) - { - /* FIXME: Add more checks */ - if (t.IsArray && t.GetArrayRank () > 1) - return false; - if (t is TypeBuilder && t.IsEnum) { - // Check that the enum is properly constructed, the unmanaged code - // depends on this - Enum.GetUnderlyingType (t); - } - if (t.IsClass && !(t.IsArray || t == typeof (object) || t == typeof (Type) || t == typeof (string) || t.Assembly.GetName ().Name == "mscorlib")) - return false; - if (t.IsValueType && !(t.IsPrimitive || t.IsEnum || ((t.Assembly is AssemblyBuilder) && t.Assembly.GetName ().Name == "mscorlib"))) - return false; - return true; - } - - private bool IsValidParam (object o, Type paramType) - { - Type t = o.GetType (); - if (!IsValidType (t)) - return false; - if (paramType == typeof (object)) { - if (t.IsArray && t.GetArrayRank () == 1) - return IsValidType (t.GetElementType ()); - if (!t.IsPrimitive && !typeof (Type).IsAssignableFrom (t) && t != typeof (string) && !t.IsEnum) - return false; - } - return true; - } - - static bool IsValidValue (Type type, object value) { - if (type.IsValueType && value == null) - return false; - if (type.IsArray && type.GetElementType ().IsValueType) { - foreach (var v in (Array)value) { - if (v == null) - return false; - } - } - return true; - } - - private void Initialize (ConstructorInfo con, object [] constructorArgs, - PropertyInfo [] namedProperties, object [] propertyValues, - FieldInfo [] namedFields, object [] fieldValues) - { - ctor = con; - args = constructorArgs; - this.namedProperties = namedProperties; - this.propertyValues = propertyValues; - this.namedFields = namedFields; - this.fieldValues = fieldValues; - - if (con == null) - throw new ArgumentNullException ("con"); - if (constructorArgs == null) - throw new ArgumentNullException ("constructorArgs"); - if (namedProperties == null) - throw new ArgumentNullException ("namedProperties"); - if (propertyValues == null) - throw new ArgumentNullException ("propertyValues"); - if (namedFields == null) - throw new ArgumentNullException ("namedFields"); - if (fieldValues == null) - throw new ArgumentNullException ("fieldValues"); - if (con.GetParametersCount () != constructorArgs.Length) - throw new ArgumentException ("Parameter count does not match " + - "passed in argument value count."); - if (namedProperties.Length != propertyValues.Length) - throw new ArgumentException ("Array lengths must be the same.", - "namedProperties, propertyValues"); - if (namedFields.Length != fieldValues.Length) - throw new ArgumentException ("Array lengths must be the same.", - "namedFields, fieldValues"); - if ((con.Attributes & MethodAttributes.Static) == MethodAttributes.Static || - (con.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Private) - throw new ArgumentException ("Cannot have private or static constructor."); - - Type atype = ctor.DeclaringType; - int i; - i = 0; - foreach (FieldInfo fi in namedFields) { - Type t = fi.DeclaringType; - if ((atype != t) && (!t.IsSubclassOf (atype)) && (!atype.IsSubclassOf (t))) - throw new ArgumentException ("Field '" + fi.Name + "' does not belong to the same class as the constructor"); - if (!IsValidType (fi.FieldType)) - throw new ArgumentException ("Field '" + fi.Name + "' does not have a valid type."); - if (!IsValidValue (fi.FieldType, fieldValues [i])) - throw new ArgumentException ("Field " + fi.Name + " is not a valid value."); - // FIXME: Check enums and TypeBuilders as well - if (fieldValues [i] != null) - // IsEnum does not seem to work on TypeBuilders - if (!(fi.FieldType is TypeBuilder) && !fi.FieldType.IsEnum && !fi.FieldType.IsInstanceOfType (fieldValues [i])) { - // - // mcs allways uses object[] for array types and - // MS.NET allows this - // - if (!fi.FieldType.IsArray) - throw new ArgumentException ("Value of field '" + fi.Name + "' does not match field type: " + fi.FieldType); - } - i ++; - } - - i = 0; - foreach (PropertyInfo pi in namedProperties) { - if (!pi.CanWrite) - throw new ArgumentException ("Property '" + pi.Name + "' does not have a setter."); - Type t = pi.DeclaringType; - if ((atype != t) && (!t.IsSubclassOf (atype)) && (!atype.IsSubclassOf (t))) - throw new ArgumentException ("Property '" + pi.Name + "' does not belong to the same class as the constructor"); - if (!IsValidType (pi.PropertyType)) - throw new ArgumentException ("Property '" + pi.Name + "' does not have a valid type."); - if (!IsValidValue (pi.PropertyType, propertyValues [i])) - throw new ArgumentException ("Property " + pi.Name + " is not a valid value."); - if (propertyValues [i] != null) { - if (!(pi.PropertyType is TypeBuilder) && !pi.PropertyType.IsEnum && !pi.PropertyType.IsInstanceOfType (propertyValues [i])) - if (!pi.PropertyType.IsArray) - throw new ArgumentException ("Value of property '" + pi.Name + "' does not match property type: " + pi.PropertyType + " -> " + propertyValues [i]); - } - i ++; - } - - i = 0; - foreach (ParameterInfo pi in GetParameters (con)) { - if (pi != null) { - Type paramType = pi.ParameterType; - if (!IsValidType (paramType)) - throw new ArgumentException ("Parameter " + i + " does not have a valid type."); - if (!IsValidValue (paramType, constructorArgs [i])) - throw new ArgumentException ("Parameter " + i + " is not a valid value."); - - if (constructorArgs [i] != null) { - if (!(paramType is TypeBuilder) && !paramType.IsEnum && !paramType.IsInstanceOfType (constructorArgs [i])) - if (!paramType.IsArray) - throw new ArgumentException ("Value of argument " + i + " does not match parameter type: " + paramType + " -> " + constructorArgs [i]); - if (!IsValidParam (constructorArgs [i], paramType)) - throw new ArgumentException ("Cannot emit a CustomAttribute with argument of type " + constructorArgs [i].GetType () + "."); - } - } - i ++; - } - - data = GetBlob (atype.Assembly, con, constructorArgs, namedProperties, propertyValues, namedFields, fieldValues); - } - - /* helper methods */ - internal static int decode_len (byte[] data, int pos, out int rpos) { - int len = 0; - if ((data [pos] & 0x80) == 0) { - len = (int)(data [pos++] & 0x7f); - } else if ((data [pos] & 0x40) == 0) { - len = ((data [pos] & 0x3f) << 8) + data [pos + 1]; - pos += 2; - } else { - len = ((data [pos] & 0x1f) << 24) + (data [pos + 1] << 16) + (data [pos + 2] << 8) + data [pos + 3]; - pos += 4; - } - rpos = pos; - return len; - } - - internal static string string_from_bytes (byte[] data, int pos, int len) - { - return System.Text.Encoding.UTF8.GetString(data, pos, len); - } - - internal static string decode_string (byte [] data, int pos, out int rpos) - { - if (data [pos] == 0xff) { - rpos = pos + 1; - return null; - } else { - int len = decode_len (data, pos, out pos); - string s = string_from_bytes (data, pos, len); - pos += len; - rpos = pos; - return s; - } - } - - internal string string_arg () - { - int pos = 2; - return decode_string (data, pos, out pos); - } - - internal static UnmanagedMarshal get_umarshal (CustomAttributeBuilder customBuilder, bool is_field) { - byte[] data = customBuilder.Data; - UnmanagedType subtype = (UnmanagedType)0x50; /* NATIVE_MAX */ - int sizeConst = -1; - int sizeParamIndex = -1; - bool hasSize = false; - int value; - int utype; /* the (stupid) ctor takes a short or an enum ... */ - string marshalTypeName = null; - Type marshalTypeRef = null; - string marshalCookie = String.Empty; - utype = (int)data [2]; - utype |= ((int)data [3]) << 8; - - string first_type_name = GetParameters (customBuilder.Ctor) [0].ParameterType.FullName; - int pos = 6; - if (first_type_name == "System.Int16") - pos = 4; - int nnamed = (int)data [pos++]; - nnamed |= ((int)data [pos++]) << 8; - - for (int i = 0; i < nnamed; ++i) { - int paramType; // What is this ? - - /* Skip field/property signature */ - int fieldPropSig = (int)data [pos ++]; - /* Read type */ - paramType = ((int)data [pos++]); - if (paramType == 0x55) { - /* enums, the value is preceeded by the type */ - decode_string (data, pos, out pos); - } - string named_name = decode_string (data, pos, out pos); - - switch (named_name) { - case "ArraySubType": - value = (int)data [pos++]; - value |= ((int)data [pos++]) << 8; - value |= ((int)data [pos++]) << 16; - value |= ((int)data [pos++]) << 24; - subtype = (UnmanagedType)value; - break; - case "SizeConst": - value = (int)data [pos++]; - value |= ((int)data [pos++]) << 8; - value |= ((int)data [pos++]) << 16; - value |= ((int)data [pos++]) << 24; - sizeConst = value; - hasSize = true; - break; - case "SafeArraySubType": - value = (int)data[pos++]; - value |= ((int)data[pos++]) << 8; - value |= ((int)data[pos++]) << 16; - value |= ((int)data[pos++]) << 24; - subtype = (UnmanagedType)value; - break; - case "IidParameterIndex": - pos += 4; - break; - case "SafeArrayUserDefinedSubType": - decode_string (data, pos, out pos); - break; - case "SizeParamIndex": - value = (int)data [pos++]; - value |= ((int)data [pos++]) << 8; - sizeParamIndex = value; - hasSize = true; - break; - case "MarshalType": - marshalTypeName = decode_string (data, pos, out pos); - break; - case "MarshalTypeRef": - marshalTypeName = decode_string (data, pos, out pos); - if (marshalTypeName != null) - marshalTypeRef = Type.GetType (marshalTypeName); - break; - case "MarshalCookie": - marshalCookie = decode_string (data, pos, out pos); - break; - default: - throw new Exception ("Unknown MarshalAsAttribute field: " + named_name); - } - } - - switch ((UnmanagedType)utype) { - case UnmanagedType.LPArray: - if (hasSize) - return UnmanagedMarshal.DefineLPArrayInternal (subtype, sizeConst, sizeParamIndex); - else - return UnmanagedMarshal.DefineLPArray (subtype); +namespace System.Reflection.Emit +{ + [StructLayout(LayoutKind.Sequential)] + public partial class CustomAttributeBuilder + { + private ConstructorInfo ctor; + private byte[] data; + private object[] args; + private PropertyInfo[] namedProperties; + private object[] propertyValues; + private FieldInfo[] namedFields; + private object[] fieldValues; + + internal ConstructorInfo Ctor + { + get { return ctor; } + } + + internal byte[] Data + { + get { return data; } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern byte[] GetBlob(Assembly asmb, ConstructorInfo con, object[] constructorArgs, PropertyInfo[] namedProperties, object[] propertyValues, FieldInfo[] namedFields, object[] fieldValues); + + internal object Invoke() + { + object result = ctor.Invoke(args); + + for (int i = 0; i < namedFields.Length; i++) + namedFields[i].SetValue(result, fieldValues[i]); + + for (int i = 0; i < namedProperties.Length; i++) + namedProperties[i].SetValue(result, propertyValues[i]); + + return result; + } + + internal CustomAttributeBuilder(ConstructorInfo con, byte[] binaryAttribute) + { + if (con == null) + throw new ArgumentNullException(nameof(con)); + if (binaryAttribute == null) + throw new ArgumentNullException(nameof(binaryAttribute)); + ctor = con; + data = (byte[])binaryAttribute.Clone(); + /* should we check that the user supplied data is correct? */ + } + + public CustomAttributeBuilder(ConstructorInfo con, object[] constructorArgs) + { + Initialize(con, constructorArgs, Array.Empty(), Array.Empty(), + Array.Empty(), Array.Empty()); + } + public CustomAttributeBuilder(ConstructorInfo con, object[] constructorArgs, + FieldInfo[] namedFields, object[] fieldValues) + { + Initialize(con, constructorArgs, Array.Empty(), Array.Empty(), + namedFields, fieldValues); + } + public CustomAttributeBuilder(ConstructorInfo con, object[] constructorArgs, + PropertyInfo[] namedProperties, object[] propertyValues) + { + Initialize(con, constructorArgs, namedProperties, propertyValues, Array.Empty(), + Array.Empty()); + } + public CustomAttributeBuilder(ConstructorInfo con, object[] constructorArgs, + PropertyInfo[] namedProperties, object[] propertyValues, + FieldInfo[] namedFields, object[] fieldValues) + { + Initialize(con, constructorArgs, namedProperties, propertyValues, namedFields, fieldValues); + } + + private bool IsValidType(Type t) + { + /* FIXME: Add more checks */ + if (t.IsArray && t.GetArrayRank() > 1) + return false; + if (t is TypeBuilder && t.IsEnum) + { + // Check that the enum is properly constructed, the unmanaged code + // depends on this + Enum.GetUnderlyingType(t); + } + if (t.IsClass && !(t.IsArray || t == typeof(object) || t == typeof(Type) || t == typeof(string) || t.Assembly.GetName().Name == "mscorlib")) + return false; + if (t.IsValueType && !(t.IsPrimitive || t.IsEnum || ((t.Assembly is AssemblyBuilder) && t.Assembly.GetName().Name == "mscorlib"))) + return false; + return true; + } + + private bool IsValidParam(object o, Type paramType) + { + Type t = o.GetType(); + if (!IsValidType(t)) + return false; + if (paramType == typeof(object)) + { + if (t.IsArray && t.GetArrayRank() == 1) + return IsValidType(t.GetElementType()); + if (!t.IsPrimitive && !typeof(Type).IsAssignableFrom(t) && t != typeof(string) && !t.IsEnum) + return false; + } + return true; + } + + private static bool IsValidValue(Type type, object value) + { + if (type.IsValueType && value == null) + return false; + if (type.IsArray && type.GetElementType().IsValueType) + { + foreach (var v in (Array)value) + { + if (v == null) + return false; + } + } + return true; + } + + private void Initialize(ConstructorInfo con, object[] constructorArgs, + PropertyInfo[] namedProperties, object[] propertyValues, + FieldInfo[] namedFields, object[] fieldValues) + { + ctor = con; + args = constructorArgs; + this.namedProperties = namedProperties; + this.propertyValues = propertyValues; + this.namedFields = namedFields; + this.fieldValues = fieldValues; + + if (con == null) + throw new ArgumentNullException(nameof(con)); + if (constructorArgs == null) + throw new ArgumentNullException(nameof(constructorArgs)); + if (namedProperties == null) + throw new ArgumentNullException(nameof(namedProperties)); + if (propertyValues == null) + throw new ArgumentNullException(nameof(propertyValues)); + if (namedFields == null) + throw new ArgumentNullException(nameof(namedFields)); + if (fieldValues == null) + throw new ArgumentNullException(nameof(fieldValues)); + if (con.GetParametersCount() != constructorArgs.Length) + throw new ArgumentException("Parameter count does not match " + + "passed in argument value count."); + if (namedProperties.Length != propertyValues.Length) + throw new ArgumentException("Array lengths must be the same.", + "namedProperties, propertyValues"); + if (namedFields.Length != fieldValues.Length) + throw new ArgumentException("Array lengths must be the same.", + "namedFields, fieldValues"); + if ((con.Attributes & MethodAttributes.Static) == MethodAttributes.Static || + (con.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Private) + throw new ArgumentException("Cannot have private or static constructor."); + + Type atype = ctor.DeclaringType; + int i; + i = 0; + foreach (FieldInfo fi in namedFields) + { + Type t = fi.DeclaringType; + if ((atype != t) && (!t.IsSubclassOf(atype)) && (!atype.IsSubclassOf(t))) + throw new ArgumentException("Field '" + fi.Name + "' does not belong to the same class as the constructor"); + if (!IsValidType(fi.FieldType)) + throw new ArgumentException("Field '" + fi.Name + "' does not have a valid type."); + if (!IsValidValue(fi.FieldType, fieldValues[i])) + throw new ArgumentException("Field " + fi.Name + " is not a valid value."); + // FIXME: Check enums and TypeBuilders as well + if (fieldValues[i] != null) + // IsEnum does not seem to work on TypeBuilders + if (!(fi.FieldType is TypeBuilder) && !fi.FieldType.IsEnum && !fi.FieldType.IsInstanceOfType(fieldValues[i])) + { + // + // mcs allways uses object[] for array types and + // MS.NET allows this + // + if (!fi.FieldType.IsArray) + throw new ArgumentException("Value of field '" + fi.Name + "' does not match field type: " + fi.FieldType); + } + i++; + } + + i = 0; + foreach (PropertyInfo pi in namedProperties) + { + if (!pi.CanWrite) + throw new ArgumentException("Property '" + pi.Name + "' does not have a setter."); + Type t = pi.DeclaringType; + if ((atype != t) && (!t.IsSubclassOf(atype)) && (!atype.IsSubclassOf(t))) + throw new ArgumentException("Property '" + pi.Name + "' does not belong to the same class as the constructor"); + if (!IsValidType(pi.PropertyType)) + throw new ArgumentException("Property '" + pi.Name + "' does not have a valid type."); + if (!IsValidValue(pi.PropertyType, propertyValues[i])) + throw new ArgumentException("Property " + pi.Name + " is not a valid value."); + if (propertyValues[i] != null) + { + if (!(pi.PropertyType is TypeBuilder) && !pi.PropertyType.IsEnum && !pi.PropertyType.IsInstanceOfType(propertyValues[i])) + if (!pi.PropertyType.IsArray) + throw new ArgumentException("Value of property '" + pi.Name + "' does not match property type: " + pi.PropertyType + " -> " + propertyValues[i]); + } + i++; + } + + i = 0; + foreach (ParameterInfo pi in GetParameters(con)) + { + if (pi != null) + { + Type paramType = pi.ParameterType; + if (!IsValidType(paramType)) + throw new ArgumentException("Parameter " + i + " does not have a valid type."); + if (!IsValidValue(paramType, constructorArgs[i])) + throw new ArgumentException("Parameter " + i + " is not a valid value."); + + if (constructorArgs[i] != null) + { + if (!(paramType is TypeBuilder) && !paramType.IsEnum && !paramType.IsInstanceOfType(constructorArgs[i])) + if (!paramType.IsArray) + throw new ArgumentException("Value of argument " + i + " does not match parameter type: " + paramType + " -> " + constructorArgs[i]); + if (!IsValidParam(constructorArgs[i], paramType)) + throw new ArgumentException("Cannot emit a CustomAttribute with argument of type " + constructorArgs[i].GetType() + "."); + } + } + i++; + } + + data = GetBlob(atype.Assembly, con, constructorArgs, namedProperties, propertyValues, namedFields, fieldValues); + } + + /* helper methods */ + internal static int decode_len(byte[] data, int pos, out int rpos) + { + int len = 0; + if ((data[pos] & 0x80) == 0) + { + len = (int)(data[pos++] & 0x7f); + } + else if ((data[pos] & 0x40) == 0) + { + len = ((data[pos] & 0x3f) << 8) + data[pos + 1]; + pos += 2; + } + else + { + len = ((data[pos] & 0x1f) << 24) + (data[pos + 1] << 16) + (data[pos + 2] << 8) + data[pos + 3]; + pos += 4; + } + rpos = pos; + return len; + } + + internal static string string_from_bytes(byte[] data, int pos, int len) + { + return Text.Encoding.UTF8.GetString(data, pos, len); + } + + internal static string decode_string(byte[] data, int pos, out int rpos) + { + if (data[pos] == 0xff) + { + rpos = pos + 1; + return null; + } + else + { + int len = decode_len(data, pos, out pos); + string s = string_from_bytes(data, pos, len); + pos += len; + rpos = pos; + return s; + } + } + + internal string string_arg() + { + int pos = 2; + return decode_string(data, pos, out pos); + } + + internal static UnmanagedMarshal get_umarshal(CustomAttributeBuilder customBuilder, bool is_field) + { + byte[] data = customBuilder.Data; + UnmanagedType subtype = (UnmanagedType)0x50; /* NATIVE_MAX */ + int sizeConst = -1; + int sizeParamIndex = -1; + bool hasSize = false; + int value; + int utype; /* the (stupid) ctor takes a short or an enum ... */ + string marshalTypeName = null; + Type marshalTypeRef = null; + string marshalCookie = string.Empty; + utype = (int)data[2]; + utype |= ((int)data[3]) << 8; + + string first_type_name = GetParameters(customBuilder.Ctor)[0].ParameterType.FullName; + int pos = 6; + if (first_type_name == "System.Int16") + pos = 4; + int nnamed = (int)data[pos++]; + nnamed |= ((int)data[pos++]) << 8; + + for (int i = 0; i < nnamed; ++i) + { + int paramType; // What is this ? + + /* Skip field/property signature */ + int fieldPropSig = (int)data[pos++]; + /* Read type */ + paramType = ((int)data[pos++]); + if (paramType == 0x55) + { + /* enums, the value is preceeded by the type */ + decode_string(data, pos, out pos); + } + string named_name = decode_string(data, pos, out pos); + + switch (named_name) + { + case "ArraySubType": + value = (int)data[pos++]; + value |= ((int)data[pos++]) << 8; + value |= ((int)data[pos++]) << 16; + value |= ((int)data[pos++]) << 24; + subtype = (UnmanagedType)value; + break; + case "SizeConst": + value = (int)data[pos++]; + value |= ((int)data[pos++]) << 8; + value |= ((int)data[pos++]) << 16; + value |= ((int)data[pos++]) << 24; + sizeConst = value; + hasSize = true; + break; + case "SafeArraySubType": + value = (int)data[pos++]; + value |= ((int)data[pos++]) << 8; + value |= ((int)data[pos++]) << 16; + value |= ((int)data[pos++]) << 24; + subtype = (UnmanagedType)value; + break; + case "IidParameterIndex": + pos += 4; + break; + case "SafeArrayUserDefinedSubType": + decode_string(data, pos, out pos); + break; + case "SizeParamIndex": + value = (int)data[pos++]; + value |= ((int)data[pos++]) << 8; + sizeParamIndex = value; + hasSize = true; + break; + case "MarshalType": + marshalTypeName = decode_string(data, pos, out pos); + break; + case "MarshalTypeRef": + marshalTypeName = decode_string(data, pos, out pos); + if (marshalTypeName != null) + marshalTypeRef = Type.GetType(marshalTypeName); + break; + case "MarshalCookie": + marshalCookie = decode_string(data, pos, out pos); + break; + default: + throw new Exception("Unknown MarshalAsAttribute field: " + named_name); + } + } + + switch ((UnmanagedType)utype) + { + case UnmanagedType.LPArray: + if (hasSize) + return UnmanagedMarshal.DefineLPArrayInternal(subtype, sizeConst, sizeParamIndex); + else + return UnmanagedMarshal.DefineLPArray(subtype); #if FEATURE_COMINTEROP case UnmanagedType.SafeArray: return UnmanagedMarshal.DefineSafeArray (subtype); #endif - case UnmanagedType.ByValArray: - if (!is_field) - throw new ArgumentException ("Specified unmanaged type is only valid on fields"); - - return UnmanagedMarshal.DefineByValArray (sizeConst); - case UnmanagedType.ByValTStr: - return UnmanagedMarshal.DefineByValTStr (sizeConst); + case UnmanagedType.ByValArray: + if (!is_field) + throw new ArgumentException("Specified unmanaged type is only valid on fields"); + + return UnmanagedMarshal.DefineByValArray(sizeConst); + case UnmanagedType.ByValTStr: + return UnmanagedMarshal.DefineByValTStr(sizeConst); #if FEATURE_COMINTEROP case UnmanagedType.CustomMarshaler: return UnmanagedMarshal.DefineCustom (marshalTypeRef, marshalCookie, marshalTypeName, Guid.Empty); #endif - default: - return UnmanagedMarshal.DefineUnmanagedMarshal ((UnmanagedType)utype); - } - } - - static Type elementTypeToType (int elementType) { - /* Partition II, section 23.1.16 */ - switch (elementType) { - case 0x02: - return typeof (bool); - case 0x03: - return typeof (char); - case 0x04: - return typeof (sbyte); - case 0x05: - return typeof (byte); - case 0x06: - return typeof (short); - case 0x07: - return typeof (ushort); - case 0x08: - return typeof (int); - case 0x09: - return typeof (uint); - case 0x0a: - return typeof (long); - case 0x0b: - return typeof (ulong); - case 0x0c: - return typeof (float); - case 0x0d: - return typeof (double); - case 0x0e: - return typeof (string); - default: - throw new Exception ("Unknown element type '" + elementType + "'"); - } - } - - static object decode_cattr_value (Type t, byte[] data, int pos, out int rpos) { - switch (Type.GetTypeCode (t)) { - case TypeCode.String: - if (data [pos] == 0xff) { - rpos = pos + 1; - return null; - } - int len = decode_len (data, pos, out pos); - rpos = pos + len; - return string_from_bytes (data, pos, len); - case TypeCode.Int32: - rpos = pos + 4; - return data [pos] + (data [pos + 1] << 8) + (data [pos + 2] << 16) + (data [pos + 3] << 24); - case TypeCode.Boolean: - rpos = pos + 1; - return (data [pos] == 0) ? false : true; - case TypeCode.Object: - int subtype = data [pos]; - pos += 1; - - if (subtype >= 0x02 && subtype <= 0x0e) - return decode_cattr_value (elementTypeToType (subtype), data, pos, out rpos); - else - throw new Exception ("Subtype '" + subtype + "' of type object not yet handled in decode_cattr_value"); - default: - throw new Exception ("FIXME: Type " + t + " not yet handled in decode_cattr_value."); - } - } - - internal struct CustomAttributeInfo { - public ConstructorInfo ctor; - public object[] ctorArgs; - public string[] namedParamNames; - public object[] namedParamValues; - } - - internal static CustomAttributeInfo decode_cattr (CustomAttributeBuilder customBuilder) { - byte[] data = customBuilder.Data; - ConstructorInfo ctor = customBuilder.Ctor; - int pos = 0; - - CustomAttributeInfo info = new CustomAttributeInfo (); - - // Prolog - if (data.Length < 2) - throw new Exception ("Custom attr length is only '" + data.Length + "'"); - if ((data [0] != 0x1) || (data [1] != 0x00)) - throw new Exception ("Prolog invalid"); - pos = 2; - - ParameterInfo [] pi = GetParameters (ctor); - info.ctor = ctor; - info.ctorArgs = new object [pi.Length]; - for (int i = 0; i < pi.Length; ++i) - info.ctorArgs [i] = decode_cattr_value (pi [i].ParameterType, data, pos, out pos); - - int num_named = data [pos] + (data [pos + 1] * 256); - pos += 2; - - info.namedParamNames = new string [num_named]; - info.namedParamValues = new object [num_named]; - for (int i = 0; i < num_named; ++i) { - int named_type = data [pos++]; - int data_type = data [pos++]; - string enum_type_name = null; - - if (data_type == 0x55) { - int len2 = decode_len (data, pos, out pos); - enum_type_name = string_from_bytes (data, pos, len2); - pos += len2; - } - - int len = decode_len (data, pos, out pos); - string name = string_from_bytes (data, pos, len); - info.namedParamNames [i] = name; - pos += len; - - if (named_type == 0x53) { - /* Field */ - FieldInfo fi = ctor.DeclaringType.GetField (name, BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance); - if (fi == null) - throw new Exception ("Custom attribute type '" + ctor.DeclaringType + "' doesn't contain a field named '" + name + "'"); - - object val = decode_cattr_value (fi.FieldType, data, pos, out pos); - if (enum_type_name != null) { - Type enumType = Type.GetType (enum_type_name); - val = Enum.ToObject (enumType, val); - } - - info.namedParamValues [i] = val; - } - else - // FIXME: - throw new Exception ("Unknown named type: " + named_type); - } - - return info; - } - - static ParameterInfo [] GetParameters (ConstructorInfo ctor) - { - ConstructorBuilder cb = ctor as ConstructorBuilder; - if (cb != null) - return cb.GetParametersInternal (); - - return ctor.GetParametersInternal (); - } - } + default: + return UnmanagedMarshal.DefineUnmanagedMarshal((UnmanagedType)utype); + } + } + + private static Type elementTypeToType(int elementType) + { + /* Partition II, section 23.1.16 */ + switch (elementType) + { + case 0x02: + return typeof(bool); + case 0x03: + return typeof(char); + case 0x04: + return typeof(sbyte); + case 0x05: + return typeof(byte); + case 0x06: + return typeof(short); + case 0x07: + return typeof(ushort); + case 0x08: + return typeof(int); + case 0x09: + return typeof(uint); + case 0x0a: + return typeof(long); + case 0x0b: + return typeof(ulong); + case 0x0c: + return typeof(float); + case 0x0d: + return typeof(double); + case 0x0e: + return typeof(string); + default: + throw new Exception("Unknown element type '" + elementType + "'"); + } + } + + private static object decode_cattr_value(Type t, byte[] data, int pos, out int rpos) + { + switch (Type.GetTypeCode(t)) + { + case TypeCode.String: + if (data[pos] == 0xff) + { + rpos = pos + 1; + return null; + } + int len = decode_len(data, pos, out pos); + rpos = pos + len; + return string_from_bytes(data, pos, len); + case TypeCode.Int32: + rpos = pos + 4; + return data[pos] + (data[pos + 1] << 8) + (data[pos + 2] << 16) + (data[pos + 3] << 24); + case TypeCode.Boolean: + rpos = pos + 1; + return (data[pos] == 0) ? false : true; + case TypeCode.Object: + int subtype = data[pos]; + pos += 1; + + if (subtype >= 0x02 && subtype <= 0x0e) + return decode_cattr_value(elementTypeToType(subtype), data, pos, out rpos); + else + throw new Exception("Subtype '" + subtype + "' of type object not yet handled in decode_cattr_value"); + default: + throw new Exception("FIXME: Type " + t + " not yet handled in decode_cattr_value."); + } + } + + internal struct CustomAttributeInfo + { + public ConstructorInfo ctor; + public object[] ctorArgs; + public string[] namedParamNames; + public object[] namedParamValues; + } + + internal static CustomAttributeInfo decode_cattr(CustomAttributeBuilder customBuilder) + { + byte[] data = customBuilder.Data; + ConstructorInfo ctor = customBuilder.Ctor; + int pos = 0; + + CustomAttributeInfo info = default; + + // Prolog + if (data.Length < 2) + throw new Exception("Custom attr length is only '" + data.Length + "'"); + if ((data[0] != 0x1) || (data[1] != 0x00)) + throw new Exception("Prolog invalid"); + pos = 2; + + ParameterInfo[] pi = GetParameters(ctor); + info.ctor = ctor; + info.ctorArgs = new object[pi.Length]; + for (int i = 0; i < pi.Length; ++i) + info.ctorArgs[i] = decode_cattr_value(pi[i].ParameterType, data, pos, out pos); + + int num_named = data[pos] + (data[pos + 1] * 256); + pos += 2; + + info.namedParamNames = new string[num_named]; + info.namedParamValues = new object[num_named]; + for (int i = 0; i < num_named; ++i) + { + int named_type = data[pos++]; + int data_type = data[pos++]; + string enum_type_name = null; + + if (data_type == 0x55) + { + int len2 = decode_len(data, pos, out pos); + enum_type_name = string_from_bytes(data, pos, len2); + pos += len2; + } + + int len = decode_len(data, pos, out pos); + string name = string_from_bytes(data, pos, len); + info.namedParamNames[i] = name; + pos += len; + + if (named_type == 0x53) + { + /* Field */ + FieldInfo fi = ctor.DeclaringType.GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + if (fi == null) + throw new Exception("Custom attribute type '" + ctor.DeclaringType + "' doesn't contain a field named '" + name + "'"); + + object val = decode_cattr_value(fi.FieldType, data, pos, out pos); + if (enum_type_name != null) + { + Type enumType = Type.GetType(enum_type_name); + val = Enum.ToObject(enumType, val); + } + + info.namedParamValues[i] = val; + } + else + // FIXME: + throw new Exception("Unknown named type: " + named_type); + } + + return info; + } + + private static ParameterInfo[] GetParameters(ConstructorInfo ctor) + { + ConstructorBuilder cb = ctor as ConstructorBuilder; + if (cb != null) + return cb.GetParametersInternal(); + + return ctor.GetParametersInternal(); + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs index 4b0361ce6997e..7be3181fc7b1a 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs @@ -1,10 +1,8 @@ -#nullable disable - // // System.Reflection.Emit.DerivedTypes.cs // // Authors: -// Rodrigo Kumpera +// Rodrigo Kumpera // // // Copyright (C) 2009 Novell, Inc (http://www.novell.com) @@ -29,6 +27,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System.Reflection; using System.Reflection.Emit; @@ -42,106 +41,117 @@ namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - abstract partial class SymbolType : TypeInfo - { - internal Type m_baseType; - - internal SymbolType (Type elementType) - { - this.m_baseType = elementType; - } - - internal abstract String FormatName (string elementName); - - protected override bool IsArrayImpl () - { - return false; - } - - protected override bool IsByRefImpl () - { - return false; - } - - protected override bool IsPointerImpl () - { - return false; - } - - public override Type MakeArrayType () - { - return new ArrayType (this, 0); - } - - public override Type MakeArrayType (int rank) - { - if (rank < 1) - throw new IndexOutOfRangeException (); - return new ArrayType (this, rank); - } - - public override Type MakeByRefType () - { - return new ByRefType (this); - } - - public override Type MakePointerType () - { - return new PointerType (this); - } - - public override string ToString () - { - return FormatName (m_baseType.ToString ()); - } - - public override string AssemblyQualifiedName { - get { - string fullName = FormatName (m_baseType.FullName); - if (fullName == null) - return null; - return fullName + ", " + m_baseType.Assembly.FullName; - } - } - - - public override string FullName { - get { - return FormatName (m_baseType.FullName); - } - } - - public override string Name { - get { - return FormatName (m_baseType.Name); - } - } - - public override Type UnderlyingSystemType { - get { - return this; - } - } - - internal override bool IsUserType { - get { - return m_baseType.IsUserType; - } - } - - // Called from the runtime to return the corresponding finished Type object - internal override Type RuntimeResolve () { - return InternalResolve (); - } + [StructLayout(LayoutKind.Sequential)] + internal abstract partial class SymbolType : TypeInfo + { + internal Type m_baseType; + + internal SymbolType(Type elementType) + { + this.m_baseType = elementType; + } + + internal abstract string FormatName(string elementName); + + protected override bool IsArrayImpl() + { + return false; + } + + protected override bool IsByRefImpl() + { + return false; + } + + protected override bool IsPointerImpl() + { + return false; + } + + public override Type MakeArrayType() + { + return new ArrayType(this, 0); + } + + public override Type MakeArrayType(int rank) + { + if (rank < 1) + throw new IndexOutOfRangeException(); + return new ArrayType(this, rank); + } + + public override Type MakeByRefType() + { + return new ByRefType(this); + } + + public override Type MakePointerType() + { + return new PointerType(this); + } + + public override string ToString() + { + return FormatName(m_baseType.ToString()); + } + + public override string AssemblyQualifiedName + { + get + { + string fullName = FormatName(m_baseType.FullName); + if (fullName == null) + return null; + return fullName + ", " + m_baseType.Assembly.FullName; + } + } + + + public override string FullName + { + get + { + return FormatName(m_baseType.FullName); + } + } + + public override string Name + { + get + { + return FormatName(m_baseType.Name); + } + } + + public override Type UnderlyingSystemType + { + get + { + return this; + } + } + + internal override bool IsUserType + { + get + { + return m_baseType.IsUserType; + } + } + + // Called from the runtime to return the corresponding finished Type object + internal override Type RuntimeResolve() + { + return InternalResolve(); + } public override Guid GUID { get { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } } - public override Object InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, - Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters) + public override object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, + object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } @@ -152,7 +162,7 @@ public override Module Module { Type baseType; - for (baseType = m_baseType; baseType is SymbolType; baseType = ((SymbolType) baseType).m_baseType); + for (baseType = m_baseType; baseType is SymbolType; baseType = ((SymbolType)baseType).m_baseType) ; return baseType.Module; } @@ -163,7 +173,7 @@ public override Assembly Assembly { Type baseType; - for (baseType = m_baseType; baseType is SymbolType; baseType = ((SymbolType) baseType).m_baseType); + for (baseType = m_baseType; baseType is SymbolType; baseType = ((SymbolType)baseType).m_baseType) ; return baseType.Assembly; } @@ -171,10 +181,10 @@ public override Assembly Assembly public override RuntimeTypeHandle TypeHandle { - get { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } + get { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } } - public override String Namespace + public override string Namespace { get { return m_baseType.Namespace; } } @@ -184,8 +194,8 @@ public override Type BaseType get { return typeof(System.Array); } } - protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr,Binder binder, - CallingConventions callConvention, Type[] types,ParameterModifier[] modifiers) + protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr, Binder binder, + CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } @@ -195,8 +205,8 @@ public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr) throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } - protected override MethodInfo GetMethodImpl(String name,BindingFlags bindingAttr,Binder binder, - CallingConventions callConvention, Type[] types,ParameterModifier[] modifiers) + protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, + CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } @@ -206,7 +216,7 @@ public override MethodInfo[] GetMethods(BindingFlags bindingAttr) throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } - public override FieldInfo GetField(String name, BindingFlags bindingAttr) + public override FieldInfo GetField(string name, BindingFlags bindingAttr) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } @@ -216,7 +226,7 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } - public override Type GetInterface(String name,bool ignoreCase) + public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } @@ -226,7 +236,7 @@ public override Type[] GetInterfaces() throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } - public override EventInfo GetEvent(String name,BindingFlags bindingAttr) + public override EventInfo GetEvent(string name, BindingFlags bindingAttr) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } @@ -236,7 +246,7 @@ public override EventInfo[] GetEvents() throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } - protected override PropertyInfo GetPropertyImpl(String name, BindingFlags bindingAttr, Binder binder, + protected override PropertyInfo GetPropertyImpl(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); @@ -252,12 +262,12 @@ public override Type[] GetNestedTypes(BindingFlags bindingAttr) throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } - public override Type GetNestedType(String name, BindingFlags bindingAttr) + public override Type GetNestedType(string name, BindingFlags bindingAttr) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } - public override MemberInfo[] GetMember(String name, MemberTypes type, BindingFlags bindingAttr) + public override MemberInfo[] GetMember(string name, MemberTypes type, BindingFlags bindingAttr) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } @@ -281,7 +291,7 @@ protected override TypeAttributes GetAttributeFlagsImpl() { // Return the attribute flags of the base type? Type baseType; - for (baseType = m_baseType; baseType is SymbolType; baseType = ((SymbolType)baseType).m_baseType); + for (baseType = m_baseType; baseType is SymbolType; baseType = ((SymbolType)baseType).m_baseType) ; return baseType.Attributes; } @@ -318,153 +328,155 @@ protected override bool HasElementTypeImpl() return m_baseType != null; } - public override Object[] GetCustomAttributes(bool inherit) + public override object[] GetCustomAttributes(bool inherit) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } - public override Object[] GetCustomAttributes(Type attributeType, bool inherit) + public override object[] GetCustomAttributes(Type attributeType, bool inherit) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } - public override bool IsDefined (Type attributeType, bool inherit) + public override bool IsDefined(Type attributeType, bool inherit) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType")); } - } - - [StructLayout (LayoutKind.Sequential)] - internal class ArrayType : SymbolType - { - int rank; - - internal ArrayType (Type elementType, int rank) : base (elementType) - { - this.rank = rank; - } - - internal int GetEffectiveRank () - { - return rank; - } - - internal override Type InternalResolve () - { - Type et = m_baseType.InternalResolve (); - if (rank == 0) - return et.MakeArrayType (); - return et.MakeArrayType (rank); - } - - internal override Type RuntimeResolve () - { - Type et = m_baseType.RuntimeResolve (); - if (rank == 0) - return et.MakeArrayType (); - return et.MakeArrayType (rank); - } - - protected override bool IsArrayImpl () - { - return true; - } - - public override bool IsSZArray { - get { - return rank == 0; - } - } - - public override int GetArrayRank () - { - return (rank == 0) ? 1 : rank; - } - - internal override String FormatName (string elementName) - { - if (elementName == null) - return null; - StringBuilder sb = new StringBuilder (elementName); - sb.Append ("["); - for (int i = 1; i < rank; ++i) - sb.Append (","); - if (rank == 1) - sb.Append ("*"); - sb.Append ("]"); - return sb.ToString (); - } - } - - [StructLayout (LayoutKind.Sequential)] - internal class ByRefType : SymbolType - { - internal ByRefType (Type elementType) : base (elementType) - { - } - - internal override Type InternalResolve () - { - return m_baseType.InternalResolve ().MakeByRefType (); - } - - protected override bool IsByRefImpl () - { - return true; - } - - internal override String FormatName (string elementName) - { - if (elementName == null) - return null; - return elementName + "&"; - } - - public override Type MakeArrayType () - { - throw new ArgumentException ("Cannot create an array type of a byref type"); - } - - public override Type MakeArrayType (int rank) - { - throw new ArgumentException ("Cannot create an array type of a byref type"); - } - - public override Type MakeByRefType () - { - throw new ArgumentException ("Cannot create a byref type of an already byref type"); - } - - public override Type MakePointerType () - { - throw new ArgumentException ("Cannot create a pointer type of a byref type"); - } - } - - [StructLayout (LayoutKind.Sequential)] - internal class PointerType : SymbolType - { - internal PointerType (Type elementType) : base (elementType) - { - } - - internal override Type InternalResolve () - { - return m_baseType.InternalResolve ().MakePointerType (); - } - - protected override bool IsPointerImpl () - { - return true; - } - - internal override String FormatName (string elementName) - { - if (elementName == null) - return null; - return elementName + "*"; - } - } + } + + [StructLayout(LayoutKind.Sequential)] + internal class ArrayType : SymbolType + { + private int rank; + + internal ArrayType(Type elementType, int rank) : base(elementType) + { + this.rank = rank; + } + + internal int GetEffectiveRank() + { + return rank; + } + + internal override Type InternalResolve() + { + Type et = m_baseType.InternalResolve(); + if (rank == 0) + return et.MakeArrayType(); + return et.MakeArrayType(rank); + } + + internal override Type RuntimeResolve() + { + Type et = m_baseType.RuntimeResolve(); + if (rank == 0) + return et.MakeArrayType(); + return et.MakeArrayType(rank); + } + + protected override bool IsArrayImpl() + { + return true; + } + + public override bool IsSZArray + { + get + { + return rank == 0; + } + } + + public override int GetArrayRank() + { + return (rank == 0) ? 1 : rank; + } + + internal override string FormatName(string elementName) + { + if (elementName == null) + return null; + StringBuilder sb = new StringBuilder(elementName); + sb.Append("["); + for (int i = 1; i < rank; ++i) + sb.Append(","); + if (rank == 1) + sb.Append("*"); + sb.Append("]"); + return sb.ToString(); + } + } + + [StructLayout(LayoutKind.Sequential)] + internal class ByRefType : SymbolType + { + internal ByRefType(Type elementType) : base(elementType) + { + } + + internal override Type InternalResolve() + { + return m_baseType.InternalResolve().MakeByRefType(); + } + + protected override bool IsByRefImpl() + { + return true; + } + + internal override string FormatName(string elementName) + { + if (elementName == null) + return null; + return elementName + "&"; + } + + public override Type MakeArrayType() + { + throw new ArgumentException("Cannot create an array type of a byref type"); + } + + public override Type MakeArrayType(int rank) + { + throw new ArgumentException("Cannot create an array type of a byref type"); + } + + public override Type MakeByRefType() + { + throw new ArgumentException("Cannot create a byref type of an already byref type"); + } + + public override Type MakePointerType() + { + throw new ArgumentException("Cannot create a pointer type of a byref type"); + } + } + + [StructLayout(LayoutKind.Sequential)] + internal class PointerType : SymbolType + { + internal PointerType(Type elementType) : base(elementType) + { + } + + internal override Type InternalResolve() + { + return m_baseType.InternalResolve().MakePointerType(); + } + + protected override bool IsPointerImpl() + { + return true; + } + + internal override string FormatName(string elementName) + { + if (elementName == null) + return null; + return elementName + "*"; + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILInfo.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILInfo.cs index 9501a83f44bd4..e2cf318f7b309 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILInfo.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILInfo.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit/DynamicILInfo.cs // @@ -15,10 +13,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -28,106 +26,125 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; using System.Runtime.InteropServices; -namespace System.Reflection.Emit { - - [ComVisible (true)] - public class DynamicILInfo { - - DynamicMethod method; - - internal DynamicILInfo () - { - } - - internal DynamicILInfo (DynamicMethod method) - { - this.method = method; - } - - public DynamicMethod DynamicMethod { - get { - return method; - } - } - - // FIXME: - public int GetTokenFor (byte[] signature) { - throw new NotImplementedException (); - } - - public int GetTokenFor (DynamicMethod method) { - return this.method.GetILGenerator ().TokenGenerator.GetToken (method, false); - } - - public int GetTokenFor (RuntimeFieldHandle field) { - return this.method.GetILGenerator ().TokenGenerator.GetToken (FieldInfo.GetFieldFromHandle (field), false); - } - - public int GetTokenFor (RuntimeMethodHandle method) { - MethodBase mi = MethodBase.GetMethodFromHandle (method); - return this.method.GetILGenerator ().TokenGenerator.GetToken (mi, false); - } - - public int GetTokenFor (RuntimeTypeHandle type) { - Type t = Type.GetTypeFromHandle (type); - return this.method.GetILGenerator ().TokenGenerator.GetToken (t, false); - } - - public int GetTokenFor (string literal) { - return method.GetILGenerator ().TokenGenerator.GetToken (literal); - } - - // FIXME: - public int GetTokenFor (RuntimeMethodHandle method, RuntimeTypeHandle contextType) { - throw new NotImplementedException (); - } - - // FIXME: - public int GetTokenFor (RuntimeFieldHandle field, RuntimeTypeHandle contextType) { - throw new NotImplementedException (); - } - - public void SetCode (byte[] code, int maxStackSize) { - if (code == null) - throw new ArgumentNullException ("code"); - method.GetILGenerator ().SetCode (code, maxStackSize); - } - - [CLSCompliantAttribute(false)] - public unsafe void SetCode (byte* code, int codeSize, int maxStackSize) { - if (code == null) - throw new ArgumentNullException ("code"); - method.GetILGenerator ().SetCode (code, codeSize, maxStackSize); - } - - // FIXME: - public void SetExceptions (byte[] exceptions) { - throw new NotImplementedException (); - } - - // FIXME: - [CLSCompliantAttribute(false)] - public unsafe void SetExceptions (byte* exceptions, int exceptionsSize) { - throw new NotImplementedException (); - } - - // FIXME: - public void SetLocalSignature (byte[] localSignature) { - throw new NotImplementedException (); - } - - [CLSCompliantAttribute(false)] - public unsafe void SetLocalSignature (byte* localSignature, int signatureSize) { - byte[] b = new byte [signatureSize]; - for (int i = 0; i < signatureSize; ++i) - b [i] = localSignature [i]; - } - } +namespace System.Reflection.Emit +{ + + [ComVisible(true)] + public class DynamicILInfo + { + + private DynamicMethod method; + + internal DynamicILInfo() + { + } + + internal DynamicILInfo(DynamicMethod method) + { + this.method = method; + } + + public DynamicMethod DynamicMethod + { + get + { + return method; + } + } + + // FIXME: + public int GetTokenFor(byte[] signature) + { + throw new NotImplementedException(); + } + + public int GetTokenFor(DynamicMethod method) + { + return this.method.GetILGenerator().TokenGenerator.GetToken(method, false); + } + + public int GetTokenFor(RuntimeFieldHandle field) + { + return this.method.GetILGenerator().TokenGenerator.GetToken(FieldInfo.GetFieldFromHandle(field), false); + } + + public int GetTokenFor(RuntimeMethodHandle method) + { + MethodBase mi = MethodBase.GetMethodFromHandle(method); + return this.method.GetILGenerator().TokenGenerator.GetToken(mi, false); + } + + public int GetTokenFor(RuntimeTypeHandle type) + { + Type t = Type.GetTypeFromHandle(type); + return this.method.GetILGenerator().TokenGenerator.GetToken(t, false); + } + + public int GetTokenFor(string literal) + { + return method.GetILGenerator().TokenGenerator.GetToken(literal); + } + + // FIXME: + public int GetTokenFor(RuntimeMethodHandle method, RuntimeTypeHandle contextType) + { + throw new NotImplementedException(); + } + + // FIXME: + public int GetTokenFor(RuntimeFieldHandle field, RuntimeTypeHandle contextType) + { + throw new NotImplementedException(); + } + + public void SetCode(byte[] code, int maxStackSize) + { + if (code == null) + throw new ArgumentNullException(nameof(code)); + method.GetILGenerator().SetCode(code, maxStackSize); + } + + [CLSCompliantAttribute(false)] + public unsafe void SetCode(byte* code, int codeSize, int maxStackSize) + { + if (code == null) + throw new ArgumentNullException(nameof(code)); + method.GetILGenerator().SetCode(code, codeSize, maxStackSize); + } + + // FIXME: + public void SetExceptions(byte[] exceptions) + { + throw new NotImplementedException(); + } + + // FIXME: + [CLSCompliantAttribute(false)] + public unsafe void SetExceptions(byte* exceptions, int exceptionsSize) + { + throw new NotImplementedException(); + } + + // FIXME: + public void SetLocalSignature(byte[] localSignature) + { + throw new NotImplementedException(); + } + + [CLSCompliantAttribute(false)] + public unsafe void SetLocalSignature(byte* localSignature, int signatureSize) + { + byte[] b = new byte[signatureSize]; + for (int i = 0; i < signatureSize; ++i) + b[i] = localSignature[i]; + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.cs index 13589e2c1cb94..3625b488b930d 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit.DynamicMethod.cs // @@ -20,10 +18,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -33,6 +31,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; @@ -43,439 +42,499 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection.Emit { +namespace System.Reflection.Emit +{ - [ComVisible (true)] - [StructLayout (LayoutKind.Sequential)] - public sealed class DynamicMethod : MethodInfo { + [ComVisible(true)] + [StructLayout(LayoutKind.Sequential)] + public sealed class DynamicMethod : MethodInfo + { #pragma warning disable 169, 414, 649 - #region Sync with reflection.h - private RuntimeMethodHandle mhandle; - private string name; - private Type returnType; - private Type[] parameters; - private MethodAttributes attributes; - private CallingConventions callingConvention; - private Module module; - private bool skipVisibility; - private bool init_locals = true; - private ILGenerator ilgen; - private int nrefs; - private object[] refs; - private IntPtr referenced_by; - private Type owner; - #endregion + #region Sync with reflection.h + private RuntimeMethodHandle mhandle; + private string name; + private Type returnType; + private Type[] parameters; + private MethodAttributes attributes; + private CallingConventions callingConvention; + private Module module; + private bool skipVisibility; + private bool init_locals = true; + private ILGenerator ilgen; + private int nrefs; + private object[] refs; + private IntPtr referenced_by; + private Type owner; + #endregion #pragma warning restore 169, 414, 649 - - private Delegate deleg; - private RuntimeMethodInfo method; - private ParameterBuilder[] pinfo; - internal bool creating; - private DynamicILInfo il_info; - - public DynamicMethod (string name, Type returnType, Type[] parameterTypes, Module m) : this (name, returnType, parameterTypes, m, false) { - } - - public DynamicMethod (string name, Type returnType, Type[] parameterTypes, Type owner) : this (name, returnType, parameterTypes, owner, false) { - } - - public DynamicMethod (string name, Type returnType, Type[] parameterTypes, Module m, bool skipVisibility) : this (name, MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, returnType, parameterTypes, m, skipVisibility) { - } - - public DynamicMethod (string name, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility) : this (name, MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, returnType, parameterTypes, owner, skipVisibility) { - } - - public DynamicMethod (string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility) : this (name, attributes, callingConvention, returnType, parameterTypes, owner, owner != null ? owner.Module : null, skipVisibility, false, true) { - } - - public DynamicMethod (string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Module m, bool skipVisibility) : this (name, attributes, callingConvention, returnType, parameterTypes, null, m, skipVisibility, false, false) { - } - - public DynamicMethod (string name, Type returnType, Type[] parameterTypes) : this (name, returnType, parameterTypes, false) { - } - - // FIXME: "Visibility is not restricted" - public DynamicMethod (string name, Type returnType, Type[] parameterTypes, bool restrictedSkipVisibility) - : this (name, MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, returnType, parameterTypes, null, null, restrictedSkipVisibility, true, false) - { - } - - DynamicMethod (string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type [] parameterTypes, Type owner, Module m, bool skipVisibility, bool anonHosted, bool typeOwner) - { - if (name == null) - throw new ArgumentNullException (nameof (name)); - if (returnType == null) - returnType = typeof (void); - if (owner == null && typeOwner) - throw new ArgumentNullException (nameof (owner)); - if ((m == null) && !anonHosted) - throw new ArgumentNullException (nameof (m)); - if (parameterTypes != null) { - for (int i = 0; i < parameterTypes.Length; ++i) - if (parameterTypes [i] == null) - throw new ArgumentException ($"Parameter {i} is null"); - } - if (owner != null && (owner.IsArray || owner.IsInterface)) { - throw new ArgumentException ("Owner can't be an array or an interface."); - } - - if (m == null) - m = AnonHostModuleHolder.AnonHostModule; - - this.name = name; - this.attributes = attributes | MethodAttributes.Static; - this.callingConvention = callingConvention; - this.returnType = returnType; - this.parameters = parameterTypes; - this.owner = owner; - this.module = m; - this.skipVisibility = skipVisibility; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern void create_dynamic_method (DynamicMethod m); - - private void CreateDynMethod () { - // Clearing of ilgen in create_dynamic_method is not yet synchronized for multiple threads - lock (this) { - if (mhandle.Value == IntPtr.Zero) { - if (ilgen == null || ilgen.ILOffset == 0) - throw new InvalidOperationException ("Method '" + name + "' does not have a method body."); - - ilgen.label_fixup (this); - - // Have to create all DynamicMethods referenced by this one - try { - // Used to avoid cycles - creating = true; - if (refs != null) { - for (int i = 0; i < refs.Length; ++i) { - if (refs [i] is DynamicMethod) { - DynamicMethod m = (DynamicMethod)refs [i]; - if (!m.creating) - m.CreateDynMethod (); - } - } - } - } finally { - creating = false; - } - create_dynamic_method (this); - ilgen = null; - } - } - } - - [ComVisible (true)] - sealed override - public Delegate CreateDelegate (Type delegateType) - { - if (delegateType == null) - throw new ArgumentNullException ("delegateType"); - if (deleg != null) - return deleg; - - CreateDynMethod (); - - deleg = Delegate.CreateDelegate (delegateType, null, this); - return deleg; - } - - [ComVisible (true)] - sealed override - public Delegate CreateDelegate (Type delegateType, object target) - { - if (delegateType == null) - throw new ArgumentNullException ("delegateType"); - - CreateDynMethod (); - - /* Can't cache the delegate since it is different for each target */ - return Delegate.CreateDelegate (delegateType, target, this); - } - - public ParameterBuilder DefineParameter (int position, ParameterAttributes attributes, string parameterName) - { - // - // Extension: Mono allows position == 0 for the return attribute - // - if ((position < 0) || (position > parameters.Length)) - throw new ArgumentOutOfRangeException ("position"); - - RejectIfCreated (); - - ParameterBuilder pb = new ParameterBuilder (this, position, attributes, parameterName); - if (pinfo == null) - pinfo = new ParameterBuilder [parameters.Length + 1]; - pinfo [position] = pb; - return pb; - } - - public override MethodInfo GetBaseDefinition () { - return this; - } - - public override object[] GetCustomAttributes (bool inherit) { - // support for MethodImplAttribute PCA - return new Object[] { new MethodImplAttribute((MethodImplOptions)GetMethodImplementationFlags()) }; - } - - public override object[] GetCustomAttributes (Type attributeType, - bool inherit) { - if (attributeType == null) - throw new ArgumentNullException ("attributeType"); - - if (attributeType.IsAssignableFrom (typeof (MethodImplAttribute))) - return new Object[] { new MethodImplAttribute ((MethodImplOptions)GetMethodImplementationFlags()) }; - else - return Array.Empty (); - } - - public DynamicILInfo GetDynamicILInfo () { - if (il_info == null) - il_info = new DynamicILInfo (this); - return il_info; - } - - public ILGenerator GetILGenerator () { - return GetILGenerator (64); - } - - public ILGenerator GetILGenerator (int streamSize) { - if (((GetMethodImplementationFlags () & MethodImplAttributes.CodeTypeMask) != - MethodImplAttributes.IL) || - ((GetMethodImplementationFlags () & MethodImplAttributes.ManagedMask) != - MethodImplAttributes.Managed)) - throw new InvalidOperationException ("Method body should not exist."); - if (ilgen != null) - return ilgen; - ilgen = new ILGenerator (Module, new DynamicMethodTokenGenerator (this), streamSize); - return ilgen; - } - - public override MethodImplAttributes GetMethodImplementationFlags () { - return MethodImplAttributes.IL | MethodImplAttributes.Managed | MethodImplAttributes.NoInlining; - } - - public override ParameterInfo[] GetParameters () - { - return GetParametersInternal (); - } - - internal override ParameterInfo[] GetParametersInternal () - { - if (parameters == null) - return Array.Empty (); - - ParameterInfo[] retval = new ParameterInfo [parameters.Length]; - for (int i = 0; i < parameters.Length; i++) { - retval [i] = RuntimeParameterInfo.New (pinfo?[i + 1], parameters [i], this, i + 1); - } - return retval; - } - - internal override int GetParametersCount () - { - return parameters == null ? 0 : parameters.Length; - } - - internal override Type GetParameterType (int pos) { - return parameters [pos]; - } - - /* - public override object Invoke (object obj, object[] parameters) { - CreateDynMethod (); - if (method == null) - method = new RuntimeMethodInfo (mhandle); - return method.Invoke (obj, parameters); - } - */ - - public override object Invoke (object obj, BindingFlags invokeAttr, - Binder binder, object[] parameters, - CultureInfo culture) - { - try { - CreateDynMethod (); - if (method == null) - method = new RuntimeMethodInfo (mhandle); - - return method.Invoke (obj, invokeAttr, binder, parameters, culture); - } - catch (MethodAccessException mae) { - throw new TargetInvocationException ("Method cannot be invoked.", mae); - } - } - - public override bool IsDefined (Type attributeType, bool inherit) { - if (attributeType == null) - throw new ArgumentNullException ("attributeType"); - - if (attributeType.IsAssignableFrom (typeof (MethodImplAttribute))) - return true; - else - return false; - } - - public override string ToString () { - var sbName = new ValueStringBuilder (MethodNameBufferSize); - sbName.Append (ReturnType.FormatTypeName ()); - sbName.Append (' '); - sbName.Append (Name); - sbName.Append ('('); - AppendParameters (ref sbName, parameters ?? Array.Empty (), CallingConvention); - sbName.Append (')'); - return sbName.ToString (); - } - - public override MethodAttributes Attributes { - get { - return attributes; - } - } - - public override CallingConventions CallingConvention { - get { - return callingConvention; - } - } - - public override Type DeclaringType { - get { - return null; - } - } - - public bool InitLocals { - get { - return init_locals; - } - set { - init_locals = value; - } - } - - public override RuntimeMethodHandle MethodHandle { - get { - return mhandle; - } - } - - public override Module Module { - get { - return module; - } - } - - public override string Name { - get { - return name; - } - } - - public override Type ReflectedType { - get { - return null; - } - } - - public override ParameterInfo ReturnParameter { - get { - if (deleg == null) { - return new RuntimeParameterInfo ((ParameterBuilder) null, returnType, this, -1); - } - return deleg.Method.ReturnParameter; - } - } - - public override Type ReturnType { - get { - return returnType; - } - } - - // FIXME: "Not implemented" - public override ICustomAttributeProvider ReturnTypeCustomAttributes { - get { - throw new NotImplementedException (); - } - } - -/* - public override int MetadataToken { - get { - return 0; - } - } -*/ - - private void RejectIfCreated () { - if (mhandle.Value != IntPtr.Zero) - throw new InvalidOperationException ("Type definition of the method is complete."); - } - - internal int AddRef (object reference) { - if (refs == null) - refs = new object [4]; - if (nrefs >= refs.Length - 1) { - object [] new_refs = new object [refs.Length * 2]; - System.Array.Copy (refs, new_refs, refs.Length); - refs = new_refs; - } - refs [nrefs] = reference; - /* Reserved by the runtime */ - refs [nrefs + 1] = null; - nrefs += 2; - return nrefs - 1; - } - - // This class takes care of constructing the module in a thread safe manner - static class AnonHostModuleHolder - { - public static readonly Module anon_host_module; - - static AnonHostModuleHolder () { - AssemblyName aname = new AssemblyName (); - aname.Name = "Anonymously Hosted DynamicMethods Assembly"; - AssemblyBuilder ab = AssemblyBuilder.DefineDynamicAssembly (aname, AssemblyBuilderAccess.Run); - - anon_host_module = ab.ManifestModule; - } - - public static Module AnonHostModule { - get { - return anon_host_module; - } - } - } - } - - internal class DynamicMethodTokenGenerator : TokenGenerator { - - private DynamicMethod m; - - public DynamicMethodTokenGenerator (DynamicMethod m) { - this.m = m; - } - - public int GetToken (string str) { - return m.AddRef (str); - } - - public int GetToken (MethodBase method, Type[] opt_param_types) { - throw new InvalidOperationException (); - } - - public int GetToken (MemberInfo member, bool create_open_instance) { - return m.AddRef (member); - } - - public int GetToken (SignatureHelper helper) { - return m.AddRef (helper); - } - } + + private Delegate deleg; + private RuntimeMethodInfo method; + private ParameterBuilder[] pinfo; + internal bool creating; + private DynamicILInfo il_info; + + public DynamicMethod(string name, Type returnType, Type[] parameterTypes, Module m) : this(name, returnType, parameterTypes, m, false) + { + } + + public DynamicMethod(string name, Type returnType, Type[] parameterTypes, Type owner) : this(name, returnType, parameterTypes, owner, false) + { + } + + public DynamicMethod(string name, Type returnType, Type[] parameterTypes, Module m, bool skipVisibility) : this(name, MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, returnType, parameterTypes, m, skipVisibility) + { + } + + public DynamicMethod(string name, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility) : this(name, MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, returnType, parameterTypes, owner, skipVisibility) + { + } + + public DynamicMethod(string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility) : this(name, attributes, callingConvention, returnType, parameterTypes, owner, owner != null ? owner.Module : null, skipVisibility, false, true) + { + } + + public DynamicMethod(string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Module m, bool skipVisibility) : this(name, attributes, callingConvention, returnType, parameterTypes, null, m, skipVisibility, false, false) + { + } + + public DynamicMethod(string name, Type returnType, Type[] parameterTypes) : this(name, returnType, parameterTypes, false) + { + } + + // FIXME: "Visibility is not restricted" + public DynamicMethod(string name, Type returnType, Type[] parameterTypes, bool restrictedSkipVisibility) + : this(name, MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, returnType, parameterTypes, null, null, restrictedSkipVisibility, true, false) + { + } + + private DynamicMethod(string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type owner, Module m, bool skipVisibility, bool anonHosted, bool typeOwner) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + if (returnType == null) + returnType = typeof(void); + if (owner == null && typeOwner) + throw new ArgumentNullException(nameof(owner)); + if ((m == null) && !anonHosted) + throw new ArgumentNullException(nameof(m)); + if (parameterTypes != null) + { + for (int i = 0; i < parameterTypes.Length; ++i) + if (parameterTypes[i] == null) + throw new ArgumentException($"Parameter {i} is null"); + } + if (owner != null && (owner.IsArray || owner.IsInterface)) + { + throw new ArgumentException("Owner can't be an array or an interface."); + } + + if (m == null) + m = AnonHostModuleHolder.AnonHostModule; + + this.name = name; + this.attributes = attributes | MethodAttributes.Static; + this.callingConvention = callingConvention; + this.returnType = returnType; + this.parameters = parameterTypes; + this.owner = owner; + this.module = m; + this.skipVisibility = skipVisibility; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void create_dynamic_method(DynamicMethod m); + + private void CreateDynMethod() + { + // Clearing of ilgen in create_dynamic_method is not yet synchronized for multiple threads + lock (this) + { + if (mhandle.Value == IntPtr.Zero) + { + if (ilgen == null || ilgen.ILOffset == 0) + throw new InvalidOperationException("Method '" + name + "' does not have a method body."); + + ilgen.label_fixup(this); + + // Have to create all DynamicMethods referenced by this one + try + { + // Used to avoid cycles + creating = true; + if (refs != null) + { + for (int i = 0; i < refs.Length; ++i) + { + if (refs[i] is DynamicMethod) + { + DynamicMethod m = (DynamicMethod)refs[i]; + if (!m.creating) + m.CreateDynMethod(); + } + } + } + } + finally + { + creating = false; + } + create_dynamic_method(this); + ilgen = null; + } + } + } + + [ComVisible(true)] + public sealed + override Delegate CreateDelegate(Type delegateType) + { + if (delegateType == null) + throw new ArgumentNullException(nameof(delegateType)); + if (deleg != null) + return deleg; + + CreateDynMethod(); + + deleg = Delegate.CreateDelegate(delegateType, null, this); + return deleg; + } + + [ComVisible(true)] + public sealed + override Delegate CreateDelegate(Type delegateType, object target) + { + if (delegateType == null) + throw new ArgumentNullException(nameof(delegateType)); + + CreateDynMethod(); + + /* Can't cache the delegate since it is different for each target */ + return Delegate.CreateDelegate(delegateType, target, this); + } + + public ParameterBuilder DefineParameter(int position, ParameterAttributes attributes, string parameterName) + { + // + // Extension: Mono allows position == 0 for the return attribute + // + if ((position < 0) || (position > parameters.Length)) + throw new ArgumentOutOfRangeException(nameof(position)); + + RejectIfCreated(); + + ParameterBuilder pb = new ParameterBuilder(this, position, attributes, parameterName); + if (pinfo == null) + pinfo = new ParameterBuilder[parameters.Length + 1]; + pinfo[position] = pb; + return pb; + } + + public override MethodInfo GetBaseDefinition() + { + return this; + } + + public override object[] GetCustomAttributes(bool inherit) + { + // support for MethodImplAttribute PCA + return new object[] { new MethodImplAttribute((MethodImplOptions)GetMethodImplementationFlags()) }; + } + + public override object[] GetCustomAttributes(Type attributeType, + bool inherit) + { + if (attributeType == null) + throw new ArgumentNullException(nameof(attributeType)); + + if (attributeType.IsAssignableFrom(typeof(MethodImplAttribute))) + return new object[] { new MethodImplAttribute((MethodImplOptions)GetMethodImplementationFlags()) }; + else + return Array.Empty(); + } + + public DynamicILInfo GetDynamicILInfo() + { + if (il_info == null) + il_info = new DynamicILInfo(this); + return il_info; + } + + public ILGenerator GetILGenerator() + { + return GetILGenerator(64); + } + + public ILGenerator GetILGenerator(int streamSize) + { + if (((GetMethodImplementationFlags() & MethodImplAttributes.CodeTypeMask) != + MethodImplAttributes.IL) || + ((GetMethodImplementationFlags() & MethodImplAttributes.ManagedMask) != + MethodImplAttributes.Managed)) + throw new InvalidOperationException("Method body should not exist."); + if (ilgen != null) + return ilgen; + ilgen = new ILGenerator(Module, new DynamicMethodTokenGenerator(this), streamSize); + return ilgen; + } + + public override MethodImplAttributes GetMethodImplementationFlags() + { + return MethodImplAttributes.IL | MethodImplAttributes.Managed | MethodImplAttributes.NoInlining; + } + + public override ParameterInfo[] GetParameters() + { + return GetParametersInternal(); + } + + internal override ParameterInfo[] GetParametersInternal() + { + if (parameters == null) + return Array.Empty(); + + ParameterInfo[] retval = new ParameterInfo[parameters.Length]; + for (int i = 0; i < parameters.Length; i++) + { + retval[i] = RuntimeParameterInfo.New(pinfo?[i + 1], parameters[i], this, i + 1); + } + return retval; + } + + internal override int GetParametersCount() + { + return parameters == null ? 0 : parameters.Length; + } + + internal override Type GetParameterType(int pos) + { + return parameters[pos]; + } + + /* + public override object Invoke (object obj, object[] parameters) { + CreateDynMethod (); + if (method == null) + method = new RuntimeMethodInfo (mhandle); + return method.Invoke (obj, parameters); + } + */ + + public override object Invoke(object obj, BindingFlags invokeAttr, + Binder binder, object[] parameters, + CultureInfo culture) + { + try + { + CreateDynMethod(); + if (method == null) + method = new RuntimeMethodInfo(mhandle); + + return method.Invoke(obj, invokeAttr, binder, parameters, culture); + } + catch (MethodAccessException mae) + { + throw new TargetInvocationException("Method cannot be invoked.", mae); + } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + if (attributeType == null) + throw new ArgumentNullException(nameof(attributeType)); + + if (attributeType.IsAssignableFrom(typeof(MethodImplAttribute))) + return true; + else + return false; + } + + public override string ToString() + { + var sbName = new ValueStringBuilder(MethodNameBufferSize); + sbName.Append(ReturnType.FormatTypeName()); + sbName.Append(' '); + sbName.Append(Name); + sbName.Append('('); + AppendParameters(ref sbName, parameters ?? Array.Empty(), CallingConvention); + sbName.Append(')'); + return sbName.ToString(); + } + + public override MethodAttributes Attributes + { + get + { + return attributes; + } + } + + public override CallingConventions CallingConvention + { + get + { + return callingConvention; + } + } + + public override Type DeclaringType + { + get + { + return null; + } + } + + public bool InitLocals + { + get + { + return init_locals; + } + set + { + init_locals = value; + } + } + + public override RuntimeMethodHandle MethodHandle + { + get + { + return mhandle; + } + } + + public override Module Module + { + get + { + return module; + } + } + + public override string Name + { + get + { + return name; + } + } + + public override Type ReflectedType + { + get + { + return null; + } + } + + public override ParameterInfo ReturnParameter + { + get + { + if (deleg == null) + { + return new RuntimeParameterInfo((ParameterBuilder)null, returnType, this, -1); + } + return deleg.Method.ReturnParameter; + } + } + + public override Type ReturnType + { + get + { + return returnType; + } + } + + // FIXME: "Not implemented" + public override ICustomAttributeProvider ReturnTypeCustomAttributes + { + get + { + throw new NotImplementedException(); + } + } + + /* + public override int MetadataToken { + get { + return 0; + } + } + */ + + private void RejectIfCreated() + { + if (mhandle.Value != IntPtr.Zero) + throw new InvalidOperationException("Type definition of the method is complete."); + } + + internal int AddRef(object reference) + { + if (refs == null) + refs = new object[4]; + if (nrefs >= refs.Length - 1) + { + object[] new_refs = new object[refs.Length * 2]; + Array.Copy(refs, new_refs, refs.Length); + refs = new_refs; + } + refs[nrefs] = reference; + /* Reserved by the runtime */ + refs[nrefs + 1] = null; + nrefs += 2; + return nrefs - 1; + } + + // This class takes care of constructing the module in a thread safe manner + private static class AnonHostModuleHolder + { + public static readonly Module anon_host_module = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName() { Name = "Anonymously Hosted DynamicMethods Assembly" }, AssemblyBuilderAccess.Run).ManifestModule; + + public static Module AnonHostModule + { + get + { + return anon_host_module; + } + } + } + } + + internal class DynamicMethodTokenGenerator : ITokenGenerator + { + + private DynamicMethod m; + + public DynamicMethodTokenGenerator(DynamicMethod m) + { + this.m = m; + } + + public int GetToken(string str) + { + return m.AddRef(str); + } + + public int GetToken(MethodBase method, Type[] opt_param_types) + { + throw new InvalidOperationException(); + } + + public int GetToken(MemberInfo member, bool create_open_instance) + { + return m.AddRef(member); + } + + public int GetToken(SignatureHelper helper) + { + return m.AddRef(helper); + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.notsupported.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.notsupported.cs index 825790bd32b6a..0eb8369b2ba2b 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.notsupported.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.notsupported.cs @@ -1,5 +1,3 @@ -#nullable disable - // // DynamicMethod.cs // @@ -15,10 +13,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -28,6 +26,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if !MONO_FEATURE_SRE using System.Globalization; diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs index a8702782ff19d..507f4c302ae16 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,6 +30,7 @@ // (C) 2001 Ximian, Inc. http://www.ximian.com // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; @@ -40,393 +39,429 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection.Emit { - public sealed partial class EnumBuilder : TypeInfo - { - private TypeBuilder _tb; - private FieldBuilder _underlyingField; - private Type _underlyingType; - - internal EnumBuilder (ModuleBuilder mb, string name, TypeAttributes visibility, Type underlyingType) - { - if ((visibility & ~TypeAttributes.VisibilityMask) != 0) - throw new ArgumentException (SR.Argument_ShouldOnlySetVisibilityFlags, nameof (name)); - if ((visibility & TypeAttributes.VisibilityMask) >= TypeAttributes.NestedPublic && (visibility & TypeAttributes.VisibilityMask) <= TypeAttributes.NestedFamORAssem) - throw new ArgumentException (); - _tb = new TypeBuilder (mb, name, (visibility | TypeAttributes.Sealed), - typeof(Enum), null, PackingSize.Unspecified, 0, null); - _underlyingType = underlyingType; - _underlyingField = _tb.DefineField ("value__", underlyingType, - FieldAttributes.Public | FieldAttributes.SpecialName | FieldAttributes.RTSpecialName); - setup_enum_type (_tb); - } - - internal TypeBuilder GetTypeBuilder () - { - return _tb; - } - - internal override Type InternalResolve () - { - return _tb.InternalResolve (); - } - - internal override Type RuntimeResolve () { - return _tb.RuntimeResolve (); - } - - public override Assembly Assembly { - get { - return _tb.Assembly; - } - } - - public override string AssemblyQualifiedName { - get { - return _tb.AssemblyQualifiedName; - } - } - - public override Type BaseType { - get { - return _tb.BaseType; - } - } - - public override Type DeclaringType { - get { - return _tb.DeclaringType; - } - } - - public override string FullName { - get { - return _tb.FullName; - } - } - - public override Guid GUID { - get { - return _tb.GUID; - } - } - - public override Module Module { - get { - return _tb.Module; - } - } - - public override string Name { - get { - return _tb.Name; - } - } - - public override string Namespace { - get { - return _tb.Namespace; - } - } - - public override Type ReflectedType { - get { - return _tb.ReflectedType; - } - } - - public override RuntimeTypeHandle TypeHandle { - get { - return _tb.TypeHandle; - } - } - - public TypeToken TypeToken { - get { - return _tb.TypeToken; - } - } - - public FieldBuilder UnderlyingField { - get { - return _underlyingField; - } - } - - public override Type UnderlyingSystemType { - get { - return _underlyingType; - } - } - - public Type CreateType () - { - Type res = _tb.CreateType (); - return res; - } - - public TypeInfo CreateTypeInfo() - { - return _tb.CreateTypeInfo (); - } - - public override Type GetEnumUnderlyingType () - { - return _underlyingType; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private extern void setup_enum_type (Type t); - - public FieldBuilder DefineLiteral (string literalName, object literalValue) - { - Type fieldType = this; - FieldBuilder fieldBuilder = _tb.DefineField (literalName, - fieldType, (FieldAttributes.Literal | - (FieldAttributes.Static | FieldAttributes.Public))); - fieldBuilder.SetConstant (literalValue); - return fieldBuilder; - } - - protected override TypeAttributes GetAttributeFlagsImpl () - { - return _tb.attrs; - } - - protected override ConstructorInfo GetConstructorImpl ( - BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, - Type[] types, ParameterModifier[] modifiers) - { - return _tb.GetConstructor (bindingAttr, binder, callConvention, types, - modifiers); - } - - [ComVisible (true)] - public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr) - { - return _tb.GetConstructors (bindingAttr); - } - - public override object[] GetCustomAttributes(bool inherit) - { - return _tb.GetCustomAttributes (inherit); - } - - public override object[] GetCustomAttributes(Type attributeType, bool inherit) - { - if (attributeType == null) - return _tb.GetCustomAttributes (inherit); - else - return _tb.GetCustomAttributes (attributeType, inherit); - } - - public override Type GetElementType() - { - return _tb.GetElementType (); - } - - public override EventInfo GetEvent( string name, BindingFlags bindingAttr) - { - return _tb.GetEvent (name, bindingAttr); - } - - public override EventInfo[] GetEvents() - { - return _tb.GetEvents (); - } - - public override EventInfo[] GetEvents( BindingFlags bindingAttr) - { - return _tb.GetEvents (bindingAttr); - } - - public override FieldInfo GetField( string name, BindingFlags bindingAttr) - { - return _tb.GetField (name, bindingAttr); - } - - public override FieldInfo[] GetFields( BindingFlags bindingAttr) - { - return _tb.GetFields (bindingAttr); - } - - public override Type GetInterface (string name, bool ignoreCase) - { - return _tb.GetInterface (name, ignoreCase); - } - - [ComVisible (true)] - public override InterfaceMapping GetInterfaceMap (Type interfaceType) - { - return _tb.GetInterfaceMap (interfaceType); - } - - public override Type[] GetInterfaces() - { - return _tb.GetInterfaces (); - } - - public override MemberInfo[] GetMember (string name, MemberTypes type, BindingFlags bindingAttr) - { - return _tb.GetMember (name, type, bindingAttr); - } - - public override MemberInfo[] GetMembers(BindingFlags bindingAttr) - { - return _tb.GetMembers (bindingAttr); - } - - protected override MethodInfo GetMethodImpl ( - string name, BindingFlags bindingAttr, Binder binder, - CallingConventions callConvention, Type[] types, - ParameterModifier[] modifiers) - { - if (types == null) { - return _tb.GetMethod (name, bindingAttr); - } - - return _tb.GetMethod (name, bindingAttr, binder, - callConvention, types, modifiers); - } - - public override MethodInfo[] GetMethods (BindingFlags bindingAttr) - { - return _tb.GetMethods (bindingAttr); - } - - public override Type GetNestedType (string name, BindingFlags bindingAttr) - { - return _tb.GetNestedType (name, bindingAttr); - } - - public override Type[] GetNestedTypes (BindingFlags bindingAttr) - { - return _tb.GetNestedTypes (bindingAttr); - } - - public override PropertyInfo[] GetProperties (BindingFlags bindingAttr) - { - return _tb.GetProperties (bindingAttr); - } - - protected override PropertyInfo GetPropertyImpl ( - string name, BindingFlags bindingAttr, Binder binder, - Type returnType, Type[] types, - ParameterModifier[] modifiers) - { - throw CreateNotSupportedException (); - } - - protected override bool HasElementTypeImpl () - { - return _tb.HasElementType; - } - - public override object InvokeMember ( - string name, BindingFlags invokeAttr, Binder binder, - object target, object[] args, - ParameterModifier[] modifiers, CultureInfo culture, - string[] namedParameters) - { - return _tb.InvokeMember (name, invokeAttr, binder, target, - args, modifiers, culture, namedParameters); - } - - protected override bool IsArrayImpl() - { - return false; - } - - protected override bool IsByRefImpl() - { - return false; - } - - protected override bool IsCOMObjectImpl() - { - return false; - } - - protected override bool IsPointerImpl() - { - return false; - } - - protected override bool IsPrimitiveImpl() - { - return false; - } - - protected override bool IsValueTypeImpl() - { - return true; - } - - public override bool IsSZArray { - get { - return false; - } - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - return _tb.IsDefined (attributeType, inherit); - } - - public override Type MakeArrayType () - { - return new ArrayType (this, 0); - } - - public override Type MakeArrayType (int rank) - { - if (rank < 1) - throw new IndexOutOfRangeException (); - return new ArrayType (this, rank); - } - - public override Type MakeByRefType () - { - return new ByRefType (this); - } - - public override Type MakePointerType () - { - return new PointerType (this); - } - - public void SetCustomAttribute (CustomAttributeBuilder customBuilder) - { - _tb.SetCustomAttribute (customBuilder); - } - - [ComVisible (true)] - public void SetCustomAttribute (ConstructorInfo con, byte[] binaryAttribute) - { - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } - - private Exception CreateNotSupportedException () - { - return new NotSupportedException ("The invoked member is not supported in a dynamic module."); - } - - internal override bool IsUserType { - get { - return false; - } - } - - public override bool IsConstructedGenericType { - get { return false; } - } - - public override bool IsAssignableFrom (TypeInfo typeInfo) - { - return base.IsAssignableFrom (typeInfo); - } - - public override bool IsTypeDefinition => true; - } +namespace System.Reflection.Emit +{ + public sealed partial class EnumBuilder : TypeInfo + { + private TypeBuilder _tb; + private FieldBuilder _underlyingField; + private Type _underlyingType; + + internal EnumBuilder(ModuleBuilder mb, string name, TypeAttributes visibility, Type underlyingType) + { + if ((visibility & ~TypeAttributes.VisibilityMask) != 0) + throw new ArgumentException(SR.Argument_ShouldOnlySetVisibilityFlags, nameof(name)); + if ((visibility & TypeAttributes.VisibilityMask) >= TypeAttributes.NestedPublic && (visibility & TypeAttributes.VisibilityMask) <= TypeAttributes.NestedFamORAssem) + throw new ArgumentException(); + _tb = new TypeBuilder(mb, name, (visibility | TypeAttributes.Sealed), + typeof(Enum), null, PackingSize.Unspecified, 0, null); + _underlyingType = underlyingType; + _underlyingField = _tb.DefineField("value__", underlyingType, + FieldAttributes.Public | FieldAttributes.SpecialName | FieldAttributes.RTSpecialName); + setup_enum_type(_tb); + } + + internal TypeBuilder GetTypeBuilder() + { + return _tb; + } + + internal override Type InternalResolve() + { + return _tb.InternalResolve(); + } + + internal override Type RuntimeResolve() + { + return _tb.RuntimeResolve(); + } + + public override Assembly Assembly + { + get + { + return _tb.Assembly; + } + } + + public override string AssemblyQualifiedName + { + get + { + return _tb.AssemblyQualifiedName; + } + } + + public override Type BaseType + { + get + { + return _tb.BaseType; + } + } + + public override Type DeclaringType + { + get + { + return _tb.DeclaringType; + } + } + + public override string FullName + { + get + { + return _tb.FullName; + } + } + + public override Guid GUID + { + get + { + return _tb.GUID; + } + } + + public override Module Module + { + get + { + return _tb.Module; + } + } + + public override string Name + { + get + { + return _tb.Name; + } + } + + public override string Namespace + { + get + { + return _tb.Namespace; + } + } + + public override Type ReflectedType + { + get + { + return _tb.ReflectedType; + } + } + + public override RuntimeTypeHandle TypeHandle + { + get + { + return _tb.TypeHandle; + } + } + + public TypeToken TypeToken + { + get + { + return _tb.TypeToken; + } + } + + public FieldBuilder UnderlyingField + { + get + { + return _underlyingField; + } + } + + public override Type UnderlyingSystemType + { + get + { + return _underlyingType; + } + } + + public Type CreateType() + { + Type res = _tb.CreateType(); + return res; + } + + public TypeInfo CreateTypeInfo() + { + return _tb.CreateTypeInfo(); + } + + public override Type GetEnumUnderlyingType() + { + return _underlyingType; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern void setup_enum_type(Type t); + + public FieldBuilder DefineLiteral(string literalName, object literalValue) + { + Type fieldType = this; + FieldBuilder fieldBuilder = _tb.DefineField(literalName, + fieldType, (FieldAttributes.Literal | + (FieldAttributes.Static | FieldAttributes.Public))); + fieldBuilder.SetConstant(literalValue); + return fieldBuilder; + } + + protected override TypeAttributes GetAttributeFlagsImpl() + { + return _tb.attrs; + } + + protected override ConstructorInfo GetConstructorImpl( + BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, + Type[] types, ParameterModifier[] modifiers) + { + return _tb.GetConstructor(bindingAttr, binder, callConvention, types, + modifiers); + } + + [ComVisible(true)] + public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr) + { + return _tb.GetConstructors(bindingAttr); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return _tb.GetCustomAttributes(inherit); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + if (attributeType == null) + return _tb.GetCustomAttributes(inherit); + else + return _tb.GetCustomAttributes(attributeType, inherit); + } + + public override Type GetElementType() + { + return _tb.GetElementType(); + } + + public override EventInfo GetEvent(string name, BindingFlags bindingAttr) + { + return _tb.GetEvent(name, bindingAttr); + } + + public override EventInfo[] GetEvents() + { + return _tb.GetEvents(); + } + + public override EventInfo[] GetEvents(BindingFlags bindingAttr) + { + return _tb.GetEvents(bindingAttr); + } + + public override FieldInfo GetField(string name, BindingFlags bindingAttr) + { + return _tb.GetField(name, bindingAttr); + } + + public override FieldInfo[] GetFields(BindingFlags bindingAttr) + { + return _tb.GetFields(bindingAttr); + } + + public override Type GetInterface(string name, bool ignoreCase) + { + return _tb.GetInterface(name, ignoreCase); + } + + [ComVisible(true)] + public override InterfaceMapping GetInterfaceMap(Type interfaceType) + { + return _tb.GetInterfaceMap(interfaceType); + } + + public override Type[] GetInterfaces() + { + return _tb.GetInterfaces(); + } + + public override MemberInfo[] GetMember(string name, MemberTypes type, BindingFlags bindingAttr) + { + return _tb.GetMember(name, type, bindingAttr); + } + + public override MemberInfo[] GetMembers(BindingFlags bindingAttr) + { + return _tb.GetMembers(bindingAttr); + } + + protected override MethodInfo GetMethodImpl( + string name, BindingFlags bindingAttr, Binder binder, + CallingConventions callConvention, Type[] types, + ParameterModifier[] modifiers) + { + if (types == null) + { + return _tb.GetMethod(name, bindingAttr); + } + + return _tb.GetMethod(name, bindingAttr, binder, + callConvention, types, modifiers); + } + + public override MethodInfo[] GetMethods(BindingFlags bindingAttr) + { + return _tb.GetMethods(bindingAttr); + } + + public override Type GetNestedType(string name, BindingFlags bindingAttr) + { + return _tb.GetNestedType(name, bindingAttr); + } + + public override Type[] GetNestedTypes(BindingFlags bindingAttr) + { + return _tb.GetNestedTypes(bindingAttr); + } + + public override PropertyInfo[] GetProperties(BindingFlags bindingAttr) + { + return _tb.GetProperties(bindingAttr); + } + + protected override PropertyInfo GetPropertyImpl( + string name, BindingFlags bindingAttr, Binder binder, + Type returnType, Type[] types, + ParameterModifier[] modifiers) + { + throw CreateNotSupportedException(); + } + + protected override bool HasElementTypeImpl() + { + return _tb.HasElementType; + } + + public override object InvokeMember( + string name, BindingFlags invokeAttr, Binder binder, + object target, object[] args, + ParameterModifier[] modifiers, CultureInfo culture, + string[] namedParameters) + { + return _tb.InvokeMember(name, invokeAttr, binder, target, + args, modifiers, culture, namedParameters); + } + + protected override bool IsArrayImpl() + { + return false; + } + + protected override bool IsByRefImpl() + { + return false; + } + + protected override bool IsCOMObjectImpl() + { + return false; + } + + protected override bool IsPointerImpl() + { + return false; + } + + protected override bool IsPrimitiveImpl() + { + return false; + } + + protected override bool IsValueTypeImpl() + { + return true; + } + + public override bool IsSZArray + { + get + { + return false; + } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + return _tb.IsDefined(attributeType, inherit); + } + + public override Type MakeArrayType() + { + return new ArrayType(this, 0); + } + + public override Type MakeArrayType(int rank) + { + if (rank < 1) + throw new IndexOutOfRangeException(); + return new ArrayType(this, rank); + } + + public override Type MakeByRefType() + { + return new ByRefType(this); + } + + public override Type MakePointerType() + { + return new PointerType(this); + } + + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + _tb.SetCustomAttribute(customBuilder); + } + + [ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } + + private Exception CreateNotSupportedException() + { + return new NotSupportedException("The invoked member is not supported in a dynamic module."); + } + + internal override bool IsUserType + { + get + { + return false; + } + } + + public override bool IsConstructedGenericType + { + get { return false; } + } + + public override bool IsAssignableFrom(TypeInfo typeInfo) + { + return base.IsAssignableFrom(typeInfo); + } + + public override bool IsTypeDefinition => true; + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EventBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EventBuilder.Mono.cs index 5957bce7ed12b..96c9d2cd9a284 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EventBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EventBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,6 +30,7 @@ // (C) 2001 Ximian, Inc. http://www.ximian.com // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; @@ -40,104 +39,123 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public sealed partial class EventBuilder { +namespace System.Reflection.Emit +{ + [StructLayout(LayoutKind.Sequential)] + public sealed partial class EventBuilder + { #pragma warning disable 169, 414 - internal string name; - Type type; - TypeBuilder typeb; - CustomAttributeBuilder[] cattrs; - internal MethodBuilder add_method; - internal MethodBuilder remove_method; - internal MethodBuilder raise_method; - internal MethodBuilder[] other_methods; - internal EventAttributes attrs; - int table_idx; + internal string name; + private Type type; + private TypeBuilder typeb; + private CustomAttributeBuilder[] cattrs; + internal MethodBuilder add_method; + internal MethodBuilder remove_method; + internal MethodBuilder raise_method; + internal MethodBuilder[] other_methods; + internal EventAttributes attrs; + private int table_idx; #pragma warning restore 169, 414 - internal EventBuilder (TypeBuilder tb, string eventName, EventAttributes eventAttrs, Type eventType) { - name = eventName; - attrs = eventAttrs; - type = eventType; - typeb = tb; - table_idx = get_next_table_index (this, 0x14, 1); - } + internal EventBuilder(TypeBuilder tb, string eventName, EventAttributes eventAttrs, Type eventType) + { + name = eventName; + attrs = eventAttrs; + type = eventType; + typeb = tb; + table_idx = get_next_table_index(this, 0x14, 1); + } + + internal int get_next_table_index(object obj, int table, int count) + { + return typeb.get_next_table_index(obj, table, count); + } - internal int get_next_table_index (object obj, int table, int count) { - return typeb.get_next_table_index (obj, table, count); - } + public void AddOtherMethod(MethodBuilder mdBuilder) + { + if (mdBuilder == null) + throw new ArgumentNullException(nameof(mdBuilder)); + RejectIfCreated(); + if (other_methods != null) + { + MethodBuilder[] newv = new MethodBuilder[other_methods.Length + 1]; + other_methods.CopyTo(newv, 0); + other_methods = newv; + } + else + { + other_methods = new MethodBuilder[1]; + } + other_methods[other_methods.Length - 1] = mdBuilder; + } - public void AddOtherMethod( MethodBuilder mdBuilder) { - if (mdBuilder == null) - throw new ArgumentNullException ("mdBuilder"); - RejectIfCreated (); - if (other_methods != null) { - MethodBuilder[] newv = new MethodBuilder [other_methods.Length + 1]; - other_methods.CopyTo (newv, 0); - other_methods = newv; - } else { - other_methods = new MethodBuilder [1]; - } - other_methods [other_methods.Length - 1] = mdBuilder; - } - - public EventToken GetEventToken () { - return new EventToken (0x14000000 | table_idx); - } - public void SetAddOnMethod( MethodBuilder mdBuilder) { - if (mdBuilder == null) - throw new ArgumentNullException ("mdBuilder"); - RejectIfCreated (); - add_method = mdBuilder; - } - public void SetRaiseMethod( MethodBuilder mdBuilder) { - if (mdBuilder == null) - throw new ArgumentNullException ("mdBuilder"); - RejectIfCreated (); - raise_method = mdBuilder; - } - public void SetRemoveOnMethod( MethodBuilder mdBuilder) { - if (mdBuilder == null) - throw new ArgumentNullException ("mdBuilder"); - RejectIfCreated (); - remove_method = mdBuilder; - } + public EventToken GetEventToken() + { + return new EventToken(0x14000000 | table_idx); + } + public void SetAddOnMethod(MethodBuilder mdBuilder) + { + if (mdBuilder == null) + throw new ArgumentNullException(nameof(mdBuilder)); + RejectIfCreated(); + add_method = mdBuilder; + } + public void SetRaiseMethod(MethodBuilder mdBuilder) + { + if (mdBuilder == null) + throw new ArgumentNullException(nameof(mdBuilder)); + RejectIfCreated(); + raise_method = mdBuilder; + } + public void SetRemoveOnMethod(MethodBuilder mdBuilder) + { + if (mdBuilder == null) + throw new ArgumentNullException(nameof(mdBuilder)); + RejectIfCreated(); + remove_method = mdBuilder; + } - public void SetCustomAttribute( CustomAttributeBuilder customBuilder) { - if (customBuilder == null) - throw new ArgumentNullException ("customBuilder"); - RejectIfCreated (); - string attrname = customBuilder.Ctor.ReflectedType.FullName; - if (attrname == "System.Runtime.CompilerServices.SpecialNameAttribute") { - attrs |= EventAttributes.SpecialName; - return; - } - if (cattrs != null) { - CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1]; - cattrs.CopyTo (new_array, 0); - new_array [cattrs.Length] = customBuilder; - cattrs = new_array; - } else { - cattrs = new CustomAttributeBuilder [1]; - cattrs [0] = customBuilder; - } - } + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + if (customBuilder == null) + throw new ArgumentNullException(nameof(customBuilder)); + RejectIfCreated(); + string attrname = customBuilder.Ctor.ReflectedType.FullName; + if (attrname == "System.Runtime.CompilerServices.SpecialNameAttribute") + { + attrs |= EventAttributes.SpecialName; + return; + } + if (cattrs != null) + { + CustomAttributeBuilder[] new_array = new CustomAttributeBuilder[cattrs.Length + 1]; + cattrs.CopyTo(new_array, 0); + new_array[cattrs.Length] = customBuilder; + cattrs = new_array; + } + else + { + cattrs = new CustomAttributeBuilder[1]; + cattrs[0] = customBuilder; + } + } - [ComVisible (true)] - public void SetCustomAttribute( ConstructorInfo con, byte[] binaryAttribute) { - if (con == null) - throw new ArgumentNullException ("con"); - if (binaryAttribute == null) - throw new ArgumentNullException ("binaryAttribute"); - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } + [ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + if (con == null) + throw new ArgumentNullException(nameof(con)); + if (binaryAttribute == null) + throw new ArgumentNullException(nameof(binaryAttribute)); + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } - private void RejectIfCreated () { - if (typeb.is_created) - throw new InvalidOperationException ("Type definition of the method is complete."); - } - } + private void RejectIfCreated() + { + if (typeb.is_created) + throw new InvalidOperationException("Type definition of the method is complete."); + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EventOnTypeBuilderInst.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EventOnTypeBuilderInst.cs index a1dff8fc9db5c..44014905f44b8 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EventOnTypeBuilderInst.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EventOnTypeBuilderInst.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit/EventOnTypeBuilderInst.cs // @@ -16,10 +14,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -29,6 +27,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Collections; @@ -38,98 +37,103 @@ namespace System.Reflection.Emit { - /* - * This class represents an event of an instantiation of a generic type builder. - */ - [StructLayout (LayoutKind.Sequential)] - internal class EventOnTypeBuilderInst : EventInfo - { - TypeBuilderInstantiation instantiation; - EventBuilder event_builder; - EventInfo event_info; - - internal EventOnTypeBuilderInst (TypeBuilderInstantiation instantiation, EventBuilder evt) - { - this.instantiation = instantiation; - this.event_builder = evt; - } - - internal EventOnTypeBuilderInst (TypeBuilderInstantiation instantiation, EventInfo evt) - { - this.instantiation = instantiation; - this.event_info = evt; - } - - public override EventAttributes Attributes { - get { return event_builder != null ? event_builder.attrs : event_info.Attributes; } - } - - public override MethodInfo GetAddMethod (bool nonPublic) - { - MethodInfo add = event_builder != null ? event_builder.add_method : event_info.GetAddMethod (nonPublic); - if (add == null || (!nonPublic && !add.IsPublic)) - return null; - return TypeBuilder.GetMethod (instantiation, add); - } - - public override MethodInfo GetRaiseMethod (bool nonPublic) - { - MethodInfo raise = event_builder != null ? event_builder.raise_method : event_info.GetRaiseMethod (nonPublic); - if (raise == null || (!nonPublic && !raise.IsPublic)) - return null; - return TypeBuilder.GetMethod (instantiation, raise); - } - - public override MethodInfo GetRemoveMethod (bool nonPublic) - { - MethodInfo remove = event_builder != null ? event_builder.remove_method : event_info.GetRemoveMethod (nonPublic); - if (remove == null || (!nonPublic && !remove.IsPublic)) - return null; - return TypeBuilder.GetMethod (instantiation, remove); - } - - public override MethodInfo[] GetOtherMethods (bool nonPublic) - { - MethodInfo[] other = event_builder != null ? event_builder.other_methods : event_info.GetOtherMethods (nonPublic); - if (other == null) - return new MethodInfo [0]; - - ArrayList ar = new ArrayList (); - foreach (MethodInfo method in other) { - if (nonPublic || method.IsPublic) - ar.Add (TypeBuilder.GetMethod (instantiation, method)); - } - MethodInfo[] res = new MethodInfo [ar.Count]; - ar.CopyTo (res, 0); - return res; - } - - public override Type DeclaringType { - get { return instantiation; } - } - - public override string Name { - get { return event_builder != null ? event_builder.name : event_info.Name; } - } - - public override Type ReflectedType { - get { return instantiation; } - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - throw new NotSupportedException (); - } - - public override object [] GetCustomAttributes (bool inherit) - { - throw new NotSupportedException (); - } - - public override object [] GetCustomAttributes (Type attributeType, bool inherit) - { - throw new NotSupportedException (); - } - } + /* + * This class represents an event of an instantiation of a generic type builder. + */ + [StructLayout(LayoutKind.Sequential)] + internal class EventOnTypeBuilderInst : EventInfo + { + private TypeBuilderInstantiation instantiation; + private EventBuilder event_builder; + private EventInfo event_info; + + internal EventOnTypeBuilderInst(TypeBuilderInstantiation instantiation, EventBuilder evt) + { + this.instantiation = instantiation; + this.event_builder = evt; + } + + internal EventOnTypeBuilderInst(TypeBuilderInstantiation instantiation, EventInfo evt) + { + this.instantiation = instantiation; + this.event_info = evt; + } + + public override EventAttributes Attributes + { + get { return event_builder != null ? event_builder.attrs : event_info.Attributes; } + } + + public override MethodInfo GetAddMethod(bool nonPublic) + { + MethodInfo add = event_builder != null ? event_builder.add_method : event_info.GetAddMethod(nonPublic); + if (add == null || (!nonPublic && !add.IsPublic)) + return null; + return TypeBuilder.GetMethod(instantiation, add); + } + + public override MethodInfo GetRaiseMethod(bool nonPublic) + { + MethodInfo raise = event_builder != null ? event_builder.raise_method : event_info.GetRaiseMethod(nonPublic); + if (raise == null || (!nonPublic && !raise.IsPublic)) + return null; + return TypeBuilder.GetMethod(instantiation, raise); + } + + public override MethodInfo GetRemoveMethod(bool nonPublic) + { + MethodInfo remove = event_builder != null ? event_builder.remove_method : event_info.GetRemoveMethod(nonPublic); + if (remove == null || (!nonPublic && !remove.IsPublic)) + return null; + return TypeBuilder.GetMethod(instantiation, remove); + } + + public override MethodInfo[] GetOtherMethods(bool nonPublic) + { + MethodInfo[] other = event_builder != null ? event_builder.other_methods : event_info.GetOtherMethods(nonPublic); + if (other == null) + return Array.Empty(); + + ArrayList ar = new ArrayList(); + foreach (MethodInfo method in other) + { + if (nonPublic || method.IsPublic) + ar.Add(TypeBuilder.GetMethod(instantiation, method)); + } + MethodInfo[] res = new MethodInfo[ar.Count]; + ar.CopyTo(res, 0); + return res; + } + + public override Type DeclaringType + { + get { return instantiation; } + } + + public override string Name + { + get { return event_builder != null ? event_builder.name : event_info.Name; } + } + + public override Type ReflectedType + { + get { return instantiation; } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + throw new NotSupportedException(); + } + + public override object[] GetCustomAttributes(bool inherit) + { + throw new NotSupportedException(); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + throw new NotSupportedException(); + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/FieldBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/FieldBuilder.Mono.cs index 2e9143f2e2c26..17ef8ec60eb7c 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/FieldBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/FieldBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,6 +30,7 @@ // (C) 2001-2002 Ximian, Inc. http://www.ximian.com // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; @@ -40,202 +39,237 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public sealed partial class FieldBuilder : FieldInfo { - +namespace System.Reflection.Emit +{ + [StructLayout(LayoutKind.Sequential)] + public sealed partial class FieldBuilder : FieldInfo + { + #pragma warning disable 169, 414 - private FieldAttributes attrs; - private Type type; - private String name; - private object def_value; - private int offset; - internal TypeBuilder typeb; - private byte[] rva_data; - private CustomAttributeBuilder[] cattrs; - private UnmanagedMarshal marshal_info; - private RuntimeFieldHandle handle; - private Type[] modReq; - private Type[] modOpt; + private FieldAttributes attrs; + private Type type; + private string name; + private object def_value; + private int offset; + internal TypeBuilder typeb; + private byte[] rva_data; + private CustomAttributeBuilder[] cattrs; + private UnmanagedMarshal marshal_info; + private RuntimeFieldHandle handle; + private Type[] modReq; + private Type[] modOpt; #pragma warning restore 169, 414 - internal FieldBuilder (TypeBuilder tb, string fieldName, Type type, FieldAttributes attributes, Type[] modReq, Type[] modOpt) - { - if (type == null) - throw new ArgumentNullException ("type"); - - attrs = attributes & ~FieldAttributes.ReservedMask; - name = fieldName; - this.type = type; - this.modReq = modReq; - this.modOpt = modOpt; - offset = -1; - typeb = tb; - - ((ModuleBuilder) tb.Module).RegisterToken (this, GetToken ().Token); - } - - public override FieldAttributes Attributes { - get { return attrs; } - } - - public override Type DeclaringType { - get { return typeb; } - } - - public override RuntimeFieldHandle FieldHandle { - get { - throw CreateNotSupportedException (); - } - } - - public override Type FieldType { - get { return type; } - } - - public override string Name { - get { return name; } - } - - public override Type ReflectedType { - get { return typeb; } - } - - public override object[] GetCustomAttributes(bool inherit) { - /* - * On MS.NET, this always returns not_supported, but we can't do this - * since there would be no way to obtain custom attributes of - * dynamically created ctors. - */ - if (typeb.is_created) - return CustomAttribute.GetCustomAttributes (this, inherit); - else - throw CreateNotSupportedException (); - } - - public override object[] GetCustomAttributes(Type attributeType, bool inherit) { - if (typeb.is_created) - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - else - throw CreateNotSupportedException (); - } - - public override int MetadataToken { get { return ((ModuleBuilder) typeb.Module).GetToken (this); } } - - public FieldToken GetToken() { - return new FieldToken (MetadataToken, type); - } - - public override object GetValue(object obj) { - throw CreateNotSupportedException (); - } - - public override bool IsDefined( Type attributeType, bool inherit) { - throw CreateNotSupportedException (); - } - - internal override int GetFieldOffset () { - /* FIXME: */ - return 0; - } - - internal void SetRVAData (byte[] data) { - rva_data = (byte[])data.Clone (); - } - - public void SetConstant( object defaultValue) { - RejectIfCreated (); - - /*if (defaultValue.GetType() != type) - throw new ArgumentException ("Constant doesn't match field type");*/ - def_value = defaultValue; - } - - public void SetCustomAttribute (CustomAttributeBuilder customBuilder) { - RejectIfCreated (); - - if (customBuilder == null) - throw new ArgumentNullException ("customBuilder"); - - string attrname = customBuilder.Ctor.ReflectedType.FullName; - if (attrname == "System.Runtime.InteropServices.FieldOffsetAttribute") { - byte[] data = customBuilder.Data; - offset = (int)data [2]; - offset |= ((int)data [3]) << 8; - offset |= ((int)data [4]) << 16; - offset |= ((int)data [5]) << 24; - return; - } else if (attrname == "System.NonSerializedAttribute") { - attrs |= FieldAttributes.NotSerialized; - return; - } else if (attrname == "System.Runtime.CompilerServices.SpecialNameAttribute") { - attrs |= FieldAttributes.SpecialName; - return; - } else if (attrname == "System.Runtime.InteropServices.MarshalAsAttribute") { - attrs |= FieldAttributes.HasFieldMarshal; - marshal_info = CustomAttributeBuilder.get_umarshal (customBuilder, true); - /* FIXME: check for errors */ - return; - } - if (cattrs != null) { - CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1]; - cattrs.CopyTo (new_array, 0); - new_array [cattrs.Length] = customBuilder; - cattrs = new_array; - } else { - cattrs = new CustomAttributeBuilder [1]; - cattrs [0] = customBuilder; - } - } - - [ComVisible (true)] - public void SetCustomAttribute( ConstructorInfo con, byte[] binaryAttribute) { - RejectIfCreated (); - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } - - public void SetOffset( int iOffset) { - RejectIfCreated (); - if (iOffset < 0) - throw new ArgumentException ("Negative field offset is not allowed"); - offset = iOffset; - } - - public override void SetValue( object obj, object val, BindingFlags invokeAttr, Binder binder, CultureInfo culture) { - throw CreateNotSupportedException (); - } - - private Exception CreateNotSupportedException () - { - return new NotSupportedException ("The invoked member is not supported in a dynamic module."); - } - - private void RejectIfCreated () - { - if (typeb.is_created) - throw new InvalidOperationException ("Unable to change after type has been created."); - } - - internal void ResolveUserTypes () { - type = TypeBuilder.ResolveUserType (type); - TypeBuilder.ResolveUserTypes (modReq); - TypeBuilder.ResolveUserTypes (modOpt); - if (marshal_info != null) - marshal_info.marshaltyperef = TypeBuilder.ResolveUserType (marshal_info.marshaltyperef); - } - - internal FieldInfo RuntimeResolve () { - // typeb.CreateType() populates this.handle - var type_handle = new RuntimeTypeHandle (typeb.CreateType () as RuntimeType); - return FieldInfo.GetFieldFromHandle (handle, type_handle); - } - - public override Module Module { - get { - return base.Module; - } - } - } + internal FieldBuilder(TypeBuilder tb, string fieldName, Type type, FieldAttributes attributes, Type[] modReq, Type[] modOpt) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + attrs = attributes & ~FieldAttributes.ReservedMask; + name = fieldName; + this.type = type; + this.modReq = modReq; + this.modOpt = modOpt; + offset = -1; + typeb = tb; + + ((ModuleBuilder)tb.Module).RegisterToken(this, GetToken().Token); + } + + public override FieldAttributes Attributes + { + get { return attrs; } + } + + public override Type DeclaringType + { + get { return typeb; } + } + + public override RuntimeFieldHandle FieldHandle + { + get + { + throw CreateNotSupportedException(); + } + } + + public override Type FieldType + { + get { return type; } + } + + public override string Name + { + get { return name; } + } + + public override Type ReflectedType + { + get { return typeb; } + } + + public override object[] GetCustomAttributes(bool inherit) + { + /* + * On MS.NET, this always returns not_supported, but we can't do this + * since there would be no way to obtain custom attributes of + * dynamically created ctors. + */ + if (typeb.is_created) + return CustomAttribute.GetCustomAttributes(this, inherit); + else + throw CreateNotSupportedException(); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + if (typeb.is_created) + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + else + throw CreateNotSupportedException(); + } + + public override int MetadataToken { get { return ((ModuleBuilder)typeb.Module).GetToken(this); } } + + public FieldToken GetToken() + { + return new FieldToken(MetadataToken, type); + } + + public override object GetValue(object obj) + { + throw CreateNotSupportedException(); + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + throw CreateNotSupportedException(); + } + + internal override int GetFieldOffset() + { + /* FIXME: */ + return 0; + } + + internal void SetRVAData(byte[] data) + { + rva_data = (byte[])data.Clone(); + } + + public void SetConstant(object defaultValue) + { + RejectIfCreated(); + + /*if (defaultValue.GetType() != type) + throw new ArgumentException ("Constant doesn't match field type");*/ + def_value = defaultValue; + } + + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + RejectIfCreated(); + + if (customBuilder == null) + throw new ArgumentNullException(nameof(customBuilder)); + + string attrname = customBuilder.Ctor.ReflectedType.FullName; + if (attrname == "System.Runtime.InteropServices.FieldOffsetAttribute") + { + byte[] data = customBuilder.Data; + offset = (int)data[2]; + offset |= ((int)data[3]) << 8; + offset |= ((int)data[4]) << 16; + offset |= ((int)data[5]) << 24; + return; + } + else if (attrname == "System.NonSerializedAttribute") + { + attrs |= FieldAttributes.NotSerialized; + return; + } + else if (attrname == "System.Runtime.CompilerServices.SpecialNameAttribute") + { + attrs |= FieldAttributes.SpecialName; + return; + } + else if (attrname == "System.Runtime.InteropServices.MarshalAsAttribute") + { + attrs |= FieldAttributes.HasFieldMarshal; + marshal_info = CustomAttributeBuilder.get_umarshal(customBuilder, true); + /* FIXME: check for errors */ + return; + } + if (cattrs != null) + { + CustomAttributeBuilder[] new_array = new CustomAttributeBuilder[cattrs.Length + 1]; + cattrs.CopyTo(new_array, 0); + new_array[cattrs.Length] = customBuilder; + cattrs = new_array; + } + else + { + cattrs = new CustomAttributeBuilder[1]; + cattrs[0] = customBuilder; + } + } + + [ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + RejectIfCreated(); + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } + + public void SetOffset(int iOffset) + { + RejectIfCreated(); + if (iOffset < 0) + throw new ArgumentException("Negative field offset is not allowed"); + offset = iOffset; + } + + public override void SetValue(object obj, object val, BindingFlags invokeAttr, Binder binder, CultureInfo culture) + { + throw CreateNotSupportedException(); + } + + private Exception CreateNotSupportedException() + { + return new NotSupportedException("The invoked member is not supported in a dynamic module."); + } + + private void RejectIfCreated() + { + if (typeb.is_created) + throw new InvalidOperationException("Unable to change after type has been created."); + } + + internal void ResolveUserTypes() + { + type = TypeBuilder.ResolveUserType(type); + TypeBuilder.ResolveUserTypes(modReq); + TypeBuilder.ResolveUserTypes(modOpt); + if (marshal_info != null) + marshal_info.marshaltyperef = TypeBuilder.ResolveUserType(marshal_info.marshaltyperef); + } + + internal FieldInfo RuntimeResolve() + { + // typeb.CreateType() populates this.handle + var type_handle = new RuntimeTypeHandle(typeb.CreateType() as RuntimeType); + return GetFieldFromHandle(handle, type_handle); + } + + public override Module Module + { + get + { + return base.Module; + } + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/FieldOnTypeBuilderInst.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/FieldOnTypeBuilderInst.cs index a9fc114d4cd27..ec2a5b580c209 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/FieldOnTypeBuilderInst.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/FieldOnTypeBuilderInst.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit/FieldOnTypeBuilderInst.cs // @@ -16,10 +14,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -29,6 +27,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Globalization; @@ -37,104 +36,122 @@ namespace System.Reflection.Emit { - /* - * This class represents a field of an instantiation of a generic type builder. - */ - [StructLayout (LayoutKind.Sequential)] - internal class FieldOnTypeBuilderInst : FieldInfo - { - #region Keep in sync with object-internals.h - internal TypeBuilderInstantiation instantiation; - internal FieldInfo fb; - #endregion - - public FieldOnTypeBuilderInst (TypeBuilderInstantiation instantiation, FieldInfo fb) { - this.instantiation = instantiation; - this.fb = fb; - } - - // - // MemberInfo members - // - - public override Type DeclaringType { - get { - return instantiation; - } - } - - public override string Name { - get { - return fb.Name; - } - } - - public override Type ReflectedType { - get { - return instantiation; - } - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - throw new NotSupportedException (); - } - - public override object [] GetCustomAttributes (bool inherit) - { - throw new NotSupportedException (); - } - - public override object [] GetCustomAttributes (Type attributeType, bool inherit) - { - throw new NotSupportedException (); - } - - public override string ToString () - { - return fb.FieldType.ToString () + " " + Name; - } - // - // FieldInfo members - // - - public override FieldAttributes Attributes { - get { - return fb.Attributes; - } - } - - public override RuntimeFieldHandle FieldHandle { - get { - throw new NotSupportedException (); - } - } - - public override int MetadataToken { - get { - throw new InvalidOperationException (); - } - } - - public override Type FieldType { - get { - throw new NotSupportedException (); - } - } - - public override object GetValue(object obj) { - throw new NotSupportedException (); - } - - public override void SetValue (object obj, object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture) { - throw new NotSupportedException (); - } - - // Called from the runtime to return the corresponding finished FieldInfo object - internal FieldInfo RuntimeResolve () { - var type = instantiation.RuntimeResolve (); - return type.GetField (fb); - } - } + /* + * This class represents a field of an instantiation of a generic type builder. + */ + [StructLayout(LayoutKind.Sequential)] + internal class FieldOnTypeBuilderInst : FieldInfo + { + #region Keep in sync with object-internals.h + internal TypeBuilderInstantiation instantiation; + internal FieldInfo fb; + #endregion + + public FieldOnTypeBuilderInst(TypeBuilderInstantiation instantiation, FieldInfo fb) + { + this.instantiation = instantiation; + this.fb = fb; + } + + // + // MemberInfo members + // + + public override Type DeclaringType + { + get + { + return instantiation; + } + } + + public override string Name + { + get + { + return fb.Name; + } + } + + public override Type ReflectedType + { + get + { + return instantiation; + } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + throw new NotSupportedException(); + } + + public override object[] GetCustomAttributes(bool inherit) + { + throw new NotSupportedException(); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + throw new NotSupportedException(); + } + + public override string ToString() + { + return fb.FieldType.ToString() + " " + Name; + } + // + // FieldInfo members + // + + public override FieldAttributes Attributes + { + get + { + return fb.Attributes; + } + } + + public override RuntimeFieldHandle FieldHandle + { + get + { + throw new NotSupportedException(); + } + } + + public override int MetadataToken + { + get + { + throw new InvalidOperationException(); + } + } + + public override Type FieldType + { + get + { + throw new NotSupportedException(); + } + } + + public override object GetValue(object obj) + { + throw new NotSupportedException(); + } + + public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture) + { + throw new NotSupportedException(); + } + + // Called from the runtime to return the corresponding finished FieldInfo object + internal FieldInfo RuntimeResolve() + { + var type = instantiation.RuntimeResolve(); + return type.GetField(fb); + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs index 4d78390b2e154..ff90c6bc82e13 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit.GenericTypeParameterBuilder // @@ -18,10 +16,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -31,6 +29,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System.Reflection; using System.Reflection.Emit; @@ -42,435 +41,463 @@ namespace System.Reflection.Emit { - [ComVisible (true)] - [StructLayout (LayoutKind.Sequential)] - public sealed class GenericTypeParameterBuilder : - TypeInfo - { - #region Sync with reflection.h - private TypeBuilder tbuilder; - private MethodBuilder mbuilder; - private string name; - private int index; - private Type base_type; + [ComVisible(true)] + [StructLayout(LayoutKind.Sequential)] + public sealed class GenericTypeParameterBuilder : + TypeInfo + { + #region Sync with reflection.h + private TypeBuilder tbuilder; + private MethodBuilder mbuilder; + private string name; + private int index; + private Type base_type; #pragma warning disable 414 - private Type[] iface_constraints; - private CustomAttributeBuilder[] cattrs; - private GenericParameterAttributes attrs; + private Type[] iface_constraints; + private CustomAttributeBuilder[] cattrs; + private GenericParameterAttributes attrs; #pragma warning restore - #endregion - - public void SetBaseTypeConstraint (Type baseTypeConstraint) - { - this.base_type = baseTypeConstraint ?? typeof (object); - } - - [ComVisible (true)] - public void SetInterfaceConstraints (params Type[] interfaceConstraints) - { - this.iface_constraints = interfaceConstraints; - } - - public void SetGenericParameterAttributes (GenericParameterAttributes genericParameterAttributes) - { - this.attrs = genericParameterAttributes; - } - - internal GenericTypeParameterBuilder (TypeBuilder tbuilder, - MethodBuilder mbuilder, - string name, int index) - { - this.tbuilder = tbuilder; - this.mbuilder = mbuilder; - this.name = name; - this.index = index; - } - - internal override Type InternalResolve () - { - if (mbuilder != null) - return MethodBase.GetMethodFromHandle (mbuilder.MethodHandleInternal, mbuilder.TypeBuilder.InternalResolve ().TypeHandle).GetGenericArguments () [index]; - return tbuilder.InternalResolve ().GetGenericArguments () [index]; - } - - internal override Type RuntimeResolve () - { - if (mbuilder != null) - return MethodBase.GetMethodFromHandle (mbuilder.MethodHandleInternal, mbuilder.TypeBuilder.RuntimeResolve ().TypeHandle).GetGenericArguments () [index]; - return tbuilder.RuntimeResolve ().GetGenericArguments () [index]; - } - - [ComVisible (true)] - public override bool IsSubclassOf (Type c) - { - throw not_supported (); - } - - protected override TypeAttributes GetAttributeFlagsImpl () - { - return TypeAttributes.Public; - } - - protected override ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr, - Binder binder, - CallingConventions callConvention, - Type[] types, - ParameterModifier[] modifiers) - { - throw not_supported (); - } - - [ComVisible (true)] - public override ConstructorInfo[] GetConstructors (BindingFlags bindingAttr) - { - throw not_supported (); - } - - public override EventInfo GetEvent (string name, BindingFlags bindingAttr) - { - throw not_supported (); - } - - public override EventInfo[] GetEvents () - { - throw not_supported (); - } - - public override EventInfo[] GetEvents (BindingFlags bindingAttr) - { - throw not_supported (); - } - - public override FieldInfo GetField (string name, BindingFlags bindingAttr) - { - throw not_supported (); - } - - public override FieldInfo[] GetFields (BindingFlags bindingAttr) - { - throw not_supported (); - } - - public override Type GetInterface (string name, bool ignoreCase) - { - throw not_supported (); - } - - public override Type[] GetInterfaces () - { - throw not_supported (); - } - - public override MemberInfo[] GetMembers (BindingFlags bindingAttr) - { - throw not_supported (); - } - - public override MemberInfo[] GetMember (string name, MemberTypes type, BindingFlags bindingAttr) - { - throw not_supported (); - } - - public override MethodInfo [] GetMethods (BindingFlags bindingAttr) - { - throw not_supported (); - } - - protected override MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, - Binder binder, - CallingConventions callConvention, - Type[] types, ParameterModifier[] modifiers) - { - throw not_supported (); - } - - public override Type GetNestedType (string name, BindingFlags bindingAttr) - { - throw not_supported (); - } - - public override Type[] GetNestedTypes (BindingFlags bindingAttr) - { - throw not_supported (); - } - - public override PropertyInfo [] GetProperties (BindingFlags bindingAttr) - { - throw not_supported (); - } - - protected override PropertyInfo GetPropertyImpl (string name, BindingFlags bindingAttr, - Binder binder, Type returnType, - Type[] types, - ParameterModifier[] modifiers) - { - throw not_supported (); - } - - protected override bool HasElementTypeImpl () - { - return false; - } - - public override bool IsAssignableFrom (Type c) - { - throw not_supported (); - } - - public override bool IsAssignableFrom (TypeInfo typeInfo) - { - if (typeInfo == null) - return false; - - return IsAssignableFrom (typeInfo.AsType ()); - } - - public override bool IsInstanceOfType (object o) - { - throw not_supported (); - } - - protected override bool IsArrayImpl () - { - return false; - } - - protected override bool IsByRefImpl () - { - return false; - } - - protected override bool IsCOMObjectImpl () - { - return false; - } - - protected override bool IsPointerImpl () - { - return false; - } - - protected override bool IsPrimitiveImpl () - { - return false; - } - - protected override bool IsValueTypeImpl () - { - return base_type != null ? base_type.IsValueType : false; - } - - public override bool IsSZArray { - get { - return false; - } - } - - public override object InvokeMember (string name, BindingFlags invokeAttr, - Binder binder, object target, object[] args, - ParameterModifier[] modifiers, - CultureInfo culture, string[] namedParameters) - { - throw not_supported (); - } - - public override Type GetElementType () - { - throw not_supported (); - } - - public override Type UnderlyingSystemType { - get { - return this; - } - } - - public override Assembly Assembly { - get { return tbuilder.Assembly; } - } - - public override string AssemblyQualifiedName { - get { return null; } - } - - public override Type BaseType { - get { return base_type; } - } - - public override string FullName { - get { return null; } - } - - public override Guid GUID { - get { throw not_supported (); } - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - throw not_supported (); - } - - public override object[] GetCustomAttributes (bool inherit) - { - throw not_supported (); - } - - public override object[] GetCustomAttributes (Type attributeType, bool inherit) - { - throw not_supported (); - } - - [ComVisible (true)] - public override InterfaceMapping GetInterfaceMap (Type interfaceType) - { - throw not_supported (); - } - - public override string Name { - get { return name; } - } - - public override string Namespace { - get { return null; } - } - - public override Module Module { - get { return tbuilder.Module; } - } - - public override Type DeclaringType { - get { return mbuilder != null ? mbuilder.DeclaringType : tbuilder; } - } - - public override Type ReflectedType { - get { return DeclaringType; } - } - - public override RuntimeTypeHandle TypeHandle { - get { throw not_supported (); } - } - - public override Type[] GetGenericArguments () - { - throw new InvalidOperationException (); - } - - public override Type GetGenericTypeDefinition () - { - throw new InvalidOperationException (); - } - - public override bool ContainsGenericParameters { - get { return true; } - } - - public override bool IsGenericParameter { - get { return true; } - } - - public override bool IsGenericType { - get { return false; } - } - - public override bool IsGenericTypeDefinition { - get { return false; } - } - - public override GenericParameterAttributes GenericParameterAttributes { - get { - return attrs; - } - } - - public override int GenericParameterPosition { - get { return index; } - } - - public override Type[] GetGenericParameterConstraints () - { - throw new InvalidOperationException (); - } - - public override MethodBase DeclaringMethod { - get { return mbuilder; } - } - - public void SetCustomAttribute (CustomAttributeBuilder customBuilder) - { - if (customBuilder == null) - throw new ArgumentNullException ("customBuilder"); - - if (cattrs != null) { - CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1]; - cattrs.CopyTo (new_array, 0); - new_array [cattrs.Length] = customBuilder; - cattrs = new_array; - } else { - cattrs = new CustomAttributeBuilder [1]; - cattrs [0] = customBuilder; - } - } - - // FIXME: "unverified implementation" - public void SetCustomAttribute (ConstructorInfo con, byte [] binaryAttribute) - { - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } - - private Exception not_supported () - { - return new NotSupportedException (); - } - - public override string ToString () - { - return name; - } - - // FIXME: - public override bool Equals (object o) - { - return base.Equals (o); - } - - // FIXME: - public override int GetHashCode () - { - return base.GetHashCode (); - } - - public override Type MakeArrayType () - { - return new ArrayType (this, 0); - } - - public override Type MakeArrayType (int rank) - { - if (rank < 1) - throw new IndexOutOfRangeException (); - return new ArrayType (this, rank); - } - - public override Type MakeByRefType () - { - return new ByRefType (this); - } - - public override Type MakeGenericType (params Type[] typeArguments) - { - throw new InvalidOperationException (Environment.GetResourceString ("Arg_NotGenericTypeDefinition")); - } - - public override Type MakePointerType () - { - return new PointerType (this); - } - - internal override bool IsUserType { - get { - return false; - } - } - } + #endregion + + public void SetBaseTypeConstraint(Type baseTypeConstraint) + { + this.base_type = baseTypeConstraint ?? typeof(object); + } + + [ComVisible(true)] + public void SetInterfaceConstraints(params Type[] interfaceConstraints) + { + this.iface_constraints = interfaceConstraints; + } + + public void SetGenericParameterAttributes(GenericParameterAttributes genericParameterAttributes) + { + this.attrs = genericParameterAttributes; + } + + internal GenericTypeParameterBuilder(TypeBuilder tbuilder, + MethodBuilder mbuilder, + string name, int index) + { + this.tbuilder = tbuilder; + this.mbuilder = mbuilder; + this.name = name; + this.index = index; + } + + internal override Type InternalResolve() + { + if (mbuilder != null) + return MethodBase.GetMethodFromHandle(mbuilder.MethodHandleInternal, mbuilder.TypeBuilder.InternalResolve().TypeHandle).GetGenericArguments()[index]; + return tbuilder.InternalResolve().GetGenericArguments()[index]; + } + + internal override Type RuntimeResolve() + { + if (mbuilder != null) + return MethodBase.GetMethodFromHandle(mbuilder.MethodHandleInternal, mbuilder.TypeBuilder.RuntimeResolve().TypeHandle).GetGenericArguments()[index]; + return tbuilder.RuntimeResolve().GetGenericArguments()[index]; + } + + [ComVisible(true)] + public override bool IsSubclassOf(Type c) + { + throw not_supported(); + } + + protected override TypeAttributes GetAttributeFlagsImpl() + { + return TypeAttributes.Public; + } + + protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr, + Binder binder, + CallingConventions callConvention, + Type[] types, + ParameterModifier[] modifiers) + { + throw not_supported(); + } + + [ComVisible(true)] + public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr) + { + throw not_supported(); + } + + public override EventInfo GetEvent(string name, BindingFlags bindingAttr) + { + throw not_supported(); + } + + public override EventInfo[] GetEvents() + { + throw not_supported(); + } + + public override EventInfo[] GetEvents(BindingFlags bindingAttr) + { + throw not_supported(); + } + + public override FieldInfo GetField(string name, BindingFlags bindingAttr) + { + throw not_supported(); + } + + public override FieldInfo[] GetFields(BindingFlags bindingAttr) + { + throw not_supported(); + } + + public override Type GetInterface(string name, bool ignoreCase) + { + throw not_supported(); + } + + public override Type[] GetInterfaces() + { + throw not_supported(); + } + + public override MemberInfo[] GetMembers(BindingFlags bindingAttr) + { + throw not_supported(); + } + + public override MemberInfo[] GetMember(string name, MemberTypes type, BindingFlags bindingAttr) + { + throw not_supported(); + } + + public override MethodInfo[] GetMethods(BindingFlags bindingAttr) + { + throw not_supported(); + } + + protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, + Binder binder, + CallingConventions callConvention, + Type[] types, ParameterModifier[] modifiers) + { + throw not_supported(); + } + + public override Type GetNestedType(string name, BindingFlags bindingAttr) + { + throw not_supported(); + } + + public override Type[] GetNestedTypes(BindingFlags bindingAttr) + { + throw not_supported(); + } + + public override PropertyInfo[] GetProperties(BindingFlags bindingAttr) + { + throw not_supported(); + } + + protected override PropertyInfo GetPropertyImpl(string name, BindingFlags bindingAttr, + Binder binder, Type returnType, + Type[] types, + ParameterModifier[] modifiers) + { + throw not_supported(); + } + + protected override bool HasElementTypeImpl() + { + return false; + } + + public override bool IsAssignableFrom(Type c) + { + throw not_supported(); + } + + public override bool IsAssignableFrom(TypeInfo typeInfo) + { + if (typeInfo == null) + return false; + + return IsAssignableFrom(typeInfo.AsType()); + } + + public override bool IsInstanceOfType(object o) + { + throw not_supported(); + } + + protected override bool IsArrayImpl() + { + return false; + } + + protected override bool IsByRefImpl() + { + return false; + } + + protected override bool IsCOMObjectImpl() + { + return false; + } + + protected override bool IsPointerImpl() + { + return false; + } + + protected override bool IsPrimitiveImpl() + { + return false; + } + + protected override bool IsValueTypeImpl() + { + return base_type != null ? base_type.IsValueType : false; + } + + public override bool IsSZArray + { + get + { + return false; + } + } + + public override object InvokeMember(string name, BindingFlags invokeAttr, + Binder binder, object target, object[] args, + ParameterModifier[] modifiers, + CultureInfo culture, string[] namedParameters) + { + throw not_supported(); + } + + public override Type GetElementType() + { + throw not_supported(); + } + + public override Type UnderlyingSystemType + { + get + { + return this; + } + } + + public override Assembly Assembly + { + get { return tbuilder.Assembly; } + } + + public override string AssemblyQualifiedName + { + get { return null; } + } + + public override Type BaseType + { + get { return base_type; } + } + + public override string FullName + { + get { return null; } + } + + public override Guid GUID + { + get { throw not_supported(); } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + throw not_supported(); + } + + public override object[] GetCustomAttributes(bool inherit) + { + throw not_supported(); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + throw not_supported(); + } + + [ComVisible(true)] + public override InterfaceMapping GetInterfaceMap(Type interfaceType) + { + throw not_supported(); + } + + public override string Name + { + get { return name; } + } + + public override string Namespace + { + get { return null; } + } + + public override Module Module + { + get { return tbuilder.Module; } + } + + public override Type DeclaringType + { + get { return mbuilder != null ? mbuilder.DeclaringType : tbuilder; } + } + + public override Type ReflectedType + { + get { return DeclaringType; } + } + + public override RuntimeTypeHandle TypeHandle + { + get { throw not_supported(); } + } + + public override Type[] GetGenericArguments() + { + throw new InvalidOperationException(); + } + + public override Type GetGenericTypeDefinition() + { + throw new InvalidOperationException(); + } + + public override bool ContainsGenericParameters + { + get { return true; } + } + + public override bool IsGenericParameter + { + get { return true; } + } + + public override bool IsGenericType + { + get { return false; } + } + + public override bool IsGenericTypeDefinition + { + get { return false; } + } + + public override GenericParameterAttributes GenericParameterAttributes + { + get + { + return attrs; + } + } + + public override int GenericParameterPosition + { + get { return index; } + } + + public override Type[] GetGenericParameterConstraints() + { + throw new InvalidOperationException(); + } + + public override MethodBase DeclaringMethod + { + get { return mbuilder; } + } + + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + if (customBuilder == null) + throw new ArgumentNullException(nameof(customBuilder)); + + if (cattrs != null) + { + CustomAttributeBuilder[] new_array = new CustomAttributeBuilder[cattrs.Length + 1]; + cattrs.CopyTo(new_array, 0); + new_array[cattrs.Length] = customBuilder; + cattrs = new_array; + } + else + { + cattrs = new CustomAttributeBuilder[1]; + cattrs[0] = customBuilder; + } + } + + // FIXME: "unverified implementation" + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } + + private Exception not_supported() + { + return new NotSupportedException(); + } + + public override string ToString() + { + return name; + } + + // FIXME: + public override bool Equals(object o) + { + return base.Equals(o); + } + + // FIXME: + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public override Type MakeArrayType() + { + return new ArrayType(this, 0); + } + + public override Type MakeArrayType(int rank) + { + if (rank < 1) + throw new IndexOutOfRangeException(); + return new ArrayType(this, rank); + } + + public override Type MakeByRefType() + { + return new ByRefType(this); + } + + public override Type MakeGenericType(params Type[] typeArguments) + { + throw new InvalidOperationException(Environment.GetResourceString("Arg_NotGenericTypeDefinition")); + } + + public override Type MakePointerType() + { + return new PointerType(this); + } + + internal override bool IsUserType + { + get + { + return false; + } + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.Mono.cs index 873d3e38be474..cbf4cf3aec829 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,28 +30,32 @@ // (C) 2001 Ximian, Inc. http://www.ximian.com // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Collections.Generic; using System.Diagnostics.SymbolStore; using System.Runtime.InteropServices; -namespace System.Reflection.Emit { - - internal struct ILExceptionBlock { - public const int CATCH = 0; - public const int FILTER = 1; - public const int FINALLY = 2; - public const int FAULT = 4; - public const int FILTER_START = -1; - - internal Type extype; - internal int type; - internal int start; - internal int len; - internal int filter_offset; - - internal void Debug () { +namespace System.Reflection.Emit +{ + + internal struct ILExceptionBlock + { + public const int CATCH = 0; + public const int FILTER = 1; + public const int FINALLY = 2; + public const int FAULT = 4; + public const int FILTER_START = -1; + + internal Type extype; + internal int type; + internal int start; + internal int len; + internal int filter_offset; + + internal void Debug() + { #if FALSE System.Console.Write ("\ttype="+type.ToString()+" start="+start.ToString()+" len="+len.ToString()); if (extype != null) @@ -61,1062 +63,1142 @@ internal void Debug () { else System.Console.WriteLine (String.Empty); #endif - } - } - internal struct ILExceptionInfo { + } + } + internal struct ILExceptionInfo + { #pragma warning disable 169 #pragma warning disable 414 - internal ILExceptionBlock[] handlers; - internal int start; - internal int len; - internal Label end; + internal ILExceptionBlock[] handlers; + internal int start; + internal int len; + internal Label end; #pragma warning restore 169 #pragma warning restore 414 - internal int NumHandlers () - { - return handlers.Length; - } - - internal void AddCatch (Type extype, int offset) - { - int i; - End (offset); - add_block (offset); - i = handlers.Length - 1; - handlers [i].type = ILExceptionBlock.CATCH; - handlers [i].start = offset; - handlers [i].extype = extype; - } - - internal void AddFinally (int offset) - { - int i; - End (offset); - add_block (offset); - i = handlers.Length - 1; - handlers [i].type = ILExceptionBlock.FINALLY; - handlers [i].start = offset; - handlers [i].extype = null; - } - - internal void AddFault (int offset) - { - int i; - End (offset); - add_block (offset); - i = handlers.Length - 1; - handlers [i].type = ILExceptionBlock.FAULT; - handlers [i].start = offset; - handlers [i].extype = null; - } - - internal void AddFilter (int offset) - { - int i; - End (offset); - add_block (offset); - i = handlers.Length - 1; - handlers [i].type = ILExceptionBlock.FILTER_START; - handlers [i].extype = null; - handlers [i].filter_offset = offset; - } - - internal void End (int offset) - { - if (handlers == null) - return; - int i = handlers.Length - 1; - if (i >= 0) - handlers [i].len = offset - handlers [i].start; - } - - internal int LastClauseType () - { - if (handlers != null) - return handlers [handlers.Length-1].type; - else - return ILExceptionBlock.CATCH; - } - - internal void PatchFilterClause (int start) - { - if (handlers != null && handlers.Length > 0) { - handlers [handlers.Length - 1].start = start; - handlers [handlers.Length - 1].type = ILExceptionBlock.FILTER; - } - } - - internal void Debug (int b) - { + internal int NumHandlers() + { + return handlers.Length; + } + + internal void AddCatch(Type extype, int offset) + { + int i; + End(offset); + add_block(offset); + i = handlers.Length - 1; + handlers[i].type = ILExceptionBlock.CATCH; + handlers[i].start = offset; + handlers[i].extype = extype; + } + + internal void AddFinally(int offset) + { + int i; + End(offset); + add_block(offset); + i = handlers.Length - 1; + handlers[i].type = ILExceptionBlock.FINALLY; + handlers[i].start = offset; + handlers[i].extype = null; + } + + internal void AddFault(int offset) + { + int i; + End(offset); + add_block(offset); + i = handlers.Length - 1; + handlers[i].type = ILExceptionBlock.FAULT; + handlers[i].start = offset; + handlers[i].extype = null; + } + + internal void AddFilter(int offset) + { + int i; + End(offset); + add_block(offset); + i = handlers.Length - 1; + handlers[i].type = ILExceptionBlock.FILTER_START; + handlers[i].extype = null; + handlers[i].filter_offset = offset; + } + + internal void End(int offset) + { + if (handlers == null) + return; + int i = handlers.Length - 1; + if (i >= 0) + handlers[i].len = offset - handlers[i].start; + } + + internal int LastClauseType() + { + if (handlers != null) + return handlers[handlers.Length - 1].type; + else + return ILExceptionBlock.CATCH; + } + + internal void PatchFilterClause(int start) + { + if (handlers != null && handlers.Length > 0) + { + handlers[handlers.Length - 1].start = start; + handlers[handlers.Length - 1].type = ILExceptionBlock.FILTER; + } + } + + internal void Debug(int b) + { #if FALSE System.Console.WriteLine ("Handler {0} at {1}, len: {2}", b, start, len); for (int i = 0; i < handlers.Length; ++i) handlers [i].Debug (); #endif - } - - void add_block (int offset) - { - if (handlers != null) { - int i = handlers.Length; - ILExceptionBlock[] new_b = new ILExceptionBlock [i + 1]; - System.Array.Copy (handlers, new_b, i); - handlers = new_b; - handlers [i].len = offset - handlers [i].start; - } else { - handlers = new ILExceptionBlock [1]; - len = offset - start; - } - } - } - - internal struct ILTokenInfo { - public MemberInfo member; - public int code_pos; - } - - internal interface TokenGenerator { - int GetToken (string str); - - int GetToken (MemberInfo member, bool create_open_instance); - - int GetToken (MethodBase method, Type[] opt_param_types); - - int GetToken (SignatureHelper helper); - } - - [StructLayout (LayoutKind.Sequential)] - public partial class ILGenerator { - private struct LabelFixup { - public int offset; // The number of bytes between pos and the - // offset of the jump - public int pos; // Where offset of the label is placed - public int label_idx; // The label to jump to - }; - - struct LabelData { - public LabelData (int addr, int maxStack) - { - this.addr = addr; - this.maxStack = maxStack; - } - - public int addr; - public int maxStack; - } - - #region Sync with reflection.h - private byte[] code; - private int code_len; - private int max_stack; - private int cur_stack; - private LocalBuilder[] locals; - private ILExceptionInfo[] ex_handlers; - private int num_token_fixups; - private object token_fixups; - #endregion - - private LabelData [] labels; - private int num_labels; - private LabelFixup[] fixups; - private int num_fixups; - internal Module module; - private int cur_block; - private Stack open_blocks; - private TokenGenerator token_gen; - - const int defaultFixupSize = 4; - const int defaultLabelsSize = 4; - const int defaultExceptionStackSize = 2; - - List sequencePointLists; - SequencePointList currentSequence; - - internal ILGenerator (Module m, TokenGenerator token_gen, int size) - { - if (size < 0) - size = 128; - code = new byte [size]; - module = m; - this.token_gen = token_gen; - } - - private void make_room (int nbytes) - { - if (code_len + nbytes < code.Length) - return; - byte[] new_code = new byte [(code_len + nbytes) * 2 + 128]; - System.Array.Copy (code, 0, new_code, 0, code.Length); - code = new_code; - } - - private void emit_int (int val) - { - code [code_len++] = (byte) (val & 0xFF); - code [code_len++] = (byte) ((val >> 8) & 0xFF); - code [code_len++] = (byte) ((val >> 16) & 0xFF); - code [code_len++] = (byte) ((val >> 24) & 0xFF); - } - - /* change to pass by ref to avoid copy */ - private void ll_emit (OpCode opcode) - { - /* - * there is already enough room allocated in code. - */ - if (opcode.Size == 2) - code [code_len++] = (byte)(opcode.Value >> 8); - code [code_len++] = (byte)(opcode.Value & 0xff); - /* - * We should probably keep track of stack needs here. - * Or we may want to run the verifier on the code before saving it - * (this may be needed anyway when the ILGenerator is not used...). - */ - switch (opcode.StackBehaviourPush) { - case StackBehaviour.Push1: - case StackBehaviour.Pushi: - case StackBehaviour.Pushi8: - case StackBehaviour.Pushr4: - case StackBehaviour.Pushr8: - case StackBehaviour.Pushref: - case StackBehaviour.Varpush: /* again we are conservative and assume it pushes 1 */ - cur_stack ++; - break; - case StackBehaviour.Push1_push1: - cur_stack += 2; - break; - } - if (max_stack < cur_stack) - max_stack = cur_stack; - - /* - * Note that we adjust for the pop behaviour _after_ setting max_stack. - */ - switch (opcode.StackBehaviourPop) { - case StackBehaviour.Varpop: - break; /* we are conservative and assume it doesn't decrease the stack needs */ - case StackBehaviour.Pop1: - case StackBehaviour.Popi: - case StackBehaviour.Popref: - cur_stack --; - break; - case StackBehaviour.Pop1_pop1: - case StackBehaviour.Popi_pop1: - case StackBehaviour.Popi_popi: - case StackBehaviour.Popi_popi8: - case StackBehaviour.Popi_popr4: - case StackBehaviour.Popi_popr8: - case StackBehaviour.Popref_pop1: - case StackBehaviour.Popref_popi: - cur_stack -= 2; - break; - case StackBehaviour.Popi_popi_popi: - case StackBehaviour.Popref_popi_popi: - case StackBehaviour.Popref_popi_popi8: - case StackBehaviour.Popref_popi_popr4: - case StackBehaviour.Popref_popi_popr8: - case StackBehaviour.Popref_popi_popref: - cur_stack -= 3; - break; - } - } - - private static int target_len (OpCode opcode) - { - if (opcode.OperandType == OperandType.InlineBrTarget) - return 4; - return 1; - } - - private void InternalEndClause () - { - switch (ex_handlers [cur_block].LastClauseType ()) { - case ILExceptionBlock.CATCH: - case ILExceptionBlock.FILTER: - case ILExceptionBlock.FILTER_START: - // how could we optimize code size here? - Emit (OpCodes.Leave, ex_handlers [cur_block].end); - break; - case ILExceptionBlock.FAULT: - case ILExceptionBlock.FINALLY: - Emit (OpCodes.Endfinally); - break; - } - } - - public virtual void BeginCatchBlock (Type exceptionType) - { - if (open_blocks == null) - open_blocks = new Stack (defaultExceptionStackSize); - - if (open_blocks.Count <= 0) - throw new NotSupportedException ("Not in an exception block"); - if (exceptionType != null && exceptionType.IsUserType) - throw new NotSupportedException ("User defined subclasses of System.Type are not yet supported."); - if (ex_handlers [cur_block].LastClauseType () == ILExceptionBlock.FILTER_START) { - if (exceptionType != null) - throw new ArgumentException ("Do not supply an exception type for filter clause"); - Emit (OpCodes.Endfilter); - ex_handlers [cur_block].PatchFilterClause (code_len); - } else { - InternalEndClause (); - ex_handlers [cur_block].AddCatch (exceptionType, code_len); - } - - cur_stack = 1; // the exception object is on the stack by default - if (max_stack < cur_stack) - max_stack = cur_stack; - - //System.Console.WriteLine ("Begin catch Block: {0} {1}",exceptionType.ToString(), max_stack); - } - - public virtual void BeginExceptFilterBlock () - { - if (open_blocks == null) - open_blocks = new Stack (defaultExceptionStackSize); - - if (open_blocks.Count <= 0) - throw new NotSupportedException ("Not in an exception block"); - InternalEndClause (); - - ex_handlers [cur_block].AddFilter (code_len); - } - - public virtual Label BeginExceptionBlock () - { - //System.Console.WriteLine ("Begin Block"); - if (open_blocks == null) - open_blocks = new Stack (defaultExceptionStackSize); - - if (ex_handlers != null) { - cur_block = ex_handlers.Length; - ILExceptionInfo[] new_ex = new ILExceptionInfo [cur_block + 1]; - System.Array.Copy (ex_handlers, new_ex, cur_block); - ex_handlers = new_ex; - } else { - ex_handlers = new ILExceptionInfo [1]; - cur_block = 0; - } - open_blocks.Push (cur_block); - ex_handlers [cur_block].start = code_len; - return ex_handlers [cur_block].end = DefineLabel (); - } - - public virtual void BeginFaultBlock() - { - if (open_blocks == null) - open_blocks = new Stack (defaultExceptionStackSize); - - if (open_blocks.Count <= 0) - throw new NotSupportedException ("Not in an exception block"); - - if (ex_handlers [cur_block].LastClauseType () == ILExceptionBlock.FILTER_START) { - Emit (OpCodes.Leave, ex_handlers [cur_block].end); - ex_handlers [cur_block].PatchFilterClause (code_len); - } - - InternalEndClause (); - //System.Console.WriteLine ("Begin fault Block"); - ex_handlers [cur_block].AddFault (code_len); - } - - public virtual void BeginFinallyBlock() - { - if (open_blocks == null) - open_blocks = new Stack (defaultExceptionStackSize); - - if (open_blocks.Count <= 0) - throw new NotSupportedException ("Not in an exception block"); - - InternalEndClause (); - - if (ex_handlers [cur_block].LastClauseType () == ILExceptionBlock.FILTER_START) { - Emit (OpCodes.Leave, ex_handlers [cur_block].end); - ex_handlers [cur_block].PatchFilterClause (code_len); - } - - //System.Console.WriteLine ("Begin finally Block"); - ex_handlers [cur_block].AddFinally (code_len); - } - - public virtual void BeginScope () - { } - - public virtual LocalBuilder DeclareLocal (Type localType) - { - return DeclareLocal (localType, false); - } - - - public virtual LocalBuilder DeclareLocal (Type localType, bool pinned) - { - if (localType == null) - throw new ArgumentNullException ("localType"); - if (localType.IsUserType) - throw new NotSupportedException ("User defined subclasses of System.Type are not yet supported."); - LocalBuilder res = new LocalBuilder (localType, this); - res.is_pinned = pinned; - - if (locals != null) { - LocalBuilder[] new_l = new LocalBuilder [locals.Length + 1]; - System.Array.Copy (locals, new_l, locals.Length); - new_l [locals.Length] = res; - locals = new_l; - } else { - locals = new LocalBuilder [1]; - locals [0] = res; - } - res.position = (ushort)(locals.Length - 1); - return res; - } - - public virtual Label DefineLabel () - { - if (labels == null) - labels = new LabelData [defaultLabelsSize]; - else if (num_labels >= labels.Length) { - LabelData [] t = new LabelData [labels.Length * 2]; - Array.Copy (labels, t, labels.Length); - labels = t; - } - - labels [num_labels] = new LabelData (-1, 0); - - return new Label (num_labels++); - } - - public virtual void Emit (OpCode opcode) - { - make_room (2); - ll_emit (opcode); - } - - public virtual void Emit (OpCode opcode, Byte arg) - { - make_room (3); - ll_emit (opcode); - code [code_len++] = arg; - } - - [ComVisible (true)] - public virtual void Emit (OpCode opcode, ConstructorInfo con) - { - int token = token_gen.GetToken (con, true); - make_room (6); - ll_emit (opcode); - emit_int (token); - - if (opcode.StackBehaviourPop == StackBehaviour.Varpop) - cur_stack -= con.GetParametersCount (); - } - - public virtual void Emit (OpCode opcode, double arg) - { - byte[] s = System.BitConverter.GetBytes (arg); - make_room (10); - ll_emit (opcode); - if (BitConverter.IsLittleEndian){ - System.Array.Copy (s, 0, code, code_len, 8); - code_len += 8; - } else { - code [code_len++] = s [7]; - code [code_len++] = s [6]; - code [code_len++] = s [5]; - code [code_len++] = s [4]; - code [code_len++] = s [3]; - code [code_len++] = s [2]; - code [code_len++] = s [1]; - code [code_len++] = s [0]; - } - } - - public virtual void Emit (OpCode opcode, FieldInfo field) - { - int token = token_gen.GetToken (field, true); - make_room (6); - ll_emit (opcode); - emit_int (token); - } - - public virtual void Emit (OpCode opcode, Int16 arg) - { - make_room (4); - ll_emit (opcode); - code [code_len++] = (byte) (arg & 0xFF); - code [code_len++] = (byte) ((arg >> 8) & 0xFF); - } - - public virtual void Emit (OpCode opcode, int arg) - { - make_room (6); - ll_emit (opcode); - emit_int (arg); - } - - public virtual void Emit (OpCode opcode, long arg) - { - make_room (10); - ll_emit (opcode); - code [code_len++] = (byte) (arg & 0xFF); - code [code_len++] = (byte) ((arg >> 8) & 0xFF); - code [code_len++] = (byte) ((arg >> 16) & 0xFF); - code [code_len++] = (byte) ((arg >> 24) & 0xFF); - code [code_len++] = (byte) ((arg >> 32) & 0xFF); - code [code_len++] = (byte) ((arg >> 40) & 0xFF); - code [code_len++] = (byte) ((arg >> 48) & 0xFF); - code [code_len++] = (byte) ((arg >> 56) & 0xFF); - } - - public virtual void Emit (OpCode opcode, Label label) - { - int tlen = target_len (opcode); - make_room (6); - ll_emit (opcode); - if (cur_stack > labels [label.m_label].maxStack) - labels [label.m_label].maxStack = cur_stack; - - if (fixups == null) - fixups = new LabelFixup [defaultFixupSize]; - else if (num_fixups >= fixups.Length) { - LabelFixup[] newf = new LabelFixup [fixups.Length * 2]; - System.Array.Copy (fixups, newf, fixups.Length); - fixups = newf; - } - fixups [num_fixups].offset = tlen; - fixups [num_fixups].pos = code_len; - fixups [num_fixups].label_idx = label.m_label; - num_fixups++; - code_len += tlen; - - } - - public virtual void Emit (OpCode opcode, Label[] labels) - { - if (labels == null) - throw new ArgumentNullException ("labels"); - - /* opcode needs to be switch. */ - int count = labels.Length; - make_room (6 + count * 4); - ll_emit (opcode); - - for (int i = 0; i < count; ++i) - if (cur_stack > this.labels [labels [i].m_label].maxStack) - this.labels [labels [i].m_label].maxStack = cur_stack; - - emit_int (count); - if (fixups == null) - fixups = new LabelFixup [defaultFixupSize + count]; - else if (num_fixups + count >= fixups.Length) { - LabelFixup[] newf = new LabelFixup [count + fixups.Length * 2]; - System.Array.Copy (fixups, newf, fixups.Length); - fixups = newf; - } - - // ECMA 335, Partition III, p94 (7-10) - // - // The switch instruction implements a jump table. The format of - // the instruction is an unsigned int32 representing the number of targets N, - // followed by N int32 values specifying jump targets: these targets are - // represented as offsets (positive or negative) from the beginning of the - // instruction following this switch instruction. - // - // We must make sure it gets an offset from the *end* of the last label - // (eg, the beginning of the instruction following this). - // - // remaining is the number of bytes from the current instruction to the - // instruction that will be emitted. - - for (int i = 0, remaining = count * 4; i < count; ++i, remaining -= 4) { - fixups [num_fixups].offset = remaining; - fixups [num_fixups].pos = code_len; - fixups [num_fixups].label_idx = labels [i].m_label; - num_fixups++; - code_len += 4; - } - } - - public virtual void Emit (OpCode opcode, LocalBuilder local) - { - if (local == null) - throw new ArgumentNullException ("local"); - if (local.ilgen != this) - throw new ArgumentException ("Trying to emit a local from a different ILGenerator."); - - uint pos = local.position; - if ((opcode == OpCodes.Ldloca_S || opcode == OpCodes.Ldloc_S || opcode == OpCodes.Stloc_S) && pos > 255) - throw new InvalidOperationException ("Opcodes using a short-form index cannot address a local position over 255."); - - bool load_addr = false; - bool is_store = false; - bool is_load = false; - make_room (6); - - /* inline the code from ll_emit () to optimize il code size */ - if (opcode.StackBehaviourPop == StackBehaviour.Pop1) { - cur_stack --; - is_store = true; - } else if (opcode.StackBehaviourPush == StackBehaviour.Push1 || opcode.StackBehaviourPush == StackBehaviour.Pushi) { - cur_stack++; - is_load = true; - if (cur_stack > max_stack) - max_stack = cur_stack; - load_addr = opcode.StackBehaviourPush == StackBehaviour.Pushi; - } - if (load_addr) { - if (pos < 256) { - code [code_len++] = (byte)0x12; - code [code_len++] = (byte)pos; - } else { - code [code_len++] = (byte)0xfe; - code [code_len++] = (byte)0x0d; - code [code_len++] = (byte)(pos & 0xff); - code [code_len++] = (byte)((pos >> 8) & 0xff); - } - } else { - if (is_store) { - if (pos < 4) { - code [code_len++] = (byte)(0x0a + pos); - } else if (pos < 256) { - code [code_len++] = (byte)0x13; - code [code_len++] = (byte)pos; - } else { - code [code_len++] = (byte)0xfe; - code [code_len++] = (byte)0x0e; - code [code_len++] = (byte)(pos & 0xff); - code [code_len++] = (byte)((pos >> 8) & 0xff); - } - } else if (is_load) { - if (pos < 4) { - code [code_len++] = (byte)(0x06 + pos); - } else if (pos < 256) { - code [code_len++] = (byte)0x11; - code [code_len++] = (byte)pos; - } else { - code [code_len++] = (byte)0xfe; - code [code_len++] = (byte)0x0c; - code [code_len++] = (byte)(pos & 0xff); - code [code_len++] = (byte)((pos >> 8) & 0xff); - } - } else { - ll_emit (opcode); - } - } - } - - public virtual void Emit (OpCode opcode, MethodInfo meth) - { - if (meth == null) - throw new ArgumentNullException ("meth"); - - // For compatibility with MS - if ((meth is DynamicMethod) && ((opcode == OpCodes.Ldftn) || (opcode == OpCodes.Ldvirtftn) || (opcode == OpCodes.Ldtoken))) - throw new ArgumentException ("Ldtoken, Ldftn and Ldvirtftn OpCodes cannot target DynamicMethods."); - - int token = token_gen.GetToken (meth, true); - make_room (6); - ll_emit (opcode); - Type declaringType = meth.DeclaringType; - emit_int (token); - if (meth.ReturnType != typeof (void)) - cur_stack ++; - - if (opcode.StackBehaviourPop == StackBehaviour.Varpop) - cur_stack -= meth.GetParametersCount (); - } - - private void Emit (OpCode opcode, MethodInfo method, int token) - { - make_room (6); - ll_emit (opcode); - emit_int (token); - if (method.ReturnType != typeof (void)) - cur_stack ++; - - if (opcode.StackBehaviourPop == StackBehaviour.Varpop) - cur_stack -= method.GetParametersCount (); - } - - [CLSCompliant(false)] - public void Emit (OpCode opcode, sbyte arg) - { - make_room (3); - ll_emit (opcode); - code [code_len++] = (byte)arg; - } - - public virtual void Emit (OpCode opcode, SignatureHelper signature) - { - int token = token_gen.GetToken (signature); - make_room (6); - ll_emit (opcode); - emit_int (token); - } - - public virtual void Emit (OpCode opcode, float arg) - { - byte[] s = System.BitConverter.GetBytes (arg); - make_room (6); - ll_emit (opcode); - if (BitConverter.IsLittleEndian){ - System.Array.Copy (s, 0, code, code_len, 4); - code_len += 4; - } else { - code [code_len++] = s [3]; - code [code_len++] = s [2]; - code [code_len++] = s [1]; - code [code_len++] = s [0]; - } - } - - public virtual void Emit (OpCode opcode, string str) - { - int token = token_gen.GetToken (str); - make_room (6); - ll_emit (opcode); - emit_int (token); - } - - public virtual void Emit (OpCode opcode, Type cls) - { - if (cls != null && cls.IsByRef) - throw new ArgumentException ("Cannot get TypeToken for a ByRef type."); - - make_room (6); - ll_emit (opcode); - int token = token_gen.GetToken (cls, opcode != OpCodes.Ldtoken); - emit_int (token); - } - - // FIXME: vararg methods are not supported - public virtual void EmitCall (OpCode opcode, MethodInfo methodInfo, Type[] optionalParameterTypes) - { - if (methodInfo == null) - throw new ArgumentNullException ("methodInfo"); - short value = opcode.Value; - if (!(value == OpCodes.Call.Value || value == OpCodes.Callvirt.Value)) - throw new NotSupportedException ("Only Call and CallVirt are allowed"); - if ((methodInfo.CallingConvention & CallingConventions.VarArgs) == 0) - optionalParameterTypes = null; - if (optionalParameterTypes != null){ - if ((methodInfo.CallingConvention & CallingConventions.VarArgs) == 0){ - throw new InvalidOperationException ("Method is not VarArgs method and optional types were passed"); - } - - int token = token_gen.GetToken (methodInfo, optionalParameterTypes); - Emit (opcode, methodInfo, token); - return; - } - Emit (opcode, methodInfo); - } - - public virtual void EmitCalli (OpCode opcode, CallingConvention unmanagedCallConv, Type returnType, Type[] parameterTypes) - { - // GetMethodSigHelper expects a ModuleBuilder or null, and module might be - // a normal module when using dynamic methods. - SignatureHelper helper = SignatureHelper.GetMethodSigHelper (module as ModuleBuilder, 0, unmanagedCallConv, returnType, parameterTypes); - Emit (opcode, helper); - } - - public virtual void EmitCalli (OpCode opcode, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type[] optionalParameterTypes) - { - if (optionalParameterTypes != null) - throw new NotImplementedException (); - - SignatureHelper helper = SignatureHelper.GetMethodSigHelper (module as ModuleBuilder, callingConvention, 0, returnType, parameterTypes); - Emit (opcode, helper); - } - - static Type GetConsoleType () - { - return Type.GetType ("System.Console, System.Console", throwOnError: true); - } - - public virtual void EmitWriteLine (FieldInfo fld) - { - if (fld == null) - throw new ArgumentNullException ("fld"); - - // The MS implementation does not check for valuetypes here but it - // should. Also, it should check that if the field is not static, - // then it is a member of this type. - if (fld.IsStatic) - Emit (OpCodes.Ldsfld, fld); - else { - Emit (OpCodes.Ldarg_0); - Emit (OpCodes.Ldfld, fld); - } - Emit (OpCodes.Call, GetConsoleType ().GetMethod ("WriteLine", new Type[1] { fld.FieldType })); - } - - public virtual void EmitWriteLine (LocalBuilder localBuilder) - { - if (localBuilder == null) - throw new ArgumentNullException ("localBuilder"); - if (localBuilder.LocalType is TypeBuilder) - throw new ArgumentException ("Output streams do not support TypeBuilders."); - // The MS implementation does not check for valuetypes here but it - // should. - Emit (OpCodes.Ldloc, localBuilder); - Emit (OpCodes.Call, GetConsoleType ().GetMethod ("WriteLine", new Type[1] { localBuilder.LocalType })); - } - - public virtual void EmitWriteLine (string value) - { - Emit (OpCodes.Ldstr, value); - Emit (OpCodes.Call, GetConsoleType ().GetMethod ("WriteLine", new Type[1] { typeof(string)})); - } - - public virtual void EndExceptionBlock () - { - if (open_blocks == null) - open_blocks = new Stack (defaultExceptionStackSize); - - if (open_blocks.Count <= 0) - throw new NotSupportedException ("Not in an exception block"); - - if (ex_handlers [cur_block].LastClauseType () == ILExceptionBlock.FILTER_START) - throw new InvalidOperationException ("Incorrect code generation for exception block."); - - InternalEndClause (); - MarkLabel (ex_handlers [cur_block].end); - ex_handlers [cur_block].End (code_len); - ex_handlers [cur_block].Debug (cur_block); - //System.Console.WriteLine ("End Block {0} (handlers: {1})", cur_block, ex_handlers [cur_block].NumHandlers ()); - open_blocks.Pop (); - if (open_blocks.Count > 0) - cur_block = (int)open_blocks.Peek (); - //Console.WriteLine ("curblock restored to {0}", cur_block); - //throw new NotImplementedException (); - } - - public virtual void EndScope () - { } - - public virtual void MarkLabel (Label loc) - { - if (loc.m_label < 0 || loc.m_label >= num_labels) - throw new System.ArgumentException ("The label is not valid"); - if (labels [loc.m_label].addr >= 0) - throw new System.ArgumentException ("The label was already defined"); - labels [loc.m_label].addr = code_len; - if (labels [loc.m_label].maxStack > cur_stack) - cur_stack = labels [loc.m_label].maxStack; - } - - public virtual void MarkSequencePoint (ISymbolDocumentWriter document, int startLine, - int startColumn, int endLine, int endColumn) - { - if (currentSequence == null || currentSequence.Document != document) { - if (sequencePointLists == null) - sequencePointLists = new List (); - currentSequence = new SequencePointList (document); - sequencePointLists.Add (currentSequence); - } - - currentSequence.AddSequencePoint (code_len, startLine, startColumn, endLine, endColumn); - } - -/* - internal void GenerateDebugInfo (ISymbolWriter symbolWriter) - { - if (sequencePointLists != null) { - SequencePointList first = (SequencePointList) sequencePointLists [0]; - SequencePointList last = (SequencePointList) sequencePointLists [sequencePointLists.Count - 1]; - symbolWriter.SetMethodSourceRange (first.Document, first.StartLine, first.StartColumn, last.Document, last.EndLine, last.EndColumn); - - foreach (SequencePointList list in sequencePointLists) - symbolWriter.DefineSequencePoints (list.Document, list.GetOffsets(), list.GetLines(), list.GetColumns(), list.GetEndLines(), list.GetEndColumns()); - - if (locals != null) { - foreach (LocalBuilder local in locals) { - if (local.Name != null && local.Name.Length > 0) { - SignatureHelper sighelper = SignatureHelper.GetLocalVarSigHelper (module as ModuleBuilder); - sighelper.AddArgument (local.LocalType); - byte[] signature = sighelper.GetSignature (); - symbolWriter.DefineLocalVariable (local.Name, FieldAttributes.Public, signature, SymAddressKind.ILOffset, local.position, 0, 0, local.StartOffset, local.EndOffset); - } - } - } - sequencePointLists = null; - } - } -*/ - - internal bool HasDebugInfo - { - get { return sequencePointLists != null; } - } - - public virtual void ThrowException (Type excType) - { - if (excType == null) - throw new ArgumentNullException ("excType"); - if (! ((excType == typeof (Exception)) || - excType.IsSubclassOf (typeof (Exception)))) - throw new ArgumentException ("Type should be an exception type", "excType"); - ConstructorInfo ctor = excType.GetConstructor (Type.EmptyTypes); - if (ctor == null) - throw new ArgumentException ("Type should have a default constructor", "excType"); - Emit (OpCodes.Newobj, ctor); - Emit (OpCodes.Throw); - } - - // FIXME: "Not implemented" - public virtual void UsingNamespace (String usingNamespace) - { - throw new NotImplementedException (); - } - - internal void label_fixup (MethodBase mb) - { - for (int i = 0; i < num_fixups; ++i) { - if (labels [fixups [i].label_idx].addr < 0) - throw new ArgumentException (string.Format ("Label #{0} is not marked in method `{1}'", fixups [i].label_idx + 1, mb.Name)); - // Diff is the offset from the end of the jump instruction to the address of the label - int diff = labels [fixups [i].label_idx].addr - (fixups [i].pos + fixups [i].offset); - if (fixups [i].offset == 1) { - code [fixups [i].pos] = (byte)((sbyte) diff); - } else { - int old_cl = code_len; - code_len = fixups [i].pos; - emit_int (diff); - code_len = old_cl; - } - } - } - - // Used by DynamicILGenerator and MethodBuilder.SetMethodBody - internal void SetCode (byte[] code, int max_stack) { - // Make a copy to avoid possible security problems - this.code = (byte[])code.Clone (); - this.code_len = code.Length; - this.max_stack = max_stack; - this.cur_stack = 0; - } - - internal unsafe void SetCode (byte *code, int code_size, int max_stack) { - // Make a copy to avoid possible security problems - this.code = new byte [code_size]; - for (int i = 0; i < code_size; ++i) - this.code [i] = code [i]; - this.code_len = code_size; - this.max_stack = max_stack; - this.cur_stack = 0; - } - - internal TokenGenerator TokenGenerator { - get { - return token_gen; - } - } - - public virtual int ILOffset { - get { return code_len; } - } - } - - internal class SequencePointList - { - ISymbolDocumentWriter doc; - SequencePoint[] points; - int count; - const int arrayGrow = 10; - - public SequencePointList (ISymbolDocumentWriter doc) - { - this.doc = doc; - } - - public ISymbolDocumentWriter Document { - get { return doc; } - } - - public int[] GetOffsets() - { - int[] data = new int [count]; - for (int n=0; n= points.Length) { - SequencePoint[] temp = new SequencePoint [count + arrayGrow]; - Array.Copy (points, temp, points.Length); - points = temp; - } - - points [count] = s; - count++; - } - } - - struct SequencePoint { - public int Offset; - public int Line; - public int Col; - public int EndLine; - public int EndCol; - } - - class Stack + } + + private void add_block(int offset) + { + if (handlers != null) + { + int i = handlers.Length; + ILExceptionBlock[] new_b = new ILExceptionBlock[i + 1]; + Array.Copy(handlers, new_b, i); + handlers = new_b; + handlers[i].len = offset - handlers[i].start; + } + else + { + handlers = new ILExceptionBlock[1]; + len = offset - start; + } + } + } + + internal struct ILTokenInfo + { + public MemberInfo member; + public int code_pos; + } + + internal interface ITokenGenerator + { + int GetToken(string str); + + int GetToken(MemberInfo member, bool create_open_instance); + + int GetToken(MethodBase method, Type[] opt_param_types); + + int GetToken(SignatureHelper helper); + } + + [StructLayout(LayoutKind.Sequential)] + public partial class ILGenerator + { + private struct LabelFixup + { + public int offset; // The number of bytes between pos and the + // offset of the jump + public int pos; // Where offset of the label is placed + public int label_idx; // The label to jump to + }; + + private struct LabelData + { + public LabelData(int addr, int maxStack) + { + this.addr = addr; + this.maxStack = maxStack; + } + + public int addr; + public int maxStack; + } + + #region Sync with reflection.h + private byte[] code; + private int code_len; + private int max_stack; + private int cur_stack; + private LocalBuilder[] locals; + private ILExceptionInfo[] ex_handlers; + private int num_token_fixups; + private object token_fixups; + #endregion + + private LabelData[] labels; + private int num_labels; + private LabelFixup[] fixups; + private int num_fixups; + internal Module module; + private int cur_block; + private Stack open_blocks; + private ITokenGenerator token_gen; + + private const int defaultFixupSize = 4; + private const int defaultLabelsSize = 4; + private const int defaultExceptionStackSize = 2; + + private List sequencePointLists; + private SequencePointList currentSequence; + + internal ILGenerator(Module m, ITokenGenerator token_gen, int size) + { + if (size < 0) + size = 128; + code = new byte[size]; + module = m; + this.token_gen = token_gen; + } + + private void make_room(int nbytes) + { + if (code_len + nbytes < code.Length) + return; + byte[] new_code = new byte[(code_len + nbytes) * 2 + 128]; + Array.Copy(code, 0, new_code, 0, code.Length); + code = new_code; + } + + private void emit_int(int val) + { + code[code_len++] = (byte)(val & 0xFF); + code[code_len++] = (byte)((val >> 8) & 0xFF); + code[code_len++] = (byte)((val >> 16) & 0xFF); + code[code_len++] = (byte)((val >> 24) & 0xFF); + } + + /* change to pass by ref to avoid copy */ + private void ll_emit(OpCode opcode) + { + /* + * there is already enough room allocated in code. + */ + if (opcode.Size == 2) + code[code_len++] = (byte)(opcode.Value >> 8); + code[code_len++] = (byte)(opcode.Value & 0xff); + /* + * We should probably keep track of stack needs here. + * Or we may want to run the verifier on the code before saving it + * (this may be needed anyway when the ILGenerator is not used...). + */ + switch (opcode.StackBehaviourPush) + { + case StackBehaviour.Push1: + case StackBehaviour.Pushi: + case StackBehaviour.Pushi8: + case StackBehaviour.Pushr4: + case StackBehaviour.Pushr8: + case StackBehaviour.Pushref: + case StackBehaviour.Varpush: /* again we are conservative and assume it pushes 1 */ + cur_stack++; + break; + case StackBehaviour.Push1_push1: + cur_stack += 2; + break; + } + if (max_stack < cur_stack) + max_stack = cur_stack; + + /* + * Note that we adjust for the pop behaviour _after_ setting max_stack. + */ + switch (opcode.StackBehaviourPop) + { + case StackBehaviour.Varpop: + break; /* we are conservative and assume it doesn't decrease the stack needs */ + case StackBehaviour.Pop1: + case StackBehaviour.Popi: + case StackBehaviour.Popref: + cur_stack--; + break; + case StackBehaviour.Pop1_pop1: + case StackBehaviour.Popi_pop1: + case StackBehaviour.Popi_popi: + case StackBehaviour.Popi_popi8: + case StackBehaviour.Popi_popr4: + case StackBehaviour.Popi_popr8: + case StackBehaviour.Popref_pop1: + case StackBehaviour.Popref_popi: + cur_stack -= 2; + break; + case StackBehaviour.Popi_popi_popi: + case StackBehaviour.Popref_popi_popi: + case StackBehaviour.Popref_popi_popi8: + case StackBehaviour.Popref_popi_popr4: + case StackBehaviour.Popref_popi_popr8: + case StackBehaviour.Popref_popi_popref: + cur_stack -= 3; + break; + } + } + + private static int target_len(OpCode opcode) + { + if (opcode.OperandType == OperandType.InlineBrTarget) + return 4; + return 1; + } + + private void InternalEndClause() + { + switch (ex_handlers[cur_block].LastClauseType()) + { + case ILExceptionBlock.CATCH: + case ILExceptionBlock.FILTER: + case ILExceptionBlock.FILTER_START: + // how could we optimize code size here? + Emit(OpCodes.Leave, ex_handlers[cur_block].end); + break; + case ILExceptionBlock.FAULT: + case ILExceptionBlock.FINALLY: + Emit(OpCodes.Endfinally); + break; + } + } + + public virtual void BeginCatchBlock(Type exceptionType) + { + if (open_blocks == null) + open_blocks = new Stack(defaultExceptionStackSize); + + if (open_blocks.Count <= 0) + throw new NotSupportedException("Not in an exception block"); + if (exceptionType != null && exceptionType.IsUserType) + throw new NotSupportedException("User defined subclasses of System.Type are not yet supported."); + if (ex_handlers[cur_block].LastClauseType() == ILExceptionBlock.FILTER_START) + { + if (exceptionType != null) + throw new ArgumentException("Do not supply an exception type for filter clause"); + Emit(OpCodes.Endfilter); + ex_handlers[cur_block].PatchFilterClause(code_len); + } + else + { + InternalEndClause(); + ex_handlers[cur_block].AddCatch(exceptionType, code_len); + } + + cur_stack = 1; // the exception object is on the stack by default + if (max_stack < cur_stack) + max_stack = cur_stack; + + //System.Console.WriteLine ("Begin catch Block: {0} {1}",exceptionType.ToString(), max_stack); + } + + public virtual void BeginExceptFilterBlock() + { + if (open_blocks == null) + open_blocks = new Stack(defaultExceptionStackSize); + + if (open_blocks.Count <= 0) + throw new NotSupportedException("Not in an exception block"); + InternalEndClause(); + + ex_handlers[cur_block].AddFilter(code_len); + } + + public virtual Label BeginExceptionBlock() + { + //System.Console.WriteLine ("Begin Block"); + if (open_blocks == null) + open_blocks = new Stack(defaultExceptionStackSize); + + if (ex_handlers != null) + { + cur_block = ex_handlers.Length; + ILExceptionInfo[] new_ex = new ILExceptionInfo[cur_block + 1]; + Array.Copy(ex_handlers, new_ex, cur_block); + ex_handlers = new_ex; + } + else + { + ex_handlers = new ILExceptionInfo[1]; + cur_block = 0; + } + open_blocks.Push(cur_block); + ex_handlers[cur_block].start = code_len; + return ex_handlers[cur_block].end = DefineLabel(); + } + + public virtual void BeginFaultBlock() + { + if (open_blocks == null) + open_blocks = new Stack(defaultExceptionStackSize); + + if (open_blocks.Count <= 0) + throw new NotSupportedException("Not in an exception block"); + + if (ex_handlers[cur_block].LastClauseType() == ILExceptionBlock.FILTER_START) + { + Emit(OpCodes.Leave, ex_handlers[cur_block].end); + ex_handlers[cur_block].PatchFilterClause(code_len); + } + + InternalEndClause(); + //System.Console.WriteLine ("Begin fault Block"); + ex_handlers[cur_block].AddFault(code_len); + } + + public virtual void BeginFinallyBlock() + { + if (open_blocks == null) + open_blocks = new Stack(defaultExceptionStackSize); + + if (open_blocks.Count <= 0) + throw new NotSupportedException("Not in an exception block"); + + InternalEndClause(); + + if (ex_handlers[cur_block].LastClauseType() == ILExceptionBlock.FILTER_START) + { + Emit(OpCodes.Leave, ex_handlers[cur_block].end); + ex_handlers[cur_block].PatchFilterClause(code_len); + } + + //System.Console.WriteLine ("Begin finally Block"); + ex_handlers[cur_block].AddFinally(code_len); + } + + public virtual void BeginScope() + { } + + public virtual LocalBuilder DeclareLocal(Type localType) + { + return DeclareLocal(localType, false); + } + + + public virtual LocalBuilder DeclareLocal(Type localType, bool pinned) + { + if (localType == null) + throw new ArgumentNullException(nameof(localType)); + if (localType.IsUserType) + throw new NotSupportedException("User defined subclasses of System.Type are not yet supported."); + LocalBuilder res = new LocalBuilder(localType, this); + res.is_pinned = pinned; + + if (locals != null) + { + LocalBuilder[] new_l = new LocalBuilder[locals.Length + 1]; + Array.Copy(locals, new_l, locals.Length); + new_l[locals.Length] = res; + locals = new_l; + } + else + { + locals = new LocalBuilder[1]; + locals[0] = res; + } + res.position = (ushort)(locals.Length - 1); + return res; + } + + public virtual Label DefineLabel() + { + if (labels == null) + labels = new LabelData[defaultLabelsSize]; + else if (num_labels >= labels.Length) + { + LabelData[] t = new LabelData[labels.Length * 2]; + Array.Copy(labels, t, labels.Length); + labels = t; + } + + labels[num_labels] = new LabelData(-1, 0); + + return new Label(num_labels++); + } + + public virtual void Emit(OpCode opcode) + { + make_room(2); + ll_emit(opcode); + } + + public virtual void Emit(OpCode opcode, byte arg) + { + make_room(3); + ll_emit(opcode); + code[code_len++] = arg; + } + + [ComVisible(true)] + public virtual void Emit(OpCode opcode, ConstructorInfo con) + { + int token = token_gen.GetToken(con, true); + make_room(6); + ll_emit(opcode); + emit_int(token); + + if (opcode.StackBehaviourPop == StackBehaviour.Varpop) + cur_stack -= con.GetParametersCount(); + } + + public virtual void Emit(OpCode opcode, double arg) + { + byte[] s = BitConverter.GetBytes(arg); + make_room(10); + ll_emit(opcode); + if (BitConverter.IsLittleEndian) + { + Array.Copy(s, 0, code, code_len, 8); + code_len += 8; + } + else + { + code[code_len++] = s[7]; + code[code_len++] = s[6]; + code[code_len++] = s[5]; + code[code_len++] = s[4]; + code[code_len++] = s[3]; + code[code_len++] = s[2]; + code[code_len++] = s[1]; + code[code_len++] = s[0]; + } + } + + public virtual void Emit(OpCode opcode, FieldInfo field) + { + int token = token_gen.GetToken(field, true); + make_room(6); + ll_emit(opcode); + emit_int(token); + } + + public virtual void Emit(OpCode opcode, short arg) + { + make_room(4); + ll_emit(opcode); + code[code_len++] = (byte)(arg & 0xFF); + code[code_len++] = (byte)((arg >> 8) & 0xFF); + } + + public virtual void Emit(OpCode opcode, int arg) + { + make_room(6); + ll_emit(opcode); + emit_int(arg); + } + + public virtual void Emit(OpCode opcode, long arg) + { + make_room(10); + ll_emit(opcode); + code[code_len++] = (byte)(arg & 0xFF); + code[code_len++] = (byte)((arg >> 8) & 0xFF); + code[code_len++] = (byte)((arg >> 16) & 0xFF); + code[code_len++] = (byte)((arg >> 24) & 0xFF); + code[code_len++] = (byte)((arg >> 32) & 0xFF); + code[code_len++] = (byte)((arg >> 40) & 0xFF); + code[code_len++] = (byte)((arg >> 48) & 0xFF); + code[code_len++] = (byte)((arg >> 56) & 0xFF); + } + + public virtual void Emit(OpCode opcode, Label label) + { + int tlen = target_len(opcode); + make_room(6); + ll_emit(opcode); + if (cur_stack > labels[label.m_label].maxStack) + labels[label.m_label].maxStack = cur_stack; + + if (fixups == null) + fixups = new LabelFixup[defaultFixupSize]; + else if (num_fixups >= fixups.Length) + { + LabelFixup[] newf = new LabelFixup[fixups.Length * 2]; + Array.Copy(fixups, newf, fixups.Length); + fixups = newf; + } + fixups[num_fixups].offset = tlen; + fixups[num_fixups].pos = code_len; + fixups[num_fixups].label_idx = label.m_label; + num_fixups++; + code_len += tlen; + + } + + public virtual void Emit(OpCode opcode, Label[] labels) + { + if (labels == null) + throw new ArgumentNullException(nameof(labels)); + + /* opcode needs to be switch. */ + int count = labels.Length; + make_room(6 + count * 4); + ll_emit(opcode); + + for (int i = 0; i < count; ++i) + if (cur_stack > this.labels[labels[i].m_label].maxStack) + this.labels[labels[i].m_label].maxStack = cur_stack; + + emit_int(count); + if (fixups == null) + fixups = new LabelFixup[defaultFixupSize + count]; + else if (num_fixups + count >= fixups.Length) + { + LabelFixup[] newf = new LabelFixup[count + fixups.Length * 2]; + Array.Copy(fixups, newf, fixups.Length); + fixups = newf; + } + + // ECMA 335, Partition III, p94 (7-10) + // + // The switch instruction implements a jump table. The format of + // the instruction is an unsigned int32 representing the number of targets N, + // followed by N int32 values specifying jump targets: these targets are + // represented as offsets (positive or negative) from the beginning of the + // instruction following this switch instruction. + // + // We must make sure it gets an offset from the *end* of the last label + // (eg, the beginning of the instruction following this). + // + // remaining is the number of bytes from the current instruction to the + // instruction that will be emitted. + + for (int i = 0, remaining = count * 4; i < count; ++i, remaining -= 4) + { + fixups[num_fixups].offset = remaining; + fixups[num_fixups].pos = code_len; + fixups[num_fixups].label_idx = labels[i].m_label; + num_fixups++; + code_len += 4; + } + } + + public virtual void Emit(OpCode opcode, LocalBuilder local) + { + if (local == null) + throw new ArgumentNullException(nameof(local)); + if (local.ilgen != this) + throw new ArgumentException("Trying to emit a local from a different ILGenerator."); + + uint pos = local.position; + if ((opcode == OpCodes.Ldloca_S || opcode == OpCodes.Ldloc_S || opcode == OpCodes.Stloc_S) && pos > 255) + throw new InvalidOperationException("Opcodes using a short-form index cannot address a local position over 255."); + + bool load_addr = false; + bool is_store = false; + bool is_load = false; + make_room(6); + + /* inline the code from ll_emit () to optimize il code size */ + if (opcode.StackBehaviourPop == StackBehaviour.Pop1) + { + cur_stack--; + is_store = true; + } + else if (opcode.StackBehaviourPush == StackBehaviour.Push1 || opcode.StackBehaviourPush == StackBehaviour.Pushi) + { + cur_stack++; + is_load = true; + if (cur_stack > max_stack) + max_stack = cur_stack; + load_addr = opcode.StackBehaviourPush == StackBehaviour.Pushi; + } + if (load_addr) + { + if (pos < 256) + { + code[code_len++] = (byte)0x12; + code[code_len++] = (byte)pos; + } + else + { + code[code_len++] = (byte)0xfe; + code[code_len++] = (byte)0x0d; + code[code_len++] = (byte)(pos & 0xff); + code[code_len++] = (byte)((pos >> 8) & 0xff); + } + } + else + { + if (is_store) + { + if (pos < 4) + { + code[code_len++] = (byte)(0x0a + pos); + } + else if (pos < 256) + { + code[code_len++] = (byte)0x13; + code[code_len++] = (byte)pos; + } + else + { + code[code_len++] = (byte)0xfe; + code[code_len++] = (byte)0x0e; + code[code_len++] = (byte)(pos & 0xff); + code[code_len++] = (byte)((pos >> 8) & 0xff); + } + } + else if (is_load) + { + if (pos < 4) + { + code[code_len++] = (byte)(0x06 + pos); + } + else if (pos < 256) + { + code[code_len++] = (byte)0x11; + code[code_len++] = (byte)pos; + } + else + { + code[code_len++] = (byte)0xfe; + code[code_len++] = (byte)0x0c; + code[code_len++] = (byte)(pos & 0xff); + code[code_len++] = (byte)((pos >> 8) & 0xff); + } + } + else + { + ll_emit(opcode); + } + } + } + + public virtual void Emit(OpCode opcode, MethodInfo meth) + { + if (meth == null) + throw new ArgumentNullException(nameof(meth)); + + // For compatibility with MS + if ((meth is DynamicMethod) && ((opcode == OpCodes.Ldftn) || (opcode == OpCodes.Ldvirtftn) || (opcode == OpCodes.Ldtoken))) + throw new ArgumentException("Ldtoken, Ldftn and Ldvirtftn OpCodes cannot target DynamicMethods."); + + int token = token_gen.GetToken(meth, true); + make_room(6); + ll_emit(opcode); + Type declaringType = meth.DeclaringType; + emit_int(token); + if (meth.ReturnType != typeof(void)) + cur_stack++; + + if (opcode.StackBehaviourPop == StackBehaviour.Varpop) + cur_stack -= meth.GetParametersCount(); + } + + private void Emit(OpCode opcode, MethodInfo method, int token) + { + make_room(6); + ll_emit(opcode); + emit_int(token); + if (method.ReturnType != typeof(void)) + cur_stack++; + + if (opcode.StackBehaviourPop == StackBehaviour.Varpop) + cur_stack -= method.GetParametersCount(); + } + + [CLSCompliant(false)] + public void Emit(OpCode opcode, sbyte arg) + { + make_room(3); + ll_emit(opcode); + code[code_len++] = (byte)arg; + } + + public virtual void Emit(OpCode opcode, SignatureHelper signature) + { + int token = token_gen.GetToken(signature); + make_room(6); + ll_emit(opcode); + emit_int(token); + } + + public virtual void Emit(OpCode opcode, float arg) + { + byte[] s = BitConverter.GetBytes(arg); + make_room(6); + ll_emit(opcode); + if (BitConverter.IsLittleEndian) + { + Array.Copy(s, 0, code, code_len, 4); + code_len += 4; + } + else + { + code[code_len++] = s[3]; + code[code_len++] = s[2]; + code[code_len++] = s[1]; + code[code_len++] = s[0]; + } + } + + public virtual void Emit(OpCode opcode, string str) + { + int token = token_gen.GetToken(str); + make_room(6); + ll_emit(opcode); + emit_int(token); + } + + public virtual void Emit(OpCode opcode, Type cls) + { + if (cls != null && cls.IsByRef) + throw new ArgumentException("Cannot get TypeToken for a ByRef type."); + + make_room(6); + ll_emit(opcode); + int token = token_gen.GetToken(cls, opcode != OpCodes.Ldtoken); + emit_int(token); + } + + // FIXME: vararg methods are not supported + public virtual void EmitCall(OpCode opcode, MethodInfo methodInfo, Type[] optionalParameterTypes) + { + if (methodInfo == null) + throw new ArgumentNullException(nameof(methodInfo)); + short value = opcode.Value; + if (!(value == OpCodes.Call.Value || value == OpCodes.Callvirt.Value)) + throw new NotSupportedException("Only Call and CallVirt are allowed"); + if ((methodInfo.CallingConvention & CallingConventions.VarArgs) == 0) + optionalParameterTypes = null; + if (optionalParameterTypes != null) + { + if ((methodInfo.CallingConvention & CallingConventions.VarArgs) == 0) + { + throw new InvalidOperationException("Method is not VarArgs method and optional types were passed"); + } + + int token = token_gen.GetToken(methodInfo, optionalParameterTypes); + Emit(opcode, methodInfo, token); + return; + } + Emit(opcode, methodInfo); + } + + public virtual void EmitCalli(OpCode opcode, CallingConvention unmanagedCallConv, Type returnType, Type[] parameterTypes) + { + // GetMethodSigHelper expects a ModuleBuilder or null, and module might be + // a normal module when using dynamic methods. + SignatureHelper helper = SignatureHelper.GetMethodSigHelper(module as ModuleBuilder, 0, unmanagedCallConv, returnType, parameterTypes); + Emit(opcode, helper); + } + + public virtual void EmitCalli(OpCode opcode, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type[] optionalParameterTypes) + { + if (optionalParameterTypes != null) + throw new NotImplementedException(); + + SignatureHelper helper = SignatureHelper.GetMethodSigHelper(module as ModuleBuilder, callingConvention, 0, returnType, parameterTypes); + Emit(opcode, helper); + } + + private static Type GetConsoleType() + { + return Type.GetType("System.Console, System.Console", throwOnError: true); + } + + public virtual void EmitWriteLine(FieldInfo fld) + { + if (fld == null) + throw new ArgumentNullException(nameof(fld)); + + // The MS implementation does not check for valuetypes here but it + // should. Also, it should check that if the field is not static, + // then it is a member of this type. + if (fld.IsStatic) + Emit(OpCodes.Ldsfld, fld); + else + { + Emit(OpCodes.Ldarg_0); + Emit(OpCodes.Ldfld, fld); + } + Emit(OpCodes.Call, GetConsoleType().GetMethod("WriteLine", new Type[1] { fld.FieldType })); + } + + public virtual void EmitWriteLine(LocalBuilder localBuilder) + { + if (localBuilder == null) + throw new ArgumentNullException(nameof(localBuilder)); + if (localBuilder.LocalType is TypeBuilder) + throw new ArgumentException("Output streams do not support TypeBuilders."); + // The MS implementation does not check for valuetypes here but it + // should. + Emit(OpCodes.Ldloc, localBuilder); + Emit(OpCodes.Call, GetConsoleType().GetMethod("WriteLine", new Type[1] { localBuilder.LocalType })); + } + + public virtual void EmitWriteLine(string value) + { + Emit(OpCodes.Ldstr, value); + Emit(OpCodes.Call, GetConsoleType().GetMethod("WriteLine", new Type[1] { typeof(string) })); + } + + public virtual void EndExceptionBlock() + { + if (open_blocks == null) + open_blocks = new Stack(defaultExceptionStackSize); + + if (open_blocks.Count <= 0) + throw new NotSupportedException("Not in an exception block"); + + if (ex_handlers[cur_block].LastClauseType() == ILExceptionBlock.FILTER_START) + throw new InvalidOperationException("Incorrect code generation for exception block."); + + InternalEndClause(); + MarkLabel(ex_handlers[cur_block].end); + ex_handlers[cur_block].End(code_len); + ex_handlers[cur_block].Debug(cur_block); + //System.Console.WriteLine ("End Block {0} (handlers: {1})", cur_block, ex_handlers [cur_block].NumHandlers ()); + open_blocks.Pop(); + if (open_blocks.Count > 0) + cur_block = (int)open_blocks.Peek(); + //Console.WriteLine ("curblock restored to {0}", cur_block); + //throw new NotImplementedException (); + } + + public virtual void EndScope() + { } + + public virtual void MarkLabel(Label loc) + { + if (loc.m_label < 0 || loc.m_label >= num_labels) + throw new System.ArgumentException("The label is not valid"); + if (labels[loc.m_label].addr >= 0) + throw new System.ArgumentException("The label was already defined"); + labels[loc.m_label].addr = code_len; + if (labels[loc.m_label].maxStack > cur_stack) + cur_stack = labels[loc.m_label].maxStack; + } + + public virtual void MarkSequencePoint(ISymbolDocumentWriter document, int startLine, + int startColumn, int endLine, int endColumn) + { + if (currentSequence == null || currentSequence.Document != document) + { + if (sequencePointLists == null) + sequencePointLists = new List(); + currentSequence = new SequencePointList(document); + sequencePointLists.Add(currentSequence); + } + + currentSequence.AddSequencePoint(code_len, startLine, startColumn, endLine, endColumn); + } + + /* + internal void GenerateDebugInfo (ISymbolWriter symbolWriter) + { + if (sequencePointLists != null) { + SequencePointList first = (SequencePointList) sequencePointLists [0]; + SequencePointList last = (SequencePointList) sequencePointLists [sequencePointLists.Count - 1]; + symbolWriter.SetMethodSourceRange (first.Document, first.StartLine, first.StartColumn, last.Document, last.EndLine, last.EndColumn); + + foreach (SequencePointList list in sequencePointLists) + symbolWriter.DefineSequencePoints (list.Document, list.GetOffsets(), list.GetLines(), list.GetColumns(), list.GetEndLines(), list.GetEndColumns()); + + if (locals != null) { + foreach (LocalBuilder local in locals) { + if (local.Name != null && local.Name.Length > 0) { + SignatureHelper sighelper = SignatureHelper.GetLocalVarSigHelper (module as ModuleBuilder); + sighelper.AddArgument (local.LocalType); + byte[] signature = sighelper.GetSignature (); + symbolWriter.DefineLocalVariable (local.Name, FieldAttributes.Public, signature, SymAddressKind.ILOffset, local.position, 0, 0, local.StartOffset, local.EndOffset); + } + } + } + sequencePointLists = null; + } + } + */ + + internal bool HasDebugInfo + { + get { return sequencePointLists != null; } + } + + public virtual void ThrowException(Type excType) + { + if (excType == null) + throw new ArgumentNullException(nameof(excType)); + if (!((excType == typeof(Exception)) || + excType.IsSubclassOf(typeof(Exception)))) + throw new ArgumentException("Type should be an exception type", nameof(excType)); + ConstructorInfo ctor = excType.GetConstructor(Type.EmptyTypes); + if (ctor == null) + throw new ArgumentException("Type should have a default constructor", nameof(excType)); + Emit(OpCodes.Newobj, ctor); + Emit(OpCodes.Throw); + } + + // FIXME: "Not implemented" + public virtual void UsingNamespace(string usingNamespace) + { + throw new NotImplementedException(); + } + + internal void label_fixup(MethodBase mb) + { + for (int i = 0; i < num_fixups; ++i) + { + if (labels[fixups[i].label_idx].addr < 0) + throw new ArgumentException(string.Format("Label #{0} is not marked in method `{1}'", fixups[i].label_idx + 1, mb.Name)); + // Diff is the offset from the end of the jump instruction to the address of the label + int diff = labels[fixups[i].label_idx].addr - (fixups[i].pos + fixups[i].offset); + if (fixups[i].offset == 1) + { + code[fixups[i].pos] = (byte)((sbyte)diff); + } + else + { + int old_cl = code_len; + code_len = fixups[i].pos; + emit_int(diff); + code_len = old_cl; + } + } + } + + // Used by DynamicILGenerator and MethodBuilder.SetMethodBody + internal void SetCode(byte[] code, int max_stack) + { + // Make a copy to avoid possible security problems + this.code = (byte[])code.Clone(); + this.code_len = code.Length; + this.max_stack = max_stack; + this.cur_stack = 0; + } + + internal unsafe void SetCode(byte* code, int code_size, int max_stack) + { + // Make a copy to avoid possible security problems + this.code = new byte[code_size]; + for (int i = 0; i < code_size; ++i) + this.code[i] = code[i]; + this.code_len = code_size; + this.max_stack = max_stack; + this.cur_stack = 0; + } + + internal ITokenGenerator TokenGenerator + { + get + { + return token_gen; + } + } + + public virtual int ILOffset + { + get { return code_len; } + } + } + + internal class SequencePointList + { + private ISymbolDocumentWriter doc; + private SequencePoint[] points; + private int count; + private const int arrayGrow = 10; + + public SequencePointList(ISymbolDocumentWriter doc) + { + this.doc = doc; + } + + public ISymbolDocumentWriter Document + { + get { return doc; } + } + + public int[] GetOffsets() + { + int[] data = new int[count]; + for (int n = 0; n < count; n++) data[n] = points[n].Offset; + return data; + } + public int[] GetLines() + { + int[] data = new int[count]; + for (int n = 0; n < count; n++) data[n] = points[n].Line; + return data; + } + public int[] GetColumns() + { + int[] data = new int[count]; + for (int n = 0; n < count; n++) data[n] = points[n].Col; + return data; + } + public int[] GetEndLines() + { + int[] data = new int[count]; + for (int n = 0; n < count; n++) data[n] = points[n].EndLine; + return data; + } + public int[] GetEndColumns() + { + int[] data = new int[count]; + for (int n = 0; n < count; n++) data[n] = points[n].EndCol; + return data; + } + public int StartLine + { + get { return points[0].Line; } + } + public int EndLine + { + get { return points[count - 1].Line; } + } + public int StartColumn + { + get { return points[0].Col; } + } + public int EndColumn + { + get { return points[count - 1].Col; } + } + + public void AddSequencePoint(int offset, int line, int col, int endLine, int endCol) + { + SequencePoint s = default; + s.Offset = offset; + s.Line = line; + s.Col = col; + s.EndLine = endLine; + s.EndCol = endCol; + + if (points == null) + { + points = new SequencePoint[arrayGrow]; + } + else if (count >= points.Length) + { + SequencePoint[] temp = new SequencePoint[count + arrayGrow]; + Array.Copy(points, temp, points.Length); + points = temp; + } + + points[count] = s; + count++; + } + } + + internal struct SequencePoint + { + public int Offset; + public int Line; + public int Col; + public int EndLine; + public int EndCol; + } + + internal class Stack { - Object[] _array; - int _size; - int _version; + private object[] _array; + private int _size; + private int _version; private const int _defaultCapacity = 10; public Stack() { - _array = new Object[_defaultCapacity]; + _array = new object[_defaultCapacity]; _size = 0; _version = 0; } @@ -1128,7 +1210,7 @@ public Stack(int initialCapacity) if (initialCapacity < _defaultCapacity) initialCapacity = _defaultCapacity; - _array = new Object[initialCapacity]; + _array = new object[initialCapacity]; _size = 0; _version = 0; } @@ -1141,36 +1223,36 @@ public virtual int Count } } - public virtual Object Peek() + public virtual object Peek() { if (_size == 0) - throw new InvalidOperationException (); + throw new InvalidOperationException(); return _array[_size - 1]; } - public virtual Object Pop() + public virtual object Pop() { if (_size == 0) - throw new InvalidOperationException (); + throw new InvalidOperationException(); _version++; - Object obj = _array[--_size]; + object obj = _array[--_size]; _array[_size] = null; return obj; } - public virtual void Push(Object obj) + public virtual void Push(object obj) { if (_size == _array.Length) { - Object[] newArray = new Object[2 * _array.Length]; + object[] newArray = new object[2 * _array.Length]; Array.Copy(_array, 0, newArray, 0, _size); _array = newArray; } _array[_size++] = obj; _version++; } - } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/LocalBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/LocalBuilder.Mono.cs index 583600a257569..f15eaf10e2ced 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/LocalBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/LocalBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -34,6 +32,7 @@ // (C) 2001, 2002 Ximian, Inc. http://www.ximian.com // +#nullable disable using System; using System.Reflection; using System.Globalization; @@ -41,71 +40,78 @@ using System.Runtime.InteropServices; using System.Diagnostics.SymbolStore; -namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public sealed partial class LocalBuilder : LocalVariableInfo - { - // Needs to have the same layout as RuntimeLocalVariableInfo - #region Sync with reflection.h - internal Type type; - internal bool is_pinned; - internal ushort position; - private string name; - #endregion - - internal ILGenerator ilgen; - int startOffset; - int endOffset; +namespace System.Reflection.Emit +{ + [StructLayout(LayoutKind.Sequential)] + public sealed partial class LocalBuilder : LocalVariableInfo + { + // Needs to have the same layout as RuntimeLocalVariableInfo + #region Sync with reflection.h + internal Type type; + internal bool is_pinned; + internal ushort position; + private string name; + #endregion + + internal ILGenerator ilgen; + private int startOffset; + private int endOffset; + + internal LocalBuilder(Type t, ILGenerator ilgen) + { + this.type = t; + this.ilgen = ilgen; + } + + public void SetLocalSymInfo(string name, int startOffset, int endOffset) + { + this.name = name; + this.startOffset = startOffset; + this.endOffset = endOffset; + } - internal LocalBuilder (Type t, ILGenerator ilgen) - { - this.type = t; - this.ilgen = ilgen; - } + public void SetLocalSymInfo(string name) + { + SetLocalSymInfo(name, 0, 0); + } - public void SetLocalSymInfo (string name, int startOffset, int endOffset) - { - this.name = name; - this.startOffset = startOffset; - this.endOffset = endOffset; - } + public override Type LocalType + { + get + { + return type; + } + } - public void SetLocalSymInfo (string name) - { - SetLocalSymInfo (name, 0, 0); - } + public override bool IsPinned + { + get + { + return is_pinned; + } + } - public override Type LocalType - { - get { - return type; - } - } + public override int LocalIndex + { + get + { + return position; + } + } - public override bool IsPinned - { - get { - return is_pinned; - } - } + internal string Name + { + get { return name; } + } - public override int LocalIndex - { - get { - return position; - } - } + internal int StartOffset + { + get { return startOffset; } + } - internal string Name { - get { return name; } - } - - internal int StartOffset { - get { return startOffset; } - } - - internal int EndOffset { - get { return endOffset; } - } - } + internal int EndOffset + { + get { return endOffset; } + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.Mono.cs index 8d2caaf23dcfc..f9fe0b33632ed 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit/MethodBuilder.cs // @@ -19,10 +17,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,6 +30,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; @@ -44,598 +43,652 @@ namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public sealed partial class MethodBuilder : MethodInfo - { + [StructLayout(LayoutKind.Sequential)] + public sealed partial class MethodBuilder : MethodInfo + { #pragma warning disable 169, 414 - private RuntimeMethodHandle mhandle; - private Type rtype; - internal Type[] parameters; - private MethodAttributes attrs; /* It's used directly by MCS */ - private MethodImplAttributes iattrs; - private string name; - private int table_idx; - private byte[] code; - private ILGenerator ilgen; - private TypeBuilder type; - internal ParameterBuilder[] pinfo; - private CustomAttributeBuilder[] cattrs; - private MethodInfo[] override_methods; - private string pi_dll; - private string pi_entry; - private CharSet charset; - private uint extra_flags; /* this encodes set_last_error etc */ - private CallingConvention native_cc; - private CallingConventions call_conv; - private bool init_locals = true; - private IntPtr generic_container; - internal GenericTypeParameterBuilder[] generic_params; - private Type[] returnModReq; - private Type[] returnModOpt; - private Type[][] paramModReq; - private Type[][] paramModOpt; - private object permissions; + private RuntimeMethodHandle mhandle; + private Type rtype; + internal Type[] parameters; + private MethodAttributes attrs; /* It's used directly by MCS */ + private MethodImplAttributes iattrs; + private string name; + private int table_idx; + private byte[] code; + private ILGenerator ilgen; + private TypeBuilder type; + internal ParameterBuilder[] pinfo; + private CustomAttributeBuilder[] cattrs; + private MethodInfo[] override_methods; + private string pi_dll; + private string pi_entry; + private CharSet charset; + private uint extra_flags; /* this encodes set_last_error etc */ + private CallingConvention native_cc; + private CallingConventions call_conv; + private bool init_locals = true; + private IntPtr generic_container; + internal GenericTypeParameterBuilder[] generic_params; + private Type[] returnModReq; + private Type[] returnModOpt; + private Type[][] paramModReq; + private Type[][] paramModOpt; + private object permissions; #pragma warning restore 169, 414 - RuntimeMethodInfo created; - - internal MethodBuilder (TypeBuilder tb, string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnModReq, Type[] returnModOpt, Type[] parameterTypes, Type[][] paramModReq, Type[][] paramModOpt) - { - this.name = name; - this.attrs = attributes; - this.call_conv = callingConvention; - this.rtype = returnType; - this.returnModReq = returnModReq; - this.returnModOpt = returnModOpt; - this.paramModReq = paramModReq; - this.paramModOpt = paramModOpt; - // The MSDN docs does not specify this, but the MS MethodBuilder - // appends a HasThis flag if the method is not static - if ((attributes & MethodAttributes.Static) == 0) - this.call_conv |= CallingConventions.HasThis; - if (parameterTypes != null) { - for (int i = 0; i < parameterTypes.Length; ++i) - if (parameterTypes [i] == null) - throw new ArgumentException ("Elements of the parameterTypes array cannot be null", "parameterTypes"); - - this.parameters = new Type [parameterTypes.Length]; - System.Array.Copy (parameterTypes, this.parameters, parameterTypes.Length); - } - type = tb; - table_idx = get_next_table_index (this, 0x06, 1); - - ((ModuleBuilder)tb.Module).RegisterToken (this, GetToken ().Token); - } - - internal MethodBuilder (TypeBuilder tb, string name, MethodAttributes attributes, - CallingConventions callingConvention, Type returnType, Type[] returnModReq, Type[] returnModOpt, Type[] parameterTypes, Type[][] paramModReq, Type[][] paramModOpt, - String dllName, String entryName, CallingConvention nativeCConv, CharSet nativeCharset) - : this (tb, name, attributes, callingConvention, returnType, returnModReq, returnModOpt, parameterTypes, paramModReq, paramModOpt) - { - pi_dll = dllName; - pi_entry = entryName; - native_cc = nativeCConv; - charset = nativeCharset; - } - - public override bool ContainsGenericParameters { - get { throw new NotSupportedException (); } - } - - public bool InitLocals { - get {return init_locals;} - set {init_locals = value;} - } - - internal TypeBuilder TypeBuilder { - get {return type;} - } - - public override RuntimeMethodHandle MethodHandle { - get { - throw NotSupported (); - } - } - - internal RuntimeMethodHandle MethodHandleInternal { - get { - return mhandle; - } - } - - public override Type ReturnType { - get { return rtype; } - } - - public override Type ReflectedType { - get { return type; } - } - - public override Type DeclaringType { - get { return type; } - } - - public override string Name { - get { return name; } - } - - public override MethodAttributes Attributes { - get { return attrs; } - } - - public override ICustomAttributeProvider ReturnTypeCustomAttributes { - get { return null; } - } - - public override CallingConventions CallingConvention { - get { return call_conv; } - } - - // FIXME: "Not implemented" - public string Signature { - get { - throw new NotImplementedException (); - } - } - - /* Used by mcs */ - internal bool BestFitMapping { - set { - extra_flags = (uint) ((extra_flags & ~0x30) | (uint)(value ? 0x10 : 0x20)); - } - } - - /* Used by mcs */ - internal bool ThrowOnUnmappableChar { - set { - extra_flags = (uint) ((extra_flags & ~0x3000) | (uint)(value ? 0x1000 : 0x2000)); - } - } - - /* Used by mcs */ - internal bool ExactSpelling { - set { - extra_flags = (uint) ((extra_flags & ~0x01) | (uint)(value ? 0x01 : 0x00)); - } - } - - /* Used by mcs */ - internal bool SetLastError { - set { - extra_flags = (uint) ((extra_flags & ~0x40) | (uint)(value ? 0x40 : 0x00)); - } - } - - public MethodToken GetToken() - { - return new MethodToken(0x06000000 | table_idx); - } - - public override MethodInfo GetBaseDefinition() - { - return this; - } - - public override MethodImplAttributes GetMethodImplementationFlags() - { - return iattrs; - } - - public override ParameterInfo[] GetParameters() - { - if (!type.is_created) - throw NotSupported (); - - return GetParametersInternal (); - } - - internal override ParameterInfo[] GetParametersInternal () - { - if (parameters == null) - return null; - - ParameterInfo[] retval = new ParameterInfo [parameters.Length]; - for (int i = 0; i < parameters.Length; i++) { - retval [i] = RuntimeParameterInfo.New (pinfo?[i + 1], parameters [i], this, i + 1); - } - return retval; - } - - internal override int GetParametersCount () - { - if (parameters == null) - return 0; - - return parameters.Length; - } - - internal override Type GetParameterType (int pos) { - return parameters [pos]; - } - - internal MethodBase RuntimeResolve () { - return type.RuntimeResolve ().GetMethod (this); - } - - public Module GetModule () - { - return type.Module; - } - - public override Object Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - { - throw NotSupported (); - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - throw NotSupported (); - } - - public override object[] GetCustomAttributes (bool inherit) - { - /* - * On MS.NET, this always returns not_supported, but we can't do this - * since there would be no way to obtain custom attributes of - * dynamically created ctors. - */ - if (type.is_created) - return CustomAttribute.GetCustomAttributes (this, inherit); - else - throw NotSupported (); - } - - public override object[] GetCustomAttributes (Type attributeType, bool inherit) - { - if (type.is_created) - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - else - throw NotSupported (); - } - - public ILGenerator GetILGenerator () - { - return GetILGenerator (64); - } - - public ILGenerator GetILGenerator (int size) - { - if (((iattrs & MethodImplAttributes.CodeTypeMask) != - MethodImplAttributes.IL) || - ((iattrs & MethodImplAttributes.ManagedMask) != - MethodImplAttributes.Managed)) - throw new InvalidOperationException ("Method body should not exist."); - if (ilgen != null) - return ilgen; - ilgen = new ILGenerator (type.Module, ((ModuleBuilder)type.Module).GetTokenGenerator (), size); - return ilgen; - } - - public ParameterBuilder DefineParameter (int position, ParameterAttributes attributes, string strParamName) - { - RejectIfCreated (); - - // - // Extension: Mono allows position == 0 for the return attribute - // - if ((position < 0) || parameters == null || (position > parameters.Length)) - throw new ArgumentOutOfRangeException ("position"); - - ParameterBuilder pb = new ParameterBuilder (this, position, attributes, strParamName); - if (pinfo == null) - pinfo = new ParameterBuilder [parameters.Length + 1]; - pinfo [position] = pb; - return pb; - } - - internal void check_override () - { - if (override_methods != null) { - foreach (var m in override_methods) { - if (m.IsVirtual && !IsVirtual) - throw new TypeLoadException (String.Format("Method '{0}' override '{1}' but it is not virtual", name, m)); - } - } - } - - internal void fixup () - { - if (((attrs & (MethodAttributes.Abstract | MethodAttributes.PinvokeImpl)) == 0) && ((iattrs & (MethodImplAttributes.Runtime | MethodImplAttributes.InternalCall)) == 0)) { - // do not allow zero length method body on MS.NET 2.0 (and higher) - if (((ilgen == null) || (ilgen.ILOffset == 0)) && (code == null || code.Length == 0)) - throw new InvalidOperationException ( - String.Format ("Method '{0}.{1}' does not have a method body.", - DeclaringType.FullName, Name)); - } - if (ilgen != null) - ilgen.label_fixup (this); - } - - internal void ResolveUserTypes () { - rtype = TypeBuilder.ResolveUserType (rtype); - TypeBuilder.ResolveUserTypes (parameters); - TypeBuilder.ResolveUserTypes (returnModReq); - TypeBuilder.ResolveUserTypes (returnModOpt); - if (paramModReq != null) { - foreach (var types in paramModReq) - TypeBuilder.ResolveUserTypes (types); - } - if (paramModOpt != null) { - foreach (var types in paramModOpt) - TypeBuilder.ResolveUserTypes (types); - } - } -/* - internal void GenerateDebugInfo (ISymbolWriter symbolWriter) - { - if (ilgen != null && ilgen.HasDebugInfo) { - SymbolToken token = new SymbolToken (GetToken().Token); - symbolWriter.OpenMethod (token); - symbolWriter.SetSymAttribute (token, "__name", System.Text.Encoding.UTF8.GetBytes (Name)); - ilgen.GenerateDebugInfo (symbolWriter); - symbolWriter.CloseMethod (); - } - } -*/ - public void SetCustomAttribute (CustomAttributeBuilder customBuilder) - { - if (customBuilder == null) - throw new ArgumentNullException ("customBuilder"); - - switch (customBuilder.Ctor.ReflectedType.FullName) { - case "System.Runtime.CompilerServices.MethodImplAttribute": - byte[] data = customBuilder.Data; - int impla; // the (stupid) ctor takes a short or an int ... - impla = (int)data [2]; - impla |= ((int)data [3]) << 8; - iattrs |= (MethodImplAttributes)impla; - return; - - case "System.Runtime.InteropServices.DllImportAttribute": - CustomAttributeBuilder.CustomAttributeInfo attr = CustomAttributeBuilder.decode_cattr (customBuilder); - bool preserveSig = true; - - /* - * It would be easier to construct a DllImportAttribute from - * the custom attribute builder, but the DllImportAttribute - * does not contain all the information required here, ie. - * - some parameters, like BestFitMapping has three values - * ("on", "off", "missing"), but DllImportAttribute only - * contains two (on/off). - * - PreserveSig is true by default, while it is false by - * default in DllImportAttribute. - */ - - pi_dll = (string)attr.ctorArgs[0]; - if (pi_dll == null || pi_dll.Length == 0) - throw new ArgumentException ("DllName cannot be empty"); - - native_cc = System.Runtime.InteropServices.CallingConvention.Winapi; - - for (int i = 0; i < attr.namedParamNames.Length; ++i) { - string name = attr.namedParamNames [i]; - object value = attr.namedParamValues [i]; - - if (name == "CallingConvention") - native_cc = (CallingConvention)value; - else if (name == "CharSet") - charset = (CharSet)value; - else if (name == "EntryPoint") - pi_entry = (string)value; - else if (name == "ExactSpelling") - ExactSpelling = (bool)value; - else if (name == "SetLastError") - SetLastError = (bool)value; - else if (name == "PreserveSig") - preserveSig = (bool)value; - else if (name == "BestFitMapping") - BestFitMapping = (bool)value; - else if (name == "ThrowOnUnmappableChar") - ThrowOnUnmappableChar = (bool)value; - } - - attrs |= MethodAttributes.PinvokeImpl; - if (preserveSig) - iattrs |= MethodImplAttributes.PreserveSig; - return; - - case "System.Runtime.InteropServices.PreserveSigAttribute": - iattrs |= MethodImplAttributes.PreserveSig; - return; - case "System.Runtime.CompilerServices.SpecialNameAttribute": - attrs |= MethodAttributes.SpecialName; - return; - case "System.Security.SuppressUnmanagedCodeSecurityAttribute": - attrs |= MethodAttributes.HasSecurity; - break; - } - - if (cattrs != null) { - CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1]; - cattrs.CopyTo (new_array, 0); - new_array [cattrs.Length] = customBuilder; - cattrs = new_array; - } else { - cattrs = new CustomAttributeBuilder [1]; - cattrs [0] = customBuilder; - } - } - - [ComVisible (true)] - public void SetCustomAttribute (ConstructorInfo con, byte[] binaryAttribute) - { - if (con == null) - throw new ArgumentNullException ("con"); - if (binaryAttribute == null) - throw new ArgumentNullException ("binaryAttribute"); - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } - - public void SetImplementationFlags (MethodImplAttributes attributes) - { - RejectIfCreated (); - iattrs = attributes; - } - - public override string ToString() - { - return "MethodBuilder [" + type.Name + "::" + name + "]"; - } - - // FIXME: - public override bool Equals (object obj) - { - return base.Equals (obj); - } - - public override int GetHashCode () - { - return name.GetHashCode (); - } - - internal override int get_next_table_index (object obj, int table, int count) - { - return type.get_next_table_index (obj, table, count); - } - - void ExtendArray (ref T[] array, T elem) { - if (array == null) { - array = new T [1]; - } else { - var newa = new T [array.Length + 1]; - Array.Copy (array, newa, array.Length); - array = newa; - } - array [array.Length - 1] = elem; - } - - internal void set_override (MethodInfo mdecl) - { - ExtendArray (ref override_methods, mdecl); - } - - private void RejectIfCreated () - { - if (type.is_created) - throw new InvalidOperationException ("Type definition of the method is complete."); - } - - private Exception NotSupported () - { - return new NotSupportedException ("The invoked member is not supported in a dynamic module."); - } - - public override MethodInfo MakeGenericMethod (params Type [] typeArguments) - { - if (!IsGenericMethodDefinition) - throw new InvalidOperationException ("Method is not a generic method definition"); - if (typeArguments == null) - throw new ArgumentNullException ("typeArguments"); - if (generic_params.Length != typeArguments.Length) - throw new ArgumentException ("Incorrect length", "typeArguments"); - foreach (Type type in typeArguments) { - if (type == null) - throw new ArgumentNullException ("typeArguments"); - } - - return new MethodOnTypeBuilderInst (this, typeArguments); - } - - public override bool IsGenericMethodDefinition { - get { - return generic_params != null; - } - } - - public override bool IsGenericMethod { - get { - return generic_params != null; - } - } - - public override MethodInfo GetGenericMethodDefinition () - { - if (!IsGenericMethodDefinition) - throw new InvalidOperationException (); - - return this; - } - - public override Type[] GetGenericArguments () - { - if (generic_params == null) - return null; - - Type[] result = new Type [generic_params.Length]; - for (int i = 0; i < generic_params.Length; i++) - result [i] = generic_params [i]; - - return result; - } - - public GenericTypeParameterBuilder[] DefineGenericParameters (params string[] names) - { - if (names == null) - throw new ArgumentNullException ("names"); - if (names.Length == 0) - throw new ArgumentException ("", "names"); - type.check_not_created (); - generic_params = new GenericTypeParameterBuilder [names.Length]; - for (int i = 0; i < names.Length; i++) { - string item = names [i]; - if (item == null) - throw new ArgumentNullException ("names"); - generic_params [i] = new GenericTypeParameterBuilder (type, this, item, i); - } - - return generic_params; - } - - public void SetReturnType (Type returnType) - { - rtype = returnType; - } - - public void SetParameters (params Type[] parameterTypes) - { - if (parameterTypes != null) { - for (int i = 0; i < parameterTypes.Length; ++i) - if (parameterTypes [i] == null) - throw new ArgumentNullException (nameof (parameterTypes), "Elements of the parameterTypes array cannot be null"); - - this.parameters = new Type [parameterTypes.Length]; - System.Array.Copy (parameterTypes, this.parameters, parameterTypes.Length); - } - } - - public void SetSignature (Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) - { - SetReturnType (returnType); - SetParameters (parameterTypes); - this.returnModReq = returnTypeRequiredCustomModifiers; - this.returnModOpt = returnTypeOptionalCustomModifiers; - this.paramModReq = parameterTypeRequiredCustomModifiers; - this.paramModOpt = parameterTypeOptionalCustomModifiers; - } - - public override Module Module { - get { - return GetModule (); - } - } - - public override ParameterInfo ReturnParameter { - get { - if (!type.is_created) - throw new InvalidOperationException (SR.InvalidOperation_TypeNotCreated); - if (created == null) - created = (RuntimeMethodInfo)MethodBase.GetMethodFromHandle (mhandle); - return created.ReturnParameter; - } - } - } + private RuntimeMethodInfo created; + + internal MethodBuilder(TypeBuilder tb, string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnModReq, Type[] returnModOpt, Type[] parameterTypes, Type[][] paramModReq, Type[][] paramModOpt) + { + this.name = name; + this.attrs = attributes; + this.call_conv = callingConvention; + this.rtype = returnType; + this.returnModReq = returnModReq; + this.returnModOpt = returnModOpt; + this.paramModReq = paramModReq; + this.paramModOpt = paramModOpt; + // The MSDN docs does not specify this, but the MS MethodBuilder + // appends a HasThis flag if the method is not static + if ((attributes & MethodAttributes.Static) == 0) + this.call_conv |= CallingConventions.HasThis; + if (parameterTypes != null) + { + for (int i = 0; i < parameterTypes.Length; ++i) + if (parameterTypes[i] == null) + throw new ArgumentException("Elements of the parameterTypes array cannot be null", nameof(parameterTypes)); + + this.parameters = new Type[parameterTypes.Length]; + Array.Copy(parameterTypes, this.parameters, parameterTypes.Length); + } + type = tb; + table_idx = get_next_table_index(this, 0x06, 1); + + ((ModuleBuilder)tb.Module).RegisterToken(this, GetToken().Token); + } + + internal MethodBuilder(TypeBuilder tb, string name, MethodAttributes attributes, + CallingConventions callingConvention, Type returnType, Type[] returnModReq, Type[] returnModOpt, Type[] parameterTypes, Type[][] paramModReq, Type[][] paramModOpt, + string dllName, string entryName, CallingConvention nativeCConv, CharSet nativeCharset) + : this(tb, name, attributes, callingConvention, returnType, returnModReq, returnModOpt, parameterTypes, paramModReq, paramModOpt) + { + pi_dll = dllName; + pi_entry = entryName; + native_cc = nativeCConv; + charset = nativeCharset; + } + + public override bool ContainsGenericParameters + { + get { throw new NotSupportedException(); } + } + + public bool InitLocals + { + get { return init_locals; } + set { init_locals = value; } + } + + internal TypeBuilder TypeBuilder + { + get { return type; } + } + + public override RuntimeMethodHandle MethodHandle + { + get + { + throw NotSupported(); + } + } + + internal RuntimeMethodHandle MethodHandleInternal + { + get + { + return mhandle; + } + } + + public override Type ReturnType + { + get { return rtype; } + } + + public override Type ReflectedType + { + get { return type; } + } + + public override Type DeclaringType + { + get { return type; } + } + + public override string Name + { + get { return name; } + } + + public override MethodAttributes Attributes + { + get { return attrs; } + } + + public override ICustomAttributeProvider ReturnTypeCustomAttributes + { + get { return null; } + } + + public override CallingConventions CallingConvention + { + get { return call_conv; } + } + + // FIXME: "Not implemented" + public string Signature + { + get + { + throw new NotImplementedException(); + } + } + + /* Used by mcs */ + internal bool BestFitMapping + { + set + { + extra_flags = (uint)((extra_flags & ~0x30) | (uint)(value ? 0x10 : 0x20)); + } + } + + /* Used by mcs */ + internal bool ThrowOnUnmappableChar + { + set + { + extra_flags = (uint)((extra_flags & ~0x3000) | (uint)(value ? 0x1000 : 0x2000)); + } + } + + /* Used by mcs */ + internal bool ExactSpelling + { + set + { + extra_flags = (uint)((extra_flags & ~0x01) | (uint)(value ? 0x01 : 0x00)); + } + } + + /* Used by mcs */ + internal bool SetLastError + { + set + { + extra_flags = (uint)((extra_flags & ~0x40) | (uint)(value ? 0x40 : 0x00)); + } + } + + public MethodToken GetToken() + { + return new MethodToken(0x06000000 | table_idx); + } + + public override MethodInfo GetBaseDefinition() + { + return this; + } + + public override MethodImplAttributes GetMethodImplementationFlags() + { + return iattrs; + } + + public override ParameterInfo[] GetParameters() + { + if (!type.is_created) + throw NotSupported(); + + return GetParametersInternal(); + } + + internal override ParameterInfo[] GetParametersInternal() + { + if (parameters == null) + return null; + + ParameterInfo[] retval = new ParameterInfo[parameters.Length]; + for (int i = 0; i < parameters.Length; i++) + { + retval[i] = RuntimeParameterInfo.New(pinfo?[i + 1], parameters[i], this, i + 1); + } + return retval; + } + + internal override int GetParametersCount() + { + if (parameters == null) + return 0; + + return parameters.Length; + } + + internal override Type GetParameterType(int pos) + { + return parameters[pos]; + } + + internal MethodBase RuntimeResolve() + { + return type.RuntimeResolve().GetMethod(this); + } + + public Module GetModule() + { + return type.Module; + } + + public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) + { + throw NotSupported(); + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + throw NotSupported(); + } + + public override object[] GetCustomAttributes(bool inherit) + { + /* + * On MS.NET, this always returns not_supported, but we can't do this + * since there would be no way to obtain custom attributes of + * dynamically created ctors. + */ + if (type.is_created) + return CustomAttribute.GetCustomAttributes(this, inherit); + else + throw NotSupported(); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + if (type.is_created) + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + else + throw NotSupported(); + } + + public ILGenerator GetILGenerator() + { + return GetILGenerator(64); + } + + public ILGenerator GetILGenerator(int size) + { + if (((iattrs & MethodImplAttributes.CodeTypeMask) != + MethodImplAttributes.IL) || + ((iattrs & MethodImplAttributes.ManagedMask) != + MethodImplAttributes.Managed)) + throw new InvalidOperationException("Method body should not exist."); + if (ilgen != null) + return ilgen; + ilgen = new ILGenerator(type.Module, ((ModuleBuilder)type.Module).GetTokenGenerator(), size); + return ilgen; + } + + public ParameterBuilder DefineParameter(int position, ParameterAttributes attributes, string strParamName) + { + RejectIfCreated(); + + // + // Extension: Mono allows position == 0 for the return attribute + // + if ((position < 0) || parameters == null || (position > parameters.Length)) + throw new ArgumentOutOfRangeException(nameof(position)); + + ParameterBuilder pb = new ParameterBuilder(this, position, attributes, strParamName); + if (pinfo == null) + pinfo = new ParameterBuilder[parameters.Length + 1]; + pinfo[position] = pb; + return pb; + } + + internal void check_override() + { + if (override_methods != null) + { + foreach (var m in override_methods) + { + if (m.IsVirtual && !IsVirtual) + throw new TypeLoadException(string.Format("Method '{0}' override '{1}' but it is not virtual", name, m)); + } + } + } + + internal void fixup() + { + if (((attrs & (MethodAttributes.Abstract | MethodAttributes.PinvokeImpl)) == 0) && ((iattrs & (MethodImplAttributes.Runtime | MethodImplAttributes.InternalCall)) == 0)) + { + // do not allow zero length method body on MS.NET 2.0 (and higher) + if (((ilgen == null) || (ilgen.ILOffset == 0)) && (code == null || code.Length == 0)) + throw new InvalidOperationException( + string.Format("Method '{0}.{1}' does not have a method body.", + DeclaringType.FullName, Name)); + } + if (ilgen != null) + ilgen.label_fixup(this); + } + + internal void ResolveUserTypes() + { + rtype = TypeBuilder.ResolveUserType(rtype); + TypeBuilder.ResolveUserTypes(parameters); + TypeBuilder.ResolveUserTypes(returnModReq); + TypeBuilder.ResolveUserTypes(returnModOpt); + if (paramModReq != null) + { + foreach (var types in paramModReq) + TypeBuilder.ResolveUserTypes(types); + } + if (paramModOpt != null) + { + foreach (var types in paramModOpt) + TypeBuilder.ResolveUserTypes(types); + } + } + /* + internal void GenerateDebugInfo (ISymbolWriter symbolWriter) + { + if (ilgen != null && ilgen.HasDebugInfo) { + SymbolToken token = new SymbolToken (GetToken().Token); + symbolWriter.OpenMethod (token); + symbolWriter.SetSymAttribute (token, "__name", System.Text.Encoding.UTF8.GetBytes (Name)); + ilgen.GenerateDebugInfo (symbolWriter); + symbolWriter.CloseMethod (); + } + } + */ + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + if (customBuilder == null) + throw new ArgumentNullException(nameof(customBuilder)); + + switch (customBuilder.Ctor.ReflectedType.FullName) + { + case "System.Runtime.CompilerServices.MethodImplAttribute": + byte[] data = customBuilder.Data; + int impla; // the (stupid) ctor takes a short or an int ... + impla = (int)data[2]; + impla |= ((int)data[3]) << 8; + iattrs |= (MethodImplAttributes)impla; + return; + + case "System.Runtime.InteropServices.DllImportAttribute": + CustomAttributeBuilder.CustomAttributeInfo attr = CustomAttributeBuilder.decode_cattr(customBuilder); + bool preserveSig = true; + + /* + * It would be easier to construct a DllImportAttribute from + * the custom attribute builder, but the DllImportAttribute + * does not contain all the information required here, ie. + * - some parameters, like BestFitMapping has three values + * ("on", "off", "missing"), but DllImportAttribute only + * contains two (on/off). + * - PreserveSig is true by default, while it is false by + * default in DllImportAttribute. + */ + + pi_dll = (string)attr.ctorArgs[0]; + if (pi_dll == null || pi_dll.Length == 0) + throw new ArgumentException("DllName cannot be empty"); + + native_cc = Runtime.InteropServices.CallingConvention.Winapi; + + for (int i = 0; i < attr.namedParamNames.Length; ++i) + { + string name = attr.namedParamNames[i]; + object value = attr.namedParamValues[i]; + + if (name == "CallingConvention") + native_cc = (CallingConvention)value; + else if (name == "CharSet") + charset = (CharSet)value; + else if (name == "EntryPoint") + pi_entry = (string)value; + else if (name == "ExactSpelling") + ExactSpelling = (bool)value; + else if (name == "SetLastError") + SetLastError = (bool)value; + else if (name == "PreserveSig") + preserveSig = (bool)value; + else if (name == "BestFitMapping") + BestFitMapping = (bool)value; + else if (name == "ThrowOnUnmappableChar") + ThrowOnUnmappableChar = (bool)value; + } + + attrs |= MethodAttributes.PinvokeImpl; + if (preserveSig) + iattrs |= MethodImplAttributes.PreserveSig; + return; + + case "System.Runtime.InteropServices.PreserveSigAttribute": + iattrs |= MethodImplAttributes.PreserveSig; + return; + case "System.Runtime.CompilerServices.SpecialNameAttribute": + attrs |= MethodAttributes.SpecialName; + return; + case "System.Security.SuppressUnmanagedCodeSecurityAttribute": + attrs |= MethodAttributes.HasSecurity; + break; + } + + if (cattrs != null) + { + CustomAttributeBuilder[] new_array = new CustomAttributeBuilder[cattrs.Length + 1]; + cattrs.CopyTo(new_array, 0); + new_array[cattrs.Length] = customBuilder; + cattrs = new_array; + } + else + { + cattrs = new CustomAttributeBuilder[1]; + cattrs[0] = customBuilder; + } + } + + [ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + if (con == null) + throw new ArgumentNullException(nameof(con)); + if (binaryAttribute == null) + throw new ArgumentNullException(nameof(binaryAttribute)); + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } + + public void SetImplementationFlags(MethodImplAttributes attributes) + { + RejectIfCreated(); + iattrs = attributes; + } + + public override string ToString() + { + return "MethodBuilder [" + type.Name + "::" + name + "]"; + } + + // FIXME: + public override bool Equals(object obj) + { + return base.Equals(obj); + } + + public override int GetHashCode() + { + return name.GetHashCode(); + } + + internal override int get_next_table_index(object obj, int table, int count) + { + return type.get_next_table_index(obj, table, count); + } + + private void ExtendArray(ref T[] array, T elem) + { + if (array == null) + { + array = new T[1]; + } + else + { + var newa = new T[array.Length + 1]; + Array.Copy(array, newa, array.Length); + array = newa; + } + array[array.Length - 1] = elem; + } + + internal void set_override(MethodInfo mdecl) + { + ExtendArray(ref override_methods, mdecl); + } + + private void RejectIfCreated() + { + if (type.is_created) + throw new InvalidOperationException("Type definition of the method is complete."); + } + + private Exception NotSupported() + { + return new NotSupportedException("The invoked member is not supported in a dynamic module."); + } + + public override MethodInfo MakeGenericMethod(params Type[] typeArguments) + { + if (!IsGenericMethodDefinition) + throw new InvalidOperationException("Method is not a generic method definition"); + if (typeArguments == null) + throw new ArgumentNullException(nameof(typeArguments)); + if (generic_params.Length != typeArguments.Length) + throw new ArgumentException("Incorrect length", nameof(typeArguments)); + foreach (Type type in typeArguments) + { + if (type == null) + throw new ArgumentNullException(nameof(typeArguments)); + } + + return new MethodOnTypeBuilderInst(this, typeArguments); + } + + public override bool IsGenericMethodDefinition + { + get + { + return generic_params != null; + } + } + + public override bool IsGenericMethod + { + get + { + return generic_params != null; + } + } + + public override MethodInfo GetGenericMethodDefinition() + { + if (!IsGenericMethodDefinition) + throw new InvalidOperationException(); + + return this; + } + + public override Type[] GetGenericArguments() + { + if (generic_params == null) + return null; + + Type[] result = new Type[generic_params.Length]; + for (int i = 0; i < generic_params.Length; i++) + result[i] = generic_params[i]; + + return result; + } + + public GenericTypeParameterBuilder[] DefineGenericParameters(params string[] names) + { + if (names == null) + throw new ArgumentNullException(nameof(names)); + if (names.Length == 0) + throw new ArgumentException("", nameof(names)); + type.check_not_created(); + generic_params = new GenericTypeParameterBuilder[names.Length]; + for (int i = 0; i < names.Length; i++) + { + string item = names[i]; + if (item == null) + throw new ArgumentNullException(nameof(names)); + generic_params[i] = new GenericTypeParameterBuilder(type, this, item, i); + } + + return generic_params; + } + + public void SetReturnType(Type returnType) + { + rtype = returnType; + } + + public void SetParameters(params Type[] parameterTypes) + { + if (parameterTypes != null) + { + for (int i = 0; i < parameterTypes.Length; ++i) + if (parameterTypes[i] == null) + throw new ArgumentNullException(nameof(parameterTypes), "Elements of the parameterTypes array cannot be null"); + + this.parameters = new Type[parameterTypes.Length]; + Array.Copy(parameterTypes, this.parameters, parameterTypes.Length); + } + } + + public void SetSignature(Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) + { + SetReturnType(returnType); + SetParameters(parameterTypes); + this.returnModReq = returnTypeRequiredCustomModifiers; + this.returnModOpt = returnTypeOptionalCustomModifiers; + this.paramModReq = parameterTypeRequiredCustomModifiers; + this.paramModOpt = parameterTypeOptionalCustomModifiers; + } + + public override Module Module + { + get + { + return GetModule(); + } + } + + public override ParameterInfo ReturnParameter + { + get + { + if (!type.is_created) + throw new InvalidOperationException(SR.InvalidOperation_TypeNotCreated); + if (created == null) + created = (RuntimeMethodInfo)GetMethodFromHandle(mhandle); + return created.ReturnParameter; + } + } + } [StructLayout(LayoutKind.Sequential)] - readonly struct ExceptionHandler : IEquatable + internal readonly struct ExceptionHandler : IEquatable { internal readonly int m_exceptionClass; internal readonly int m_tryStartOffset; @@ -712,7 +765,7 @@ public override int GetHashCode() return m_exceptionClass ^ m_tryStartOffset ^ m_tryEndOffset ^ m_filterOffset ^ m_handlerStartOffset ^ m_handlerEndOffset ^ (int)m_kind; } - public override bool Equals(Object obj) + public override bool Equals(object obj) { return obj is ExceptionHandler && Equals((ExceptionHandler)obj); } @@ -729,7 +782,7 @@ public bool Equals(ExceptionHandler other) other.m_kind == m_kind; } - public static bool operator ==(ExceptionHandler left, ExceptionHandler right) + public static bool operator ==(ExceptionHandler left, ExceptionHandler right) { return left.Equals(right); } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MethodOnTypeBuilderInst.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MethodOnTypeBuilderInst.cs index 49b2d39e962a7..ff11c1e69ce5a 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MethodOnTypeBuilderInst.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MethodOnTypeBuilderInst.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit/MethodOnTypeBuilderInst.cs // @@ -16,10 +14,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -29,6 +27,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Globalization; @@ -39,277 +38,309 @@ namespace System.Reflection.Emit { - /* - * This class represents a method of an instantiation of a generic type builder. - */ - [StructLayout (LayoutKind.Sequential)] - internal class MethodOnTypeBuilderInst : MethodInfo - { - #region Keep in sync with object-internals.h - Type instantiation; - MethodInfo base_method; /*This is the base method definition, it must be non-inflated and belong to a non-inflated type.*/ - Type[] method_arguments; - #endregion - MethodInfo generic_method_definition; - - public MethodOnTypeBuilderInst (TypeBuilderInstantiation instantiation, MethodInfo base_method) - { - this.instantiation = instantiation; - this.base_method = base_method; - } - - internal MethodOnTypeBuilderInst (MethodOnTypeBuilderInst gmd, Type[] typeArguments) - { - this.instantiation = gmd.instantiation; - this.base_method = gmd.base_method; - this.method_arguments = new Type [typeArguments.Length]; - typeArguments.CopyTo (this.method_arguments, 0); - this.generic_method_definition = gmd; - } - - internal MethodOnTypeBuilderInst (MethodInfo method, Type[] typeArguments) - { - this.instantiation = method.DeclaringType; - this.base_method = ExtractBaseMethod (method); - this.method_arguments = new Type [typeArguments.Length]; - typeArguments.CopyTo (this.method_arguments, 0); - if (base_method != method) - this.generic_method_definition = method; - } - - static MethodInfo ExtractBaseMethod (MethodInfo info) - { - if (info is MethodBuilder) - return info; - if (info is MethodOnTypeBuilderInst) - return ((MethodOnTypeBuilderInst)info).base_method; - - if (info.IsGenericMethod) - info = info.GetGenericMethodDefinition (); - - Type t = info.DeclaringType; - if (!t.IsGenericType || t.IsGenericTypeDefinition) - return info; - - return (MethodInfo)t.Module.ResolveMethod (info.MetadataToken); - } - - internal Type[] GetTypeArgs () - { - if (!instantiation.IsGenericType || instantiation.IsGenericParameter) - return null; - - return instantiation.GetGenericArguments (); - } - - // Called from the runtime to return the corresponding finished MethodInfo object - internal MethodInfo RuntimeResolve () { - var type = instantiation.InternalResolve (); - var m = type.GetMethod (base_method); - if (method_arguments != null) { - var args = new Type [method_arguments.Length]; - for (int i = 0; i < method_arguments.Length; ++i) - args [i] = method_arguments [i].InternalResolve (); - m = m.MakeGenericMethod (args); - } - return m; - } - - // - // MemberInfo members - // - - public override Type DeclaringType { - get { - return instantiation; - } - } - - public override string Name { - get { - return base_method.Name; - } - } - - public override Type ReflectedType { - get { - return instantiation; - } - } - - public override Type ReturnType { - get { - return base_method.ReturnType; - } - } - - public override Module Module { - get { - return base_method.Module; - } - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - throw new NotSupportedException (); - } - - public override object [] GetCustomAttributes (bool inherit) - { - throw new NotSupportedException (); - } - - public override object [] GetCustomAttributes (Type attributeType, bool inherit) - { - throw new NotSupportedException (); - } - - public override string ToString () - { - //IEnumerable`1 get_Item(TKey) - StringBuilder sb = new StringBuilder (ReturnType.ToString ()); - sb.Append (" "); - sb.Append (base_method.Name); - sb.Append ("("); - sb.Append (")"); - return sb.ToString (); - } - // - // MethodBase members - // - - public override MethodImplAttributes GetMethodImplementationFlags () - { - return base_method.GetMethodImplementationFlags (); - } - - public override ParameterInfo [] GetParameters () - { - return GetParametersInternal (); - } - - internal override ParameterInfo [] GetParametersInternal () - { - throw new NotSupportedException (); - } - - public override int MetadataToken { - get { - return base.MetadataToken; - } - } - - internal override int GetParametersCount () - { - return base_method.GetParametersCount (); - } - - public override Object Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - { - throw new NotSupportedException (); - } - - public override RuntimeMethodHandle MethodHandle { - get { - throw new NotSupportedException (); - } - } - - public override MethodAttributes Attributes { - get { - return base_method.Attributes; - } - } - - public override CallingConventions CallingConvention { - get { - return base_method.CallingConvention; - } - } - - public override MethodInfo MakeGenericMethod (params Type [] methodInstantiation) - { - if (!base_method.IsGenericMethodDefinition || (method_arguments != null)) - throw new InvalidOperationException ("Method is not a generic method definition"); - - if (methodInstantiation == null) - throw new ArgumentNullException ("methodInstantiation"); - - if (base_method.GetGenericArguments ().Length != methodInstantiation.Length) - throw new ArgumentException ("Incorrect length", "methodInstantiation"); - - foreach (Type type in methodInstantiation) { - if (type == null) - throw new ArgumentNullException ("methodInstantiation"); - } - - return new MethodOnTypeBuilderInst (this, methodInstantiation); - } - - public override Type [] GetGenericArguments () - { - if (!base_method.IsGenericMethodDefinition) - return null; - Type[] source = method_arguments ?? base_method.GetGenericArguments (); - Type[] result = new Type [source.Length]; - source.CopyTo (result, 0); - return result; - } - - public override MethodInfo GetGenericMethodDefinition () - { - return generic_method_definition ?? base_method; - } - - public override bool ContainsGenericParameters { - get { - if (base_method.ContainsGenericParameters) - return true; - if (!base_method.IsGenericMethodDefinition) - throw new NotSupportedException (); - if (method_arguments == null) - return true; - foreach (Type t in method_arguments) { - if (t.ContainsGenericParameters) - return true; - } - return false; - } - } - - public override bool IsGenericMethodDefinition { - get { - return base_method.IsGenericMethodDefinition && method_arguments == null; - } - } - - public override bool IsGenericMethod { - get { - return base_method.IsGenericMethodDefinition; - } - } - - // - // MethodInfo members - // - - public override MethodInfo GetBaseDefinition () - { - throw new NotSupportedException (); - } - - public override ParameterInfo ReturnParameter { - get { - throw new NotSupportedException(); - } - } - - public override ICustomAttributeProvider ReturnTypeCustomAttributes { - get { - throw new NotSupportedException (); - } - } - } + /* + * This class represents a method of an instantiation of a generic type builder. + */ + [StructLayout(LayoutKind.Sequential)] + internal class MethodOnTypeBuilderInst : MethodInfo + { + #region Keep in sync with object-internals.h + private Type instantiation; + private MethodInfo base_method; /*This is the base method definition, it must be non-inflated and belong to a non-inflated type.*/ + private Type[] method_arguments; + #endregion + private MethodInfo generic_method_definition; + + public MethodOnTypeBuilderInst(TypeBuilderInstantiation instantiation, MethodInfo base_method) + { + this.instantiation = instantiation; + this.base_method = base_method; + } + + internal MethodOnTypeBuilderInst(MethodOnTypeBuilderInst gmd, Type[] typeArguments) + { + this.instantiation = gmd.instantiation; + this.base_method = gmd.base_method; + this.method_arguments = new Type[typeArguments.Length]; + typeArguments.CopyTo(this.method_arguments, 0); + this.generic_method_definition = gmd; + } + + internal MethodOnTypeBuilderInst(MethodInfo method, Type[] typeArguments) + { + this.instantiation = method.DeclaringType; + this.base_method = ExtractBaseMethod(method); + this.method_arguments = new Type[typeArguments.Length]; + typeArguments.CopyTo(this.method_arguments, 0); + if (base_method != method) + this.generic_method_definition = method; + } + + private static MethodInfo ExtractBaseMethod(MethodInfo info) + { + if (info is MethodBuilder) + return info; + if (info is MethodOnTypeBuilderInst) + return ((MethodOnTypeBuilderInst)info).base_method; + + if (info.IsGenericMethod) + info = info.GetGenericMethodDefinition(); + + Type t = info.DeclaringType; + if (!t.IsGenericType || t.IsGenericTypeDefinition) + return info; + + return (MethodInfo)t.Module.ResolveMethod(info.MetadataToken); + } + + internal Type[] GetTypeArgs() + { + if (!instantiation.IsGenericType || instantiation.IsGenericParameter) + return null; + + return instantiation.GetGenericArguments(); + } + + // Called from the runtime to return the corresponding finished MethodInfo object + internal MethodInfo RuntimeResolve() + { + var type = instantiation.InternalResolve(); + var m = type.GetMethod(base_method); + if (method_arguments != null) + { + var args = new Type[method_arguments.Length]; + for (int i = 0; i < method_arguments.Length; ++i) + args[i] = method_arguments[i].InternalResolve(); + m = m.MakeGenericMethod(args); + } + return m; + } + + // + // MemberInfo members + // + + public override Type DeclaringType + { + get + { + return instantiation; + } + } + + public override string Name + { + get + { + return base_method.Name; + } + } + + public override Type ReflectedType + { + get + { + return instantiation; + } + } + + public override Type ReturnType + { + get + { + return base_method.ReturnType; + } + } + + public override Module Module + { + get + { + return base_method.Module; + } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + throw new NotSupportedException(); + } + + public override object[] GetCustomAttributes(bool inherit) + { + throw new NotSupportedException(); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + throw new NotSupportedException(); + } + + public override string ToString() + { + //IEnumerable`1 get_Item(TKey) + StringBuilder sb = new StringBuilder(ReturnType.ToString()); + sb.Append(" "); + sb.Append(base_method.Name); + sb.Append("("); + sb.Append(")"); + return sb.ToString(); + } + // + // MethodBase members + // + + public override MethodImplAttributes GetMethodImplementationFlags() + { + return base_method.GetMethodImplementationFlags(); + } + + public override ParameterInfo[] GetParameters() + { + return GetParametersInternal(); + } + + internal override ParameterInfo[] GetParametersInternal() + { + throw new NotSupportedException(); + } + + public override int MetadataToken + { + get + { + return base.MetadataToken; + } + } + + internal override int GetParametersCount() + { + return base_method.GetParametersCount(); + } + + public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) + { + throw new NotSupportedException(); + } + + public override RuntimeMethodHandle MethodHandle + { + get + { + throw new NotSupportedException(); + } + } + + public override MethodAttributes Attributes + { + get + { + return base_method.Attributes; + } + } + + public override CallingConventions CallingConvention + { + get + { + return base_method.CallingConvention; + } + } + + public override MethodInfo MakeGenericMethod(params Type[] methodInstantiation) + { + if (!base_method.IsGenericMethodDefinition || (method_arguments != null)) + throw new InvalidOperationException("Method is not a generic method definition"); + + if (methodInstantiation == null) + throw new ArgumentNullException(nameof(methodInstantiation)); + + if (base_method.GetGenericArguments().Length != methodInstantiation.Length) + throw new ArgumentException("Incorrect length", nameof(methodInstantiation)); + + foreach (Type type in methodInstantiation) + { + if (type == null) + throw new ArgumentNullException(nameof(methodInstantiation)); + } + + return new MethodOnTypeBuilderInst(this, methodInstantiation); + } + + public override Type[] GetGenericArguments() + { + if (!base_method.IsGenericMethodDefinition) + return null; + Type[] source = method_arguments ?? base_method.GetGenericArguments(); + Type[] result = new Type[source.Length]; + source.CopyTo(result, 0); + return result; + } + + public override MethodInfo GetGenericMethodDefinition() + { + return generic_method_definition ?? base_method; + } + + public override bool ContainsGenericParameters + { + get + { + if (base_method.ContainsGenericParameters) + return true; + if (!base_method.IsGenericMethodDefinition) + throw new NotSupportedException(); + if (method_arguments == null) + return true; + foreach (Type t in method_arguments) + { + if (t.ContainsGenericParameters) + return true; + } + return false; + } + } + + public override bool IsGenericMethodDefinition + { + get + { + return base_method.IsGenericMethodDefinition && method_arguments == null; + } + } + + public override bool IsGenericMethod + { + get + { + return base_method.IsGenericMethodDefinition; + } + } + + // + // MethodInfo members + // + + public override MethodInfo GetBaseDefinition() + { + throw new NotSupportedException(); + } + + public override ParameterInfo ReturnParameter + { + get + { + throw new NotSupportedException(); + } + } + + public override ICustomAttributeProvider ReturnTypeCustomAttributes + { + get + { + throw new NotSupportedException(); + } + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.Mono.cs index 9df938b13c6fc..75eb11e19b7f1 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,6 +30,7 @@ // (C) 2001 Ximian, Inc. http://www.ximian.com // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; @@ -43,870 +42,972 @@ using System.IO; using System.Globalization; -namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public partial class ModuleBuilder : Module { +namespace System.Reflection.Emit +{ + [StructLayout(LayoutKind.Sequential)] + public partial class ModuleBuilder : Module + { #pragma warning disable 169, 414 - #region Sync with object-internals.h - // This class inherits from Module, but the runtime expects it to have the same layout as MonoModule - #region Sync with MonoModule - internal IntPtr _impl; /* a pointer to a MonoImage */ - internal Assembly assembly; - internal string fqname; - internal string name; - internal string scopename; - internal bool is_resource; - internal int token; - #endregion - private UIntPtr dynamic_image; /* GC-tracked */ - private int num_types; - private TypeBuilder[] types; - private CustomAttributeBuilder[] cattrs; - private byte[] guid; - private int table_idx; - internal AssemblyBuilder assemblyb; - private MethodBuilder[] global_methods; - private FieldBuilder[] global_fields; - bool is_main; - private object resources; - private IntPtr unparented_classes; - private int[] table_indexes; - #endregion + #region Sync with object-internals.h + // This class inherits from Module, but the runtime expects it to have the same layout as MonoModule + #region Sync with MonoModule + internal IntPtr _impl; /* a pointer to a MonoImage */ + internal Assembly assembly; + internal string fqname; + internal string name; + internal string scopename; + internal bool is_resource; + internal int token; + #endregion + private UIntPtr dynamic_image; /* GC-tracked */ + private int num_types; + private TypeBuilder[] types; + private CustomAttributeBuilder[] cattrs; + private byte[] guid; + private int table_idx; + internal AssemblyBuilder assemblyb; + private MethodBuilder[] global_methods; + private FieldBuilder[] global_fields; + private bool is_main; + private object resources; + private IntPtr unparented_classes; + private int[] table_indexes; + #endregion #pragma warning restore 169, 414 - - private TypeBuilder global_type; - private Type global_type_created; - // name_cache keys are display names - Dictionary name_cache; - Dictionary us_string_cache; - ModuleBuilderTokenGenerator token_gen; - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern void basic_init (ModuleBuilder ab); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern void set_wrappers_type (ModuleBuilder mb, Type ab); - - internal ModuleBuilder (AssemblyBuilder assb, string name, bool emitSymbolInfo) { - this.name = this.scopename = name; - this.fqname = name; - this.assembly = this.assemblyb = assb; - guid = Guid.NewGuid ().ToByteArray (); - table_idx = get_next_table_index (this, 0x00, 1); - name_cache = new Dictionary (); - us_string_cache = new Dictionary (512); - - basic_init (this); - - CreateGlobalType (); - - TypeBuilder tb = new TypeBuilder (this, TypeAttributes.Abstract, 0xFFFFFF); /*last valid token*/ - Type type = tb.CreateType (); - set_wrappers_type (this, type); - } - - public override string FullyQualifiedName { - get { - string fullyQualifiedName = fqname; - if (fullyQualifiedName == null) - return null; - if (assemblyb.AssemblyDir != null) { - fullyQualifiedName = Path.Combine (assemblyb.AssemblyDir, fullyQualifiedName); - fullyQualifiedName = Path.GetFullPath (fullyQualifiedName); - } - - return fullyQualifiedName; - } - } - - public bool IsTransient () { - return true; - } - - public void CreateGlobalFunctions () - { - if (global_type_created != null) - throw new InvalidOperationException ("global methods already created"); - if (global_type != null) - global_type_created = global_type.CreateType (); - } - - public FieldBuilder DefineInitializedData( string name, byte[] data, FieldAttributes attributes) { - if (data == null) - throw new ArgumentNullException ("data"); - - var maskedAttributes = attributes & ~FieldAttributes.ReservedMask; - FieldBuilder fb = DefineDataImpl (name, data.Length, maskedAttributes | FieldAttributes.HasFieldRVA); - fb.SetRVAData (data); - - return fb; - } - - public FieldBuilder DefineUninitializedData (string name, int size, FieldAttributes attributes) - { - return DefineDataImpl (name, size, attributes & ~FieldAttributes.ReservedMask); - } - - private FieldBuilder DefineDataImpl (string name, int size, FieldAttributes attributes) - { - if (name == null) - throw new ArgumentNullException ("name"); - if (name == String.Empty) - throw new ArgumentException ("name cannot be empty", "name"); - if (global_type_created != null) - throw new InvalidOperationException ("global fields already created"); - if ((size <= 0) || (size >= 0x3f0000)) - throw new ArgumentException ("Data size must be > 0 and < 0x3f0000", null as string); - - CreateGlobalType (); - - string typeName = "$ArrayType$" + size; - Type datablobtype = GetType (typeName, false, false); - if (datablobtype == null) { - TypeBuilder tb = DefineType (typeName, - TypeAttributes.Public|TypeAttributes.ExplicitLayout|TypeAttributes.Sealed, - typeof (ValueType), null, PackingSize.Size1, size); - tb.CreateType (); - datablobtype = tb; - } - FieldBuilder fb = global_type.DefineField (name, datablobtype, attributes|FieldAttributes.Static); - - if (global_fields != null) { - FieldBuilder[] new_fields = new FieldBuilder [global_fields.Length+1]; - System.Array.Copy (global_fields, new_fields, global_fields.Length); - new_fields [global_fields.Length] = fb; - global_fields = new_fields; - } else { - global_fields = new FieldBuilder [1]; - global_fields [0] = fb; - } - return fb; - } - - private void addGlobalMethod (MethodBuilder mb) { - if (global_methods != null) { - MethodBuilder[] new_methods = new MethodBuilder [global_methods.Length+1]; - System.Array.Copy (global_methods, new_methods, global_methods.Length); - new_methods [global_methods.Length] = mb; - global_methods = new_methods; - } else { - global_methods = new MethodBuilder [1]; - global_methods [0] = mb; - } - } - - public MethodBuilder DefineGlobalMethod (string name, MethodAttributes attributes, Type returnType, Type[] parameterTypes) - { - return DefineGlobalMethod (name, attributes, CallingConventions.Standard, returnType, parameterTypes); - } - - public MethodBuilder DefineGlobalMethod (string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) { - return DefineGlobalMethod (name, attributes, callingConvention, returnType, null, null, parameterTypes, null, null); - } - - public MethodBuilder DefineGlobalMethod (string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] requiredReturnTypeCustomModifiers, Type[] optionalReturnTypeCustomModifiers, Type[] parameterTypes, Type[][] requiredParameterTypeCustomModifiers, Type[][] optionalParameterTypeCustomModifiers) - { - if (name == null) - throw new ArgumentNullException ("name"); - if ((attributes & MethodAttributes.Static) == 0) - throw new ArgumentException ("global methods must be static"); - if (global_type_created != null) - throw new InvalidOperationException ("global methods already created"); - CreateGlobalType (); - MethodBuilder mb = global_type.DefineMethod (name, attributes, callingConvention, returnType, requiredReturnTypeCustomModifiers, optionalReturnTypeCustomModifiers, parameterTypes, requiredParameterTypeCustomModifiers, optionalParameterTypeCustomModifiers); - - addGlobalMethod (mb); - return mb; - } - - public MethodBuilder DefinePInvokeMethod (string name, string dllName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) { - return DefinePInvokeMethod (name, dllName, name, attributes, callingConvention, returnType, parameterTypes, nativeCallConv, nativeCharSet); - } - - public MethodBuilder DefinePInvokeMethod (string name, string dllName, string entryName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) { - if (name == null) - throw new ArgumentNullException ("name"); - if ((attributes & MethodAttributes.Static) == 0) - throw new ArgumentException ("global methods must be static"); - if (global_type_created != null) - throw new InvalidOperationException ("global methods already created"); - CreateGlobalType (); - MethodBuilder mb = global_type.DefinePInvokeMethod (name, dllName, entryName, attributes, callingConvention, returnType, parameterTypes, nativeCallConv, nativeCharSet); - - addGlobalMethod (mb); - return mb; - } - - public TypeBuilder DefineType (string name) { - return DefineType (name, 0); - } - - public TypeBuilder DefineType (string name, TypeAttributes attr) { - if ((attr & TypeAttributes.Interface) != 0) - return DefineType (name, attr, null, null); - return DefineType (name, attr, typeof(object), null); - } - - public TypeBuilder DefineType (string name, TypeAttributes attr, Type parent) { - return DefineType (name, attr, parent, null); - } - - private void AddType (TypeBuilder tb) - { - if (types != null) { - if (types.Length == num_types) { - TypeBuilder[] new_types = new TypeBuilder [types.Length * 2]; - System.Array.Copy (types, new_types, num_types); - types = new_types; - } - } else { - types = new TypeBuilder [1]; - } - types [num_types] = tb; - num_types ++; - } - - private TypeBuilder DefineType (string name, TypeAttributes attr, Type parent, Type[] interfaces, PackingSize packingSize, int typesize) { - if (name == null) - throw new ArgumentNullException ("fullname"); - TypeIdentifier ident = TypeIdentifiers.FromInternal (name); - if (name_cache.ContainsKey (ident)) - throw new ArgumentException ("Duplicate type name within an assembly."); - TypeBuilder res = new TypeBuilder (this, name, attr, parent, interfaces, packingSize, typesize, null); - AddType (res); - - name_cache.Add (ident, res); - - return res; - } - - internal void RegisterTypeName (TypeBuilder tb, TypeName name) - { - name_cache.Add (name, tb); - } - - internal TypeBuilder GetRegisteredType (TypeName name) - { - TypeBuilder result = null; - name_cache.TryGetValue (name, out result); - return result; - } - - [ComVisible (true)] - public TypeBuilder DefineType (string name, TypeAttributes attr, Type parent, Type[] interfaces) { - return DefineType (name, attr, parent, interfaces, PackingSize.Unspecified, TypeBuilder.UnspecifiedTypeSize); - } - - public TypeBuilder DefineType (string name, TypeAttributes attr, Type parent, int typesize) { - return DefineType (name, attr, parent, null, PackingSize.Unspecified, typesize); - } - - public TypeBuilder DefineType (string name, TypeAttributes attr, Type parent, PackingSize packsize) { - return DefineType (name, attr, parent, null, packsize, TypeBuilder.UnspecifiedTypeSize); - } - - public TypeBuilder DefineType (string name, TypeAttributes attr, Type parent, PackingSize packingSize, int typesize) { - return DefineType (name, attr, parent, null, packingSize, typesize); - } - - public MethodInfo GetArrayMethod( Type arrayClass, string methodName, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) { - return new MonoArrayMethod (arrayClass, methodName, callingConvention, returnType, parameterTypes); - } - - public EnumBuilder DefineEnum( string name, TypeAttributes visibility, Type underlyingType) { - TypeIdentifier ident = TypeIdentifiers.FromInternal (name); - if (name_cache.ContainsKey (ident)) - throw new ArgumentException ("Duplicate type name within an assembly."); - - EnumBuilder eb = new EnumBuilder (this, name, visibility, underlyingType); - TypeBuilder res = eb.GetTypeBuilder (); - AddType (res); - name_cache.Add (ident, res); - return eb; - } - - [ComVisible (true)] - public override Type GetType( string className) { - return GetType (className, false, false); - } - - [ComVisible (true)] - public override Type GetType( string className, bool ignoreCase) { - return GetType (className, false, ignoreCase); - } - - private TypeBuilder search_in_array (TypeBuilder[] arr, int validElementsInArray, TypeName className) { - int i; - for (i = 0; i < validElementsInArray; ++i) { - if (String.Compare (className.DisplayName, arr [i].FullName, true, CultureInfo.InvariantCulture) == 0) { - return arr [i]; - } - } - return null; - } - - private TypeBuilder search_nested_in_array (TypeBuilder[] arr, int validElementsInArray, TypeName className) { - int i; - for (i = 0; i < validElementsInArray; ++i) { - if (String.Compare (className.DisplayName, arr [i].Name, true, CultureInfo.InvariantCulture) == 0) - return arr [i]; - } - return null; - } - - private TypeBuilder GetMaybeNested (TypeBuilder t, IEnumerable nested) { - TypeBuilder result = t; - - foreach (TypeName pname in nested) { - if (result.subtypes == null) - return null; - result = search_nested_in_array(result.subtypes, result.subtypes.Length, pname); - if (result == null) - return null; - } - return result; - } - - [ComVisible (true)] - public override Type GetType (string className, bool throwOnError, bool ignoreCase) - { - if (className == null) - throw new ArgumentNullException ("className"); - if (className.Length == 0) - throw new ArgumentException ("className"); - - TypeBuilder result = null; - - if (types == null && throwOnError) - throw new TypeLoadException (className); - - TypeSpec ts = TypeSpec.Parse (className); - - if (!ignoreCase) { - var displayNestedName = ts.TypeNameWithoutModifiers(); - name_cache.TryGetValue (displayNestedName, out result); - } else { - if (types != null) - result = search_in_array (types, num_types, ts.Name); - if (!ts.IsNested && result != null) { - result = GetMaybeNested (result, ts.Nested); - } - } - if ((result == null) && throwOnError) - throw new TypeLoadException (className); - if (result != null && (ts.HasModifiers || ts.IsByRef)) { - Type mt = result; - if (result is TypeBuilder) { - var tb = result as TypeBuilder; - if (tb.is_created) - mt = tb.CreateType (); - } - foreach (var mod in ts.Modifiers) { - if (mod is PointerSpec) - mt = mt.MakePointerType (); - else if (mod is ArraySpec) { - var spec = mod as ArraySpec; - if (spec.IsBound) - return null; - if (spec.Rank == 1) - mt = mt.MakeArrayType (); - else - mt = mt.MakeArrayType (spec.Rank); - } - } - if (ts.IsByRef) - mt = mt.MakeByRefType (); - result = mt as TypeBuilder; - if (result == null) - return mt; - } - if (result != null && result.is_created) - return result.CreateType (); - else - return result; - } - - internal int get_next_table_index (object obj, int table, int count) { - if (table_indexes == null) { - table_indexes = new int [64]; - for (int i=0; i < 64; ++i) - table_indexes [i] = 1; - /* allow room for . in TypeDef table */ - table_indexes [0x02] = 2; - } - // Console.WriteLine ("getindex for table "+table.ToString()+" got "+table_indexes [table].ToString()); - var index = table_indexes [table]; - table_indexes [table] += count; - return index; - } - - public void SetCustomAttribute (CustomAttributeBuilder customBuilder) - { - if (customBuilder == null) - throw new ArgumentNullException (nameof (customBuilder)); - if (cattrs != null) { - CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1]; - cattrs.CopyTo (new_array, 0); - new_array [cattrs.Length] = customBuilder; - cattrs = new_array; - } else { - cattrs = new CustomAttributeBuilder [1]; - cattrs [0] = customBuilder; - } - } - - [ComVisible (true)] - public void SetCustomAttribute( ConstructorInfo con, byte[] binaryAttribute) { - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } -/* - internal ISymbolDocumentWriter DefineDocument (string url, Guid language, Guid languageVendor, Guid documentType) - { - if (symbolWriter != null) - return symbolWriter.DefineDocument (url, language, languageVendor, documentType); - else - return null; - } -*/ - public override Type [] GetTypes () - { - if (types == null) - return Type.EmptyTypes; - - int n = num_types; - Type [] copy = new Type [n]; - Array.Copy (types, copy, n); - - // MS replaces the typebuilders with their created types - for (int i = 0; i < copy.Length; ++i) - if (types [i].is_created) - copy [i] = types [i].CreateType (); - - return copy; - } - - public MethodToken GetMethodToken (MethodInfo method) - { - if (method == null) - throw new ArgumentNullException ("method"); - - return new MethodToken (GetToken (method)); - } - - public MethodToken GetArrayMethodToken (Type arrayClass, string methodName, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) - { - return GetMethodToken (GetArrayMethod (arrayClass, methodName, callingConvention, returnType, parameterTypes)); - } - - [ComVisible (true)] - public MethodToken GetConstructorToken (ConstructorInfo con) - { - if (con == null) - throw new ArgumentNullException ("con"); - - return new MethodToken (GetToken (con)); - } - - public FieldToken GetFieldToken (FieldInfo field) - { - if (field == null) - throw new ArgumentNullException ("field"); - - throw new NotImplementedException (); - //return new FieldToken (GetToken (field)); - } - - // FIXME: - public SignatureToken GetSignatureToken (byte[] sigBytes, int sigLength) - { - throw new NotImplementedException (); - } - - public SignatureToken GetSignatureToken (SignatureHelper sigHelper) - { - if (sigHelper == null) - throw new ArgumentNullException ("sigHelper"); - return new SignatureToken (GetToken (sigHelper)); - } - - public StringToken GetStringConstant (string str) - { - if (str == null) - throw new ArgumentNullException ("str"); - return new StringToken (GetToken (str)); - } - - public TypeToken GetTypeToken (Type type) - { - if (type == null) - throw new ArgumentNullException ("type"); - if (type.IsByRef) - throw new ArgumentException ("type can't be a byref type", "type"); - if (!IsTransient () && (type.Module is ModuleBuilder) && ((ModuleBuilder)type.Module).IsTransient ()) - throw new InvalidOperationException ("a non-transient module can't reference a transient module"); - return new TypeToken (GetToken (type)); - } - - public TypeToken GetTypeToken (string name) - { - return GetTypeToken (GetType (name)); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern int getUSIndex (ModuleBuilder mb, string str); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern int getToken (ModuleBuilder mb, object obj, bool create_open_instance); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern int getMethodToken (ModuleBuilder mb, MethodBase method, - Type[] opt_param_types); - - internal int GetToken (string str) - { - int result; - if (!us_string_cache.TryGetValue (str, out result)) { - result = getUSIndex (this, str); - us_string_cache [str] = result; - } - - return result; - } - - static int typeref_tokengen = 0x01ffffff; - static int typedef_tokengen = 0x02ffffff; - static int typespec_tokengen = 0x1bffffff; - static int memberref_tokengen = 0x0affffff; - static int methoddef_tokengen = 0x06ffffff; - Dictionary inst_tokens, inst_tokens_open; - - // - // Assign a pseudo token to the various TypeBuilderInst objects, so the runtime - // doesn't have to deal with them. - // For Run assemblies, the tokens will not be fixed up, so the runtime will - // still encounter these objects, it will resolve them by calling their - // RuntimeResolve () methods. - // - int GetPseudoToken (MemberInfo member, bool create_open_instance) - { - int token; - var dict = create_open_instance ? inst_tokens_open : inst_tokens; - if (dict == null) { - dict = new Dictionary (ReferenceEqualityComparer.Instance); - if (create_open_instance) - inst_tokens_open = dict; - else - inst_tokens = dict; - } else if (dict.TryGetValue (member, out token)) { - return token; - } - - // Count backwards to avoid collisions with the tokens - // allocated by the runtime - if (member is TypeBuilderInstantiation || member is SymbolType) - token = typespec_tokengen --; - else if (member is FieldOnTypeBuilderInst) - token = memberref_tokengen --; - else if (member is ConstructorOnTypeBuilderInst) - token = memberref_tokengen --; - else if (member is MethodOnTypeBuilderInst) - token = memberref_tokengen --; - else if (member is FieldBuilder) - token = memberref_tokengen --; - else if (member is TypeBuilder) { - if (create_open_instance && (member as TypeBuilder).ContainsGenericParameters) - token = typespec_tokengen --; - else if (member.Module == this) - token = typedef_tokengen --; - else - token = typeref_tokengen --; - } else if (member is EnumBuilder) { - token = GetPseudoToken ((member as EnumBuilder).GetTypeBuilder(), create_open_instance); - dict[member] = token; - // n.b. don't register with the runtime, the TypeBuilder already did it. - return token; - } else if (member is ConstructorBuilder) { - if (member.Module == this && !(member as ConstructorBuilder).TypeBuilder.ContainsGenericParameters) - token = methoddef_tokengen --; - else - token = memberref_tokengen --; - } else if (member is MethodBuilder) { - var mb = member as MethodBuilder; - if (member.Module == this && !mb.TypeBuilder.ContainsGenericParameters && !mb.IsGenericMethodDefinition) - token = methoddef_tokengen --; - else - token = memberref_tokengen --; - } else if (member is GenericTypeParameterBuilder) { - token = typespec_tokengen --; - } else - throw new NotImplementedException (); - - dict [member] = token; - RegisterToken (member, token); - return token; - } - - internal int GetToken (MemberInfo member) { - if (member is ConstructorBuilder || member is MethodBuilder || member is FieldBuilder) - return GetPseudoToken (member, false); - return getToken (this, member, true); - } - - internal int GetToken (MemberInfo member, bool create_open_instance) { - if (member is TypeBuilderInstantiation || member is FieldOnTypeBuilderInst || member is ConstructorOnTypeBuilderInst || member is MethodOnTypeBuilderInst || member is SymbolType || member is FieldBuilder || member is TypeBuilder || member is ConstructorBuilder || member is MethodBuilder || member is GenericTypeParameterBuilder || - member is EnumBuilder) - return GetPseudoToken (member, create_open_instance); - return getToken (this, member, create_open_instance); - } - - internal int GetToken (MethodBase method, IEnumerable opt_param_types) { - if (method is ConstructorBuilder || method is MethodBuilder) - return GetPseudoToken (method, false); - - if (opt_param_types == null) - return getToken (this, method, true); - - var optParamTypes = new List (opt_param_types); - return getMethodToken (this, method, optParamTypes.ToArray ()); - } - - internal int GetToken (MethodBase method, Type[] opt_param_types) { - if (method is ConstructorBuilder || method is MethodBuilder) - return GetPseudoToken (method, false); - return getMethodToken (this, method, opt_param_types); - } - - internal int GetToken (SignatureHelper helper) { - return getToken (this, helper, true); - } - - /* - * Register the token->obj mapping with the runtime so the Module.Resolve... - * methods will work for obj. - */ - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern void RegisterToken (object obj, int token); - - /* - * Returns MemberInfo registered with the given token. - */ - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern object GetRegisteredToken (int token); - - internal TokenGenerator GetTokenGenerator () { - if (token_gen == null) - token_gen = new ModuleBuilderTokenGenerator (this); - return token_gen; - } - - // Called from the runtime to return the corresponding finished reflection object - internal static object RuntimeResolve (object obj) { - if (obj is MethodBuilder) - return (obj as MethodBuilder).RuntimeResolve (); - if (obj is ConstructorBuilder) - return (obj as ConstructorBuilder).RuntimeResolve (); - if (obj is FieldBuilder) - return (obj as FieldBuilder).RuntimeResolve (); - if (obj is GenericTypeParameterBuilder) - return (obj as GenericTypeParameterBuilder).RuntimeResolve (); - if (obj is FieldOnTypeBuilderInst) - return (obj as FieldOnTypeBuilderInst).RuntimeResolve (); - if (obj is MethodOnTypeBuilderInst) - return (obj as MethodOnTypeBuilderInst).RuntimeResolve (); - if (obj is ConstructorOnTypeBuilderInst) - return (obj as ConstructorOnTypeBuilderInst).RuntimeResolve (); - if (obj is Type) - return (obj as Type).RuntimeResolve (); - throw new NotImplementedException (obj.GetType ().FullName); - } - - internal string FileName { - get { - return fqname; - } - } - - internal bool IsMain { - set { - is_main = value; - } - } - - internal void CreateGlobalType () { - if (global_type == null) - global_type = new TypeBuilder (this, 0, 1); - } - - public override Assembly Assembly { - get { return assemblyb; } - } - - public override string Name { - get { return name; } - } - - public override string ScopeName { - get { return name; } - } - - public override Guid ModuleVersionId { - get { - return new Guid (guid); - } - } - - public override bool IsResource () - { - return false; - } - - protected override MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) - { - if (global_type_created == null) - return null; - if (types == null) - return global_type_created.GetMethod (name); - return global_type_created.GetMethod (name, bindingAttr, binder, callConvention, types, modifiers); - } - - public override FieldInfo ResolveField (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - return RuntimeModule.ResolveField (this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); - } - - public override MemberInfo ResolveMember (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - return RuntimeModule.ResolveMember (this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); - } - - internal MemberInfo ResolveOrGetRegisteredToken (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) - { - ResolveTokenError error; - MemberInfo m = RuntimeModule.ResolveMemberToken (_impl, metadataToken, RuntimeModule.ptrs_from_types (genericTypeArguments), RuntimeModule.ptrs_from_types (genericMethodArguments), out error); - if (m != null) - return m; - - m = GetRegisteredToken (metadataToken) as MemberInfo; - if (m == null) - throw RuntimeModule.resolve_token_exception (Name, metadataToken, error, "MemberInfo"); - else - return m; - } - - public override MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - return RuntimeModule.ResolveMethod (this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); - } - - public override string ResolveString (int metadataToken) { - return RuntimeModule.ResolveString (this, _impl, metadataToken); - } - - public override byte[] ResolveSignature (int metadataToken) { - return RuntimeModule.ResolveSignature (this, _impl, metadataToken); - } - - public override Type ResolveType (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - return RuntimeModule.ResolveType (this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); - } - - public override bool Equals (object obj) - { - return base.Equals (obj); - } - - public override int GetHashCode () - { - return base.GetHashCode (); - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - return base.IsDefined (attributeType, inherit); - } - - public override object[] GetCustomAttributes (bool inherit) - { - return GetCustomAttributes (null, inherit); - } - - public override object[] GetCustomAttributes (Type attributeType, bool inherit) - { - if (cattrs == null || cattrs.Length == 0) - return Array.Empty (); - - if (attributeType is TypeBuilder) - throw new InvalidOperationException ("First argument to GetCustomAttributes can't be a TypeBuilder"); - - List results = new List (); - for (int i=0; i < cattrs.Length; i++) { - Type t = cattrs [i].Ctor.GetType (); - - if (t is TypeBuilder) - throw new InvalidOperationException ("Can't construct custom attribute for TypeBuilder type"); - - if (attributeType == null || attributeType.IsAssignableFrom (t)) - results.Add (cattrs [i].Invoke ()); - } - - return results.ToArray (); - } - - public override IList GetCustomAttributesData () - { - return CustomAttributeData.GetCustomAttributes (this); - } - - public override FieldInfo GetField (string name, BindingFlags bindingAttr) - { - if (global_type_created == null) - throw new InvalidOperationException ("Module-level fields cannot be retrieved until after the CreateGlobalFunctions method has been called for the module."); - return global_type_created.GetField (name, bindingAttr); - } - - public override FieldInfo[] GetFields (BindingFlags bindingFlags) - { - if (global_type_created == null) - throw new InvalidOperationException ("Module-level fields cannot be retrieved until after the CreateGlobalFunctions method has been called for the module."); - return global_type_created.GetFields (bindingFlags); - } - - public override MethodInfo[] GetMethods (BindingFlags bindingFlags) - { - if (global_type_created == null) - throw new InvalidOperationException ("Module-level methods cannot be retrieved until after the CreateGlobalFunctions method has been called for the module."); - return global_type_created.GetMethods (bindingFlags); - } - - public override int MetadataToken { - get { - return RuntimeModule.get_MetadataToken (this); - } - } - } - - internal class ModuleBuilderTokenGenerator : TokenGenerator { - - private ModuleBuilder mb; - - public ModuleBuilderTokenGenerator (ModuleBuilder mb) { - this.mb = mb; - } - - public int GetToken (string str) { - return mb.GetToken (str); - } - - public int GetToken (MemberInfo member, bool create_open_instance) { - return mb.GetToken (member, create_open_instance); - } - - public int GetToken (MethodBase method, Type[] opt_param_types) { - return mb.GetToken (method, opt_param_types); - } - - public int GetToken (SignatureHelper helper) { - return mb.GetToken (helper); - } - } + + private TypeBuilder global_type; + private Type global_type_created; + // name_cache keys are display names + private Dictionary name_cache; + private Dictionary us_string_cache; + private ModuleBuilderTokenGenerator token_gen; + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void basic_init(ModuleBuilder ab); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void set_wrappers_type(ModuleBuilder mb, Type ab); + + internal ModuleBuilder(AssemblyBuilder assb, string name, bool emitSymbolInfo) + { + this.name = this.scopename = name; + this.fqname = name; + this.assembly = this.assemblyb = assb; + guid = Guid.NewGuid().ToByteArray(); + table_idx = get_next_table_index(this, 0x00, 1); + name_cache = new Dictionary(); + us_string_cache = new Dictionary(512); + + basic_init(this); + + CreateGlobalType(); + + TypeBuilder tb = new TypeBuilder(this, TypeAttributes.Abstract, 0xFFFFFF); /*last valid token*/ + Type type = tb.CreateType(); + set_wrappers_type(this, type); + } + + public override string FullyQualifiedName + { + get + { + string fullyQualifiedName = fqname; + if (fullyQualifiedName == null) + return null; + if (assemblyb.AssemblyDir != null) + { + fullyQualifiedName = Path.Combine(assemblyb.AssemblyDir, fullyQualifiedName); + fullyQualifiedName = Path.GetFullPath(fullyQualifiedName); + } + + return fullyQualifiedName; + } + } + + public bool IsTransient() + { + return true; + } + + public void CreateGlobalFunctions() + { + if (global_type_created != null) + throw new InvalidOperationException("global methods already created"); + if (global_type != null) + global_type_created = global_type.CreateType(); + } + + public FieldBuilder DefineInitializedData(string name, byte[] data, FieldAttributes attributes) + { + if (data == null) + throw new ArgumentNullException(nameof(data)); + + var maskedAttributes = attributes & ~FieldAttributes.ReservedMask; + FieldBuilder fb = DefineDataImpl(name, data.Length, maskedAttributes | FieldAttributes.HasFieldRVA); + fb.SetRVAData(data); + + return fb; + } + + public FieldBuilder DefineUninitializedData(string name, int size, FieldAttributes attributes) + { + return DefineDataImpl(name, size, attributes & ~FieldAttributes.ReservedMask); + } + + private FieldBuilder DefineDataImpl(string name, int size, FieldAttributes attributes) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + if (name == string.Empty) + throw new ArgumentException("name cannot be empty", nameof(name)); + if (global_type_created != null) + throw new InvalidOperationException("global fields already created"); + if ((size <= 0) || (size >= 0x3f0000)) + throw new ArgumentException("Data size must be > 0 and < 0x3f0000", null as string); + + CreateGlobalType(); + + string typeName = "$ArrayType$" + size; + Type datablobtype = GetType(typeName, false, false); + if (datablobtype == null) + { + TypeBuilder tb = DefineType(typeName, + TypeAttributes.Public | TypeAttributes.ExplicitLayout | TypeAttributes.Sealed, + typeof(ValueType), null, PackingSize.Size1, size); + tb.CreateType(); + datablobtype = tb; + } + FieldBuilder fb = global_type.DefineField(name, datablobtype, attributes | FieldAttributes.Static); + + if (global_fields != null) + { + FieldBuilder[] new_fields = new FieldBuilder[global_fields.Length + 1]; + Array.Copy(global_fields, new_fields, global_fields.Length); + new_fields[global_fields.Length] = fb; + global_fields = new_fields; + } + else + { + global_fields = new FieldBuilder[1]; + global_fields[0] = fb; + } + return fb; + } + + private void addGlobalMethod(MethodBuilder mb) + { + if (global_methods != null) + { + MethodBuilder[] new_methods = new MethodBuilder[global_methods.Length + 1]; + Array.Copy(global_methods, new_methods, global_methods.Length); + new_methods[global_methods.Length] = mb; + global_methods = new_methods; + } + else + { + global_methods = new MethodBuilder[1]; + global_methods[0] = mb; + } + } + + public MethodBuilder DefineGlobalMethod(string name, MethodAttributes attributes, Type returnType, Type[] parameterTypes) + { + return DefineGlobalMethod(name, attributes, CallingConventions.Standard, returnType, parameterTypes); + } + + public MethodBuilder DefineGlobalMethod(string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) + { + return DefineGlobalMethod(name, attributes, callingConvention, returnType, null, null, parameterTypes, null, null); + } + + public MethodBuilder DefineGlobalMethod(string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] requiredReturnTypeCustomModifiers, Type[] optionalReturnTypeCustomModifiers, Type[] parameterTypes, Type[][] requiredParameterTypeCustomModifiers, Type[][] optionalParameterTypeCustomModifiers) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + if ((attributes & MethodAttributes.Static) == 0) + throw new ArgumentException("global methods must be static"); + if (global_type_created != null) + throw new InvalidOperationException("global methods already created"); + CreateGlobalType(); + MethodBuilder mb = global_type.DefineMethod(name, attributes, callingConvention, returnType, requiredReturnTypeCustomModifiers, optionalReturnTypeCustomModifiers, parameterTypes, requiredParameterTypeCustomModifiers, optionalParameterTypeCustomModifiers); + + addGlobalMethod(mb); + return mb; + } + + public MethodBuilder DefinePInvokeMethod(string name, string dllName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) + { + return DefinePInvokeMethod(name, dllName, name, attributes, callingConvention, returnType, parameterTypes, nativeCallConv, nativeCharSet); + } + + public MethodBuilder DefinePInvokeMethod(string name, string dllName, string entryName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + if ((attributes & MethodAttributes.Static) == 0) + throw new ArgumentException("global methods must be static"); + if (global_type_created != null) + throw new InvalidOperationException("global methods already created"); + CreateGlobalType(); + MethodBuilder mb = global_type.DefinePInvokeMethod(name, dllName, entryName, attributes, callingConvention, returnType, parameterTypes, nativeCallConv, nativeCharSet); + + addGlobalMethod(mb); + return mb; + } + + public TypeBuilder DefineType(string name) + { + return DefineType(name, 0); + } + + public TypeBuilder DefineType(string name, TypeAttributes attr) + { + if ((attr & TypeAttributes.Interface) != 0) + return DefineType(name, attr, null, null); + return DefineType(name, attr, typeof(object), null); + } + + public TypeBuilder DefineType(string name, TypeAttributes attr, Type parent) + { + return DefineType(name, attr, parent, null); + } + + private void AddType(TypeBuilder tb) + { + if (types != null) + { + if (types.Length == num_types) + { + TypeBuilder[] new_types = new TypeBuilder[types.Length * 2]; + Array.Copy(types, new_types, num_types); + types = new_types; + } + } + else + { + types = new TypeBuilder[1]; + } + types[num_types] = tb; + num_types++; + } + + private TypeBuilder DefineType(string name, TypeAttributes attr, Type parent, Type[] interfaces, PackingSize packingSize, int typesize) + { + if (name == null) + throw new ArgumentNullException("fullname"); + ITypeIdentifier ident = TypeIdentifiers.FromInternal(name); + if (name_cache.ContainsKey(ident)) + throw new ArgumentException("Duplicate type name within an assembly."); + TypeBuilder res = new TypeBuilder(this, name, attr, parent, interfaces, packingSize, typesize, null); + AddType(res); + + name_cache.Add(ident, res); + + return res; + } + + internal void RegisterTypeName(TypeBuilder tb, ITypeName name) + { + name_cache.Add(name, tb); + } + + internal TypeBuilder GetRegisteredType(ITypeName name) + { + TypeBuilder result = null; + name_cache.TryGetValue(name, out result); + return result; + } + + [ComVisible(true)] + public TypeBuilder DefineType(string name, TypeAttributes attr, Type parent, Type[] interfaces) + { + return DefineType(name, attr, parent, interfaces, PackingSize.Unspecified, TypeBuilder.UnspecifiedTypeSize); + } + + public TypeBuilder DefineType(string name, TypeAttributes attr, Type parent, int typesize) + { + return DefineType(name, attr, parent, null, PackingSize.Unspecified, typesize); + } + + public TypeBuilder DefineType(string name, TypeAttributes attr, Type parent, PackingSize packsize) + { + return DefineType(name, attr, parent, null, packsize, TypeBuilder.UnspecifiedTypeSize); + } + + public TypeBuilder DefineType(string name, TypeAttributes attr, Type parent, PackingSize packingSize, int typesize) + { + return DefineType(name, attr, parent, null, packingSize, typesize); + } + + public MethodInfo GetArrayMethod(Type arrayClass, string methodName, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) + { + return new MonoArrayMethod(arrayClass, methodName, callingConvention, returnType, parameterTypes); + } + + public EnumBuilder DefineEnum(string name, TypeAttributes visibility, Type underlyingType) + { + ITypeIdentifier ident = TypeIdentifiers.FromInternal(name); + if (name_cache.ContainsKey(ident)) + throw new ArgumentException("Duplicate type name within an assembly."); + + EnumBuilder eb = new EnumBuilder(this, name, visibility, underlyingType); + TypeBuilder res = eb.GetTypeBuilder(); + AddType(res); + name_cache.Add(ident, res); + return eb; + } + + [ComVisible(true)] + public override Type GetType(string className) + { + return GetType(className, false, false); + } + + [ComVisible(true)] + public override Type GetType(string className, bool ignoreCase) + { + return GetType(className, false, ignoreCase); + } + + private TypeBuilder search_in_array(TypeBuilder[] arr, int validElementsInArray, ITypeName className) + { + int i; + for (i = 0; i < validElementsInArray; ++i) + { + if (string.Compare(className.DisplayName, arr[i].FullName, true, CultureInfo.InvariantCulture) == 0) + { + return arr[i]; + } + } + return null; + } + + private TypeBuilder search_nested_in_array(TypeBuilder[] arr, int validElementsInArray, ITypeName className) + { + int i; + for (i = 0; i < validElementsInArray; ++i) + { + if (string.Compare(className.DisplayName, arr[i].Name, true, CultureInfo.InvariantCulture) == 0) + return arr[i]; + } + return null; + } + + private TypeBuilder GetMaybeNested(TypeBuilder t, IEnumerable nested) + { + TypeBuilder result = t; + + foreach (ITypeName pname in nested) + { + if (result.subtypes == null) + return null; + result = search_nested_in_array(result.subtypes, result.subtypes.Length, pname); + if (result == null) + return null; + } + return result; + } + + [ComVisible(true)] + public override Type GetType(string className, bool throwOnError, bool ignoreCase) + { + if (className == null) + throw new ArgumentNullException(nameof(className)); + if (className.Length == 0) + throw new ArgumentException("className"); + + TypeBuilder result = null; + + if (types == null && throwOnError) + throw new TypeLoadException(className); + + TypeSpec ts = TypeSpec.Parse(className); + + if (!ignoreCase) + { + var displayNestedName = ts.TypeNameWithoutModifiers(); + name_cache.TryGetValue(displayNestedName, out result); + } + else + { + if (types != null) + result = search_in_array(types, num_types, ts.Name); + if (!ts.IsNested && result != null) + { + result = GetMaybeNested(result, ts.Nested); + } + } + if ((result == null) && throwOnError) + throw new TypeLoadException(className); + if (result != null && (ts.HasModifiers || ts.IsByRef)) + { + Type mt = result; + if (result is TypeBuilder) + { + var tb = result as TypeBuilder; + if (tb.is_created) + mt = tb.CreateType(); + } + foreach (var mod in ts.Modifiers) + { + if (mod is PointerSpec) + mt = mt.MakePointerType(); + else if (mod is IArraySpec) + { + var spec = mod as IArraySpec; + if (spec.IsBound) + return null; + if (spec.Rank == 1) + mt = mt.MakeArrayType(); + else + mt = mt.MakeArrayType(spec.Rank); + } + } + if (ts.IsByRef) + mt = mt.MakeByRefType(); + result = mt as TypeBuilder; + if (result == null) + return mt; + } + if (result != null && result.is_created) + return result.CreateType(); + else + return result; + } + + internal int get_next_table_index(object obj, int table, int count) + { + if (table_indexes == null) + { + table_indexes = new int[64]; + for (int i = 0; i < 64; ++i) + table_indexes[i] = 1; + /* allow room for . in TypeDef table */ + table_indexes[0x02] = 2; + } + // Console.WriteLine ("getindex for table "+table.ToString()+" got "+table_indexes [table].ToString()); + var index = table_indexes[table]; + table_indexes[table] += count; + return index; + } + + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + if (customBuilder == null) + throw new ArgumentNullException(nameof(customBuilder)); + if (cattrs != null) + { + CustomAttributeBuilder[] new_array = new CustomAttributeBuilder[cattrs.Length + 1]; + cattrs.CopyTo(new_array, 0); + new_array[cattrs.Length] = customBuilder; + cattrs = new_array; + } + else + { + cattrs = new CustomAttributeBuilder[1]; + cattrs[0] = customBuilder; + } + } + + [ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } + /* + internal ISymbolDocumentWriter DefineDocument (string url, Guid language, Guid languageVendor, Guid documentType) + { + if (symbolWriter != null) + return symbolWriter.DefineDocument (url, language, languageVendor, documentType); + else + return null; + } + */ + public override Type[] GetTypes() + { + if (types == null) + return Type.EmptyTypes; + + int n = num_types; + Type[] copy = new Type[n]; + Array.Copy(types, copy, n); + + // MS replaces the typebuilders with their created types + for (int i = 0; i < copy.Length; ++i) + if (types[i].is_created) + copy[i] = types[i].CreateType(); + + return copy; + } + + public MethodToken GetMethodToken(MethodInfo method) + { + if (method == null) + throw new ArgumentNullException(nameof(method)); + + return new MethodToken(GetToken(method)); + } + + public MethodToken GetArrayMethodToken(Type arrayClass, string methodName, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) + { + return GetMethodToken(GetArrayMethod(arrayClass, methodName, callingConvention, returnType, parameterTypes)); + } + + [ComVisible(true)] + public MethodToken GetConstructorToken(ConstructorInfo con) + { + if (con == null) + throw new ArgumentNullException(nameof(con)); + + return new MethodToken(GetToken(con)); + } + + public FieldToken GetFieldToken(FieldInfo field) + { + if (field == null) + throw new ArgumentNullException(nameof(field)); + + throw new NotImplementedException(); + //return new FieldToken (GetToken (field)); + } + + // FIXME: + public SignatureToken GetSignatureToken(byte[] sigBytes, int sigLength) + { + throw new NotImplementedException(); + } + + public SignatureToken GetSignatureToken(SignatureHelper sigHelper) + { + if (sigHelper == null) + throw new ArgumentNullException(nameof(sigHelper)); + return new SignatureToken(GetToken(sigHelper)); + } + + public StringToken GetStringConstant(string str) + { + if (str == null) + throw new ArgumentNullException(nameof(str)); + return new StringToken(GetToken(str)); + } + + public TypeToken GetTypeToken(Type type) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + if (type.IsByRef) + throw new ArgumentException("type can't be a byref type", nameof(type)); + if (!IsTransient() && (type.Module is ModuleBuilder) && ((ModuleBuilder)type.Module).IsTransient()) + throw new InvalidOperationException("a non-transient module can't reference a transient module"); + return new TypeToken(GetToken(type)); + } + + public TypeToken GetTypeToken(string name) + { + return GetTypeToken(GetType(name)); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int getUSIndex(ModuleBuilder mb, string str); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int getToken(ModuleBuilder mb, object obj, bool create_open_instance); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int getMethodToken(ModuleBuilder mb, MethodBase method, + Type[] opt_param_types); + + internal int GetToken(string str) + { + int result; + if (!us_string_cache.TryGetValue(str, out result)) + { + result = getUSIndex(this, str); + us_string_cache[str] = result; + } + + return result; + } + + private static int typeref_tokengen = 0x01ffffff; + private static int typedef_tokengen = 0x02ffffff; + private static int typespec_tokengen = 0x1bffffff; + private static int memberref_tokengen = 0x0affffff; + private static int methoddef_tokengen = 0x06ffffff; + private Dictionary inst_tokens, inst_tokens_open; + + // + // Assign a pseudo token to the various TypeBuilderInst objects, so the runtime + // doesn't have to deal with them. + // For Run assemblies, the tokens will not be fixed up, so the runtime will + // still encounter these objects, it will resolve them by calling their + // RuntimeResolve () methods. + // + private int GetPseudoToken(MemberInfo member, bool create_open_instance) + { + int token; + var dict = create_open_instance ? inst_tokens_open : inst_tokens; + if (dict == null) + { + dict = new Dictionary(ReferenceEqualityComparer.Instance); + if (create_open_instance) + inst_tokens_open = dict; + else + inst_tokens = dict; + } + else if (dict.TryGetValue(member, out token)) + { + return token; + } + + // Count backwards to avoid collisions with the tokens + // allocated by the runtime + if (member is TypeBuilderInstantiation || member is SymbolType) + token = typespec_tokengen--; + else if (member is FieldOnTypeBuilderInst) + token = memberref_tokengen--; + else if (member is ConstructorOnTypeBuilderInst) + token = memberref_tokengen--; + else if (member is MethodOnTypeBuilderInst) + token = memberref_tokengen--; + else if (member is FieldBuilder) + token = memberref_tokengen--; + else if (member is TypeBuilder) + { + if (create_open_instance && (member as TypeBuilder).ContainsGenericParameters) + token = typespec_tokengen--; + else if (member.Module == this) + token = typedef_tokengen--; + else + token = typeref_tokengen--; + } + else if (member is EnumBuilder) + { + token = GetPseudoToken((member as EnumBuilder).GetTypeBuilder(), create_open_instance); + dict[member] = token; + // n.b. don't register with the runtime, the TypeBuilder already did it. + return token; + } + else if (member is ConstructorBuilder) + { + if (member.Module == this && !(member as ConstructorBuilder).TypeBuilder.ContainsGenericParameters) + token = methoddef_tokengen--; + else + token = memberref_tokengen--; + } + else if (member is MethodBuilder) + { + var mb = member as MethodBuilder; + if (member.Module == this && !mb.TypeBuilder.ContainsGenericParameters && !mb.IsGenericMethodDefinition) + token = methoddef_tokengen--; + else + token = memberref_tokengen--; + } + else if (member is GenericTypeParameterBuilder) + { + token = typespec_tokengen--; + } + else + throw new NotImplementedException(); + + dict[member] = token; + RegisterToken(member, token); + return token; + } + + internal int GetToken(MemberInfo member) + { + if (member is ConstructorBuilder || member is MethodBuilder || member is FieldBuilder) + return GetPseudoToken(member, false); + return getToken(this, member, true); + } + + internal int GetToken(MemberInfo member, bool create_open_instance) + { + if (member is TypeBuilderInstantiation || member is FieldOnTypeBuilderInst || member is ConstructorOnTypeBuilderInst || member is MethodOnTypeBuilderInst || member is SymbolType || member is FieldBuilder || member is TypeBuilder || member is ConstructorBuilder || member is MethodBuilder || member is GenericTypeParameterBuilder || + member is EnumBuilder) + return GetPseudoToken(member, create_open_instance); + return getToken(this, member, create_open_instance); + } + + internal int GetToken(MethodBase method, IEnumerable opt_param_types) + { + if (method is ConstructorBuilder || method is MethodBuilder) + return GetPseudoToken(method, false); + + if (opt_param_types == null) + return getToken(this, method, true); + + var optParamTypes = new List(opt_param_types); + return getMethodToken(this, method, optParamTypes.ToArray()); + } + + internal int GetToken(MethodBase method, Type[] opt_param_types) + { + if (method is ConstructorBuilder || method is MethodBuilder) + return GetPseudoToken(method, false); + return getMethodToken(this, method, opt_param_types); + } + + internal int GetToken(SignatureHelper helper) + { + return getToken(this, helper, true); + } + + /* + * Register the token->obj mapping with the runtime so the Module.Resolve... + * methods will work for obj. + */ + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern void RegisterToken(object obj, int token); + + /* + * Returns MemberInfo registered with the given token. + */ + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern object GetRegisteredToken(int token); + + internal ITokenGenerator GetTokenGenerator() + { + if (token_gen == null) + token_gen = new ModuleBuilderTokenGenerator(this); + return token_gen; + } + + // Called from the runtime to return the corresponding finished reflection object + internal static object RuntimeResolve(object obj) + { + if (obj is MethodBuilder) + return (obj as MethodBuilder).RuntimeResolve(); + if (obj is ConstructorBuilder) + return (obj as ConstructorBuilder).RuntimeResolve(); + if (obj is FieldBuilder) + return (obj as FieldBuilder).RuntimeResolve(); + if (obj is GenericTypeParameterBuilder) + return (obj as GenericTypeParameterBuilder).RuntimeResolve(); + if (obj is FieldOnTypeBuilderInst) + return (obj as FieldOnTypeBuilderInst).RuntimeResolve(); + if (obj is MethodOnTypeBuilderInst) + return (obj as MethodOnTypeBuilderInst).RuntimeResolve(); + if (obj is ConstructorOnTypeBuilderInst) + return (obj as ConstructorOnTypeBuilderInst).RuntimeResolve(); + if (obj is Type) + return (obj as Type).RuntimeResolve(); + throw new NotImplementedException(obj.GetType().FullName); + } + + internal string FileName + { + get + { + return fqname; + } + } + + internal bool IsMain + { + set + { + is_main = value; + } + } + + internal void CreateGlobalType() + { + if (global_type == null) + global_type = new TypeBuilder(this, 0, 1); + } + + public override Assembly Assembly + { + get { return assemblyb; } + } + + public override string Name + { + get { return name; } + } + + public override string ScopeName + { + get { return name; } + } + + public override Guid ModuleVersionId + { + get + { + return new Guid(guid); + } + } + + public override bool IsResource() + { + return false; + } + + protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) + { + if (global_type_created == null) + return null; + if (types == null) + return global_type_created.GetMethod(name); + return global_type_created.GetMethod(name, bindingAttr, binder, callConvention, types, modifiers); + } + + public override FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + return RuntimeModule.ResolveField(this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); + } + + public override MemberInfo ResolveMember(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + return RuntimeModule.ResolveMember(this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); + } + + internal MemberInfo ResolveOrGetRegisteredToken(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + ResolveTokenError error; + MemberInfo m = RuntimeModule.ResolveMemberToken(_impl, metadataToken, RuntimeModule.ptrs_from_types(genericTypeArguments), RuntimeModule.ptrs_from_types(genericMethodArguments), out error); + if (m != null) + return m; + + m = GetRegisteredToken(metadataToken) as MemberInfo; + if (m == null) + throw RuntimeModule.resolve_token_exception(Name, metadataToken, error, "MemberInfo"); + else + return m; + } + + public override MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + return RuntimeModule.ResolveMethod(this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); + } + + public override string ResolveString(int metadataToken) + { + return RuntimeModule.ResolveString(this, _impl, metadataToken); + } + + public override byte[] ResolveSignature(int metadataToken) + { + return RuntimeModule.ResolveSignature(this, _impl, metadataToken); + } + + public override Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + return RuntimeModule.ResolveType(this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); + } + + public override bool Equals(object obj) + { + return base.Equals(obj); + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + return base.IsDefined(attributeType, inherit); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return GetCustomAttributes(null, inherit); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + if (cattrs == null || cattrs.Length == 0) + return Array.Empty(); + + if (attributeType is TypeBuilder) + throw new InvalidOperationException("First argument to GetCustomAttributes can't be a TypeBuilder"); + + List results = new List(); + for (int i = 0; i < cattrs.Length; i++) + { + Type t = cattrs[i].Ctor.GetType(); + + if (t is TypeBuilder) + throw new InvalidOperationException("Can't construct custom attribute for TypeBuilder type"); + + if (attributeType == null || attributeType.IsAssignableFrom(t)) + results.Add(cattrs[i].Invoke()); + } + + return results.ToArray(); + } + + public override IList GetCustomAttributesData() + { + return CustomAttributeData.GetCustomAttributes(this); + } + + public override FieldInfo GetField(string name, BindingFlags bindingAttr) + { + if (global_type_created == null) + throw new InvalidOperationException("Module-level fields cannot be retrieved until after the CreateGlobalFunctions method has been called for the module."); + return global_type_created.GetField(name, bindingAttr); + } + + public override FieldInfo[] GetFields(BindingFlags bindingFlags) + { + if (global_type_created == null) + throw new InvalidOperationException("Module-level fields cannot be retrieved until after the CreateGlobalFunctions method has been called for the module."); + return global_type_created.GetFields(bindingFlags); + } + + public override MethodInfo[] GetMethods(BindingFlags bindingFlags) + { + if (global_type_created == null) + throw new InvalidOperationException("Module-level methods cannot be retrieved until after the CreateGlobalFunctions method has been called for the module."); + return global_type_created.GetMethods(bindingFlags); + } + + public override int MetadataToken + { + get + { + return RuntimeModule.get_MetadataToken(this); + } + } + } + + internal class ModuleBuilderTokenGenerator : ITokenGenerator + { + + private ModuleBuilder mb; + + public ModuleBuilderTokenGenerator(ModuleBuilder mb) + { + this.mb = mb; + } + + public int GetToken(string str) + { + return mb.GetToken(str); + } + + public int GetToken(MemberInfo member, bool create_open_instance) + { + return mb.GetToken(member, create_open_instance); + } + + public int GetToken(MethodBase method, Type[] opt_param_types) + { + return mb.GetToken(method, opt_param_types); + } + + public int GetToken(SignatureHelper helper) + { + return mb.GetToken(helper); + } + } internal sealed class ReferenceEqualityComparer : IEqualityComparer where T : class { @@ -918,12 +1019,12 @@ private ReferenceEqualityComparer() public bool Equals(T x, T y) { - return ReferenceEquals (x, y); + return ReferenceEquals(x, y); } public int GetHashCode(T obj) { - return RuntimeHelpers.GetHashCode (obj); + return RuntimeHelpers.GetHashCode(obj); } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MonoArrayMethod.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MonoArrayMethod.cs index eebe6efc687cc..812d0472dd272 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MonoArrayMethod.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/MonoArrayMethod.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection/MonoMethod.cs // The class used to represent methods from the mono runtime. @@ -20,10 +18,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -33,126 +31,150 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection { - [StructLayout (LayoutKind.Sequential)] - internal class MonoArrayMethod: MethodInfo { +namespace System.Reflection +{ + [StructLayout(LayoutKind.Sequential)] + internal class MonoArrayMethod : MethodInfo + { #pragma warning disable 649 - internal RuntimeMethodHandle mhandle; - internal Type parent; - internal Type ret; - internal Type[] parameters; - internal string name; - internal int table_idx; - internal CallingConventions call_conv; -#pragma warning restore 649 - - internal MonoArrayMethod (Type arrayClass, string methodName, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) { - name = methodName; - parent = arrayClass; - ret = returnType; - parameters = (Type[])parameterTypes.Clone(); - call_conv = callingConvention; - } - - // FIXME: "Always returns this" - public override MethodInfo GetBaseDefinition() { - return this; /* FIXME */ - } - public override Type ReturnType { - get { - return ret; - } - } - - // FIXME: "Not implemented. Always returns null" - public override ICustomAttributeProvider ReturnTypeCustomAttributes { - get {return null;} - } - - // FIXME: "Not implemented. Always returns zero" - public override MethodImplAttributes GetMethodImplementationFlags() { - return (MethodImplAttributes)0; - } - - // FIXME: "Not implemented. Always returns an empty array" - public override ParameterInfo[] GetParameters() - { - return GetParametersInternal (); - } - - internal override ParameterInfo[] GetParametersInternal () - { - return Array.Empty (); - } - - // FIXME: "Not implemented. Always returns 0" - internal override int GetParametersCount () - { - return 0; - } - - // FIXME: "Not implemented" - public override Object Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) { - throw new NotImplementedException (); - } - - public override RuntimeMethodHandle MethodHandle { - get {return mhandle;} - } - - // FIXME: "Not implemented. Always returns zero" - public override MethodAttributes Attributes { - get { - return (MethodAttributes)0; - } - } - - public override Type ReflectedType { - get { - return parent; - } - } - public override Type DeclaringType { - get { - return parent; - } - } - public override string Name { - get { - return name; - } - } - - public override bool IsDefined (Type attributeType, bool inherit) { - return CustomAttribute.IsDefined (this, attributeType, inherit); - } - - public override object[] GetCustomAttributes( bool inherit) { - return CustomAttribute.GetCustomAttributes (this, inherit); - } - public override object[] GetCustomAttributes( Type attributeType, bool inherit) { - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - } - - public override string ToString () { - string parms = String.Empty; - ParameterInfo[] p = GetParameters (); - for (int i = 0; i < p.Length; ++i) { - if (i > 0) - parms = parms + ", "; - parms = parms + p [i].ParameterType.Name; - } - if (ReturnType != null) - return ReturnType.Name+" "+Name+"("+parms+")"; - else - return "void "+Name+"("+parms+")"; - } - } + internal RuntimeMethodHandle mhandle; + internal Type parent; + internal Type ret; + internal Type[] parameters; + internal string name; + internal int table_idx; + internal CallingConventions call_conv; +#pragma warning restore 649 + + internal MonoArrayMethod(Type arrayClass, string methodName, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) + { + name = methodName; + parent = arrayClass; + ret = returnType; + parameters = (Type[])parameterTypes.Clone(); + call_conv = callingConvention; + } + + // FIXME: "Always returns this" + public override MethodInfo GetBaseDefinition() + { + return this; /* FIXME */ + } + public override Type ReturnType + { + get + { + return ret; + } + } + + // FIXME: "Not implemented. Always returns null" + public override ICustomAttributeProvider ReturnTypeCustomAttributes + { + get { return null; } + } + + // FIXME: "Not implemented. Always returns zero" + public override MethodImplAttributes GetMethodImplementationFlags() + { + return (MethodImplAttributes)0; + } + + // FIXME: "Not implemented. Always returns an empty array" + public override ParameterInfo[] GetParameters() + { + return GetParametersInternal(); + } + + internal override ParameterInfo[] GetParametersInternal() + { + return Array.Empty(); + } + + // FIXME: "Not implemented. Always returns 0" + internal override int GetParametersCount() + { + return 0; + } + + // FIXME: "Not implemented" + public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) + { + throw new NotImplementedException(); + } + + public override RuntimeMethodHandle MethodHandle + { + get { return mhandle; } + } + + // FIXME: "Not implemented. Always returns zero" + public override MethodAttributes Attributes + { + get + { + return (MethodAttributes)0; + } + } + + public override Type ReflectedType + { + get + { + return parent; + } + } + public override Type DeclaringType + { + get + { + return parent; + } + } + public override string Name + { + get + { + return name; + } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + return CustomAttribute.IsDefined(this, attributeType, inherit); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, inherit); + } + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + } + + public override string ToString() + { + string parms = string.Empty; + ParameterInfo[] p = GetParameters(); + for (int i = 0; i < p.Length; ++i) + { + if (i > 0) + parms = parms + ", "; + parms = parms + p[i].ParameterType.Name; + } + if (ReturnType != null) + return ReturnType.Name + " " + Name + "(" + parms + ")"; + else + return "void " + Name + "(" + parms + ")"; + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ParameterBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ParameterBuilder.Mono.cs index 70a8fad045623..f08aef59e1c02 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ParameterBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/ParameterBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -33,6 +31,7 @@ // (C) 2001 Ximian, Inc. http://www.ximian.com // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; @@ -41,106 +40,130 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public partial class ParameterBuilder - { +namespace System.Reflection.Emit +{ + [StructLayout(LayoutKind.Sequential)] + public partial class ParameterBuilder + { #pragma warning disable 169, 414 - private MethodBase methodb; /* MethodBuilder, ConstructorBuilder or DynamicMethod */ - private string name; - private CustomAttributeBuilder[] cattrs; - private UnmanagedMarshal marshal_info; - private ParameterAttributes attrs; - private int position; - private int table_idx; - object def_value; + private MethodBase methodb; /* MethodBuilder, ConstructorBuilder or DynamicMethod */ + private string name; + private CustomAttributeBuilder[] cattrs; + private UnmanagedMarshal marshal_info; + private ParameterAttributes attrs; + private int position; + private int table_idx; + private object def_value; #pragma warning restore 169, 414 - - internal ParameterBuilder (MethodBase mb, int pos, ParameterAttributes attributes, string strParamName) { - name = strParamName; - position = pos; - attrs = attributes; - methodb = mb; - if (mb is DynamicMethod) - table_idx = 0; - else - table_idx = mb.get_next_table_index (this, 0x08, 1); - } - public virtual int Attributes { - get {return (int)attrs;} - } - public bool IsIn { - get {return ((int)attrs & (int)ParameterAttributes.In) != 0;} - } - public bool IsOut { - get {return ((int)attrs & (int)ParameterAttributes.Out) != 0;} - } - public bool IsOptional { - get {return ((int)attrs & (int)ParameterAttributes.Optional) != 0;} - } - public virtual string Name { - get {return name;} - } - public virtual int Position { - get {return position;} - } + internal ParameterBuilder(MethodBase mb, int pos, ParameterAttributes attributes, string strParamName) + { + name = strParamName; + position = pos; + attrs = attributes; + methodb = mb; + if (mb is DynamicMethod) + table_idx = 0; + else + table_idx = mb.get_next_table_index(this, 0x08, 1); + } + + public virtual int Attributes + { + get { return (int)attrs; } + } + public bool IsIn + { + get { return ((int)attrs & (int)ParameterAttributes.In) != 0; } + } + public bool IsOut + { + get { return ((int)attrs & (int)ParameterAttributes.Out) != 0; } + } + public bool IsOptional + { + get { return ((int)attrs & (int)ParameterAttributes.Optional) != 0; } + } + public virtual string Name + { + get { return name; } + } + public virtual int Position + { + get { return position; } + } + + public virtual ParameterToken GetToken() + { + return new ParameterToken(0x08 | table_idx); + } - public virtual ParameterToken GetToken() { - return new ParameterToken (0x08 | table_idx); - } + public virtual void SetConstant(object defaultValue) + { + if (position > 0) + { + TypeBuilder.SetConstantValue(methodb.GetParameterType(position - 1), + defaultValue, ref defaultValue); + } - public virtual void SetConstant (object defaultValue) - { - if (position > 0) { - TypeBuilder.SetConstantValue (methodb.GetParameterType (position - 1), - defaultValue, ref defaultValue); - } + def_value = defaultValue; + attrs |= ParameterAttributes.HasDefault; + } - def_value = defaultValue; - attrs |= ParameterAttributes.HasDefault; - } - - public void SetCustomAttribute( CustomAttributeBuilder customBuilder) { - string attrname = customBuilder.Ctor.ReflectedType.FullName; - if (attrname == "System.Runtime.InteropServices.InAttribute") { - attrs |= ParameterAttributes.In; - return; - } else if (attrname == "System.Runtime.InteropServices.OutAttribute") { - attrs |= ParameterAttributes.Out; - return; - } else if (attrname == "System.Runtime.InteropServices.OptionalAttribute") { - attrs |= ParameterAttributes.Optional; - return; - } else if (attrname == "System.Runtime.InteropServices.MarshalAsAttribute") { - attrs |= ParameterAttributes.HasFieldMarshal; - marshal_info = CustomAttributeBuilder.get_umarshal (customBuilder, false); - /* FIXME: check for errors */ - return; - } else if (attrname == "System.Runtime.InteropServices.DefaultParameterValueAttribute") { - /* MS.NET doesn't handle this attribute but we handle it for consistency */ - CustomAttributeBuilder.CustomAttributeInfo cinfo = CustomAttributeBuilder.decode_cattr (customBuilder); - /* FIXME: check for type compatibility */ - SetConstant (cinfo.ctorArgs [0]); - return; - } + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + string attrname = customBuilder.Ctor.ReflectedType.FullName; + if (attrname == "System.Runtime.InteropServices.InAttribute") + { + attrs |= ParameterAttributes.In; + return; + } + else if (attrname == "System.Runtime.InteropServices.OutAttribute") + { + attrs |= ParameterAttributes.Out; + return; + } + else if (attrname == "System.Runtime.InteropServices.OptionalAttribute") + { + attrs |= ParameterAttributes.Optional; + return; + } + else if (attrname == "System.Runtime.InteropServices.MarshalAsAttribute") + { + attrs |= ParameterAttributes.HasFieldMarshal; + marshal_info = CustomAttributeBuilder.get_umarshal(customBuilder, false); + /* FIXME: check for errors */ + return; + } + else if (attrname == "System.Runtime.InteropServices.DefaultParameterValueAttribute") + { + /* MS.NET doesn't handle this attribute but we handle it for consistency */ + CustomAttributeBuilder.CustomAttributeInfo cinfo = CustomAttributeBuilder.decode_cattr(customBuilder); + /* FIXME: check for type compatibility */ + SetConstant(cinfo.ctorArgs[0]); + return; + } - if (cattrs != null) { - CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1]; - cattrs.CopyTo (new_array, 0); - new_array [cattrs.Length] = customBuilder; - cattrs = new_array; - } else { - cattrs = new CustomAttributeBuilder [1]; - cattrs [0] = customBuilder; - } - } + if (cattrs != null) + { + CustomAttributeBuilder[] new_array = new CustomAttributeBuilder[cattrs.Length + 1]; + cattrs.CopyTo(new_array, 0); + new_array[cattrs.Length] = customBuilder; + cattrs = new_array; + } + else + { + cattrs = new CustomAttributeBuilder[1]; + cattrs[0] = customBuilder; + } + } - [ComVisible (true)] - public void SetCustomAttribute( ConstructorInfo con, byte[] binaryAttribute) { - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } - } + [ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/PropertyBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/PropertyBuilder.Mono.cs index 5cd1b5b160ea6..a51afbbf79d8b 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/PropertyBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/PropertyBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,6 +30,7 @@ // (C) 2001 Ximian, Inc. http://www.ximian.com // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; @@ -40,179 +39,204 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public sealed partial class PropertyBuilder : PropertyInfo { +namespace System.Reflection.Emit +{ + [StructLayout(LayoutKind.Sequential)] + public sealed partial class PropertyBuilder : PropertyInfo + { -// Managed version of MonoReflectionPropertyBuilder + // Managed version of MonoReflectionPropertyBuilder #pragma warning disable 169, 414 - private PropertyAttributes attrs; - private string name; - private Type type; - private Type[] parameters; - private CustomAttributeBuilder[] cattrs; - private object def_value; - private MethodBuilder set_method; - private MethodBuilder get_method; - private int table_idx = 0; - internal TypeBuilder typeb; - private Type[] returnModReq; - private Type[] returnModOpt; - private Type[][] paramModReq; - private Type[][] paramModOpt; - CallingConventions callingConvention; + private PropertyAttributes attrs; + private string name; + private Type type; + private Type[] parameters; + private CustomAttributeBuilder[] cattrs; + private object def_value; + private MethodBuilder set_method; + private MethodBuilder get_method; + private int table_idx = 0; + internal TypeBuilder typeb; + private Type[] returnModReq; + private Type[] returnModOpt; + private Type[][] paramModReq; + private Type[][] paramModOpt; + private CallingConventions callingConvention; #pragma warning restore 169, 414 - - internal PropertyBuilder (TypeBuilder tb, string name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnModReq, Type[] returnModOpt, Type[] parameterTypes, Type[][] paramModReq, Type[][] paramModOpt) - { - this.name = name; - this.attrs = attributes; - this.callingConvention = callingConvention; - this.type = returnType; - this.returnModReq = returnModReq; - this.returnModOpt = returnModOpt; - this.paramModReq = paramModReq; - this.paramModOpt = paramModOpt; - if (parameterTypes != null) { - this.parameters = new Type [parameterTypes.Length]; - System.Array.Copy (parameterTypes, this.parameters, this.parameters.Length); - } - typeb = tb; - table_idx = tb.get_next_table_index (this, 0x17, 1); - } - - public override PropertyAttributes Attributes { - get {return attrs;} - } - public override bool CanRead { - get {return get_method != null;} - } - public override bool CanWrite { - get {return set_method != null;} - } - public override Type DeclaringType { - get {return typeb;} - } - public override string Name { - get {return name;} - } - public PropertyToken PropertyToken { - get {return new PropertyToken ();} - } - public override Type PropertyType { - get {return type;} - } - public override Type ReflectedType { - get {return typeb;} - } - - public void AddOtherMethod (MethodBuilder mdBuilder) - { - if (mdBuilder == null) - throw new ArgumentNullException (nameof (mdBuilder)); - typeb.check_not_created (); - } - - public override MethodInfo[] GetAccessors( bool nonPublic) { - return null; - } - public override object[] GetCustomAttributes(bool inherit) { - throw not_supported (); - } - public override object[] GetCustomAttributes(Type attributeType, bool inherit) { - throw not_supported (); - } - public override MethodInfo GetGetMethod( bool nonPublic) { - return get_method; - } - public override ParameterInfo[] GetIndexParameters() { - throw not_supported (); - } - public override MethodInfo GetSetMethod( bool nonPublic) { - return set_method; - } - - public override object GetValue (object obj, object[] index) - { - throw not_supported (); - } - - public override object GetValue (object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) - { - throw not_supported (); - } - public override bool IsDefined( Type attributeType, bool inherit) { - throw not_supported (); - } - public void SetConstant (object defaultValue) - { - typeb.check_not_created (); - def_value = defaultValue; - } - - public void SetCustomAttribute (CustomAttributeBuilder customBuilder) - { - if (customBuilder == null) - throw new ArgumentNullException (nameof (customBuilder)); - typeb.check_not_created (); - string attrname = customBuilder.Ctor.ReflectedType.FullName; - if (attrname == "System.Runtime.CompilerServices.SpecialNameAttribute") { - attrs |= PropertyAttributes.SpecialName; - return; - } - - if (cattrs != null) { - CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1]; - cattrs.CopyTo (new_array, 0); - new_array [cattrs.Length] = customBuilder; - cattrs = new_array; - } else { - cattrs = new CustomAttributeBuilder [1]; - cattrs [0] = customBuilder; - } - } - - [ComVisible (true)] - public void SetCustomAttribute (ConstructorInfo con, byte[] binaryAttribute) { - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } - - public void SetGetMethod (MethodBuilder mdBuilder) - { - typeb.check_not_created (); - if (mdBuilder == null) - throw new ArgumentNullException (nameof (mdBuilder)); - get_method = mdBuilder; - } - - public void SetSetMethod (MethodBuilder mdBuilder) - { - if (mdBuilder == null) - throw new ArgumentNullException (nameof (mdBuilder)); - set_method = mdBuilder; - } - - public override void SetValue (object obj, object value, object[] index) - { - throw not_supported (); - } - - public override void SetValue (object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) - { - throw not_supported (); - } - - public override Module Module { - get { - return base.Module; - } - } - - private Exception not_supported () - { - return new NotSupportedException ("The invoked member is not supported in a dynamic module."); - } - } + + internal PropertyBuilder(TypeBuilder tb, string name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnModReq, Type[] returnModOpt, Type[] parameterTypes, Type[][] paramModReq, Type[][] paramModOpt) + { + this.name = name; + this.attrs = attributes; + this.callingConvention = callingConvention; + this.type = returnType; + this.returnModReq = returnModReq; + this.returnModOpt = returnModOpt; + this.paramModReq = paramModReq; + this.paramModOpt = paramModOpt; + if (parameterTypes != null) + { + this.parameters = new Type[parameterTypes.Length]; + Array.Copy(parameterTypes, this.parameters, this.parameters.Length); + } + typeb = tb; + table_idx = tb.get_next_table_index(this, 0x17, 1); + } + + public override PropertyAttributes Attributes + { + get { return attrs; } + } + public override bool CanRead + { + get { return get_method != null; } + } + public override bool CanWrite + { + get { return set_method != null; } + } + public override Type DeclaringType + { + get { return typeb; } + } + public override string Name + { + get { return name; } + } + public PropertyToken PropertyToken + { + get { return default; } + } + public override Type PropertyType + { + get { return type; } + } + public override Type ReflectedType + { + get { return typeb; } + } + + public void AddOtherMethod(MethodBuilder mdBuilder) + { + if (mdBuilder == null) + throw new ArgumentNullException(nameof(mdBuilder)); + typeb.check_not_created(); + } + + public override MethodInfo[] GetAccessors(bool nonPublic) + { + return null; + } + public override object[] GetCustomAttributes(bool inherit) + { + throw not_supported(); + } + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + throw not_supported(); + } + public override MethodInfo GetGetMethod(bool nonPublic) + { + return get_method; + } + public override ParameterInfo[] GetIndexParameters() + { + throw not_supported(); + } + public override MethodInfo GetSetMethod(bool nonPublic) + { + return set_method; + } + + public override object GetValue(object obj, object[] index) + { + throw not_supported(); + } + + public override object GetValue(object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) + { + throw not_supported(); + } + public override bool IsDefined(Type attributeType, bool inherit) + { + throw not_supported(); + } + public void SetConstant(object defaultValue) + { + typeb.check_not_created(); + def_value = defaultValue; + } + + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + if (customBuilder == null) + throw new ArgumentNullException(nameof(customBuilder)); + typeb.check_not_created(); + string attrname = customBuilder.Ctor.ReflectedType.FullName; + if (attrname == "System.Runtime.CompilerServices.SpecialNameAttribute") + { + attrs |= PropertyAttributes.SpecialName; + return; + } + + if (cattrs != null) + { + CustomAttributeBuilder[] new_array = new CustomAttributeBuilder[cattrs.Length + 1]; + cattrs.CopyTo(new_array, 0); + new_array[cattrs.Length] = customBuilder; + cattrs = new_array; + } + else + { + cattrs = new CustomAttributeBuilder[1]; + cattrs[0] = customBuilder; + } + } + + [ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } + + public void SetGetMethod(MethodBuilder mdBuilder) + { + typeb.check_not_created(); + if (mdBuilder == null) + throw new ArgumentNullException(nameof(mdBuilder)); + get_method = mdBuilder; + } + + public void SetSetMethod(MethodBuilder mdBuilder) + { + if (mdBuilder == null) + throw new ArgumentNullException(nameof(mdBuilder)); + set_method = mdBuilder; + } + + public override void SetValue(object obj, object value, object[] index) + { + throw not_supported(); + } + + public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) + { + throw not_supported(); + } + + public override Module Module + { + get + { + return base.Module; + } + } + + private Exception not_supported() + { + return new NotSupportedException("The invoked member is not supported in a dynamic module."); + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/PropertyOnTypeBuilderInst.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/PropertyOnTypeBuilderInst.cs index d705521b99043..3a02bca556d66 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/PropertyOnTypeBuilderInst.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/PropertyOnTypeBuilderInst.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit/PropertyOnTypeBuilderInst.cs // @@ -16,10 +14,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -29,6 +27,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Globalization; @@ -37,129 +36,138 @@ namespace System.Reflection.Emit { - /* - * This class represents a property of an instantiation of a generic type builder. - */ - [StructLayout (LayoutKind.Sequential)] - internal class PropertyOnTypeBuilderInst : PropertyInfo - { - TypeBuilderInstantiation instantiation; - PropertyInfo prop; - - internal PropertyOnTypeBuilderInst (TypeBuilderInstantiation instantiation, PropertyInfo prop) - { - this.instantiation = instantiation; - this.prop = prop; - } - - public override PropertyAttributes Attributes { - get { throw new NotSupportedException (); } - } - - public override bool CanRead { - get { throw new NotSupportedException (); } - } - - public override bool CanWrite { - get { throw new NotSupportedException (); } - } - - public override Type PropertyType { - get { return instantiation.InflateType (prop.PropertyType); } - } - - public override Type DeclaringType { - get { return instantiation.InflateType (prop.DeclaringType); } - } - - public override Type ReflectedType { - get { return instantiation; } - } - - public override string Name { - get { return prop.Name; } - } - - public override MethodInfo[] GetAccessors (bool nonPublic) - { - MethodInfo getter = GetGetMethod (nonPublic); - MethodInfo setter = GetSetMethod (nonPublic); - - int methods = 0; - if (getter != null) - ++methods; - if (setter != null) - ++methods; - - MethodInfo[] res = new MethodInfo [methods]; - - methods = 0; - if (getter != null) - res [methods++] = getter; - if (setter != null) - res [methods] = setter; - - return res; - } - - - public override MethodInfo GetGetMethod (bool nonPublic) - { - MethodInfo mi = prop.GetGetMethod (nonPublic); - if (mi != null && prop.DeclaringType == instantiation.generic_type) { - mi = TypeBuilder.GetMethod (instantiation, mi); - } - return mi; - } - - public override ParameterInfo[] GetIndexParameters() - { - MethodInfo method = GetGetMethod (true); - if (method != null) - return method.GetParameters (); - - return Array.Empty (); - } - - public override MethodInfo GetSetMethod (bool nonPublic) - { - MethodInfo mi = prop.GetSetMethod (nonPublic); - if (mi != null && prop.DeclaringType == instantiation.generic_type) { - mi = TypeBuilder.GetMethod (instantiation, mi); - } - return mi; - } - - public override string ToString () - { - return String.Format("{0} {1}", PropertyType, Name); - } - - public override object GetValue (object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) - { - throw new NotSupportedException (); - } - - public override void SetValue (object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) - { - throw new NotSupportedException (); - } - - public override bool IsDefined( Type attributeType, bool inherit) - { - throw new NotSupportedException (); - } - - public override object[] GetCustomAttributes(bool inherit) - { - throw new NotSupportedException (); - } - - public override object[] GetCustomAttributes(Type attributeType, bool inherit) - { - throw new NotSupportedException (); - } - } + /* + * This class represents a property of an instantiation of a generic type builder. + */ + [StructLayout(LayoutKind.Sequential)] + internal class PropertyOnTypeBuilderInst : PropertyInfo + { + private TypeBuilderInstantiation instantiation; + private PropertyInfo prop; + + internal PropertyOnTypeBuilderInst(TypeBuilderInstantiation instantiation, PropertyInfo prop) + { + this.instantiation = instantiation; + this.prop = prop; + } + + public override PropertyAttributes Attributes + { + get { throw new NotSupportedException(); } + } + + public override bool CanRead + { + get { throw new NotSupportedException(); } + } + + public override bool CanWrite + { + get { throw new NotSupportedException(); } + } + + public override Type PropertyType + { + get { return instantiation.InflateType(prop.PropertyType); } + } + + public override Type DeclaringType + { + get { return instantiation.InflateType(prop.DeclaringType); } + } + + public override Type ReflectedType + { + get { return instantiation; } + } + + public override string Name + { + get { return prop.Name; } + } + + public override MethodInfo[] GetAccessors(bool nonPublic) + { + MethodInfo getter = GetGetMethod(nonPublic); + MethodInfo setter = GetSetMethod(nonPublic); + + int methods = 0; + if (getter != null) + ++methods; + if (setter != null) + ++methods; + + MethodInfo[] res = new MethodInfo[methods]; + + methods = 0; + if (getter != null) + res[methods++] = getter; + if (setter != null) + res[methods] = setter; + + return res; + } + + + public override MethodInfo GetGetMethod(bool nonPublic) + { + MethodInfo mi = prop.GetGetMethod(nonPublic); + if (mi != null && prop.DeclaringType == instantiation.generic_type) + { + mi = TypeBuilder.GetMethod(instantiation, mi); + } + return mi; + } + + public override ParameterInfo[] GetIndexParameters() + { + MethodInfo method = GetGetMethod(true); + if (method != null) + return method.GetParameters(); + + return Array.Empty(); + } + + public override MethodInfo GetSetMethod(bool nonPublic) + { + MethodInfo mi = prop.GetSetMethod(nonPublic); + if (mi != null && prop.DeclaringType == instantiation.generic_type) + { + mi = TypeBuilder.GetMethod(instantiation, mi); + } + return mi; + } + + public override string ToString() + { + return string.Format("{0} {1}", PropertyType, Name); + } + + public override object GetValue(object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) + { + throw new NotSupportedException(); + } + + public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) + { + throw new NotSupportedException(); + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + throw new NotSupportedException(); + } + + public override object[] GetCustomAttributes(bool inherit) + { + throw new NotSupportedException(); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + throw new NotSupportedException(); + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/SignatureHelper.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/SignatureHelper.cs index 078d9354d9dd8..2768f392258ec 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/SignatureHelper.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/SignatureHelper.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,6 +30,7 @@ // (C) 2001 Ximian, Inc. http://www.ximian.com // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Reflection; @@ -40,371 +39,395 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public sealed class SignatureHelper { - internal enum SignatureHelperType { - HELPER_FIELD, - HELPER_LOCAL, - HELPER_METHOD, - HELPER_PROPERTY - } - - private ModuleBuilder module; // can be null in 2.0 - private Type[] arguments; - private SignatureHelperType type; - private Type returnType; - private CallingConventions callConv; - private CallingConvention unmanagedCallConv; +namespace System.Reflection.Emit +{ + [StructLayout(LayoutKind.Sequential)] + public sealed class SignatureHelper + { + internal enum SignatureHelperType + { + HELPER_FIELD, + HELPER_LOCAL, + HELPER_METHOD, + HELPER_PROPERTY + } + + private ModuleBuilder module; // can be null in 2.0 + private Type[] arguments; + private SignatureHelperType type; + private Type returnType; + private CallingConventions callConv; + private CallingConvention unmanagedCallConv; #pragma warning disable 649 - private Type[][] modreqs; - private Type[][] modopts; + private Type[][] modreqs; + private Type[][] modopts; #pragma warning restore 649 - internal SignatureHelper (ModuleBuilder module, SignatureHelperType type) - { - this.type = type; - this.module = module; - } - - public static SignatureHelper GetFieldSigHelper (Module mod) - { - if (mod != null && !(mod is ModuleBuilder)) - throw new ArgumentException ("ModuleBuilder is expected"); - - return new SignatureHelper ((ModuleBuilder) mod, SignatureHelperType.HELPER_FIELD); - } - - public static SignatureHelper GetLocalVarSigHelper (Module mod) - { - if (mod != null && !(mod is ModuleBuilder)) - throw new ArgumentException ("ModuleBuilder is expected"); - - return new SignatureHelper ((ModuleBuilder) mod, SignatureHelperType.HELPER_LOCAL); - } - - public static SignatureHelper GetLocalVarSigHelper () - { - return new SignatureHelper (null, SignatureHelperType.HELPER_LOCAL); - } - - public static SignatureHelper GetMethodSigHelper (CallingConventions callingConvention, Type returnType) - { - return GetMethodSigHelper (null, callingConvention, (CallingConvention)0, returnType, null); - } - - public static SignatureHelper GetMethodSigHelper (CallingConvention unmanagedCallingConvention, Type returnType) - { - return GetMethodSigHelper (null, CallingConventions.Standard, unmanagedCallingConvention, returnType, null); - } - - public static SignatureHelper GetMethodSigHelper (Module mod, CallingConventions callingConvention, Type returnType) - { - return GetMethodSigHelper (mod, callingConvention, (CallingConvention)0, returnType, null); - } - - public static SignatureHelper GetMethodSigHelper (Module mod, CallingConvention unmanagedCallConv, Type returnType) - { - return GetMethodSigHelper (mod, CallingConventions.Standard, unmanagedCallConv, returnType, null); - } - - public static SignatureHelper GetMethodSigHelper (Module mod, Type returnType, Type[] parameterTypes) - { - return GetMethodSigHelper (mod, CallingConventions.Standard, (CallingConvention)0, returnType, parameterTypes); - } - - // FIXME: "Not implemented" - public static SignatureHelper GetPropertySigHelper (Module mod, Type returnType, Type[] parameterTypes) - { - throw new NotImplementedException (); - } - - // FIXME: "Not implemented" - public static SignatureHelper GetPropertySigHelper (Module mod, Type returnType, - Type [] requiredReturnTypeCustomModifiers, - Type [] optionalReturnTypeCustomModifiers, - Type [] parameterTypes, - Type [] [] requiredParameterTypeCustomModifiers, - Type [] [] optionalParameterTypeCustomModifiers) - { - throw new NotImplementedException (); - } - - // FIXME: "Not implemented" - public static SignatureHelper GetPropertySigHelper (Module mod, - CallingConventions callingConvention, - Type returnType, - Type [] requiredReturnTypeCustomModifiers, - Type [] optionalReturnTypeCustomModifiers, - Type [] parameterTypes, - Type [] [] requiredParameterTypeCustomModifiers, - Type [] [] optionalParameterTypeCustomModifiers) - { - throw new NotImplementedException (); - } - - // - // Grows the given array, and returns the index where the element - // was added - // - static int AppendArray (ref Type [] array, Type t) - { - if (array != null) { - Type[] new_a = new Type [array.Length + 1]; - System.Array.Copy (array, new_a, array.Length); - new_a [array.Length] = t; - array = new_a; - return array.Length-1; - } else { - array = new Type [1]; - array [0] = t; - return 0; - } - } - - // - // Appends the given type array @t into the @array passed at - // position @pos. If there is no array, it gets created - // - // This allows adding data to a null array at position 5 for - // example, creating 4 empty slots before the slot where @t - // is stored. - // - // - static void AppendArrayAt (ref Type [][] array, Type [] t, int pos) - { - int top = Math.Max (pos, array == null ? 0 : array.Length); - Type[][] new_a = new Type [top+1][]; - if (array != null) - System.Array.Copy (array, new_a, top); - new_a [pos] = t; - array = new_a; - } - - static void ValidateParameterModifiers (string name, Type [] parameter_modifiers) - { - foreach (Type modifier in parameter_modifiers){ - if (modifier == null) - throw new ArgumentNullException (name); - if (modifier.IsArray) - throw new ArgumentException ("Array type not permitted", name); - if (modifier.ContainsGenericParameters) - throw new ArgumentException ("Open Generic Type not permitted", name); - } - } - - static void ValidateCustomModifier (int n, Type [][] custom_modifiers, string name) - { - if (custom_modifiers == null) - return; - - if (custom_modifiers.Length != n) - throw new ArgumentException (String.Format ("Custom modifiers length `{0}' does not match the size of the arguments")); - - foreach (Type [] parameter_modifiers in custom_modifiers){ - if (parameter_modifiers == null) - continue; - - ValidateParameterModifiers (name, parameter_modifiers); - } - } - - static Exception MissingFeature () - { - throw new NotImplementedException ("Mono does not currently support setting modOpt/modReq through SignatureHelper"); - } - - // FIXME: "Currently we ignore requiredCustomModifiers and optionalCustomModifiers" - public void AddArguments (Type[] arguments, Type[][] requiredCustomModifiers, Type[][] optionalCustomModifiers) - { - if (arguments == null) - throw new ArgumentNullException ("arguments"); - - // For now - if (requiredCustomModifiers != null || optionalCustomModifiers != null){ - throw MissingFeature(); - } - - ValidateCustomModifier (arguments.Length, requiredCustomModifiers, "requiredCustomModifiers"); - ValidateCustomModifier (arguments.Length, optionalCustomModifiers, "optionalCustomModifiers"); - - for (int i = 0; i < arguments.Length; i++){ - AddArgument (arguments [i], - requiredCustomModifiers != null ? requiredCustomModifiers [i] : null, - optionalCustomModifiers != null ? optionalCustomModifiers [i] : null); - } - } - - // FIXME: "pinned is ignored" - public void AddArgument (Type argument, bool pinned) - { - AddArgument (argument); - } - - public void AddArgument (Type argument, Type [] requiredCustomModifiers, Type [] optionalCustomModifiers) - { - if (argument == null) - throw new ArgumentNullException ("argument"); - - if (requiredCustomModifiers != null) - ValidateParameterModifiers ("requiredCustomModifiers", requiredCustomModifiers); - if (optionalCustomModifiers != null) - ValidateParameterModifiers ("optionalCustomModifiers", optionalCustomModifiers); - - int p = AppendArray (ref arguments, argument); - if (requiredCustomModifiers != null) - AppendArrayAt (ref modreqs, requiredCustomModifiers, p); - if (optionalCustomModifiers != null) - AppendArrayAt (ref modopts, optionalCustomModifiers, p); - } - - public void AddArgument (Type clsArgument) - { - if (clsArgument == null) - throw new ArgumentNullException ("clsArgument"); - - AppendArray (ref arguments, clsArgument); - } - - // FIXME: "Not implemented" - public void AddSentinel () - { - throw new NotImplementedException (); - } - - static bool CompareOK (Type [][] one, Type [][] two) - { - if (one == null){ - if (two == null) - return true; - return false; - } else if (two == null) - return false; - - if (one.Length != two.Length) - return false; - - for (int i = 0; i < one.Length; i++){ - Type [] tone = one [i]; - Type [] ttwo = two [i]; - - if (tone == null){ - if (ttwo == null) - continue; - } else if (ttwo == null) - return false; - - if (tone.Length != ttwo.Length) - return false; - - for (int j = 0; j < tone.Length; j++){ - Type uone = tone [j]; - Type utwo = ttwo [j]; - - if (uone == null){ - if (utwo == null) - continue; - return false; - } else if (utwo == null) - return false; - - if (!uone.Equals (utwo)) - return false; - } - } - return true; - } - - public override bool Equals (object obj) - { - SignatureHelper other = obj as SignatureHelper; - if (other == null) - return false; - - if (other.module != module || - other.returnType != returnType || - other.callConv != callConv || - other.unmanagedCallConv != unmanagedCallConv) - return false; - - if (arguments != null){ - if (other.arguments == null) - return false; - if (arguments.Length != other.arguments.Length) - return false; - - for (int i = 0; i < arguments.Length; i++) - if (!other.arguments [i].Equals (arguments [i])) - return false; - } else if (other.arguments != null) - return false; - - return CompareOK (other.modreqs, modreqs) && CompareOK (other.modopts, modopts); - } - - public override int GetHashCode () - { - // Lame, but easy, and will work, and chances are - // you will only need a few of these. - return 0; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern byte[] get_signature_local (); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern byte[] get_signature_field (); - - public byte[] GetSignature () - { - TypeBuilder.ResolveUserTypes (arguments); - - switch (type) { - case SignatureHelperType.HELPER_LOCAL: - return get_signature_local (); - case SignatureHelperType.HELPER_FIELD: - return get_signature_field (); - default: - throw new NotImplementedException (); - } - } - - public override string ToString() { - return "SignatureHelper"; - } - - internal static SignatureHelper GetMethodSigHelper (Module mod, CallingConventions callingConvention, CallingConvention unmanagedCallingConvention, Type returnType, - Type [] parameters) - { - if (mod != null && !(mod is ModuleBuilder)) - throw new ArgumentException ("ModuleBuilder is expected"); - - if (returnType == null) - returnType = typeof (void); - - if (returnType.IsUserType) - throw new NotSupportedException ("User defined subclasses of System.Type are not yet supported."); - if (parameters != null) { - for (int i = 0; i < parameters.Length; ++i) - if (parameters [i].IsUserType) - throw new NotSupportedException ("User defined subclasses of System.Type are not yet supported."); - - } - - SignatureHelper helper = - new SignatureHelper ((ModuleBuilder)mod, SignatureHelperType.HELPER_METHOD); - helper.returnType = returnType; - helper.callConv = callingConvention; - helper.unmanagedCallConv = unmanagedCallingConvention; - - if (parameters != null) { - helper.arguments = new Type [parameters.Length]; - for (int i = 0; i < parameters.Length; ++i) - helper.arguments [i] = parameters [i]; - } - - return helper; - } - } + internal SignatureHelper(ModuleBuilder module, SignatureHelperType type) + { + this.type = type; + this.module = module; + } + + public static SignatureHelper GetFieldSigHelper(Module mod) + { + if (mod != null && !(mod is ModuleBuilder)) + throw new ArgumentException("ModuleBuilder is expected"); + + return new SignatureHelper((ModuleBuilder)mod, SignatureHelperType.HELPER_FIELD); + } + + public static SignatureHelper GetLocalVarSigHelper(Module mod) + { + if (mod != null && !(mod is ModuleBuilder)) + throw new ArgumentException("ModuleBuilder is expected"); + + return new SignatureHelper((ModuleBuilder)mod, SignatureHelperType.HELPER_LOCAL); + } + + public static SignatureHelper GetLocalVarSigHelper() + { + return new SignatureHelper(null, SignatureHelperType.HELPER_LOCAL); + } + + public static SignatureHelper GetMethodSigHelper(CallingConventions callingConvention, Type returnType) + { + return GetMethodSigHelper(null, callingConvention, (CallingConvention)0, returnType, null); + } + + public static SignatureHelper GetMethodSigHelper(CallingConvention unmanagedCallingConvention, Type returnType) + { + return GetMethodSigHelper(null, CallingConventions.Standard, unmanagedCallingConvention, returnType, null); + } + + public static SignatureHelper GetMethodSigHelper(Module mod, CallingConventions callingConvention, Type returnType) + { + return GetMethodSigHelper(mod, callingConvention, (CallingConvention)0, returnType, null); + } + + public static SignatureHelper GetMethodSigHelper(Module mod, CallingConvention unmanagedCallConv, Type returnType) + { + return GetMethodSigHelper(mod, CallingConventions.Standard, unmanagedCallConv, returnType, null); + } + + public static SignatureHelper GetMethodSigHelper(Module mod, Type returnType, Type[] parameterTypes) + { + return GetMethodSigHelper(mod, CallingConventions.Standard, (CallingConvention)0, returnType, parameterTypes); + } + + // FIXME: "Not implemented" + public static SignatureHelper GetPropertySigHelper(Module mod, Type returnType, Type[] parameterTypes) + { + throw new NotImplementedException(); + } + + // FIXME: "Not implemented" + public static SignatureHelper GetPropertySigHelper(Module mod, Type returnType, + Type[] requiredReturnTypeCustomModifiers, + Type[] optionalReturnTypeCustomModifiers, + Type[] parameterTypes, + Type[][] requiredParameterTypeCustomModifiers, + Type[][] optionalParameterTypeCustomModifiers) + { + throw new NotImplementedException(); + } + + // FIXME: "Not implemented" + public static SignatureHelper GetPropertySigHelper(Module mod, + CallingConventions callingConvention, + Type returnType, + Type[] requiredReturnTypeCustomModifiers, + Type[] optionalReturnTypeCustomModifiers, + Type[] parameterTypes, + Type[][] requiredParameterTypeCustomModifiers, + Type[][] optionalParameterTypeCustomModifiers) + { + throw new NotImplementedException(); + } + + // + // Grows the given array, and returns the index where the element + // was added + // + private static int AppendArray(ref Type[] array, Type t) + { + if (array != null) + { + Type[] new_a = new Type[array.Length + 1]; + Array.Copy(array, new_a, array.Length); + new_a[array.Length] = t; + array = new_a; + return array.Length - 1; + } + else + { + array = new Type[1]; + array[0] = t; + return 0; + } + } + + // + // Appends the given type array @t into the @array passed at + // position @pos. If there is no array, it gets created + // + // This allows adding data to a null array at position 5 for + // example, creating 4 empty slots before the slot where @t + // is stored. + // + // + private static void AppendArrayAt(ref Type[][] array, Type[] t, int pos) + { + int top = Math.Max(pos, array == null ? 0 : array.Length); + Type[][] new_a = new Type[top + 1][]; + if (array != null) + Array.Copy(array, new_a, top); + new_a[pos] = t; + array = new_a; + } + + private static void ValidateParameterModifiers(string name, Type[] parameter_modifiers) + { + foreach (Type modifier in parameter_modifiers) + { + if (modifier == null) + throw new ArgumentNullException(name); + if (modifier.IsArray) + throw new ArgumentException("Array type not permitted", name); + if (modifier.ContainsGenericParameters) + throw new ArgumentException("Open Generic Type not permitted", name); + } + } + + private static void ValidateCustomModifier(int n, Type[][] custom_modifiers, string name) + { + if (custom_modifiers == null) + return; + + if (custom_modifiers.Length != n) + throw new ArgumentException(string.Format("Custom modifiers length `{0}' does not match the size of the arguments", custom_modifiers.Length)); + + foreach (Type[] parameter_modifiers in custom_modifiers) + { + if (parameter_modifiers == null) + continue; + + ValidateParameterModifiers(name, parameter_modifiers); + } + } + + private static Exception MissingFeature() + { + throw new NotImplementedException("Mono does not currently support setting modOpt/modReq through SignatureHelper"); + } + + // FIXME: "Currently we ignore requiredCustomModifiers and optionalCustomModifiers" + public void AddArguments(Type[] arguments, Type[][] requiredCustomModifiers, Type[][] optionalCustomModifiers) + { + if (arguments == null) + throw new ArgumentNullException(nameof(arguments)); + + // For now + if (requiredCustomModifiers != null || optionalCustomModifiers != null) + { + throw MissingFeature(); + } + + ValidateCustomModifier(arguments.Length, requiredCustomModifiers, "requiredCustomModifiers"); + ValidateCustomModifier(arguments.Length, optionalCustomModifiers, "optionalCustomModifiers"); + + for (int i = 0; i < arguments.Length; i++) + { + AddArgument(arguments[i], + requiredCustomModifiers != null ? requiredCustomModifiers[i] : null, + optionalCustomModifiers != null ? optionalCustomModifiers[i] : null); + } + } + + // FIXME: "pinned is ignored" + public void AddArgument(Type argument, bool pinned) + { + AddArgument(argument); + } + + public void AddArgument(Type argument, Type[] requiredCustomModifiers, Type[] optionalCustomModifiers) + { + if (argument == null) + throw new ArgumentNullException(nameof(argument)); + + if (requiredCustomModifiers != null) + ValidateParameterModifiers("requiredCustomModifiers", requiredCustomModifiers); + if (optionalCustomModifiers != null) + ValidateParameterModifiers("optionalCustomModifiers", optionalCustomModifiers); + + int p = AppendArray(ref arguments, argument); + if (requiredCustomModifiers != null) + AppendArrayAt(ref modreqs, requiredCustomModifiers, p); + if (optionalCustomModifiers != null) + AppendArrayAt(ref modopts, optionalCustomModifiers, p); + } + + public void AddArgument(Type clsArgument) + { + if (clsArgument == null) + throw new ArgumentNullException(nameof(clsArgument)); + + AppendArray(ref arguments, clsArgument); + } + + // FIXME: "Not implemented" + public void AddSentinel() + { + throw new NotImplementedException(); + } + + private static bool CompareOK(Type[][] one, Type[][] two) + { + if (one == null) + { + if (two == null) + return true; + return false; + } + else if (two == null) + return false; + + if (one.Length != two.Length) + return false; + + for (int i = 0; i < one.Length; i++) + { + Type[] tone = one[i]; + Type[] ttwo = two[i]; + + if (tone == null) + { + if (ttwo == null) + continue; + } + else if (ttwo == null) + return false; + + if (tone.Length != ttwo.Length) + return false; + + for (int j = 0; j < tone.Length; j++) + { + Type uone = tone[j]; + Type utwo = ttwo[j]; + + if (uone == null) + { + if (utwo == null) + continue; + return false; + } + else if (utwo == null) + return false; + + if (!uone.Equals(utwo)) + return false; + } + } + return true; + } + + public override bool Equals(object obj) + { + SignatureHelper other = obj as SignatureHelper; + if (other == null) + return false; + + if (other.module != module || + other.returnType != returnType || + other.callConv != callConv || + other.unmanagedCallConv != unmanagedCallConv) + return false; + + if (arguments != null) + { + if (other.arguments == null) + return false; + if (arguments.Length != other.arguments.Length) + return false; + + for (int i = 0; i < arguments.Length; i++) + if (!other.arguments[i].Equals(arguments[i])) + return false; + } + else if (other.arguments != null) + return false; + + return CompareOK(other.modreqs, modreqs) && CompareOK(other.modopts, modopts); + } + + public override int GetHashCode() + { + // Lame, but easy, and will work, and chances are + // you will only need a few of these. + return 0; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern byte[] get_signature_local(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern byte[] get_signature_field(); + + public byte[] GetSignature() + { + TypeBuilder.ResolveUserTypes(arguments); + + switch (type) + { + case SignatureHelperType.HELPER_LOCAL: + return get_signature_local(); + case SignatureHelperType.HELPER_FIELD: + return get_signature_field(); + default: + throw new NotImplementedException(); + } + } + + public override string ToString() + { + return "SignatureHelper"; + } + + internal static SignatureHelper GetMethodSigHelper(Module mod, CallingConventions callingConvention, CallingConvention unmanagedCallingConvention, Type returnType, + Type[] parameters) + { + if (mod != null && !(mod is ModuleBuilder)) + throw new ArgumentException("ModuleBuilder is expected"); + + if (returnType == null) + returnType = typeof(void); + + if (returnType.IsUserType) + throw new NotSupportedException("User defined subclasses of System.Type are not yet supported."); + if (parameters != null) + { + for (int i = 0; i < parameters.Length; ++i) + if (parameters[i].IsUserType) + throw new NotSupportedException("User defined subclasses of System.Type are not yet supported."); + + } + + SignatureHelper helper = + new SignatureHelper((ModuleBuilder)mod, SignatureHelperType.HELPER_METHOD); + helper.returnType = returnType; + helper.callConv = callingConvention; + helper.unmanagedCallConv = unmanagedCallingConvention; + + if (parameters != null) + { + helper.arguments = new Type[parameters.Length]; + for (int i = 0; i < parameters.Length; ++i) + helper.arguments[i] = parameters[i]; + } + + return helper; + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs index 7c7255daa7a27..573f1619d0228 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit.TypeBuilder.cs // @@ -20,10 +18,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -33,6 +31,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System; using System.Text; @@ -47,1846 +46,2030 @@ namespace System.Reflection.Emit { - [StructLayout (LayoutKind.Sequential)] - public sealed partial class TypeBuilder : TypeInfo - { -#pragma warning disable 169 - #region Sync with reflection.h - private string tname; // name in internal form - private string nspace; // namespace in internal form - private Type parent; - private Type nesting_type; - internal Type[] interfaces; - internal int num_methods; - internal MethodBuilder[] methods; - internal ConstructorBuilder[] ctors; - internal PropertyBuilder[] properties; - internal int num_fields; - internal FieldBuilder[] fields; - internal EventBuilder[] events; - private CustomAttributeBuilder[] cattrs; - internal TypeBuilder[] subtypes; - internal TypeAttributes attrs; - private int table_idx; - private ModuleBuilder pmodule; - private int class_size; - private PackingSize packing_size; - private IntPtr generic_container; - private GenericTypeParameterBuilder[] generic_params; - private object permissions; - private TypeInfo created; - private int state; - #endregion -#pragma warning restore 169 - - TypeName fullname; - bool createTypeCalled; - private Type underlying_type; - - public const int UnspecifiedTypeSize = 0; - - protected override TypeAttributes GetAttributeFlagsImpl () - { - return attrs; - } - - internal TypeBuilder (ModuleBuilder mb, TypeAttributes attr, int table_idx) - { - this.parent = null; - this.attrs = attr; - this.class_size = UnspecifiedTypeSize; - this.table_idx = table_idx; - this.tname = table_idx == 1 ? "" : "type_" + table_idx.ToString (); - this.nspace = String.Empty; - this.fullname = TypeIdentifiers.WithoutEscape(this.tname); - pmodule = mb; - } - - internal TypeBuilder (ModuleBuilder mb, string name, TypeAttributes attr, Type parent, Type[] interfaces, PackingSize packing_size, int type_size, Type nesting_type) - { - int sep_index; - this.parent = ResolveUserType (parent); - this.attrs = attr; - this.class_size = type_size; - this.packing_size = packing_size; - this.nesting_type = nesting_type; - - check_name ("fullname", name); - - if (parent == null && (attr & TypeAttributes.Interface) != 0 && (attr & TypeAttributes.Abstract) == 0) - throw new InvalidOperationException ("Interface must be declared abstract."); - - sep_index = name.LastIndexOf('.'); - if (sep_index != -1) { - this.tname = name.Substring (sep_index + 1); - this.nspace = name.Substring (0, sep_index); - } else { - this.tname = name; - this.nspace = String.Empty; - } - if (interfaces != null) { - this.interfaces = new Type[interfaces.Length]; - System.Array.Copy (interfaces, this.interfaces, interfaces.Length); - } - pmodule = mb; - - if (((attr & TypeAttributes.Interface) == 0) && (parent == null)) - this.parent = typeof (object); - - // skip . ? - table_idx = mb.get_next_table_index (this, 0x02, 1); - fullname = GetFullName (); - } - - public override Assembly Assembly { - get {return pmodule.Assembly;} - } - - public override string AssemblyQualifiedName { - get { - return fullname.DisplayName + ", " + Assembly.FullName; - } - } - - public override Type BaseType { - get { - return parent; - } - } - - public override Type DeclaringType { - get { return nesting_type; } - } - - [ComVisible (true)] - public override bool IsSubclassOf (Type c) - { - Type t; - if (c == null) - return false; - if (c == this) - return false; - t = parent; - while (t != null) { - if (c == t) - return true; - t = t.BaseType; - } - return false; - } - - public override Type UnderlyingSystemType { - get { - if (is_created) - return created.UnderlyingSystemType; - - if (IsEnum) { - if (underlying_type != null) - return underlying_type; - throw new InvalidOperationException ( - "Enumeration type is not defined."); - } - - return this; - } - } - - TypeName GetFullName () - { - TypeIdentifier ident = TypeIdentifiers.FromInternal (tname); - if (nesting_type != null) - return TypeNames.FromDisplay (nesting_type.FullName).NestedName (ident); - if ((nspace != null) && (nspace.Length > 0)) - return TypeIdentifiers.FromInternal (nspace, ident); - return ident; - } - - public override string FullName { - get { - return fullname.DisplayName; - } - } - - public override Guid GUID { - get { - check_created (); - return created.GUID; - } - } - - public override Module Module { - get {return pmodule;} - } - - public override string Name { - get {return tname;} - } - - public override string Namespace { - get {return nspace;} - } - - public PackingSize PackingSize { - get {return packing_size;} - } - - public int Size { - get { return class_size; } - } - - public override Type ReflectedType { - get { return nesting_type; } - } - - [ComVisible (true)] - public void AddInterfaceImplementation (Type interfaceType) - { - if (interfaceType == null) - throw new ArgumentNullException ("interfaceType"); - if (interfaceType.IsByRef) - throw new ArgumentException (nameof (interfaceType)); - check_not_created (); - - if (interfaces != null) { - // Check for duplicates - foreach (Type t in interfaces) - if (t == interfaceType) - return; - - Type[] ifnew = new Type [interfaces.Length + 1]; - interfaces.CopyTo (ifnew, 0); - ifnew [interfaces.Length] = interfaceType; - interfaces = ifnew; - } else { - interfaces = new Type [1]; - interfaces [0] = interfaceType; - } - } - - protected override ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr, Binder binder, - CallingConventions callConvention, Type[] types, - ParameterModifier[] modifiers) - { - check_created (); - - if (created == typeof (object)) { - /* - * This happens when building corlib. Calling created.GetConstructor - * would return constructors from the real mscorlib, instead of the - * newly built one. - */ - - if (ctors == null) - return null; - - ConstructorBuilder found = null; - int count = 0; - - foreach (ConstructorBuilder cb in ctors) { - if (callConvention != CallingConventions.Any && cb.CallingConvention != callConvention) - continue; - found = cb; - count++; - } - - if (count == 0) - return null; - if (types == null) { - if (count > 1) - throw new AmbiguousMatchException (); - return found; - } - MethodBase[] match = new MethodBase [count]; - if (count == 1) - match [0] = found; - else { - count = 0; - foreach (ConstructorInfo m in ctors) { - if (callConvention != CallingConventions.Any && m.CallingConvention != callConvention) - continue; - match [count++] = m; - } - } - if (binder == null) - binder = DefaultBinder; - return (ConstructorInfo) binder.SelectMethod (bindingAttr, match, - types, modifiers); - } - - return created.GetConstructor (bindingAttr, binder, - callConvention, types, modifiers); - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - if (!is_created) - throw new NotSupportedException (); - /* - * MS throws NotSupported here, but we can't because some corlib - * classes make calls to IsDefined. - */ - return CustomAttribute.IsDefined (this, attributeType, inherit); - } - - public override object[] GetCustomAttributes(bool inherit) - { - check_created (); - - return created.GetCustomAttributes (inherit); - } - - public override object[] GetCustomAttributes(Type attributeType, bool inherit) - { - check_created (); - - return created.GetCustomAttributes (attributeType, inherit); - } - - public TypeBuilder DefineNestedType (string name) - { - return DefineNestedType (name, TypeAttributes.NestedPrivate, - typeof (object), null); - } - - public TypeBuilder DefineNestedType (string name, TypeAttributes attr) - { - return DefineNestedType (name, attr, typeof (object), null); - } - - public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent) - { - return DefineNestedType (name, attr, parent, null); - } - - private TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, Type[] interfaces, - PackingSize packSize, int typeSize) - { - // Visibility must be NestedXXX - /* This breaks mcs - if (((attrs & TypeAttributes.VisibilityMask) == TypeAttributes.Public) || - ((attrs & TypeAttributes.VisibilityMask) == TypeAttributes.NotPublic)) - throw new ArgumentException ("attr", "Bad type flags for nested type."); - */ - if (interfaces != null) { - foreach (Type iface in interfaces) { - if (iface == null) - throw new ArgumentNullException ("interfaces"); - if (iface.IsByRef) - throw new ArgumentException (nameof (interfaces)); - } - } - - TypeBuilder res = new TypeBuilder (pmodule, name, attr, parent, interfaces, packSize, typeSize, this); - res.fullname = res.GetFullName (); - pmodule.RegisterTypeName (res, res.fullname); - if (subtypes != null) { - TypeBuilder[] new_types = new TypeBuilder [subtypes.Length + 1]; - System.Array.Copy (subtypes, new_types, subtypes.Length); - new_types [subtypes.Length] = res; - subtypes = new_types; - } else { - subtypes = new TypeBuilder [1]; - subtypes [0] = res; - } - return res; - } - - [ComVisible (true)] - public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, Type[] interfaces) - { - return DefineNestedType (name, attr, parent, interfaces, PackingSize.Unspecified, UnspecifiedTypeSize); - } - - public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, int typeSize) - { - return DefineNestedType (name, attr, parent, null, PackingSize.Unspecified, typeSize); - } - - public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, PackingSize packSize) - { - return DefineNestedType (name, attr, parent, null, packSize, UnspecifiedTypeSize); - } - - public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, PackingSize packSize, - int typeSize) - { - return DefineNestedType (name, attr, parent, null, packSize, typeSize); - } - - [ComVisible (true)] - public ConstructorBuilder DefineConstructor (MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes) - { - return DefineConstructor (attributes, callingConvention, parameterTypes, null, null); - } - - [ComVisible (true)] - public ConstructorBuilder DefineConstructor (MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes, Type[][] requiredCustomModifiers, Type[][] optionalCustomModifiers) - { - check_not_created (); - if (IsInterface && (attributes & MethodAttributes.Static) == 0) - throw new InvalidOperationException (); - ConstructorBuilder cb = new ConstructorBuilder (this, attributes, - callingConvention, parameterTypes, requiredCustomModifiers, - optionalCustomModifiers); - if (ctors != null) { - ConstructorBuilder[] new_ctors = new ConstructorBuilder [ctors.Length+1]; - System.Array.Copy (ctors, new_ctors, ctors.Length); - new_ctors [ctors.Length] = cb; - ctors = new_ctors; - } else { - ctors = new ConstructorBuilder [1]; - ctors [0] = cb; - } - return cb; - } - - [ComVisible (true)] - public ConstructorBuilder DefineDefaultConstructor (MethodAttributes attributes) - { - Type parent_type, old_parent_type; - - if (IsInterface) - throw new InvalidOperationException (); - if ((attributes & (MethodAttributes.Static|MethodAttributes.Virtual)) > 0) - throw new ArgumentException (nameof (attributes)); - - if (parent != null) - parent_type = parent; - else - parent_type = typeof (object); - - old_parent_type = parent_type; - parent_type = parent_type.InternalResolve (); - /*This avoids corlib to have self references.*/ - if (parent_type == typeof (object) || parent_type == typeof (ValueType)) - parent_type = old_parent_type; - - ConstructorInfo parent_constructor = - parent_type.GetConstructor ( - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, - null, Type.EmptyTypes, null); - if (parent_constructor == null) { - throw new NotSupportedException ("Parent does" - + " not have a default constructor." - + " The default constructor must be" - + " explicitly defined."); - } - - ConstructorBuilder cb = DefineConstructor (attributes, - CallingConventions.Standard, Type.EmptyTypes); - ILGenerator ig = cb.GetILGenerator (); - ig.Emit (OpCodes.Ldarg_0); - ig.Emit (OpCodes.Call, parent_constructor); - ig.Emit (OpCodes.Ret); - cb.finished = true; - return cb; - } - - private void append_method (MethodBuilder mb) - { - if (methods != null) { - if (methods.Length == num_methods) { - MethodBuilder[] new_methods = new MethodBuilder [methods.Length * 2]; - System.Array.Copy (methods, new_methods, num_methods); - methods = new_methods; - } - } else { - methods = new MethodBuilder [1]; - } - methods [num_methods] = mb; - num_methods ++; - } - - public MethodBuilder DefineMethod (string name, MethodAttributes attributes, Type returnType, Type[] parameterTypes) - { - return DefineMethod (name, attributes, CallingConventions.Standard, - returnType, parameterTypes); - } - - public MethodBuilder DefineMethod (string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) - { - return DefineMethod (name, attributes, callingConvention, returnType, - null, null, parameterTypes, null, null); - } - - public MethodBuilder DefineMethod (string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) - { - check_name ("name", name); - check_not_created (); - if (IsInterface && ( - !((attributes & MethodAttributes.Abstract) != 0) || - !((attributes & MethodAttributes.Virtual) != 0)) && - !(((attributes & MethodAttributes.Static) != 0))) - throw new ArgumentException ("Interface method must be abstract and virtual."); - - if (returnType == null) - returnType = typeof (void); - MethodBuilder res = new MethodBuilder (this, name, attributes, - callingConvention, returnType, - returnTypeRequiredCustomModifiers, - returnTypeOptionalCustomModifiers, parameterTypes, - parameterTypeRequiredCustomModifiers, - parameterTypeOptionalCustomModifiers); - append_method (res); - return res; - } - - public MethodBuilder DefinePInvokeMethod (string name, string dllName, string entryName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) - { - return DefinePInvokeMethod (name, dllName, entryName, attributes, - callingConvention, returnType, null, null, parameterTypes, - null, null, nativeCallConv, nativeCharSet); - } - - public MethodBuilder DefinePInvokeMethod ( - string name, - string dllName, - string entryName, MethodAttributes attributes, - CallingConventions callingConvention, - Type returnType, - Type[] returnTypeRequiredCustomModifiers, - Type[] returnTypeOptionalCustomModifiers, - Type[] parameterTypes, - Type[][] parameterTypeRequiredCustomModifiers, - Type[][] parameterTypeOptionalCustomModifiers, - CallingConvention nativeCallConv, - CharSet nativeCharSet) - { - check_name ("name", name); - check_name ("dllName", dllName); - check_name ("entryName", entryName); - if ((attributes & MethodAttributes.Abstract) != 0) - throw new ArgumentException ("PInvoke methods must be static and native and cannot be abstract."); - if (IsInterface) - throw new ArgumentException ("PInvoke methods cannot exist on interfaces."); - check_not_created (); - - MethodBuilder res - = new MethodBuilder ( - this, - name, - attributes, - callingConvention, - returnType, - returnTypeRequiredCustomModifiers, - returnTypeOptionalCustomModifiers, - parameterTypes, - parameterTypeRequiredCustomModifiers, - parameterTypeOptionalCustomModifiers, - dllName, - entryName, - nativeCallConv, - nativeCharSet); - append_method (res); - return res; - } - - public MethodBuilder DefinePInvokeMethod (string name, string dllName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) { - return DefinePInvokeMethod (name, dllName, name, attributes, callingConvention, returnType, parameterTypes, - nativeCallConv, nativeCharSet); - } - - public MethodBuilder DefineMethod (string name, MethodAttributes attributes) - { - return DefineMethod (name, attributes, CallingConventions.Standard); - } - - public MethodBuilder DefineMethod (string name, MethodAttributes attributes, CallingConventions callingConvention) - { - return DefineMethod (name, attributes, callingConvention, null, null); - } - - public void DefineMethodOverride (MethodInfo methodInfoBody, MethodInfo methodInfoDeclaration) - { - if (methodInfoBody == null) - throw new ArgumentNullException ("methodInfoBody"); - if (methodInfoDeclaration == null) - throw new ArgumentNullException ("methodInfoDeclaration"); - check_not_created (); - if (methodInfoBody.DeclaringType != this) - throw new ArgumentException ("method body must belong to this type"); - - if (methodInfoBody is MethodBuilder) { - MethodBuilder mb = (MethodBuilder)methodInfoBody; - mb.set_override (methodInfoDeclaration); - } - } - - public FieldBuilder DefineField (string fieldName, Type type, FieldAttributes attributes) - { - return DefineField (fieldName, type, null, null, attributes); - } - - public FieldBuilder DefineField (string fieldName, Type type, Type[] requiredCustomModifiers, Type[] optionalCustomModifiers, FieldAttributes attributes) - { - check_name ("fieldName", fieldName); - if (type == typeof (void)) - throw new ArgumentException ("Bad field type in defining field."); - check_not_created (); - - FieldBuilder res = new FieldBuilder (this, fieldName, type, attributes, requiredCustomModifiers, optionalCustomModifiers); - if (fields != null) { - if (fields.Length == num_fields) { - FieldBuilder[] new_fields = new FieldBuilder [fields.Length * 2]; - System.Array.Copy (fields, new_fields, num_fields); - fields = new_fields; - } - fields [num_fields] = res; - num_fields ++; - } else { - fields = new FieldBuilder [1]; - fields [0] = res; - num_fields ++; - } - - if (IsEnum) { - if (underlying_type == null && (attributes & FieldAttributes.Static) == 0) - underlying_type = type; - } - - return res; - } - - public PropertyBuilder DefineProperty (string name, PropertyAttributes attributes, Type returnType, Type[] parameterTypes) - { - return DefineProperty (name, attributes, 0, returnType, null, null, parameterTypes, null, null); - } - - public PropertyBuilder DefineProperty (string name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) - { - return DefineProperty (name, attributes, callingConvention, returnType , null, null, parameterTypes, null, null); - } - - public PropertyBuilder DefineProperty (string name, PropertyAttributes attributes, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) - { - return DefineProperty (name, attributes, 0, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); - } - - public PropertyBuilder DefineProperty (string name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) - { - check_name ("name", name); - if (parameterTypes != null) - foreach (Type param in parameterTypes) - if (param == null) - throw new ArgumentNullException ("parameterTypes"); - check_not_created (); - - PropertyBuilder res = new PropertyBuilder (this, name, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); - - if (properties != null) { - Array.Resize (ref properties, properties.Length + 1); - properties [properties.Length - 1] = res; - } else { - properties = new PropertyBuilder [1] { res }; - } - return res; - } - - [ComVisible (true)] - public ConstructorBuilder DefineTypeInitializer() - { - return DefineConstructor (MethodAttributes.Public | - MethodAttributes.Static | MethodAttributes.SpecialName | - MethodAttributes.RTSpecialName, CallingConventions.Standard, - null); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private extern TypeInfo create_runtime_class (); - - private bool is_nested_in (Type t) - { - while (t != null) { - if (t == this) - return true; - else - t = t.DeclaringType; - } - return false; - } - - // Return whenever this type has a ctor defined using DefineMethod () - private bool has_ctor_method () { - MethodAttributes ctor_attrs = MethodAttributes.SpecialName | MethodAttributes.RTSpecialName; - - for (int i = 0; i < num_methods; ++i) { - MethodBuilder mb = (MethodBuilder)(methods[i]); - - if (mb.Name == ConstructorInfo.ConstructorName && (mb.Attributes & ctor_attrs) == ctor_attrs) - return true; - } - - return false; - } - - public Type CreateType () - { - return CreateTypeInfo (); - } - - public - TypeInfo CreateTypeInfo () - { - /* handle nesting_type */ - if (createTypeCalled) - return created; - - if (!IsInterface && (parent == null) && (this != typeof (object)) && (FullName != "")) { - SetParent (typeof (object)); - } - - // Fire TypeResolve events for fields whose type is an unfinished - // value type. - if (fields != null) { - foreach (FieldBuilder fb in fields) { - if (fb == null) - continue; - Type ft = fb.FieldType; - if (!fb.IsStatic && (ft is TypeBuilder) && ft.IsValueType && (ft != this) && is_nested_in (ft)) { - TypeBuilder tb = (TypeBuilder)ft; - if (!tb.is_created) { - throw new NotImplementedException (); - } - } - } - } - - if (parent != null) { - if (parent.IsByRef) - throw new ArgumentException (); - if (IsInterface) - throw new TypeLoadException (); - } - - // - // On classes, define a default constructor if not provided - // - if (!(IsInterface || IsValueType) && (ctors == null) && (tname != "") && - (GetAttributeFlagsImpl () & TypeAttributes.Abstract | TypeAttributes.Sealed) != (TypeAttributes.Abstract | TypeAttributes.Sealed) && !has_ctor_method ()) - DefineDefaultConstructor (MethodAttributes.Public); - - createTypeCalled = true; - - if (parent != null) { - if (parent.IsSealed) - throw new TypeLoadException ("Could not load type '" + FullName + "' from assembly '" + Assembly + "' because the parent type is sealed."); - if (parent.IsGenericTypeDefinition) - throw new BadImageFormatException (); - } - - if (parent == typeof (Enum) && methods != null) - throw new TypeLoadException ("Could not load type '" + FullName + "' from assembly '" + Assembly + "' because it is an enum with methods."); - if (interfaces != null) { - foreach (var iface in interfaces) { - if (iface.IsNestedPrivate && iface.Assembly != Assembly) - throw new TypeLoadException ("Could not load type '" + FullName + "' from assembly '" + Assembly + "' because it is implements the inaccessible interface '" + iface.FullName + "'."); - if (iface.IsGenericTypeDefinition) - throw new BadImageFormatException (); - if (!iface.IsInterface) - throw new TypeLoadException (); - if (iface is TypeBuilder && !((TypeBuilder)iface).is_created) - throw new TypeLoadException (); - } - } - - if (fields != null) { - foreach (FieldBuilder fb in fields) { - if (fb == null) - continue; - if (fb.FieldType.IsByRef) - throw new COMException (); - } - } - - if (methods != null) { - bool is_concrete = !IsAbstract; - for (int i = 0; i < num_methods; ++i) { - MethodBuilder mb = (MethodBuilder)(methods[i]); - if (is_concrete && mb.IsAbstract) - throw new InvalidOperationException ("Type is concrete but has abstract method " + mb); - mb.check_override (); - mb.fixup (); - } - } - - if (ctors != null){ - foreach (ConstructorBuilder ctor in ctors) - ctor.fixup (); - } - - ResolveUserTypes (); - - created = create_runtime_class (); - if (created != null) - return created; - return this; - } - - void ResolveUserTypes () { - parent = ResolveUserType (parent); - ResolveUserTypes (interfaces); - if (fields != null) { - foreach (var fb in fields) { - if (fb != null) - fb.ResolveUserTypes (); - } - } - if (methods != null) { - foreach (var mb in methods) { - if (mb != null) - mb.ResolveUserTypes (); - } - } - if (ctors != null) { - foreach (var cb in ctors) { - if (cb != null) - cb.ResolveUserTypes (); - } - } - } - - static internal void ResolveUserTypes (Type[] types) { - if (types != null) - for (int i = 0; i < types.Length; ++i) - types [i] = ResolveUserType (types [i]); - } - - static internal Type ResolveUserType (Type t) { - if (t != null && ((t.GetType ().Assembly != typeof (int).Assembly) || (t is TypeDelegator))) { - t = t.UnderlyingSystemType; - if (t != null && ((t.GetType ().Assembly != typeof (int).Assembly) || (t is TypeDelegator))) - throw new NotSupportedException ("User defined subclasses of System.Type are not yet supported."); - return t; - } else { - return t; - } - } -/* - internal void GenerateDebugInfo (ISymbolWriter symbolWriter) - { - symbolWriter.OpenNamespace (this.Namespace); - - if (methods != null) { - for (int i = 0; i < num_methods; ++i) { - MethodBuilder metb = (MethodBuilder) methods[i]; - metb.GenerateDebugInfo (symbolWriter); - } - } - - if (ctors != null) { - foreach (ConstructorBuilder ctor in ctors) - ctor.GenerateDebugInfo (symbolWriter); - } - - symbolWriter.CloseNamespace (); - - if (subtypes != null) { - for (int i = 0; i < subtypes.Length; ++i) - subtypes [i].GenerateDebugInfo (symbolWriter); - } - } -*/ - [ComVisible (true)] - public override ConstructorInfo[] GetConstructors (BindingFlags bindingAttr) - { - if (is_created) - return created.GetConstructors (bindingAttr); - - throw new NotSupportedException (); - } - - internal ConstructorInfo[] GetConstructorsInternal (BindingFlags bindingAttr) - { - if (ctors == null) - return new ConstructorInfo [0]; - ArrayList l = new ArrayList (); - bool match; - MethodAttributes mattrs; - - foreach (ConstructorBuilder c in ctors) { - match = false; - mattrs = c.Attributes; - if ((mattrs & MethodAttributes.MemberAccessMask) == MethodAttributes.Public) { - if ((bindingAttr & BindingFlags.Public) != 0) - match = true; - } else { - if ((bindingAttr & BindingFlags.NonPublic) != 0) - match = true; - } - if (!match) - continue; - match = false; - if ((mattrs & MethodAttributes.Static) != 0) { - if ((bindingAttr & BindingFlags.Static) != 0) - match = true; - } else { - if ((bindingAttr & BindingFlags.Instance) != 0) - match = true; - } - if (!match) - continue; - l.Add (c); - } - ConstructorInfo[] result = new ConstructorInfo [l.Count]; - l.CopyTo (result); - return result; - } - - public override Type GetElementType () - { - throw new NotSupportedException (); - } - - public override EventInfo GetEvent (string name, BindingFlags bindingAttr) - { - check_created (); - return created.GetEvent (name, bindingAttr); - } - - /* Needed to keep signature compatibility with MS.NET */ - public override EventInfo[] GetEvents () - { - const BindingFlags DefaultBindingFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance; - return GetEvents (DefaultBindingFlags); - } - - public override EventInfo[] GetEvents (BindingFlags bindingAttr) - { - if (is_created) - return created.GetEvents (bindingAttr); - throw new NotSupportedException (); - } - - public override FieldInfo GetField (string name, BindingFlags bindingAttr) - { - check_created (); - return created.GetField (name, bindingAttr); - } - - public override FieldInfo[] GetFields (BindingFlags bindingAttr) - { - check_created (); - return created.GetFields (bindingAttr); - } - - public override Type GetInterface (string name, bool ignoreCase) - { - check_created (); - return created.GetInterface (name, ignoreCase); - } - - public override Type[] GetInterfaces () - { - if (is_created) - return created.GetInterfaces (); - - if (interfaces != null) { - Type[] ret = new Type [interfaces.Length]; - interfaces.CopyTo (ret, 0); - return ret; - } else { - return Type.EmptyTypes; - } - } - - public override MemberInfo[] GetMember (string name, MemberTypes type, - BindingFlags bindingAttr) - { - check_created (); - return created.GetMember (name, type, bindingAttr); - } - - public override MemberInfo[] GetMembers (BindingFlags bindingAttr) - { - check_created (); - return created.GetMembers (bindingAttr); - } - - private MethodInfo[] GetMethodsByName (string name, BindingFlags bindingAttr, bool ignoreCase, Type reflected_type) - { - MethodInfo[] candidates; - bool match; - MethodAttributes mattrs; - - if (((bindingAttr & BindingFlags.DeclaredOnly) == 0) && (parent != null)) { - MethodInfo [] parent_methods = parent.GetMethods (bindingAttr); - ArrayList parent_candidates = new ArrayList (parent_methods.Length); - - bool flatten = (bindingAttr & BindingFlags.FlattenHierarchy) != 0; - - for (int i = 0; i < parent_methods.Length; i++) { - MethodInfo m = parent_methods [i]; - - mattrs = m.Attributes; - - if (m.IsStatic && !flatten) - continue; - - switch (mattrs & MethodAttributes.MemberAccessMask) { - case MethodAttributes.Public: - match = (bindingAttr & BindingFlags.Public) != 0; - break; - case MethodAttributes.Assembly: - match = (bindingAttr & BindingFlags.NonPublic) != 0; - break; - case MethodAttributes.Private: - match = false; - break; - default: - match = (bindingAttr & BindingFlags.NonPublic) != 0; - break; - } - - if (match) - parent_candidates.Add (m); - } - - if (methods == null) { - candidates = new MethodInfo [parent_candidates.Count]; - parent_candidates.CopyTo (candidates); - } else { - candidates = new MethodInfo [methods.Length + parent_candidates.Count]; - parent_candidates.CopyTo (candidates, 0); - methods.CopyTo (candidates, parent_candidates.Count); - } - } - else - candidates = methods; - - if (candidates == null) - return new MethodInfo [0]; - - ArrayList l = new ArrayList (); - - foreach (MethodInfo c in candidates) { - if (c == null) - continue; - if (name != null) { - if (String.Compare (c.Name, name, ignoreCase) != 0) - continue; - } - match = false; - mattrs = c.Attributes; - if ((mattrs & MethodAttributes.MemberAccessMask) == MethodAttributes.Public) { - if ((bindingAttr & BindingFlags.Public) != 0) - match = true; - } else { - if ((bindingAttr & BindingFlags.NonPublic) != 0) - match = true; - } - if (!match) - continue; - match = false; - if ((mattrs & MethodAttributes.Static) != 0) { - if ((bindingAttr & BindingFlags.Static) != 0) - match = true; - } else { - if ((bindingAttr & BindingFlags.Instance) != 0) - match = true; - } - if (!match) - continue; - l.Add (c); - } - - MethodInfo[] result = new MethodInfo [l.Count]; - l.CopyTo (result); - return result; - } - - public override MethodInfo[] GetMethods (BindingFlags bindingAttr) - { - check_created (); - - return GetMethodsByName (null, bindingAttr, false, this); - } - - protected override MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, - Binder binder, - CallingConventions callConvention, - Type[] types, ParameterModifier[] modifiers) - { - check_created (); - - if (types == null) - return created.GetMethod (name, bindingAttr); - - return created.GetMethod (name, bindingAttr, binder, callConvention, types, modifiers); - } - - public override Type GetNestedType (string name, BindingFlags bindingAttr) - { - check_created (); - - if (subtypes == null) - return null; - - foreach (TypeBuilder t in subtypes) { - if (!t.is_created) - continue; - if ((t.attrs & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPublic) { - if ((bindingAttr & BindingFlags.Public) == 0) - continue; - } else { - if ((bindingAttr & BindingFlags.NonPublic) == 0) - continue; - } - if (t.Name == name) - return t.created; - } - - return null; - } - - public override Type[] GetNestedTypes (BindingFlags bindingAttr) - { - if (!is_created) - throw new NotSupportedException (); - - bool match; - ArrayList result = new ArrayList (); - - if (subtypes == null) - return Type.EmptyTypes; - foreach (TypeBuilder t in subtypes) { - match = false; - if ((t.attrs & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPublic) { - if ((bindingAttr & BindingFlags.Public) != 0) - match = true; - } else { - if ((bindingAttr & BindingFlags.NonPublic) != 0) - match = true; - } - if (!match) - continue; - result.Add (t); - } - Type[] r = new Type [result.Count]; - result.CopyTo (r); - return r; - } - - public override PropertyInfo[] GetProperties (BindingFlags bindingAttr) - { - check_created (); - return created.GetProperties (bindingAttr); - } - - protected override PropertyInfo GetPropertyImpl (string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) - { - throw not_supported (); - } - - protected override bool HasElementTypeImpl () - { - // a TypeBuilder can never represent an array, pointer - if (!is_created) - return false; - - return created.HasElementType; - } - - public override object InvokeMember (string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) - { - check_created (); - return created.InvokeMember (name, invokeAttr, binder, target, args, modifiers, culture, namedParameters); - } - - protected override bool IsArrayImpl () - { - return false; /*A TypeBuilder never represents a non typedef type.*/ - } - - protected override bool IsByRefImpl () - { - return false; /*A TypeBuilder never represents a non typedef type.*/ - } - - protected override bool IsCOMObjectImpl () - { - return ((GetAttributeFlagsImpl () & TypeAttributes.Import) != 0); - } - - protected override bool IsPointerImpl () - { - return false; /*A TypeBuilder never represents a non typedef type.*/ - } - - protected override bool IsPrimitiveImpl () - { - // FIXME - return false; - } - - // FIXME: I doubt just removing this still works. - protected override bool IsValueTypeImpl () - { - Type parent_type = parent; - while (parent_type != null) { - if (parent_type == typeof (ValueType)) - return true; - parent_type = parent_type.BaseType; - } - return false; - } - - public override bool IsSZArray { - get { - return false; - } - } - - public override Type MakeArrayType () - { - return new ArrayType (this, 0); - } - - public override Type MakeArrayType (int rank) - { - if (rank < 1) - throw new IndexOutOfRangeException (); - return new ArrayType (this, rank); - } - - public override Type MakeByRefType () - { - return new ByRefType (this); - } - - public override Type MakeGenericType (params Type [] typeArguments) - { - //return base.MakeGenericType (typeArguments); - - if (!IsGenericTypeDefinition) - throw new InvalidOperationException ("not a generic type definition"); - if (typeArguments == null) - throw new ArgumentNullException ("typeArguments"); - - if (generic_params.Length != typeArguments.Length) - throw new ArgumentException (String.Format ("The type or method has {0} generic parameter(s) but {1} generic argument(s) where provided. A generic argument must be provided for each generic parameter.", generic_params.Length, typeArguments.Length), "typeArguments"); - - foreach (Type t in typeArguments) { - if (t == null) - throw new ArgumentNullException ("typeArguments"); - } - - Type[] copy = new Type [typeArguments.Length]; - typeArguments.CopyTo (copy, 0); - return pmodule.assemblyb.MakeGenericType (this, copy); - } - - public override Type MakePointerType () - { - return new PointerType (this); - } - - public override RuntimeTypeHandle TypeHandle { - get { - check_created (); - return created.TypeHandle; - } - } - - public void SetCustomAttribute (CustomAttributeBuilder customBuilder) - { - if (customBuilder == null) - throw new ArgumentNullException ("customBuilder"); - - string attrname = customBuilder.Ctor.ReflectedType.FullName; - if (attrname == "System.Runtime.InteropServices.StructLayoutAttribute") { - byte[] data = customBuilder.Data; - int layout_kind; /* the (stupid) ctor takes a short or an int ... */ - layout_kind = (int)data [2]; - layout_kind |= ((int)data [3]) << 8; - attrs &= ~TypeAttributes.LayoutMask; - switch ((LayoutKind)layout_kind) { - case LayoutKind.Auto: - attrs |= TypeAttributes.AutoLayout; - break; - case LayoutKind.Explicit: - attrs |= TypeAttributes.ExplicitLayout; - break; - case LayoutKind.Sequential: - attrs |= TypeAttributes.SequentialLayout; - break; - default: - // we should ignore it since it can be any value anyway... - throw new Exception ("Error in customattr"); - } - - var ctor_type = customBuilder.Ctor is ConstructorBuilder ? ((ConstructorBuilder)customBuilder.Ctor).parameters[0] : customBuilder.Ctor.GetParametersInternal()[0].ParameterType; - int pos = 6; - if (ctor_type.FullName == "System.Int16") - pos = 4; - int nnamed = (int)data [pos++]; - nnamed |= ((int)data [pos++]) << 8; - for (int i = 0; i < nnamed; ++i) { - //byte named_type = data [pos++]; - pos ++; - byte type = data [pos++]; - int len; - string named_name; - - if (type == 0x55) { - len = CustomAttributeBuilder.decode_len (data, pos, out pos); - //string named_typename = - CustomAttributeBuilder.string_from_bytes (data, pos, len); - pos += len; - // FIXME: Check that 'named_type' and 'named_typename' match, etc. - // See related code/FIXME in mono/mono/metadata/reflection.c - } - - len = CustomAttributeBuilder.decode_len (data, pos, out pos); - named_name = CustomAttributeBuilder.string_from_bytes (data, pos, len); - pos += len; - /* all the fields are integers in StructLayout */ - int value = (int)data [pos++]; - value |= ((int)data [pos++]) << 8; - value |= ((int)data [pos++]) << 16; - value |= ((int)data [pos++]) << 24; - switch (named_name) { - case "CharSet": - switch ((CharSet)value) { - case CharSet.None: - case CharSet.Ansi: - attrs &= ~(TypeAttributes.UnicodeClass | TypeAttributes.AutoClass); - break; - case CharSet.Unicode: - attrs &= ~TypeAttributes.AutoClass; - attrs |= TypeAttributes.UnicodeClass; - break; - case CharSet.Auto: - attrs &= ~TypeAttributes.UnicodeClass; - attrs |= TypeAttributes.AutoClass; - break; - default: - break; // error out... - } - break; - case "Pack": - packing_size = (PackingSize)value; - break; - case "Size": - class_size = value; - break; - default: - break; // error out... - } - } - return; - } else if (attrname == "System.Runtime.CompilerServices.SpecialNameAttribute") { - attrs |= TypeAttributes.SpecialName; - return; - } else if (attrname == "System.SerializableAttribute") { - attrs |= TypeAttributes.Serializable; - return; - } else if (attrname == "System.Runtime.InteropServices.ComImportAttribute") { - attrs |= TypeAttributes.Import; - return; - } else if (attrname == "System.Security.SuppressUnmanagedCodeSecurityAttribute") { - attrs |= TypeAttributes.HasSecurity; - } - - if (cattrs != null) { - CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1]; - cattrs.CopyTo (new_array, 0); - new_array [cattrs.Length] = customBuilder; - cattrs = new_array; - } else { - cattrs = new CustomAttributeBuilder [1]; - cattrs [0] = customBuilder; - } - } - - [ComVisible (true)] - public void SetCustomAttribute (ConstructorInfo con, byte[] binaryAttribute) - { - SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute)); - } - - public EventBuilder DefineEvent (string name, EventAttributes attributes, Type eventtype) - { - check_name ("name", name); - if (eventtype == null) - throw new ArgumentNullException ("type"); - check_not_created (); - if (eventtype.IsByRef) - throw new ArgumentException (nameof (eventtype)); - EventBuilder res = new EventBuilder (this, name, attributes, eventtype); - if (events != null) { - EventBuilder[] new_events = new EventBuilder [events.Length+1]; - System.Array.Copy (events, new_events, events.Length); - new_events [events.Length] = res; - events = new_events; - } else { - events = new EventBuilder [1]; - events [0] = res; - } - return res; - } - - public FieldBuilder DefineInitializedData (string name, byte[] data, FieldAttributes attributes) { - if (data == null) - throw new ArgumentNullException ("data"); - - FieldBuilder res = DefineUninitializedData (name, data.Length, attributes); - res.SetRVAData (data); - return res; - } - - public FieldBuilder DefineUninitializedData (string name, int size, FieldAttributes attributes) - { - if (name == null) - throw new ArgumentNullException ("name"); - if (name.Length == 0) - throw new ArgumentException ("Empty name is not legal", "name"); - if ((size <= 0) || (size > 0x3f0000)) - throw new ArgumentException ("Data size must be > 0 and < 0x3f0000"); - check_not_created (); - - string typeName = "$ArrayType$" + size; - TypeIdentifier ident = TypeIdentifiers.WithoutEscape (typeName); - Type datablobtype = pmodule.GetRegisteredType (fullname.NestedName(ident)); - if (datablobtype == null) { - TypeBuilder tb = DefineNestedType (typeName, - TypeAttributes.NestedPrivate|TypeAttributes.ExplicitLayout|TypeAttributes.Sealed, - typeof (ValueType), null, PackingSize.Size1, size); - tb.CreateType (); - datablobtype = tb; - } - return DefineField (name, datablobtype, attributes|FieldAttributes.Static|FieldAttributes.HasFieldRVA); - } - - public TypeToken TypeToken { - get { - return new TypeToken (0x02000000 | table_idx); - } - } - - public void SetParent (Type parent) - { - check_not_created (); - - if (parent == null) { - if ((attrs & TypeAttributes.Interface) != 0) { - if ((attrs & TypeAttributes.Abstract) == 0) - throw new InvalidOperationException ("Interface must be declared abstract."); - this.parent = null; - } else { - this.parent = typeof (object); - } - } else { - if (parent.IsInterface) - throw new ArgumentException (nameof (parent)); - this.parent = parent; - } - this.parent = ResolveUserType (this.parent); - } - - internal int get_next_table_index (object obj, int table, int count) { - return pmodule.get_next_table_index (obj, table, count); - } - - [ComVisible (true)] - public override InterfaceMapping GetInterfaceMap (Type interfaceType) - { - if (created == null) - throw new NotSupportedException ("This method is not implemented for incomplete types."); - - return created.GetInterfaceMap (interfaceType); - } - - internal override Type InternalResolve () - { - check_created (); - return created; - } - - internal override Type RuntimeResolve () - { - check_created (); - return created; - } - - internal bool is_created { - get { - return createTypeCalled; - } - } - - private Exception not_supported () - { - return new NotSupportedException ("The invoked member is not supported in a dynamic module."); - } - - internal void check_not_created () - { - if (is_created) - throw new InvalidOperationException ("Unable to change after type has been created."); - } - - private void check_created () - { - if (!is_created) - throw not_supported (); - } - - private void check_name (string argName, string name) - { - if (name == null) - throw new ArgumentNullException (argName); - if (name.Length == 0) - throw new ArgumentException ("Empty name is not legal", argName); - if (name [0] == ((char)0)) - throw new ArgumentException ("Illegal name", argName); - } - - public override String ToString () - { - return FullName; - } - - // FIXME: - public override bool IsAssignableFrom (Type c) - { - return base.IsAssignableFrom (c); - } - - // FIXME: "arrays" - internal bool IsAssignableTo (Type c) - { - if (c == this) - return true; - - if (c.IsInterface) { - if (parent != null && is_created) { - if (c.IsAssignableFrom (parent)) - return true; - } - - if (interfaces == null) - return false; - foreach (Type t in interfaces) - if (c.IsAssignableFrom (t)) - return true; - if (!is_created) - return false; - } - - if (parent == null) - return c == typeof (object); - else - return c.IsAssignableFrom (parent); - } - - public bool IsCreated () - { - return is_created; - } - - public override Type[] GetGenericArguments () - { - if (generic_params == null) - return null; - Type[] args = new Type [generic_params.Length]; - generic_params.CopyTo (args, 0); - return args; - } - - public override Type GetGenericTypeDefinition () - { - if (generic_params == null) - throw new InvalidOperationException ("Type is not generic"); - return this; - } - - public override bool ContainsGenericParameters { - get { - return generic_params != null; - } - } - - public override bool IsGenericParameter { - get { - return false; - } - } - - public override GenericParameterAttributes GenericParameterAttributes { - get { return GenericParameterAttributes.None; } - } - - public override bool IsGenericTypeDefinition { - get { - return generic_params != null; - } - } - - public override bool IsGenericType { - get { return IsGenericTypeDefinition; } - } - - // FIXME: - public override int GenericParameterPosition { - get { - return 0; - } - } - - public override MethodBase DeclaringMethod { - get { - return null; - } - } - - public GenericTypeParameterBuilder[] DefineGenericParameters (params string[] names) - { - if (names == null) - throw new ArgumentNullException ("names"); - if (names.Length == 0) - throw new ArgumentException ("names"); - - generic_params = new GenericTypeParameterBuilder [names.Length]; - for (int i = 0; i < names.Length; i++) { - string item = names [i]; - if (item == null) - throw new ArgumentNullException ("names"); - generic_params [i] = new GenericTypeParameterBuilder (this, null, item, i); - } - - return generic_params; - } - - public static ConstructorInfo GetConstructor (Type type, ConstructorInfo constructor) - { - /*FIXME I would expect the same checks of GetMethod here*/ - if (type == null) - throw new ArgumentException ("Type is not generic", "type"); - - if (!type.IsGenericType) - throw new ArgumentException ("Type is not a generic type", "type"); - - if (type.IsGenericTypeDefinition) - throw new ArgumentException ("Type cannot be a generic type definition", "type"); - - if (constructor == null) - throw new NullReferenceException (); //MS raises this instead of an ArgumentNullException - - if (!constructor.DeclaringType.IsGenericTypeDefinition) - throw new ArgumentException ("constructor declaring type is not a generic type definition", "constructor"); - if (constructor.DeclaringType != type.GetGenericTypeDefinition ()) - throw new ArgumentException ("constructor declaring type is not the generic type definition of type", "constructor"); - - ConstructorInfo res = type.GetConstructor (constructor); - if (res == null) - throw new ArgumentException ("constructor not found"); - - return res; - } - - static bool IsValidGetMethodType (Type type) - { - if (type is TypeBuilder || type is TypeBuilderInstantiation) - return true; - /*GetMethod() must work with TypeBuilders after CreateType() was called.*/ - if (type.Module is ModuleBuilder) - return true; - if (type.IsGenericParameter) - return false; - - Type[] inst = type.GetGenericArguments (); - if (inst == null) - return false; - for (int i = 0; i < inst.Length; ++i) { - if (IsValidGetMethodType (inst [i])) - return true; - } - return false; - } - - public static MethodInfo GetMethod (Type type, MethodInfo method) - { - if (!IsValidGetMethodType (type)) - throw new ArgumentException ("type is not TypeBuilder but " + type.GetType (), "type"); - - if (type is TypeBuilder && type.ContainsGenericParameters) - type = type.MakeGenericType (type.GetGenericArguments ()); - - if (!type.IsGenericType) - throw new ArgumentException ("type is not a generic type", "type"); - - if (!method.DeclaringType.IsGenericTypeDefinition) - throw new ArgumentException ("method declaring type is not a generic type definition", "method"); - if (method.DeclaringType != type.GetGenericTypeDefinition ()) - throw new ArgumentException ("method declaring type is not the generic type definition of type", "method"); - if (method == null) - throw new NullReferenceException (); //MS raises this instead of an ArgumentNullException - - MethodInfo res = type.GetMethod (method); - if (res == null) - throw new ArgumentException (String.Format ("method {0} not found in type {1}", method.Name, type)); - - return res; - } - - public static FieldInfo GetField (Type type, FieldInfo field) - { - if (!type.IsGenericType) - throw new ArgumentException ("Type is not a generic type", "type"); - - if (type.IsGenericTypeDefinition) - throw new ArgumentException ("Type cannot be a generic type definition", "type"); - - if (field is FieldOnTypeBuilderInst) - throw new ArgumentException ("The specified field must be declared on a generic type definition.", "field"); - - if (field.DeclaringType != type.GetGenericTypeDefinition ()) - throw new ArgumentException ("field declaring type is not the generic type definition of type", "method"); - - FieldInfo res = type.GetField (field); - if (res == null) - throw new System.Exception ("field not found"); - else - return res; - } - - internal override bool IsUserType { - get { - return false; - } - } - - internal override bool IsTypeBuilder () => true; - - public override bool IsConstructedGenericType { - get { return false; } - } - - public override bool IsAssignableFrom (TypeInfo typeInfo) - { - return base.IsAssignableFrom (typeInfo); - } - - internal static bool SetConstantValue (Type destType, Object value, ref Object destValue) - { - // Mono: This is based on the CoreCLR - // TypeBuilder.SetConstantValue except it writes to an - // out argument instead of doing an icall, and it uses - // TypeCode instead of CorElementType (like - // MonoTypeEnum) which we don't have in our corlib and - // our member fields are different. - - // This is a helper function that is used by ParameterBuilder, PropertyBuilder, - // and FieldBuilder to validate a default value and save it in the meta-data. - - if (value != null) { - Type type = value.GetType (); - - // We should allow setting a constant value on a ByRef parameter - if (destType.IsByRef) - destType = destType.GetElementType (); - - // Convert nullable types to their underlying type. - // This is necessary for nullable enum types to pass the IsEnum check that's coming next. - destType = Nullable.GetUnderlyingType (destType) ?? destType; - - if (destType.IsEnum) - { - // | UnderlyingSystemType | Enum.GetUnderlyingType() | IsEnum - // ----------------------------------|---------------------------|---------------------------|--------- - // runtime Enum Type | self | underlying type of enum | TRUE - // EnumBuilder | underlying type of enum | underlying type of enum* | TRUE - // TypeBuilder of enum types** | underlying type of enum | Exception | TRUE - // TypeBuilder of enum types (baked) | runtime enum type | Exception | TRUE - - // *: the behavior of Enum.GetUnderlyingType(EnumBuilder) might change in the future - // so let's not depend on it. - // **: created with System.Enum as the parent type. - - // The above behaviors might not be the most consistent but we have to live with them. - - Type underlyingType; - EnumBuilder enumBldr; - TypeBuilder typeBldr; - if ((enumBldr = destType as EnumBuilder) != null) { - underlyingType = enumBldr.GetEnumUnderlyingType (); - - // The constant value supplied should match either the baked enum type or its underlying type - // we don't need to compare it with the EnumBuilder itself because you can never have an object of that type - if (!((enumBldr.GetTypeBuilder ().is_created && type == enumBldr.GetTypeBuilder ().created) || - type == underlyingType)) - throw_argument_ConstantDoesntMatch (); - } else if ((typeBldr = destType as TypeBuilder) != null) { - underlyingType = typeBldr.underlying_type; - - // The constant value supplied should match either the baked enum type or its underlying type - // typeBldr.m_enumUnderlyingType is null if the user hasn't created a "value__" field on the enum - if (underlyingType == null || (type != typeBldr.UnderlyingSystemType && type != underlyingType)) - throw_argument_ConstantDoesntMatch (); - } else { - // must be a runtime Enum Type - - // Debug.Assert(destType is RuntimeType, "destType is not a runtime type, an EnumBuilder, or a TypeBuilder."); - - underlyingType = Enum.GetUnderlyingType (destType); - - // The constant value supplied should match either the enum itself or its underlying type - if (type != destType && type != underlyingType) - throw_argument_ConstantDoesntMatch (); - } - - type = underlyingType; - } else { - // Note that it is non CLS compliant if destType != type. But RefEmit never guarantees CLS-Compliance. - if (!destType.IsAssignableFrom (type)) - throw_argument_ConstantDoesntMatch (); - } - - TypeCode corType = Type.GetTypeCode (type); - - switch (corType) - { - case TypeCode.Byte: - case TypeCode.SByte: - case TypeCode.Boolean: - case TypeCode.Int16: - case TypeCode.UInt16: - case TypeCode.Char: - case TypeCode.Int32: - case TypeCode.UInt32: - case TypeCode.Single: - case TypeCode.Int64: - case TypeCode.UInt64: - case TypeCode.Double: - destValue = value; - return true; - case TypeCode.String: - destValue = value; - return true; - case TypeCode.DateTime: - //date is a I8 representation - long ticks = ((DateTime)value).Ticks; - destValue = ticks; - return true; - default: - throw new ArgumentException(type.ToString() + " is not a supported constant type."); - } - } else { - // A null default value in metadata is permissible even for non-nullable value types. - // (See ECMA-335 II.15.4.1.4 "The .param directive" and II.22.9 "Constant" for details.) - // This is how the Roslyn compilers generally encode `default(TValueType)` default values. - - destValue = null; - return true; - } - } - - private static void throw_argument_ConstantDoesntMatch () - { - throw new ArgumentException("Constant does not match the defined type."); - } - - public override bool IsTypeDefinition => true; - } + [StructLayout(LayoutKind.Sequential)] + public sealed partial class TypeBuilder : TypeInfo + { +#pragma warning disable 169 + #region Sync with reflection.h + private string tname; // name in internal form + private string nspace; // namespace in internal form + private Type parent; + private Type nesting_type; + internal Type[] interfaces; + internal int num_methods; + internal MethodBuilder[] methods; + internal ConstructorBuilder[] ctors; + internal PropertyBuilder[] properties; + internal int num_fields; + internal FieldBuilder[] fields; + internal EventBuilder[] events; + private CustomAttributeBuilder[] cattrs; + internal TypeBuilder[] subtypes; + internal TypeAttributes attrs; + private int table_idx; + private ModuleBuilder pmodule; + private int class_size; + private PackingSize packing_size; + private IntPtr generic_container; + private GenericTypeParameterBuilder[] generic_params; + private object permissions; + private TypeInfo created; + private int state; + #endregion +#pragma warning restore 169 + + private ITypeName fullname; + private bool createTypeCalled; + private Type underlying_type; + + public const int UnspecifiedTypeSize = 0; + + protected override TypeAttributes GetAttributeFlagsImpl() + { + return attrs; + } + + internal TypeBuilder(ModuleBuilder mb, TypeAttributes attr, int table_idx) + { + this.parent = null; + this.attrs = attr; + this.class_size = UnspecifiedTypeSize; + this.table_idx = table_idx; + this.tname = table_idx == 1 ? "" : "type_" + table_idx.ToString(); + this.nspace = string.Empty; + this.fullname = TypeIdentifiers.WithoutEscape(this.tname); + pmodule = mb; + } + + internal TypeBuilder(ModuleBuilder mb, string name, TypeAttributes attr, Type parent, Type[] interfaces, PackingSize packing_size, int type_size, Type nesting_type) + { + int sep_index; + this.parent = ResolveUserType(parent); + this.attrs = attr; + this.class_size = type_size; + this.packing_size = packing_size; + this.nesting_type = nesting_type; + + check_name("fullname", name); + + if (parent == null && (attr & TypeAttributes.Interface) != 0 && (attr & TypeAttributes.Abstract) == 0) + throw new InvalidOperationException("Interface must be declared abstract."); + + sep_index = name.LastIndexOf('.'); + if (sep_index != -1) + { + this.tname = name.Substring(sep_index + 1); + this.nspace = name.Substring(0, sep_index); + } + else + { + this.tname = name; + this.nspace = string.Empty; + } + if (interfaces != null) + { + this.interfaces = new Type[interfaces.Length]; + Array.Copy(interfaces, this.interfaces, interfaces.Length); + } + pmodule = mb; + + if (((attr & TypeAttributes.Interface) == 0) && (parent == null)) + this.parent = typeof(object); + + // skip . ? + table_idx = mb.get_next_table_index(this, 0x02, 1); + fullname = GetFullName(); + } + + public override Assembly Assembly + { + get { return pmodule.Assembly; } + } + + public override string AssemblyQualifiedName + { + get + { + return fullname.DisplayName + ", " + Assembly.FullName; + } + } + + public override Type BaseType + { + get + { + return parent; + } + } + + public override Type DeclaringType + { + get { return nesting_type; } + } + + [ComVisible(true)] + public override bool IsSubclassOf(Type c) + { + Type t; + if (c == null) + return false; + if (c == this) + return false; + t = parent; + while (t != null) + { + if (c == t) + return true; + t = t.BaseType; + } + return false; + } + + public override Type UnderlyingSystemType + { + get + { + if (is_created) + return created.UnderlyingSystemType; + + if (IsEnum) + { + if (underlying_type != null) + return underlying_type; + throw new InvalidOperationException( + "Enumeration type is not defined."); + } + + return this; + } + } + + private ITypeName GetFullName() + { + ITypeIdentifier ident = TypeIdentifiers.FromInternal(tname); + if (nesting_type != null) + return TypeNames.FromDisplay(nesting_type.FullName).NestedName(ident); + if ((nspace != null) && (nspace.Length > 0)) + return TypeIdentifiers.FromInternal(nspace, ident); + return ident; + } + + public override string FullName + { + get + { + return fullname.DisplayName; + } + } + + public override Guid GUID + { + get + { + check_created(); + return created.GUID; + } + } + + public override Module Module + { + get { return pmodule; } + } + + public override string Name + { + get { return tname; } + } + + public override string Namespace + { + get { return nspace; } + } + + public PackingSize PackingSize + { + get { return packing_size; } + } + + public int Size + { + get { return class_size; } + } + + public override Type ReflectedType + { + get { return nesting_type; } + } + + [ComVisible(true)] + public void AddInterfaceImplementation(Type interfaceType) + { + if (interfaceType == null) + throw new ArgumentNullException(nameof(interfaceType)); + if (interfaceType.IsByRef) + throw new ArgumentException(nameof(interfaceType)); + check_not_created(); + + if (interfaces != null) + { + // Check for duplicates + foreach (Type t in interfaces) + if (t == interfaceType) + return; + + Type[] ifnew = new Type[interfaces.Length + 1]; + interfaces.CopyTo(ifnew, 0); + ifnew[interfaces.Length] = interfaceType; + interfaces = ifnew; + } + else + { + interfaces = new Type[1]; + interfaces[0] = interfaceType; + } + } + + protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr, Binder binder, + CallingConventions callConvention, Type[] types, + ParameterModifier[] modifiers) + { + check_created(); + + if (created == typeof(object)) + { + /* + * This happens when building corlib. Calling created.GetConstructor + * would return constructors from the real mscorlib, instead of the + * newly built one. + */ + + if (ctors == null) + return null; + + ConstructorBuilder found = null; + int count = 0; + + foreach (ConstructorBuilder cb in ctors) + { + if (callConvention != CallingConventions.Any && cb.CallingConvention != callConvention) + continue; + found = cb; + count++; + } + + if (count == 0) + return null; + if (types == null) + { + if (count > 1) + throw new AmbiguousMatchException(); + return found; + } + MethodBase[] match = new MethodBase[count]; + if (count == 1) + match[0] = found; + else + { + count = 0; + foreach (ConstructorInfo m in ctors) + { + if (callConvention != CallingConventions.Any && m.CallingConvention != callConvention) + continue; + match[count++] = m; + } + } + if (binder == null) + binder = DefaultBinder; + return (ConstructorInfo)binder.SelectMethod(bindingAttr, match, + types, modifiers); + } + + return created.GetConstructor(bindingAttr, binder, + callConvention, types, modifiers); + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + if (!is_created) + throw new NotSupportedException(); + /* + * MS throws NotSupported here, but we can't because some corlib + * classes make calls to IsDefined. + */ + return CustomAttribute.IsDefined(this, attributeType, inherit); + } + + public override object[] GetCustomAttributes(bool inherit) + { + check_created(); + + return created.GetCustomAttributes(inherit); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + check_created(); + + return created.GetCustomAttributes(attributeType, inherit); + } + + public TypeBuilder DefineNestedType(string name) + { + return DefineNestedType(name, TypeAttributes.NestedPrivate, + typeof(object), null); + } + + public TypeBuilder DefineNestedType(string name, TypeAttributes attr) + { + return DefineNestedType(name, attr, typeof(object), null); + } + + public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type parent) + { + return DefineNestedType(name, attr, parent, null); + } + + private TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type parent, Type[] interfaces, + PackingSize packSize, int typeSize) + { + // Visibility must be NestedXXX + /* This breaks mcs + if (((attrs & TypeAttributes.VisibilityMask) == TypeAttributes.Public) || + ((attrs & TypeAttributes.VisibilityMask) == TypeAttributes.NotPublic)) + throw new ArgumentException ("attr", "Bad type flags for nested type."); + */ + if (interfaces != null) + { + foreach (Type iface in interfaces) + { + if (iface == null) + throw new ArgumentNullException(nameof(interfaces)); + if (iface.IsByRef) + throw new ArgumentException(nameof(interfaces)); + } + } + + TypeBuilder res = new TypeBuilder(pmodule, name, attr, parent, interfaces, packSize, typeSize, this); + res.fullname = res.GetFullName(); + pmodule.RegisterTypeName(res, res.fullname); + if (subtypes != null) + { + TypeBuilder[] new_types = new TypeBuilder[subtypes.Length + 1]; + Array.Copy(subtypes, new_types, subtypes.Length); + new_types[subtypes.Length] = res; + subtypes = new_types; + } + else + { + subtypes = new TypeBuilder[1]; + subtypes[0] = res; + } + return res; + } + + [ComVisible(true)] + public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type parent, Type[] interfaces) + { + return DefineNestedType(name, attr, parent, interfaces, PackingSize.Unspecified, UnspecifiedTypeSize); + } + + public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type parent, int typeSize) + { + return DefineNestedType(name, attr, parent, null, PackingSize.Unspecified, typeSize); + } + + public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type parent, PackingSize packSize) + { + return DefineNestedType(name, attr, parent, null, packSize, UnspecifiedTypeSize); + } + + public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type parent, PackingSize packSize, + int typeSize) + { + return DefineNestedType(name, attr, parent, null, packSize, typeSize); + } + + [ComVisible(true)] + public ConstructorBuilder DefineConstructor(MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes) + { + return DefineConstructor(attributes, callingConvention, parameterTypes, null, null); + } + + [ComVisible(true)] + public ConstructorBuilder DefineConstructor(MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes, Type[][] requiredCustomModifiers, Type[][] optionalCustomModifiers) + { + check_not_created(); + if (IsInterface && (attributes & MethodAttributes.Static) == 0) + throw new InvalidOperationException(); + ConstructorBuilder cb = new ConstructorBuilder(this, attributes, + callingConvention, parameterTypes, requiredCustomModifiers, + optionalCustomModifiers); + if (ctors != null) + { + ConstructorBuilder[] new_ctors = new ConstructorBuilder[ctors.Length + 1]; + Array.Copy(ctors, new_ctors, ctors.Length); + new_ctors[ctors.Length] = cb; + ctors = new_ctors; + } + else + { + ctors = new ConstructorBuilder[1]; + ctors[0] = cb; + } + return cb; + } + + [ComVisible(true)] + public ConstructorBuilder DefineDefaultConstructor(MethodAttributes attributes) + { + Type parent_type, old_parent_type; + + if (IsInterface) + throw new InvalidOperationException(); + if ((attributes & (MethodAttributes.Static | MethodAttributes.Virtual)) > 0) + throw new ArgumentException(nameof(attributes)); + + if (parent != null) + parent_type = parent; + else + parent_type = typeof(object); + + old_parent_type = parent_type; + parent_type = parent_type.InternalResolve(); + /*This avoids corlib to have self references.*/ + if (parent_type == typeof(object) || parent_type == typeof(ValueType)) + parent_type = old_parent_type; + + ConstructorInfo parent_constructor = + parent_type.GetConstructor( + BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, + null, EmptyTypes, null); + if (parent_constructor == null) + { + throw new NotSupportedException("Parent does" + + " not have a default constructor." + + " The default constructor must be" + + " explicitly defined."); + } + + ConstructorBuilder cb = DefineConstructor(attributes, + CallingConventions.Standard, EmptyTypes); + ILGenerator ig = cb.GetILGenerator(); + ig.Emit(OpCodes.Ldarg_0); + ig.Emit(OpCodes.Call, parent_constructor); + ig.Emit(OpCodes.Ret); + cb.finished = true; + return cb; + } + + private void append_method(MethodBuilder mb) + { + if (methods != null) + { + if (methods.Length == num_methods) + { + MethodBuilder[] new_methods = new MethodBuilder[methods.Length * 2]; + Array.Copy(methods, new_methods, num_methods); + methods = new_methods; + } + } + else + { + methods = new MethodBuilder[1]; + } + methods[num_methods] = mb; + num_methods++; + } + + public MethodBuilder DefineMethod(string name, MethodAttributes attributes, Type returnType, Type[] parameterTypes) + { + return DefineMethod(name, attributes, CallingConventions.Standard, + returnType, parameterTypes); + } + + public MethodBuilder DefineMethod(string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) + { + return DefineMethod(name, attributes, callingConvention, returnType, + null, null, parameterTypes, null, null); + } + + public MethodBuilder DefineMethod(string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) + { + check_name("name", name); + check_not_created(); + if (IsInterface && ( + !((attributes & MethodAttributes.Abstract) != 0) || + !((attributes & MethodAttributes.Virtual) != 0)) && + !(((attributes & MethodAttributes.Static) != 0))) + throw new ArgumentException("Interface method must be abstract and virtual."); + + if (returnType == null) + returnType = typeof(void); + MethodBuilder res = new MethodBuilder(this, name, attributes, + callingConvention, returnType, + returnTypeRequiredCustomModifiers, + returnTypeOptionalCustomModifiers, parameterTypes, + parameterTypeRequiredCustomModifiers, + parameterTypeOptionalCustomModifiers); + append_method(res); + return res; + } + + public MethodBuilder DefinePInvokeMethod(string name, string dllName, string entryName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) + { + return DefinePInvokeMethod(name, dllName, entryName, attributes, + callingConvention, returnType, null, null, parameterTypes, + null, null, nativeCallConv, nativeCharSet); + } + + public MethodBuilder DefinePInvokeMethod( + string name, + string dllName, + string entryName, MethodAttributes attributes, + CallingConventions callingConvention, + Type returnType, + Type[] returnTypeRequiredCustomModifiers, + Type[] returnTypeOptionalCustomModifiers, + Type[] parameterTypes, + Type[][] parameterTypeRequiredCustomModifiers, + Type[][] parameterTypeOptionalCustomModifiers, + CallingConvention nativeCallConv, + CharSet nativeCharSet) + { + check_name("name", name); + check_name("dllName", dllName); + check_name("entryName", entryName); + if ((attributes & MethodAttributes.Abstract) != 0) + throw new ArgumentException("PInvoke methods must be static and native and cannot be abstract."); + if (IsInterface) + throw new ArgumentException("PInvoke methods cannot exist on interfaces."); + check_not_created(); + + MethodBuilder res + = new MethodBuilder( + this, + name, + attributes, + callingConvention, + returnType, + returnTypeRequiredCustomModifiers, + returnTypeOptionalCustomModifiers, + parameterTypes, + parameterTypeRequiredCustomModifiers, + parameterTypeOptionalCustomModifiers, + dllName, + entryName, + nativeCallConv, + nativeCharSet); + append_method(res); + return res; + } + + public MethodBuilder DefinePInvokeMethod(string name, string dllName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) + { + return DefinePInvokeMethod(name, dllName, name, attributes, callingConvention, returnType, parameterTypes, + nativeCallConv, nativeCharSet); + } + + public MethodBuilder DefineMethod(string name, MethodAttributes attributes) + { + return DefineMethod(name, attributes, CallingConventions.Standard); + } + + public MethodBuilder DefineMethod(string name, MethodAttributes attributes, CallingConventions callingConvention) + { + return DefineMethod(name, attributes, callingConvention, null, null); + } + + public void DefineMethodOverride(MethodInfo methodInfoBody, MethodInfo methodInfoDeclaration) + { + if (methodInfoBody == null) + throw new ArgumentNullException(nameof(methodInfoBody)); + if (methodInfoDeclaration == null) + throw new ArgumentNullException(nameof(methodInfoDeclaration)); + check_not_created(); + if (methodInfoBody.DeclaringType != this) + throw new ArgumentException("method body must belong to this type"); + + if (methodInfoBody is MethodBuilder) + { + MethodBuilder mb = (MethodBuilder)methodInfoBody; + mb.set_override(methodInfoDeclaration); + } + } + + public FieldBuilder DefineField(string fieldName, Type type, FieldAttributes attributes) + { + return DefineField(fieldName, type, null, null, attributes); + } + + public FieldBuilder DefineField(string fieldName, Type type, Type[] requiredCustomModifiers, Type[] optionalCustomModifiers, FieldAttributes attributes) + { + check_name("fieldName", fieldName); + if (type == typeof(void)) + throw new ArgumentException("Bad field type in defining field."); + check_not_created(); + + FieldBuilder res = new FieldBuilder(this, fieldName, type, attributes, requiredCustomModifiers, optionalCustomModifiers); + if (fields != null) + { + if (fields.Length == num_fields) + { + FieldBuilder[] new_fields = new FieldBuilder[fields.Length * 2]; + Array.Copy(fields, new_fields, num_fields); + fields = new_fields; + } + fields[num_fields] = res; + num_fields++; + } + else + { + fields = new FieldBuilder[1]; + fields[0] = res; + num_fields++; + } + + if (IsEnum) + { + if (underlying_type == null && (attributes & FieldAttributes.Static) == 0) + underlying_type = type; + } + + return res; + } + + public PropertyBuilder DefineProperty(string name, PropertyAttributes attributes, Type returnType, Type[] parameterTypes) + { + return DefineProperty(name, attributes, 0, returnType, null, null, parameterTypes, null, null); + } + + public PropertyBuilder DefineProperty(string name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) + { + return DefineProperty(name, attributes, callingConvention, returnType, null, null, parameterTypes, null, null); + } + + public PropertyBuilder DefineProperty(string name, PropertyAttributes attributes, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) + { + return DefineProperty(name, attributes, 0, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); + } + + public PropertyBuilder DefineProperty(string name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) + { + check_name("name", name); + if (parameterTypes != null) + foreach (Type param in parameterTypes) + if (param == null) + throw new ArgumentNullException(nameof(parameterTypes)); + check_not_created(); + + PropertyBuilder res = new PropertyBuilder(this, name, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); + + if (properties != null) + { + Array.Resize(ref properties, properties.Length + 1); + properties[properties.Length - 1] = res; + } + else + { + properties = new PropertyBuilder[1] { res }; + } + return res; + } + + [ComVisible(true)] + public ConstructorBuilder DefineTypeInitializer() + { + return DefineConstructor(MethodAttributes.Public | + MethodAttributes.Static | MethodAttributes.SpecialName | + MethodAttributes.RTSpecialName, CallingConventions.Standard, + null); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern TypeInfo create_runtime_class(); + + private bool is_nested_in(Type t) + { + while (t != null) + { + if (t == this) + return true; + else + t = t.DeclaringType; + } + return false; + } + + // Return whenever this type has a ctor defined using DefineMethod () + private bool has_ctor_method() + { + MethodAttributes ctor_attrs = MethodAttributes.SpecialName | MethodAttributes.RTSpecialName; + + for (int i = 0; i < num_methods; ++i) + { + MethodBuilder mb = (MethodBuilder)(methods[i]); + + if (mb.Name == ConstructorInfo.ConstructorName && (mb.Attributes & ctor_attrs) == ctor_attrs) + return true; + } + + return false; + } + + public Type CreateType() + { + return CreateTypeInfo(); + } + + public + TypeInfo CreateTypeInfo() + { + /* handle nesting_type */ + if (createTypeCalled) + return created; + + if (!IsInterface && (parent == null) && (this != typeof(object)) && (FullName != "")) + { + SetParent(typeof(object)); + } + + // Fire TypeResolve events for fields whose type is an unfinished + // value type. + if (fields != null) + { + foreach (FieldBuilder fb in fields) + { + if (fb == null) + continue; + Type ft = fb.FieldType; + if (!fb.IsStatic && (ft is TypeBuilder) && ft.IsValueType && (ft != this) && is_nested_in(ft)) + { + TypeBuilder tb = (TypeBuilder)ft; + if (!tb.is_created) + { + throw new NotImplementedException(); + } + } + } + } + + if (parent != null) + { + if (parent.IsByRef) + throw new ArgumentException(); + if (IsInterface) + throw new TypeLoadException(); + } + + // + // On classes, define a default constructor if not provided + // + if (!(IsInterface || IsValueType) && (ctors == null) && (tname != "") && + (GetAttributeFlagsImpl() & TypeAttributes.Abstract | TypeAttributes.Sealed) != (TypeAttributes.Abstract | TypeAttributes.Sealed) && !has_ctor_method()) + DefineDefaultConstructor(MethodAttributes.Public); + + createTypeCalled = true; + + if (parent != null) + { + if (parent.IsSealed) + throw new TypeLoadException("Could not load type '" + FullName + "' from assembly '" + Assembly + "' because the parent type is sealed."); + if (parent.IsGenericTypeDefinition) + throw new BadImageFormatException(); + } + + if (parent == typeof(Enum) && methods != null) + throw new TypeLoadException("Could not load type '" + FullName + "' from assembly '" + Assembly + "' because it is an enum with methods."); + if (interfaces != null) + { + foreach (var iface in interfaces) + { + if (iface.IsNestedPrivate && iface.Assembly != Assembly) + throw new TypeLoadException("Could not load type '" + FullName + "' from assembly '" + Assembly + "' because it is implements the inaccessible interface '" + iface.FullName + "'."); + if (iface.IsGenericTypeDefinition) + throw new BadImageFormatException(); + if (!iface.IsInterface) + throw new TypeLoadException(); + if (iface is TypeBuilder && !((TypeBuilder)iface).is_created) + throw new TypeLoadException(); + } + } + + if (fields != null) + { + foreach (FieldBuilder fb in fields) + { + if (fb == null) + continue; + if (fb.FieldType.IsByRef) + throw new COMException(); + } + } + + if (methods != null) + { + bool is_concrete = !IsAbstract; + for (int i = 0; i < num_methods; ++i) + { + MethodBuilder mb = (MethodBuilder)(methods[i]); + if (is_concrete && mb.IsAbstract) + throw new InvalidOperationException("Type is concrete but has abstract method " + mb); + mb.check_override(); + mb.fixup(); + } + } + + if (ctors != null) + { + foreach (ConstructorBuilder ctor in ctors) + ctor.fixup(); + } + + ResolveUserTypes(); + + created = create_runtime_class(); + if (created != null) + return created; + return this; + } + + private void ResolveUserTypes() + { + parent = ResolveUserType(parent); + ResolveUserTypes(interfaces); + if (fields != null) + { + foreach (var fb in fields) + { + if (fb != null) + fb.ResolveUserTypes(); + } + } + if (methods != null) + { + foreach (var mb in methods) + { + if (mb != null) + mb.ResolveUserTypes(); + } + } + if (ctors != null) + { + foreach (var cb in ctors) + { + if (cb != null) + cb.ResolveUserTypes(); + } + } + } + + internal static void ResolveUserTypes(Type[] types) + { + if (types != null) + for (int i = 0; i < types.Length; ++i) + types[i] = ResolveUserType(types[i]); + } + + internal static Type ResolveUserType(Type t) + { + if (t != null && ((t.GetType().Assembly != typeof(int).Assembly) || (t is TypeDelegator))) + { + t = t.UnderlyingSystemType; + if (t != null && ((t.GetType().Assembly != typeof(int).Assembly) || (t is TypeDelegator))) + throw new NotSupportedException("User defined subclasses of System.Type are not yet supported."); + return t; + } + else + { + return t; + } + } + /* + internal void GenerateDebugInfo (ISymbolWriter symbolWriter) + { + symbolWriter.OpenNamespace (this.Namespace); + + if (methods != null) { + for (int i = 0; i < num_methods; ++i) { + MethodBuilder metb = (MethodBuilder) methods[i]; + metb.GenerateDebugInfo (symbolWriter); + } + } + + if (ctors != null) { + foreach (ConstructorBuilder ctor in ctors) + ctor.GenerateDebugInfo (symbolWriter); + } + + symbolWriter.CloseNamespace (); + + if (subtypes != null) { + for (int i = 0; i < subtypes.Length; ++i) + subtypes [i].GenerateDebugInfo (symbolWriter); + } + } + */ + [ComVisible(true)] + public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr) + { + if (is_created) + return created.GetConstructors(bindingAttr); + + throw new NotSupportedException(); + } + + internal ConstructorInfo[] GetConstructorsInternal(BindingFlags bindingAttr) + { + if (ctors == null) + return Array.Empty(); + ArrayList l = new ArrayList(); + bool match; + MethodAttributes mattrs; + + foreach (ConstructorBuilder c in ctors) + { + match = false; + mattrs = c.Attributes; + if ((mattrs & MethodAttributes.MemberAccessMask) == MethodAttributes.Public) + { + if ((bindingAttr & BindingFlags.Public) != 0) + match = true; + } + else + { + if ((bindingAttr & BindingFlags.NonPublic) != 0) + match = true; + } + if (!match) + continue; + match = false; + if ((mattrs & MethodAttributes.Static) != 0) + { + if ((bindingAttr & BindingFlags.Static) != 0) + match = true; + } + else + { + if ((bindingAttr & BindingFlags.Instance) != 0) + match = true; + } + if (!match) + continue; + l.Add(c); + } + ConstructorInfo[] result = new ConstructorInfo[l.Count]; + l.CopyTo(result); + return result; + } + + public override Type GetElementType() + { + throw new NotSupportedException(); + } + + public override EventInfo GetEvent(string name, BindingFlags bindingAttr) + { + check_created(); + return created.GetEvent(name, bindingAttr); + } + + /* Needed to keep signature compatibility with MS.NET */ + public override EventInfo[] GetEvents() + { + const BindingFlags DefaultBindingFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance; + return GetEvents(DefaultBindingFlags); + } + + public override EventInfo[] GetEvents(BindingFlags bindingAttr) + { + if (is_created) + return created.GetEvents(bindingAttr); + throw new NotSupportedException(); + } + + public override FieldInfo GetField(string name, BindingFlags bindingAttr) + { + check_created(); + return created.GetField(name, bindingAttr); + } + + public override FieldInfo[] GetFields(BindingFlags bindingAttr) + { + check_created(); + return created.GetFields(bindingAttr); + } + + public override Type GetInterface(string name, bool ignoreCase) + { + check_created(); + return created.GetInterface(name, ignoreCase); + } + + public override Type[] GetInterfaces() + { + if (is_created) + return created.GetInterfaces(); + + if (interfaces != null) + { + Type[] ret = new Type[interfaces.Length]; + interfaces.CopyTo(ret, 0); + return ret; + } + else + { + return EmptyTypes; + } + } + + public override MemberInfo[] GetMember(string name, MemberTypes type, + BindingFlags bindingAttr) + { + check_created(); + return created.GetMember(name, type, bindingAttr); + } + + public override MemberInfo[] GetMembers(BindingFlags bindingAttr) + { + check_created(); + return created.GetMembers(bindingAttr); + } + + private MethodInfo[] GetMethodsByName(string name, BindingFlags bindingAttr, bool ignoreCase, Type reflected_type) + { + MethodInfo[] candidates; + bool match; + MethodAttributes mattrs; + + if (((bindingAttr & BindingFlags.DeclaredOnly) == 0) && (parent != null)) + { + MethodInfo[] parent_methods = parent.GetMethods(bindingAttr); + ArrayList parent_candidates = new ArrayList(parent_methods.Length); + + bool flatten = (bindingAttr & BindingFlags.FlattenHierarchy) != 0; + + for (int i = 0; i < parent_methods.Length; i++) + { + MethodInfo m = parent_methods[i]; + + mattrs = m.Attributes; + + if (m.IsStatic && !flatten) + continue; + + switch (mattrs & MethodAttributes.MemberAccessMask) + { + case MethodAttributes.Public: + match = (bindingAttr & BindingFlags.Public) != 0; + break; + case MethodAttributes.Assembly: + match = (bindingAttr & BindingFlags.NonPublic) != 0; + break; + case MethodAttributes.Private: + match = false; + break; + default: + match = (bindingAttr & BindingFlags.NonPublic) != 0; + break; + } + + if (match) + parent_candidates.Add(m); + } + + if (methods == null) + { + candidates = new MethodInfo[parent_candidates.Count]; + parent_candidates.CopyTo(candidates); + } + else + { + candidates = new MethodInfo[methods.Length + parent_candidates.Count]; + parent_candidates.CopyTo(candidates, 0); + methods.CopyTo(candidates, parent_candidates.Count); + } + } + else + candidates = methods; + + if (candidates == null) + return Array.Empty(); + + ArrayList l = new ArrayList(); + + foreach (MethodInfo c in candidates) + { + if (c == null) + continue; + if (name != null) + { + if (string.Compare(c.Name, name, ignoreCase) != 0) + continue; + } + match = false; + mattrs = c.Attributes; + if ((mattrs & MethodAttributes.MemberAccessMask) == MethodAttributes.Public) + { + if ((bindingAttr & BindingFlags.Public) != 0) + match = true; + } + else + { + if ((bindingAttr & BindingFlags.NonPublic) != 0) + match = true; + } + if (!match) + continue; + match = false; + if ((mattrs & MethodAttributes.Static) != 0) + { + if ((bindingAttr & BindingFlags.Static) != 0) + match = true; + } + else + { + if ((bindingAttr & BindingFlags.Instance) != 0) + match = true; + } + if (!match) + continue; + l.Add(c); + } + + MethodInfo[] result = new MethodInfo[l.Count]; + l.CopyTo(result); + return result; + } + + public override MethodInfo[] GetMethods(BindingFlags bindingAttr) + { + check_created(); + + return GetMethodsByName(null, bindingAttr, false, this); + } + + protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, + Binder binder, + CallingConventions callConvention, + Type[] types, ParameterModifier[] modifiers) + { + check_created(); + + if (types == null) + return created.GetMethod(name, bindingAttr); + + return created.GetMethod(name, bindingAttr, binder, callConvention, types, modifiers); + } + + public override Type GetNestedType(string name, BindingFlags bindingAttr) + { + check_created(); + + if (subtypes == null) + return null; + + foreach (TypeBuilder t in subtypes) + { + if (!t.is_created) + continue; + if ((t.attrs & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPublic) + { + if ((bindingAttr & BindingFlags.Public) == 0) + continue; + } + else + { + if ((bindingAttr & BindingFlags.NonPublic) == 0) + continue; + } + if (t.Name == name) + return t.created; + } + + return null; + } + + public override Type[] GetNestedTypes(BindingFlags bindingAttr) + { + if (!is_created) + throw new NotSupportedException(); + + bool match; + ArrayList result = new ArrayList(); + + if (subtypes == null) + return EmptyTypes; + foreach (TypeBuilder t in subtypes) + { + match = false; + if ((t.attrs & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPublic) + { + if ((bindingAttr & BindingFlags.Public) != 0) + match = true; + } + else + { + if ((bindingAttr & BindingFlags.NonPublic) != 0) + match = true; + } + if (!match) + continue; + result.Add(t); + } + Type[] r = new Type[result.Count]; + result.CopyTo(r); + return r; + } + + public override PropertyInfo[] GetProperties(BindingFlags bindingAttr) + { + check_created(); + return created.GetProperties(bindingAttr); + } + + protected override PropertyInfo GetPropertyImpl(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) + { + throw not_supported(); + } + + protected override bool HasElementTypeImpl() + { + // a TypeBuilder can never represent an array, pointer + if (!is_created) + return false; + + return created.HasElementType; + } + + public override object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) + { + check_created(); + return created.InvokeMember(name, invokeAttr, binder, target, args, modifiers, culture, namedParameters); + } + + protected override bool IsArrayImpl() + { + return false; /*A TypeBuilder never represents a non typedef type.*/ + } + + protected override bool IsByRefImpl() + { + return false; /*A TypeBuilder never represents a non typedef type.*/ + } + + protected override bool IsCOMObjectImpl() + { + return ((GetAttributeFlagsImpl() & TypeAttributes.Import) != 0); + } + + protected override bool IsPointerImpl() + { + return false; /*A TypeBuilder never represents a non typedef type.*/ + } + + protected override bool IsPrimitiveImpl() + { + // FIXME + return false; + } + + // FIXME: I doubt just removing this still works. + protected override bool IsValueTypeImpl() + { + Type parent_type = parent; + while (parent_type != null) + { + if (parent_type == typeof(ValueType)) + return true; + parent_type = parent_type.BaseType; + } + return false; + } + + public override bool IsSZArray + { + get + { + return false; + } + } + + public override Type MakeArrayType() + { + return new ArrayType(this, 0); + } + + public override Type MakeArrayType(int rank) + { + if (rank < 1) + throw new IndexOutOfRangeException(); + return new ArrayType(this, rank); + } + + public override Type MakeByRefType() + { + return new ByRefType(this); + } + + public override Type MakeGenericType(params Type[] typeArguments) + { + //return base.MakeGenericType (typeArguments); + + if (!IsGenericTypeDefinition) + throw new InvalidOperationException("not a generic type definition"); + if (typeArguments == null) + throw new ArgumentNullException(nameof(typeArguments)); + + if (generic_params.Length != typeArguments.Length) + throw new ArgumentException(string.Format("The type or method has {0} generic parameter(s) but {1} generic argument(s) where provided. A generic argument must be provided for each generic parameter.", generic_params.Length, typeArguments.Length), nameof(typeArguments)); + + foreach (Type t in typeArguments) + { + if (t == null) + throw new ArgumentNullException(nameof(typeArguments)); + } + + Type[] copy = new Type[typeArguments.Length]; + typeArguments.CopyTo(copy, 0); + return pmodule.assemblyb.MakeGenericType(this, copy); + } + + public override Type MakePointerType() + { + return new PointerType(this); + } + + public override RuntimeTypeHandle TypeHandle + { + get + { + check_created(); + return created.TypeHandle; + } + } + + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + if (customBuilder == null) + throw new ArgumentNullException(nameof(customBuilder)); + + string attrname = customBuilder.Ctor.ReflectedType.FullName; + if (attrname == "System.Runtime.InteropServices.StructLayoutAttribute") + { + byte[] data = customBuilder.Data; + int layout_kind; /* the (stupid) ctor takes a short or an int ... */ + layout_kind = (int)data[2]; + layout_kind |= ((int)data[3]) << 8; + attrs &= ~TypeAttributes.LayoutMask; + switch ((LayoutKind)layout_kind) + { + case LayoutKind.Auto: + attrs |= TypeAttributes.AutoLayout; + break; + case LayoutKind.Explicit: + attrs |= TypeAttributes.ExplicitLayout; + break; + case LayoutKind.Sequential: + attrs |= TypeAttributes.SequentialLayout; + break; + default: + // we should ignore it since it can be any value anyway... + throw new Exception("Error in customattr"); + } + + var ctor_type = customBuilder.Ctor is ConstructorBuilder ? ((ConstructorBuilder)customBuilder.Ctor).parameters[0] : customBuilder.Ctor.GetParametersInternal()[0].ParameterType; + int pos = 6; + if (ctor_type.FullName == "System.Int16") + pos = 4; + int nnamed = (int)data[pos++]; + nnamed |= ((int)data[pos++]) << 8; + for (int i = 0; i < nnamed; ++i) + { + //byte named_type = data [pos++]; + pos++; + byte type = data[pos++]; + int len; + string named_name; + + if (type == 0x55) + { + len = CustomAttributeBuilder.decode_len(data, pos, out pos); + //string named_typename = + CustomAttributeBuilder.string_from_bytes(data, pos, len); + pos += len; + // FIXME: Check that 'named_type' and 'named_typename' match, etc. + // See related code/FIXME in mono/mono/metadata/reflection.c + } + + len = CustomAttributeBuilder.decode_len(data, pos, out pos); + named_name = CustomAttributeBuilder.string_from_bytes(data, pos, len); + pos += len; + /* all the fields are integers in StructLayout */ + int value = (int)data[pos++]; + value |= ((int)data[pos++]) << 8; + value |= ((int)data[pos++]) << 16; + value |= ((int)data[pos++]) << 24; + switch (named_name) + { + case "CharSet": + switch ((CharSet)value) + { + case CharSet.None: + case CharSet.Ansi: + attrs &= ~(TypeAttributes.UnicodeClass | TypeAttributes.AutoClass); + break; + case CharSet.Unicode: + attrs &= ~TypeAttributes.AutoClass; + attrs |= TypeAttributes.UnicodeClass; + break; + case CharSet.Auto: + attrs &= ~TypeAttributes.UnicodeClass; + attrs |= TypeAttributes.AutoClass; + break; + default: + break; // error out... + } + break; + case "Pack": + packing_size = (PackingSize)value; + break; + case "Size": + class_size = value; + break; + default: + break; // error out... + } + } + return; + } + else if (attrname == "System.Runtime.CompilerServices.SpecialNameAttribute") + { + attrs |= TypeAttributes.SpecialName; + return; + } + else if (attrname == "System.SerializableAttribute") + { + attrs |= TypeAttributes.Serializable; + return; + } + else if (attrname == "System.Runtime.InteropServices.ComImportAttribute") + { + attrs |= TypeAttributes.Import; + return; + } + else if (attrname == "System.Security.SuppressUnmanagedCodeSecurityAttribute") + { + attrs |= TypeAttributes.HasSecurity; + } + + if (cattrs != null) + { + CustomAttributeBuilder[] new_array = new CustomAttributeBuilder[cattrs.Length + 1]; + cattrs.CopyTo(new_array, 0); + new_array[cattrs.Length] = customBuilder; + cattrs = new_array; + } + else + { + cattrs = new CustomAttributeBuilder[1]; + cattrs[0] = customBuilder; + } + } + + [ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute)); + } + + public EventBuilder DefineEvent(string name, EventAttributes attributes, Type eventtype) + { + check_name("name", name); + if (eventtype == null) + throw new ArgumentNullException("type"); + check_not_created(); + if (eventtype.IsByRef) + throw new ArgumentException(nameof(eventtype)); + EventBuilder res = new EventBuilder(this, name, attributes, eventtype); + if (events != null) + { + EventBuilder[] new_events = new EventBuilder[events.Length + 1]; + Array.Copy(events, new_events, events.Length); + new_events[events.Length] = res; + events = new_events; + } + else + { + events = new EventBuilder[1]; + events[0] = res; + } + return res; + } + + public FieldBuilder DefineInitializedData(string name, byte[] data, FieldAttributes attributes) + { + if (data == null) + throw new ArgumentNullException(nameof(data)); + + FieldBuilder res = DefineUninitializedData(name, data.Length, attributes); + res.SetRVAData(data); + return res; + } + + public FieldBuilder DefineUninitializedData(string name, int size, FieldAttributes attributes) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + if (name.Length == 0) + throw new ArgumentException("Empty name is not legal", nameof(name)); + if ((size <= 0) || (size > 0x3f0000)) + throw new ArgumentException("Data size must be > 0 and < 0x3f0000"); + check_not_created(); + + string typeName = "$ArrayType$" + size; + ITypeIdentifier ident = TypeIdentifiers.WithoutEscape(typeName); + Type datablobtype = pmodule.GetRegisteredType(fullname.NestedName(ident)); + if (datablobtype == null) + { + TypeBuilder tb = DefineNestedType(typeName, + TypeAttributes.NestedPrivate | TypeAttributes.ExplicitLayout | TypeAttributes.Sealed, + typeof(ValueType), null, PackingSize.Size1, size); + tb.CreateType(); + datablobtype = tb; + } + return DefineField(name, datablobtype, attributes | FieldAttributes.Static | FieldAttributes.HasFieldRVA); + } + + public TypeToken TypeToken + { + get + { + return new TypeToken(0x02000000 | table_idx); + } + } + + public void SetParent(Type parent) + { + check_not_created(); + + if (parent == null) + { + if ((attrs & TypeAttributes.Interface) != 0) + { + if ((attrs & TypeAttributes.Abstract) == 0) + throw new InvalidOperationException("Interface must be declared abstract."); + this.parent = null; + } + else + { + this.parent = typeof(object); + } + } + else + { + if (parent.IsInterface) + throw new ArgumentException(nameof(parent)); + this.parent = parent; + } + this.parent = ResolveUserType(this.parent); + } + + internal int get_next_table_index(object obj, int table, int count) + { + return pmodule.get_next_table_index(obj, table, count); + } + + [ComVisible(true)] + public override InterfaceMapping GetInterfaceMap(Type interfaceType) + { + if (created == null) + throw new NotSupportedException("This method is not implemented for incomplete types."); + + return created.GetInterfaceMap(interfaceType); + } + + internal override Type InternalResolve() + { + check_created(); + return created; + } + + internal override Type RuntimeResolve() + { + check_created(); + return created; + } + + internal bool is_created + { + get + { + return createTypeCalled; + } + } + + private Exception not_supported() + { + return new NotSupportedException("The invoked member is not supported in a dynamic module."); + } + + internal void check_not_created() + { + if (is_created) + throw new InvalidOperationException("Unable to change after type has been created."); + } + + private void check_created() + { + if (!is_created) + throw not_supported(); + } + + private void check_name(string argName, string name) + { + if (name == null) + throw new ArgumentNullException(argName); + if (name.Length == 0) + throw new ArgumentException("Empty name is not legal", argName); + if (name[0] == ((char)0)) + throw new ArgumentException("Illegal name", argName); + } + + public override string ToString() + { + return FullName; + } + + // FIXME: + public override bool IsAssignableFrom(Type c) + { + return base.IsAssignableFrom(c); + } + + // FIXME: "arrays" + internal bool IsAssignableTo(Type c) + { + if (c == this) + return true; + + if (c.IsInterface) + { + if (parent != null && is_created) + { + if (c.IsAssignableFrom(parent)) + return true; + } + + if (interfaces == null) + return false; + foreach (Type t in interfaces) + if (c.IsAssignableFrom(t)) + return true; + if (!is_created) + return false; + } + + if (parent == null) + return c == typeof(object); + else + return c.IsAssignableFrom(parent); + } + + public bool IsCreated() + { + return is_created; + } + + public override Type[] GetGenericArguments() + { + if (generic_params == null) + return null; + Type[] args = new Type[generic_params.Length]; + generic_params.CopyTo(args, 0); + return args; + } + + public override Type GetGenericTypeDefinition() + { + if (generic_params == null) + throw new InvalidOperationException("Type is not generic"); + return this; + } + + public override bool ContainsGenericParameters + { + get + { + return generic_params != null; + } + } + + public override bool IsGenericParameter + { + get + { + return false; + } + } + + public override GenericParameterAttributes GenericParameterAttributes + { + get { return GenericParameterAttributes.None; } + } + + public override bool IsGenericTypeDefinition + { + get + { + return generic_params != null; + } + } + + public override bool IsGenericType + { + get { return IsGenericTypeDefinition; } + } + + // FIXME: + public override int GenericParameterPosition + { + get + { + return 0; + } + } + + public override MethodBase DeclaringMethod + { + get + { + return null; + } + } + + public GenericTypeParameterBuilder[] DefineGenericParameters(params string[] names) + { + if (names == null) + throw new ArgumentNullException(nameof(names)); + if (names.Length == 0) + throw new ArgumentException("names"); + + generic_params = new GenericTypeParameterBuilder[names.Length]; + for (int i = 0; i < names.Length; i++) + { + string item = names[i]; + if (item == null) + throw new ArgumentNullException(nameof(names)); + generic_params[i] = new GenericTypeParameterBuilder(this, null, item, i); + } + + return generic_params; + } + + public static ConstructorInfo GetConstructor(Type type, ConstructorInfo constructor) + { + /*FIXME I would expect the same checks of GetMethod here*/ + if (type == null) + throw new ArgumentException("Type is not generic", nameof(type)); + + if (!type.IsGenericType) + throw new ArgumentException("Type is not a generic type", nameof(type)); + + if (type.IsGenericTypeDefinition) + throw new ArgumentException("Type cannot be a generic type definition", nameof(type)); + + if (constructor == null) + throw new NullReferenceException(); //MS raises this instead of an ArgumentNullException + + if (!constructor.DeclaringType.IsGenericTypeDefinition) + throw new ArgumentException("constructor declaring type is not a generic type definition", nameof(constructor)); + if (constructor.DeclaringType != type.GetGenericTypeDefinition()) + throw new ArgumentException("constructor declaring type is not the generic type definition of type", nameof(constructor)); + + ConstructorInfo res = type.GetConstructor(constructor); + if (res == null) + throw new ArgumentException("constructor not found"); + + return res; + } + + private static bool IsValidGetMethodType(Type type) + { + if (type is TypeBuilder || type is TypeBuilderInstantiation) + return true; + /*GetMethod() must work with TypeBuilders after CreateType() was called.*/ + if (type.Module is ModuleBuilder) + return true; + if (type.IsGenericParameter) + return false; + + Type[] inst = type.GetGenericArguments(); + if (inst == null) + return false; + for (int i = 0; i < inst.Length; ++i) + { + if (IsValidGetMethodType(inst[i])) + return true; + } + return false; + } + + public static MethodInfo GetMethod(Type type, MethodInfo method) + { + if (!IsValidGetMethodType(type)) + throw new ArgumentException("type is not TypeBuilder but " + type.GetType(), nameof(type)); + + if (type is TypeBuilder && type.ContainsGenericParameters) + type = type.MakeGenericType(type.GetGenericArguments()); + + if (!type.IsGenericType) + throw new ArgumentException("type is not a generic type", nameof(type)); + + if (!method.DeclaringType.IsGenericTypeDefinition) + throw new ArgumentException("method declaring type is not a generic type definition", nameof(method)); + if (method.DeclaringType != type.GetGenericTypeDefinition()) + throw new ArgumentException("method declaring type is not the generic type definition of type", nameof(method)); + if (method == null) + throw new NullReferenceException(); //MS raises this instead of an ArgumentNullException + + MethodInfo res = type.GetMethod(method); + if (res == null) + throw new ArgumentException(string.Format("method {0} not found in type {1}", method.Name, type)); + + return res; + } + + public static FieldInfo GetField(Type type, FieldInfo field) + { + if (!type.IsGenericType) + throw new ArgumentException("Type is not a generic type", nameof(type)); + + if (type.IsGenericTypeDefinition) + throw new ArgumentException("Type cannot be a generic type definition", nameof(type)); + + if (field is FieldOnTypeBuilderInst) + throw new ArgumentException("The specified field must be declared on a generic type definition.", nameof(field)); + + if (field.DeclaringType != type.GetGenericTypeDefinition()) + throw new ArgumentException("field declaring type is not the generic type definition of type", "method"); + + FieldInfo res = type.GetField(field); + if (res == null) + throw new System.Exception("field not found"); + else + return res; + } + + internal override bool IsUserType + { + get + { + return false; + } + } + + internal override bool IsTypeBuilder() => true; + + public override bool IsConstructedGenericType + { + get { return false; } + } + + public override bool IsAssignableFrom(TypeInfo typeInfo) + { + return base.IsAssignableFrom(typeInfo); + } + + internal static bool SetConstantValue(Type destType, object value, ref object destValue) + { + // Mono: This is based on the CoreCLR + // TypeBuilder.SetConstantValue except it writes to an + // out argument instead of doing an icall, and it uses + // TypeCode instead of CorElementType (like + // MonoTypeEnum) which we don't have in our corlib and + // our member fields are different. + + // This is a helper function that is used by ParameterBuilder, PropertyBuilder, + // and FieldBuilder to validate a default value and save it in the meta-data. + + if (value != null) + { + Type type = value.GetType(); + + // We should allow setting a constant value on a ByRef parameter + if (destType.IsByRef) + destType = destType.GetElementType(); + + // Convert nullable types to their underlying type. + // This is necessary for nullable enum types to pass the IsEnum check that's coming next. + destType = Nullable.GetUnderlyingType(destType) ?? destType; + + if (destType.IsEnum) + { + // | UnderlyingSystemType | Enum.GetUnderlyingType() | IsEnum + // ----------------------------------|---------------------------|---------------------------|--------- + // runtime Enum Type | self | underlying type of enum | TRUE + // EnumBuilder | underlying type of enum | underlying type of enum* | TRUE + // TypeBuilder of enum types** | underlying type of enum | Exception | TRUE + // TypeBuilder of enum types (baked) | runtime enum type | Exception | TRUE + + // *: the behavior of Enum.GetUnderlyingType(EnumBuilder) might change in the future + // so let's not depend on it. + // **: created with System.Enum as the parent type. + + // The above behaviors might not be the most consistent but we have to live with them. + + Type underlyingType; + EnumBuilder enumBldr; + TypeBuilder typeBldr; + if ((enumBldr = destType as EnumBuilder) != null) + { + underlyingType = enumBldr.GetEnumUnderlyingType(); + + // The constant value supplied should match either the baked enum type or its underlying type + // we don't need to compare it with the EnumBuilder itself because you can never have an object of that type + if (!((enumBldr.GetTypeBuilder().is_created && type == enumBldr.GetTypeBuilder().created) || + type == underlyingType)) + throw_argument_ConstantDoesntMatch(); + } + else if ((typeBldr = destType as TypeBuilder) != null) + { + underlyingType = typeBldr.underlying_type; + + // The constant value supplied should match either the baked enum type or its underlying type + // typeBldr.m_enumUnderlyingType is null if the user hasn't created a "value__" field on the enum + if (underlyingType == null || (type != typeBldr.UnderlyingSystemType && type != underlyingType)) + throw_argument_ConstantDoesntMatch(); + } + else + { + // must be a runtime Enum Type + + // Debug.Assert(destType is RuntimeType, "destType is not a runtime type, an EnumBuilder, or a TypeBuilder."); + + underlyingType = Enum.GetUnderlyingType(destType); + + // The constant value supplied should match either the enum itself or its underlying type + if (type != destType && type != underlyingType) + throw_argument_ConstantDoesntMatch(); + } + + type = underlyingType; + } + else + { + // Note that it is non CLS compliant if destType != type. But RefEmit never guarantees CLS-Compliance. + if (!destType.IsAssignableFrom(type)) + throw_argument_ConstantDoesntMatch(); + } + + TypeCode corType = GetTypeCode(type); + + switch (corType) + { + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Boolean: + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Char: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Single: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Double: + destValue = value; + return true; + case TypeCode.String: + destValue = value; + return true; + case TypeCode.DateTime: + //date is a I8 representation + long ticks = ((DateTime)value).Ticks; + destValue = ticks; + return true; + default: + throw new ArgumentException(type.ToString() + " is not a supported constant type."); + } + } + else + { + // A null default value in metadata is permissible even for non-nullable value types. + // (See ECMA-335 II.15.4.1.4 "The .param directive" and II.22.9 "Constant" for details.) + // This is how the Roslyn compilers generally encode `default(TValueType)` default values. + + destValue = null; + return true; + } + } + + private static void throw_argument_ConstantDoesntMatch() + { + throw new ArgumentException("Constant does not match the defined type."); + } + + public override bool IsTypeDefinition => true; + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs index 00b5432b33afb..a5cc6e15cd565 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs @@ -1,5 +1,3 @@ -#nullable disable - // // System.Reflection.Emit.TypeBuilderInstantiation // @@ -20,10 +18,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -33,6 +31,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#nullable disable #if MONO_FEATURE_SRE using System.Reflection; using System.Reflection.Emit; @@ -45,458 +44,489 @@ namespace System.Reflection.Emit { - /* - * TypeBuilderInstantiation represents an instantiation of a generic TypeBuilder. - */ - [StructLayout (LayoutKind.Sequential)] - sealed class TypeBuilderInstantiation : - TypeInfo - { - #region Keep in sync with object-internals.h MonoReflectionGenericClass + /* + * TypeBuilderInstantiation represents an instantiation of a generic TypeBuilder. + */ + [StructLayout(LayoutKind.Sequential)] + internal sealed class TypeBuilderInstantiation : + TypeInfo + { + #region Keep in sync with object-internals.h MonoReflectionGenericClass #pragma warning disable 649 - internal Type generic_type; - Type[] type_arguments; + internal Type generic_type; + private Type[] type_arguments; #pragma warning restore 649 - #endregion - - Hashtable fields, ctors, methods; - - internal TypeBuilderInstantiation () - { - // this should not be used - throw new InvalidOperationException (); - } - - internal TypeBuilderInstantiation (Type tb, Type[] args) - { - this.generic_type = tb; - this.type_arguments = args; - } - - internal override Type InternalResolve () - { - Type gtd = generic_type.InternalResolve (); - Type[] args = new Type [type_arguments.Length]; - for (int i = 0; i < type_arguments.Length; ++i) - args [i] = type_arguments [i].InternalResolve (); - return gtd.MakeGenericType (args); - } - - // Called from the runtime to return the corresponding finished Type object - internal override Type RuntimeResolve () - { - if (generic_type is TypeBuilder && !(generic_type as TypeBuilder).IsCreated ()) - throw new NotImplementedException (); - for (int i = 0; i < type_arguments.Length; ++i) { - var t = type_arguments [i]; - if (t is TypeBuilder && !(t as TypeBuilder).IsCreated ()) - throw new NotImplementedException (); - } - return InternalResolve (); - } - - internal bool IsCreated { - get { - TypeBuilder tb = generic_type as TypeBuilder; - return tb != null ? tb.is_created : true; - } - } - - private const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | - BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly; - - Type GetParentType () - { - return InflateType (generic_type.BaseType); - } - - internal Type InflateType (Type type) - { - return InflateType (type, type_arguments, null); - } - - internal Type InflateType (Type type, Type[] method_args) - { - return InflateType (type, type_arguments, method_args); - } - - internal static Type InflateType (Type type, Type[] type_args, Type[] method_args) - { - if (type == null) - return null; - if (!type.IsGenericParameter && !type.ContainsGenericParameters) - return type; - if (type.IsGenericParameter) { - if (type.DeclaringMethod == null) - return type_args == null ? type : type_args [type.GenericParameterPosition]; - return method_args == null ? type : method_args [type.GenericParameterPosition]; - } - if (type.IsPointer) - return InflateType (type.GetElementType (), type_args, method_args).MakePointerType (); - if (type.IsByRef) - return InflateType (type.GetElementType (), type_args, method_args).MakeByRefType (); - if (type.IsArray) { - if (type.GetArrayRank () > 1) - return InflateType (type.GetElementType (), type_args, method_args).MakeArrayType (type.GetArrayRank ()); - - if (type.ToString ().EndsWith ("[*]", StringComparison.Ordinal)) /*FIXME, the reflection API doesn't offer a way around this*/ - return InflateType (type.GetElementType (), type_args, method_args).MakeArrayType (1); - return InflateType (type.GetElementType (), type_args, method_args).MakeArrayType (); - } - - Type[] args = type.GetGenericArguments (); - for (int i = 0; i < args.Length; ++i) - args [i] = InflateType (args [i], type_args, method_args); - - Type gtd = type.IsGenericTypeDefinition ? type : type.GetGenericTypeDefinition (); - return gtd.MakeGenericType (args); - } - - public override Type BaseType { - get { return generic_type.BaseType; } - } - - public override Type[] GetInterfaces () - { - throw new NotSupportedException (); - } - - protected override bool IsValueTypeImpl () - { - return generic_type.IsValueType; - } - - internal override MethodInfo GetMethod (MethodInfo fromNoninstanciated) - { - if (methods == null) - methods = new Hashtable (); - if (!methods.ContainsKey (fromNoninstanciated)) - methods [fromNoninstanciated] = new MethodOnTypeBuilderInst (this, fromNoninstanciated); - return (MethodInfo)methods [fromNoninstanciated]; - } - - internal override ConstructorInfo GetConstructor (ConstructorInfo fromNoninstanciated) - { - if (ctors == null) - ctors = new Hashtable (); - if (!ctors.ContainsKey (fromNoninstanciated)) - ctors [fromNoninstanciated] = new ConstructorOnTypeBuilderInst (this, fromNoninstanciated); - return (ConstructorInfo)ctors [fromNoninstanciated]; - } - - internal override FieldInfo GetField (FieldInfo fromNoninstanciated) - { - if (fields == null) - fields = new Hashtable (); - if (!fields.ContainsKey (fromNoninstanciated)) - fields [fromNoninstanciated] = new FieldOnTypeBuilderInst (this, fromNoninstanciated); - return (FieldInfo)fields [fromNoninstanciated]; - } - - public override MethodInfo[] GetMethods (BindingFlags bf) - { - throw new NotSupportedException (); - } - - public override ConstructorInfo[] GetConstructors (BindingFlags bf) - { - throw new NotSupportedException (); - } - - public override FieldInfo[] GetFields (BindingFlags bf) - { - throw new NotSupportedException (); - } - - public override PropertyInfo[] GetProperties (BindingFlags bf) - { - throw new NotSupportedException (); - } - - public override EventInfo[] GetEvents (BindingFlags bf) - { - throw new NotSupportedException (); - } - - public override Type[] GetNestedTypes (BindingFlags bf) - { - throw new NotSupportedException (); - } - - public override bool IsAssignableFrom (Type c) - { - throw new NotSupportedException (); - } - - public override Type UnderlyingSystemType { - get { return this; } - } - - public override Assembly Assembly { - get { return generic_type.Assembly; } - } - - public override Module Module { - get { return generic_type.Module; } - } - - public override string Name { - get { return generic_type.Name; } - } - - public override string Namespace { - get { return generic_type.Namespace; } - } - - public override string FullName { - get { return format_name (true, false); } - } - - public override string AssemblyQualifiedName { - get { return format_name (true, true); } - } - - public override Guid GUID { - get { throw new NotSupportedException (); } - } - - string format_name (bool full_name, bool assembly_qualified) - { - StringBuilder sb = new StringBuilder (generic_type.FullName); - - sb.Append ("["); - for (int i = 0; i < type_arguments.Length; ++i) { - if (i > 0) - sb.Append (","); - - string name; - if (full_name) { - string assemblyName = type_arguments [i].Assembly.FullName; - name = type_arguments [i].FullName; - if (name != null && assemblyName != null) - name = name + ", " + assemblyName; - } else { - name = type_arguments [i].ToString (); - } - if (name == null) { - return null; - } - if (full_name) - sb.Append ("["); - sb.Append (name); - if (full_name) - sb.Append ("]"); - } - sb.Append ("]"); - if (assembly_qualified) { - sb.Append (", "); - sb.Append (generic_type.Assembly.FullName); - } - return sb.ToString (); - } - - public override string ToString () - { - return format_name (false, false); - } - - public override Type GetGenericTypeDefinition () - { - return generic_type; - } - - public override Type[] GetGenericArguments () - { - Type[] ret = new Type [type_arguments.Length]; - type_arguments.CopyTo (ret, 0); - return ret; - } - - public override bool ContainsGenericParameters { - get { - foreach (Type t in type_arguments) { - if (t.ContainsGenericParameters) - return true; - } - return false; - } - } - - public override bool IsGenericTypeDefinition { - get { return false; } - } - - public override bool IsGenericType { - get { return true; } - } - - public override Type DeclaringType { - get { return generic_type.DeclaringType; } - } - - public override RuntimeTypeHandle TypeHandle { - get { - throw new NotSupportedException (); - } - } - - public override Type MakeArrayType () - { - return new ArrayType (this, 0); - } - - public override Type MakeArrayType (int rank) - { - if (rank < 1) - throw new IndexOutOfRangeException (); - return new ArrayType (this, rank); - } - - public override Type MakeByRefType () - { - return new ByRefType (this); - } - - public override Type MakePointerType () - { - return new PointerType (this); - } - - public override Type GetElementType () - { - throw new NotSupportedException (); - } - - protected override bool HasElementTypeImpl () - { - return false; - } - - protected override bool IsCOMObjectImpl () - { - return false; - } - - protected override bool IsPrimitiveImpl () - { - return false; - } - - protected override bool IsArrayImpl () - { - return false; - } - - protected override bool IsByRefImpl () - { - return false; - } - - protected override bool IsPointerImpl () - { - return false; - } - - protected override TypeAttributes GetAttributeFlagsImpl () - { - return generic_type.Attributes; - } - - //stuff that throws - public override Type GetInterface (string name, bool ignoreCase) - { - throw new NotSupportedException (); - } - - public override EventInfo GetEvent (string name, BindingFlags bindingAttr) - { - throw new NotSupportedException (); - } - - public override FieldInfo GetField( string name, BindingFlags bindingAttr) - { - throw new NotSupportedException (); - } - - public override MemberInfo[] GetMembers (BindingFlags bindingAttr) - { - throw new NotSupportedException (); - } - - public override Type GetNestedType (string name, BindingFlags bindingAttr) - { - throw new NotSupportedException (); - } - - public override object InvokeMember (string name, BindingFlags invokeAttr, - Binder binder, object target, object[] args, - ParameterModifier[] modifiers, - CultureInfo culture, string[] namedParameters) - { - throw new NotSupportedException (); - } - - protected override MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, - CallingConventions callConvention, Type[] types, - ParameterModifier[] modifiers) - { - throw new NotSupportedException (); - } - - protected override PropertyInfo GetPropertyImpl (string name, BindingFlags bindingAttr, Binder binder, - Type returnType, Type[] types, ParameterModifier[] modifiers) - { - throw new NotSupportedException (); - } - - protected override ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr, - Binder binder, - CallingConventions callConvention, - Type[] types, - ParameterModifier[] modifiers) - { - throw new NotSupportedException (); - } - - //MemberInfo - public override bool IsDefined (Type attributeType, bool inherit) - { - throw new NotSupportedException (); - } - - public override object [] GetCustomAttributes (bool inherit) - { - if (IsCreated) - return generic_type.GetCustomAttributes (inherit); - throw new NotSupportedException (); - } - - public override object [] GetCustomAttributes (Type attributeType, bool inherit) - { - if (IsCreated) - return generic_type.GetCustomAttributes (attributeType, inherit); - throw new NotSupportedException (); - } - - internal override bool IsUserType { - get { - foreach (var t in type_arguments) { - if (t.IsUserType) - return true; - } - return false; - } - } - - internal static Type MakeGenericType (Type type, Type[] typeArguments) - { - return new TypeBuilderInstantiation (type, typeArguments); - } - - public override bool IsTypeDefinition => false; - - public override bool IsConstructedGenericType => true; - } + #endregion + + private Hashtable fields, ctors, methods; + + internal TypeBuilderInstantiation() + { + // this should not be used + throw new InvalidOperationException(); + } + + internal TypeBuilderInstantiation(Type tb, Type[] args) + { + this.generic_type = tb; + this.type_arguments = args; + } + + internal override Type InternalResolve() + { + Type gtd = generic_type.InternalResolve(); + Type[] args = new Type[type_arguments.Length]; + for (int i = 0; i < type_arguments.Length; ++i) + args[i] = type_arguments[i].InternalResolve(); + return gtd.MakeGenericType(args); + } + + // Called from the runtime to return the corresponding finished Type object + internal override Type RuntimeResolve() + { + if (generic_type is TypeBuilder && !(generic_type as TypeBuilder).IsCreated()) + throw new NotImplementedException(); + for (int i = 0; i < type_arguments.Length; ++i) + { + var t = type_arguments[i]; + if (t is TypeBuilder && !(t as TypeBuilder).IsCreated()) + throw new NotImplementedException(); + } + return InternalResolve(); + } + + internal bool IsCreated + { + get + { + TypeBuilder tb = generic_type as TypeBuilder; + return tb != null ? tb.is_created : true; + } + } + + private const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | + BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly; + + private Type GetParentType() + { + return InflateType(generic_type.BaseType); + } + + internal Type InflateType(Type type) + { + return InflateType(type, type_arguments, null); + } + + internal Type InflateType(Type type, Type[] method_args) + { + return InflateType(type, type_arguments, method_args); + } + + internal static Type InflateType(Type type, Type[] type_args, Type[] method_args) + { + if (type == null) + return null; + if (!type.IsGenericParameter && !type.ContainsGenericParameters) + return type; + if (type.IsGenericParameter) + { + if (type.DeclaringMethod == null) + return type_args == null ? type : type_args[type.GenericParameterPosition]; + return method_args == null ? type : method_args[type.GenericParameterPosition]; + } + if (type.IsPointer) + return InflateType(type.GetElementType(), type_args, method_args).MakePointerType(); + if (type.IsByRef) + return InflateType(type.GetElementType(), type_args, method_args).MakeByRefType(); + if (type.IsArray) + { + if (type.GetArrayRank() > 1) + return InflateType(type.GetElementType(), type_args, method_args).MakeArrayType(type.GetArrayRank()); + + if (type.ToString().EndsWith("[*]", StringComparison.Ordinal)) /*FIXME, the reflection API doesn't offer a way around this*/ + return InflateType(type.GetElementType(), type_args, method_args).MakeArrayType(1); + return InflateType(type.GetElementType(), type_args, method_args).MakeArrayType(); + } + + Type[] args = type.GetGenericArguments(); + for (int i = 0; i < args.Length; ++i) + args[i] = InflateType(args[i], type_args, method_args); + + Type gtd = type.IsGenericTypeDefinition ? type : type.GetGenericTypeDefinition(); + return gtd.MakeGenericType(args); + } + + public override Type BaseType + { + get { return generic_type.BaseType; } + } + + public override Type[] GetInterfaces() + { + throw new NotSupportedException(); + } + + protected override bool IsValueTypeImpl() + { + return generic_type.IsValueType; + } + + internal override MethodInfo GetMethod(MethodInfo fromNoninstanciated) + { + if (methods == null) + methods = new Hashtable(); + if (!methods.ContainsKey(fromNoninstanciated)) + methods[fromNoninstanciated] = new MethodOnTypeBuilderInst(this, fromNoninstanciated); + return (MethodInfo)methods[fromNoninstanciated]; + } + + internal override ConstructorInfo GetConstructor(ConstructorInfo fromNoninstanciated) + { + if (ctors == null) + ctors = new Hashtable(); + if (!ctors.ContainsKey(fromNoninstanciated)) + ctors[fromNoninstanciated] = new ConstructorOnTypeBuilderInst(this, fromNoninstanciated); + return (ConstructorInfo)ctors[fromNoninstanciated]; + } + + internal override FieldInfo GetField(FieldInfo fromNoninstanciated) + { + if (fields == null) + fields = new Hashtable(); + if (!fields.ContainsKey(fromNoninstanciated)) + fields[fromNoninstanciated] = new FieldOnTypeBuilderInst(this, fromNoninstanciated); + return (FieldInfo)fields[fromNoninstanciated]; + } + + public override MethodInfo[] GetMethods(BindingFlags bf) + { + throw new NotSupportedException(); + } + + public override ConstructorInfo[] GetConstructors(BindingFlags bf) + { + throw new NotSupportedException(); + } + + public override FieldInfo[] GetFields(BindingFlags bf) + { + throw new NotSupportedException(); + } + + public override PropertyInfo[] GetProperties(BindingFlags bf) + { + throw new NotSupportedException(); + } + + public override EventInfo[] GetEvents(BindingFlags bf) + { + throw new NotSupportedException(); + } + + public override Type[] GetNestedTypes(BindingFlags bf) + { + throw new NotSupportedException(); + } + + public override bool IsAssignableFrom(Type c) + { + throw new NotSupportedException(); + } + + public override Type UnderlyingSystemType + { + get { return this; } + } + + public override Assembly Assembly + { + get { return generic_type.Assembly; } + } + + public override Module Module + { + get { return generic_type.Module; } + } + + public override string Name + { + get { return generic_type.Name; } + } + + public override string Namespace + { + get { return generic_type.Namespace; } + } + + public override string FullName + { + get { return format_name(true, false); } + } + + public override string AssemblyQualifiedName + { + get { return format_name(true, true); } + } + + public override Guid GUID + { + get { throw new NotSupportedException(); } + } + + private string format_name(bool full_name, bool assembly_qualified) + { + StringBuilder sb = new StringBuilder(generic_type.FullName); + + sb.Append("["); + for (int i = 0; i < type_arguments.Length; ++i) + { + if (i > 0) + sb.Append(","); + + string name; + if (full_name) + { + string assemblyName = type_arguments[i].Assembly.FullName; + name = type_arguments[i].FullName; + if (name != null && assemblyName != null) + name = name + ", " + assemblyName; + } + else + { + name = type_arguments[i].ToString(); + } + if (name == null) + { + return null; + } + if (full_name) + sb.Append("["); + sb.Append(name); + if (full_name) + sb.Append("]"); + } + sb.Append("]"); + if (assembly_qualified) + { + sb.Append(", "); + sb.Append(generic_type.Assembly.FullName); + } + return sb.ToString(); + } + + public override string ToString() + { + return format_name(false, false); + } + + public override Type GetGenericTypeDefinition() + { + return generic_type; + } + + public override Type[] GetGenericArguments() + { + Type[] ret = new Type[type_arguments.Length]; + type_arguments.CopyTo(ret, 0); + return ret; + } + + public override bool ContainsGenericParameters + { + get + { + foreach (Type t in type_arguments) + { + if (t.ContainsGenericParameters) + return true; + } + return false; + } + } + + public override bool IsGenericTypeDefinition + { + get { return false; } + } + + public override bool IsGenericType + { + get { return true; } + } + + public override Type DeclaringType + { + get { return generic_type.DeclaringType; } + } + + public override RuntimeTypeHandle TypeHandle + { + get + { + throw new NotSupportedException(); + } + } + + public override Type MakeArrayType() + { + return new ArrayType(this, 0); + } + + public override Type MakeArrayType(int rank) + { + if (rank < 1) + throw new IndexOutOfRangeException(); + return new ArrayType(this, rank); + } + + public override Type MakeByRefType() + { + return new ByRefType(this); + } + + public override Type MakePointerType() + { + return new PointerType(this); + } + + public override Type GetElementType() + { + throw new NotSupportedException(); + } + + protected override bool HasElementTypeImpl() + { + return false; + } + + protected override bool IsCOMObjectImpl() + { + return false; + } + + protected override bool IsPrimitiveImpl() + { + return false; + } + + protected override bool IsArrayImpl() + { + return false; + } + + protected override bool IsByRefImpl() + { + return false; + } + + protected override bool IsPointerImpl() + { + return false; + } + + protected override TypeAttributes GetAttributeFlagsImpl() + { + return generic_type.Attributes; + } + + //stuff that throws + public override Type GetInterface(string name, bool ignoreCase) + { + throw new NotSupportedException(); + } + + public override EventInfo GetEvent(string name, BindingFlags bindingAttr) + { + throw new NotSupportedException(); + } + + public override FieldInfo GetField(string name, BindingFlags bindingAttr) + { + throw new NotSupportedException(); + } + + public override MemberInfo[] GetMembers(BindingFlags bindingAttr) + { + throw new NotSupportedException(); + } + + public override Type GetNestedType(string name, BindingFlags bindingAttr) + { + throw new NotSupportedException(); + } + + public override object InvokeMember(string name, BindingFlags invokeAttr, + Binder binder, object target, object[] args, + ParameterModifier[] modifiers, + CultureInfo culture, string[] namedParameters) + { + throw new NotSupportedException(); + } + + protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, + CallingConventions callConvention, Type[] types, + ParameterModifier[] modifiers) + { + throw new NotSupportedException(); + } + + protected override PropertyInfo GetPropertyImpl(string name, BindingFlags bindingAttr, Binder binder, + Type returnType, Type[] types, ParameterModifier[] modifiers) + { + throw new NotSupportedException(); + } + + protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr, + Binder binder, + CallingConventions callConvention, + Type[] types, + ParameterModifier[] modifiers) + { + throw new NotSupportedException(); + } + + //MemberInfo + public override bool IsDefined(Type attributeType, bool inherit) + { + throw new NotSupportedException(); + } + + public override object[] GetCustomAttributes(bool inherit) + { + if (IsCreated) + return generic_type.GetCustomAttributes(inherit); + throw new NotSupportedException(); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + if (IsCreated) + return generic_type.GetCustomAttributes(attributeType, inherit); + throw new NotSupportedException(); + } + + internal override bool IsUserType + { + get + { + foreach (var t in type_arguments) + { + if (t.IsUserType) + return true; + } + return false; + } + } + + internal static Type MakeGenericType(Type type, Type[] typeArguments) + { + return new TypeBuilderInstantiation(type, typeArguments); + } + + public override bool IsTypeDefinition => false; + + public override bool IsConstructedGenericType => true; + } } #else namespace System.Reflection.Emit diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/UnmanagedMarshal.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/UnmanagedMarshal.cs index bbe9c3894ed6e..8e979856ad4ca 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/UnmanagedMarshal.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/UnmanagedMarshal.cs @@ -1,5 +1,3 @@ -#nullable disable - // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // @@ -10,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,85 +30,99 @@ // (C) 2001-2002 Ximian, Inc. http://www.ximian.com // +#nullable disable #if MONO_FEATURE_SRE using System.Reflection.Emit; using System.Runtime.InteropServices; using System; -namespace System.Reflection.Emit { +namespace System.Reflection.Emit +{ - [Obsolete ("An alternate API is available: Emit the MarshalAs custom attribute instead.")] - [ComVisible (true)] - [Serializable] - [StructLayout (LayoutKind.Sequential)] - public sealed class UnmanagedMarshal { + [Obsolete("An alternate API is available: Emit the MarshalAs custom attribute instead.")] + [ComVisible(true)] + [Serializable] + [StructLayout(LayoutKind.Sequential)] + public sealed class UnmanagedMarshal + { #pragma warning disable 169, 414 - private int count; - private UnmanagedType t; - private UnmanagedType tbase; - string guid; - string mcookie; - string marshaltype; - internal Type marshaltyperef; - private int param_num; - private bool has_size; + private int count; + private UnmanagedType t; + private UnmanagedType tbase; + private string guid; + private string mcookie; + private string marshaltype; + internal Type marshaltyperef; + private int param_num; + private bool has_size; #pragma warning restore 169, 414 - - private UnmanagedMarshal (UnmanagedType maint, int cnt) { - count = cnt; - t = maint; - tbase = maint; - } - private UnmanagedMarshal (UnmanagedType maint, UnmanagedType elemt) { - count = 0; - t = maint; - tbase = elemt; - } - - public UnmanagedType BaseType { - get { - if (t == UnmanagedType.LPArray) - throw new ArgumentException (); + + private UnmanagedMarshal(UnmanagedType maint, int cnt) + { + count = cnt; + t = maint; + tbase = maint; + } + private UnmanagedMarshal(UnmanagedType maint, UnmanagedType elemt) + { + count = 0; + t = maint; + tbase = elemt; + } + + public UnmanagedType BaseType + { + get + { + if (t == UnmanagedType.LPArray) + throw new ArgumentException(); #if FEATURE_COMINTEROP if (t == UnmanagedType.SafeArray) throw new ArgumentException (); #endif - return tbase; - } - } + return tbase; + } + } - public int ElementCount { - get {return count;} - } + public int ElementCount + { + get { return count; } + } - public UnmanagedType GetUnmanagedType { - get {return t;} - } + public UnmanagedType GetUnmanagedType + { + get { return t; } + } - public Guid IIDGuid { - get {return new Guid (guid);} - } + public Guid IIDGuid + { + get { return new Guid(guid); } + } - public static UnmanagedMarshal DefineByValArray( int elemCount) { - return new UnmanagedMarshal (UnmanagedType.ByValArray, elemCount); - } + public static UnmanagedMarshal DefineByValArray(int elemCount) + { + return new UnmanagedMarshal(UnmanagedType.ByValArray, elemCount); + } - public static UnmanagedMarshal DefineByValTStr( int elemCount) { - return new UnmanagedMarshal (UnmanagedType.ByValTStr, elemCount); - } + public static UnmanagedMarshal DefineByValTStr(int elemCount) + { + return new UnmanagedMarshal(UnmanagedType.ByValTStr, elemCount); + } - public static UnmanagedMarshal DefineLPArray( UnmanagedType elemType) { - return new UnmanagedMarshal (UnmanagedType.LPArray, elemType); - } + public static UnmanagedMarshal DefineLPArray(UnmanagedType elemType) + { + return new UnmanagedMarshal(UnmanagedType.LPArray, elemType); + } #if FEATURE_COMINTEROP public static UnmanagedMarshal DefineSafeArray( UnmanagedType elemType) { return new UnmanagedMarshal (UnmanagedType.SafeArray, elemType); } #endif - public static UnmanagedMarshal DefineUnmanagedMarshal( UnmanagedType unmanagedType) { - return new UnmanagedMarshal (unmanagedType, unmanagedType); - } + public static UnmanagedMarshal DefineUnmanagedMarshal(UnmanagedType unmanagedType) + { + return new UnmanagedMarshal(unmanagedType, unmanagedType); + } #if FEATURE_COMINTEROP internal static UnmanagedMarshal DefineCustom (Type typeref, string cookie, string mtype, Guid id) { UnmanagedMarshal res = new UnmanagedMarshal (UnmanagedType.CustomMarshaler, UnmanagedType.CustomMarshaler); @@ -123,16 +135,17 @@ internal static UnmanagedMarshal DefineCustom (Type typeref, string cookie, stri res.guid = id.ToString (); return res; } -#endif - // sizeConst and sizeParamIndex can be -1 meaning they are not specified - internal static UnmanagedMarshal DefineLPArrayInternal (UnmanagedType elemType, int sizeConst, int sizeParamIndex) { - UnmanagedMarshal res = new UnmanagedMarshal (UnmanagedType.LPArray, elemType); - res.count = sizeConst; - res.param_num = sizeParamIndex; - res.has_size = true; +#endif + // sizeConst and sizeParamIndex can be -1 meaning they are not specified + internal static UnmanagedMarshal DefineLPArrayInternal(UnmanagedType elemType, int sizeConst, int sizeParamIndex) + { + UnmanagedMarshal res = new UnmanagedMarshal(UnmanagedType.LPArray, elemType); + res.count = sizeConst; + res.param_num = sizeParamIndex; + res.has_size = true; - return res; - } - } + return res; + } + } } #endif diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/FieldInfo.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/FieldInfo.Mono.cs index ae68d8a40da10..0a000dd57f087 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/FieldInfo.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/FieldInfo.Mono.cs @@ -7,103 +7,105 @@ namespace System.Reflection { - partial class FieldInfo - { - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern FieldInfo internal_from_handle_type (IntPtr field_handle, IntPtr type_handle); - - public static FieldInfo GetFieldFromHandle (RuntimeFieldHandle handle) - { - if (handle.IsNullHandle ()) - throw new ArgumentException (SR.Argument_InvalidHandle); - return internal_from_handle_type (handle.Value, IntPtr.Zero); - } - - public static FieldInfo GetFieldFromHandle (RuntimeFieldHandle handle, RuntimeTypeHandle declaringType) - { - if (handle.IsNullHandle ()) - throw new ArgumentException (SR.Argument_InvalidHandle); - FieldInfo fi = internal_from_handle_type (handle.Value, declaringType.Value); - if (fi == null) - throw new ArgumentException ("The field handle and the type handle are incompatible."); - return fi; - } - - internal virtual int GetFieldOffset () - { - throw NotImplemented.ByDesign; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private extern MarshalAsAttribute get_marshal_info (); - - internal object[] GetPseudoCustomAttributes () - { - int count = 0; - - if (IsNotSerialized) - count ++; - - if (DeclaringType.IsExplicitLayout) - count ++; - - MarshalAsAttribute marshalAs = get_marshal_info (); - if (marshalAs != null) - count ++; - - if (count == 0) - return null; - object[] attrs = new object [count]; - count = 0; - - if (IsNotSerialized) - attrs [count ++] = new NonSerializedAttribute (); - if (DeclaringType.IsExplicitLayout) - attrs [count ++] = new FieldOffsetAttribute (GetFieldOffset ()); - if (marshalAs != null) - attrs [count ++] = marshalAs; - - return attrs; - } - - internal CustomAttributeData[] GetPseudoCustomAttributesData () - { - int count = 0; - - if (IsNotSerialized) - count++; - - if (DeclaringType.IsExplicitLayout) - count++; - - MarshalAsAttribute marshalAs = get_marshal_info (); - if (marshalAs != null) - count++; - - if (count == 0) - return null; - CustomAttributeData[] attrsData = new CustomAttributeData [count]; - count = 0; - - if (IsNotSerialized) - attrsData [count++] = new CustomAttributeData ((typeof (NonSerializedAttribute)).GetConstructor (Type.EmptyTypes)); - if (DeclaringType.IsExplicitLayout) { - var ctorArgs = new CustomAttributeTypedArgument[] { new CustomAttributeTypedArgument (typeof (int), GetFieldOffset ()) }; - attrsData [count++] = new CustomAttributeData ( - (typeof (FieldOffsetAttribute)).GetConstructor (new[] { typeof (int) }), - ctorArgs, - Array.Empty ()); - } - - if (marshalAs != null) { - var ctorArgs = new CustomAttributeTypedArgument[] { new CustomAttributeTypedArgument (typeof (UnmanagedType), marshalAs.Value) }; - attrsData [count++] = new CustomAttributeData ( - (typeof (MarshalAsAttribute)).GetConstructor (new[] { typeof (UnmanagedType) }), - ctorArgs, - Array.Empty ());//FIXME Get named params - } - - return attrsData; - } - } + public partial class FieldInfo + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern FieldInfo internal_from_handle_type(IntPtr field_handle, IntPtr type_handle); + + public static FieldInfo GetFieldFromHandle(RuntimeFieldHandle handle) + { + if (handle.IsNullHandle()) + throw new ArgumentException(SR.Argument_InvalidHandle); + return internal_from_handle_type(handle.Value, IntPtr.Zero); + } + + public static FieldInfo GetFieldFromHandle(RuntimeFieldHandle handle, RuntimeTypeHandle declaringType) + { + if (handle.IsNullHandle()) + throw new ArgumentException(SR.Argument_InvalidHandle); + FieldInfo fi = internal_from_handle_type(handle.Value, declaringType.Value); + if (fi == null) + throw new ArgumentException("The field handle and the type handle are incompatible."); + return fi; + } + + internal virtual int GetFieldOffset() + { + throw NotImplemented.ByDesign; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern MarshalAsAttribute get_marshal_info(); + + internal object[] GetPseudoCustomAttributes() + { + int count = 0; + + if (IsNotSerialized) + count++; + + if (DeclaringType.IsExplicitLayout) + count++; + + MarshalAsAttribute marshalAs = get_marshal_info(); + if (marshalAs != null) + count++; + + if (count == 0) + return null; + object[] attrs = new object[count]; + count = 0; + + if (IsNotSerialized) + attrs[count++] = new NonSerializedAttribute(); + if (DeclaringType.IsExplicitLayout) + attrs[count++] = new FieldOffsetAttribute(GetFieldOffset()); + if (marshalAs != null) + attrs[count++] = marshalAs; + + return attrs; + } + + internal CustomAttributeData[] GetPseudoCustomAttributesData() + { + int count = 0; + + if (IsNotSerialized) + count++; + + if (DeclaringType.IsExplicitLayout) + count++; + + MarshalAsAttribute marshalAs = get_marshal_info(); + if (marshalAs != null) + count++; + + if (count == 0) + return null; + CustomAttributeData[] attrsData = new CustomAttributeData[count]; + count = 0; + + if (IsNotSerialized) + attrsData[count++] = new CustomAttributeData((typeof(NonSerializedAttribute)).GetConstructor(Type.EmptyTypes)); + if (DeclaringType.IsExplicitLayout) + { + var ctorArgs = new CustomAttributeTypedArgument[] { new CustomAttributeTypedArgument(typeof(int), GetFieldOffset()) }; + attrsData[count++] = new CustomAttributeData( + (typeof(FieldOffsetAttribute)).GetConstructor(new[] { typeof(int) }), + ctorArgs, + Array.Empty()); + } + + if (marshalAs != null) + { + var ctorArgs = new CustomAttributeTypedArgument[] { new CustomAttributeTypedArgument(typeof(UnmanagedType), marshalAs.Value) }; + attrsData[count++] = new CustomAttributeData( + (typeof(MarshalAsAttribute)).GetConstructor(new[] { typeof(UnmanagedType) }), + ctorArgs, + Array.Empty());//FIXME Get named params + } + + return attrsData; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/MemberInfo.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/MemberInfo.Mono.cs index c385d9ec5e856..6a91fc52a1c97 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/MemberInfo.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/MemberInfo.Mono.cs @@ -4,25 +4,24 @@ namespace System.Reflection { - public abstract partial class MemberInfo - { - internal bool HasSameMetadataDefinitionAsCore(MemberInfo other) where TOther : MemberInfo - { - if (other == null) - throw new ArgumentNullException(nameof(other)); + public abstract partial class MemberInfo + { + internal bool HasSameMetadataDefinitionAsCore(MemberInfo other) where TOther : MemberInfo + { + if (other == null) + throw new ArgumentNullException(nameof(other)); - // Ensure that "other" is a runtime-implemented MemberInfo. Do this check before calling any methods on it! - if (!(other is TOther)) - return false; + // Ensure that "other" is a runtime-implemented MemberInfo. Do this check before calling any methods on it! + if (!(other is TOther)) + return false; - if (MetadataToken != other.MetadataToken) - return false; + if (MetadataToken != other.MetadataToken) + return false; - if (!(Module.Equals(other.Module))) - return false; + if (!(Module.Equals(other.Module))) + return false; - return true; - } - } + return true; + } + } } - diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs index 3d759589a7de3..9f129ef8aec9a 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs @@ -4,9 +4,9 @@ namespace System.Reflection.Metadata { - public static class AssemblyExtensions - { - [CLSCompliant(false)] - public static unsafe bool TryGetRawMetadata (this Assembly assembly, out byte* blob, out int length) => throw new NotImplementedException (); - } + public static class AssemblyExtensions + { + [CLSCompliant(false)] + public static unsafe bool TryGetRawMetadata(this Assembly assembly, out byte* blob, out int length) => throw new NotImplementedException(); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/MethodBase.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/MethodBase.Mono.cs index b219e9f919ff0..7db4d6d3e1523 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/MethodBase.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/MethodBase.Mono.cs @@ -7,72 +7,72 @@ namespace System.Reflection { - partial class MethodBase - { - public static MethodBase GetMethodFromHandle (RuntimeMethodHandle handle) - { - if (handle.IsNullHandle ()) - throw new ArgumentException (SR.Argument_InvalidHandle); + public partial class MethodBase + { + public static MethodBase GetMethodFromHandle(RuntimeMethodHandle handle) + { + if (handle.IsNullHandle()) + throw new ArgumentException(SR.Argument_InvalidHandle); - MethodBase m = RuntimeMethodInfo.GetMethodFromHandleInternalType (handle.Value, IntPtr.Zero); - if (m == null) - throw new ArgumentException (SR.Argument_InvalidHandle); + MethodBase m = RuntimeMethodInfo.GetMethodFromHandleInternalType(handle.Value, IntPtr.Zero); + if (m == null) + throw new ArgumentException(SR.Argument_InvalidHandle); - Type declaringType = m.DeclaringType; - if (declaringType != null && declaringType.IsGenericType) - throw new ArgumentException (String.Format (SR.Argument_MethodDeclaringTypeGeneric, - m, declaringType.GetGenericTypeDefinition ())); + Type declaringType = m.DeclaringType; + if (declaringType != null && declaringType.IsGenericType) + throw new ArgumentException(string.Format(SR.Argument_MethodDeclaringTypeGeneric, + m, declaringType.GetGenericTypeDefinition())); - return m; - } + return m; + } - public static MethodBase GetMethodFromHandle (RuntimeMethodHandle handle, RuntimeTypeHandle declaringType) - { - if (handle.IsNullHandle ()) - throw new ArgumentException (SR.Argument_InvalidHandle); - MethodBase m = RuntimeMethodInfo.GetMethodFromHandleInternalType (handle.Value, declaringType.Value); - if (m == null) - throw new ArgumentException (SR.Argument_InvalidHandle); - return m; - } + public static MethodBase GetMethodFromHandle(RuntimeMethodHandle handle, RuntimeTypeHandle declaringType) + { + if (handle.IsNullHandle()) + throw new ArgumentException(SR.Argument_InvalidHandle); + MethodBase m = RuntimeMethodInfo.GetMethodFromHandleInternalType(handle.Value, declaringType.Value); + if (m == null) + throw new ArgumentException(SR.Argument_InvalidHandle); + return m; + } - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static MethodBase GetCurrentMethod (); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern MethodBase GetCurrentMethod(); - internal virtual ParameterInfo[] GetParametersNoCopy () - { - return GetParametersInternal (); - } + internal virtual ParameterInfo[] GetParametersNoCopy() + { + return GetParametersInternal(); + } - internal virtual ParameterInfo[] GetParametersInternal () - { - throw new NotImplementedException (); - } + internal virtual ParameterInfo[] GetParametersInternal() + { + throw new NotImplementedException(); + } - internal virtual int GetParametersCount () - { - throw new NotImplementedException (); - } + internal virtual int GetParametersCount() + { + throw new NotImplementedException(); + } - internal virtual Type GetParameterType (int pos) - { - throw new NotImplementedException (); - } + internal virtual Type GetParameterType(int pos) + { + throw new NotImplementedException(); + } - internal virtual Type[] GetParameterTypes () - { - ParameterInfo[] paramInfo = GetParametersNoCopy (); + internal virtual Type[] GetParameterTypes() + { + ParameterInfo[] paramInfo = GetParametersNoCopy(); - Type[] parameterTypes = new Type [paramInfo.Length]; - for (int i = 0; i < paramInfo.Length; i++) - parameterTypes [i] = paramInfo [i].ParameterType; + Type[] parameterTypes = new Type[paramInfo.Length]; + for (int i = 0; i < paramInfo.Length; i++) + parameterTypes[i] = paramInfo[i].ParameterType; - return parameterTypes; - } + return parameterTypes; + } - internal virtual int get_next_table_index (object obj, int table, int count) - { - throw new NotImplementedException (); - } - } + internal virtual int get_next_table_index(object obj, int table, int count) + { + throw new NotImplementedException(); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs index 8d394d280465e..b29077308fcb9 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs @@ -8,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,422 +32,456 @@ namespace System.Reflection { - [StructLayout (LayoutKind.Sequential)] - sealed class RuntimeAssembly : Assembly - { - private sealed class ResolveEventHolder - { - public event ModuleResolveEventHandler ModuleResolve; - } - - private sealed class UnmanagedMemoryStreamForModule : UnmanagedMemoryStream - { - Module module; - - public unsafe UnmanagedMemoryStreamForModule (byte* pointer, long length, Module module) - : base (pointer, length) - { - this.module = module; - } - } - - // - // KEEP IN SYNC WITH mcs/class/corlib/System.Reflection/RuntimeAssembly.cs - // - #region VM dependency - IntPtr _mono_assembly; - object _evidence; // Unused, kept for layout compatibility - #endregion - - ResolveEventHolder resolve_event_holder; - - public override extern MethodInfo? EntryPoint { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } - - public override bool ReflectionOnly => false; - - public override string? CodeBase { - get { - return get_code_base (this, false); - } - } - - public override string? FullName { - get { - return get_fullname (this); - } - } - - // - // We can't store the event directly in this class, since the - // compiler would silently insert the fields before _mono_assembly - // - public override event ModuleResolveEventHandler ModuleResolve { - add { - resolve_event_holder.ModuleResolve += value; - } - remove { - resolve_event_holder.ModuleResolve -= value; - } - } - - public override Module? ManifestModule => GetManifestModuleInternal (); - - public override bool GlobalAssemblyCache => false; - - public override long HostContext => 0; - - public override string ImageRuntimeVersion => InternalImageRuntimeVersion (this); - - public override string Location { - get { - return get_location (); - } - } - - // TODO: - public override bool IsCollectible => false; - - internal static AssemblyName CreateAssemblyName (string assemblyString, out RuntimeAssembly assemblyFromResolveEvent) - { - if (assemblyString == null) - throw new ArgumentNullException (nameof (assemblyString)); + [StructLayout(LayoutKind.Sequential)] + internal sealed class RuntimeAssembly : Assembly + { + private sealed class ResolveEventHolder + { + public event ModuleResolveEventHandler ModuleResolve; + } + + private sealed class UnmanagedMemoryStreamForModule : UnmanagedMemoryStream + { + private Module module; + + public unsafe UnmanagedMemoryStreamForModule(byte* pointer, long length, Module module) + : base(pointer, length) + { + this.module = module; + } + } + + // + // KEEP IN SYNC WITH mcs/class/corlib/System.Reflection/RuntimeAssembly.cs + // + #region VM dependency + private IntPtr _mono_assembly; + private object _evidence; // Unused, kept for layout compatibility + #endregion + + private ResolveEventHolder resolve_event_holder; + + public override extern MethodInfo? EntryPoint + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + } + + public override bool ReflectionOnly => false; + + public override string? CodeBase + { + get + { + return get_code_base(this, false); + } + } + + public override string? FullName + { + get + { + return get_fullname(this); + } + } + + // + // We can't store the event directly in this class, since the + // compiler would silently insert the fields before _mono_assembly + // + public override event ModuleResolveEventHandler ModuleResolve + { + add + { + resolve_event_holder.ModuleResolve += value; + } + remove + { + resolve_event_holder.ModuleResolve -= value; + } + } + + public override Module? ManifestModule => GetManifestModuleInternal(); + + public override bool GlobalAssemblyCache => false; + + public override long HostContext => 0; + + public override string ImageRuntimeVersion => InternalImageRuntimeVersion(this); + + public override string Location + { + get + { + return get_location(); + } + } + + // TODO: + public override bool IsCollectible => false; + + internal static AssemblyName CreateAssemblyName(string assemblyString, out RuntimeAssembly assemblyFromResolveEvent) + { + if (assemblyString == null) + throw new ArgumentNullException(nameof(assemblyString)); if ((assemblyString.Length == 0) || (assemblyString[0] == '\0')) - throw new ArgumentException (SR.Format_StringZeroLength); - - assemblyFromResolveEvent = null; - try { - return new AssemblyName (assemblyString); - } catch (Exception) { - assemblyFromResolveEvent = (RuntimeAssembly)AssemblyLoadContext.DoAssemblyResolve (assemblyString); - if (assemblyFromResolveEvent == null) - throw new FileLoadException (assemblyString); - return null; - } - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public override extern String[] GetManifestResourceNames (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public override extern Type[] GetExportedTypes (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern Type[] GetTopLevelForwardedTypes (); - - public override Type[] GetForwardedTypes () { - Type[] topLevelTypes = GetTopLevelForwardedTypes (); - List forwardedTypes = new List (topLevelTypes); - List exceptions = new List (); - - foreach (Type t in topLevelTypes) - AddPublicNestedTypes (t, forwardedTypes, exceptions); - - if (exceptions.Count > 0) { - forwardedTypes.AddRange (new Type [exceptions.Count]); // add one null Type for each exception - exceptions.InsertRange (0, new Exception [forwardedTypes.Count]); // align the Exceptions with the null Types - throw new ReflectionTypeLoadException (forwardedTypes.ToArray (), exceptions.ToArray ()); - } - - return forwardedTypes.ToArray (); - } - - private static void AddPublicNestedTypes (Type type, List types, List exceptions) - { - Type[] nestedTypes; - - try { - nestedTypes = type.GetNestedTypes (BindingFlags.Public); - } - catch (FileLoadException e) { exceptions.Add (e); return; } - catch (FileNotFoundException e) { exceptions.Add (e); return; } - catch (TypeLoadException e) { exceptions.Add (e); return; } - catch (IOException e) { exceptions.Add (e); return; } - catch (UnauthorizedAccessException e) { exceptions.Add (e); return; } - - foreach (Type nestedType in nestedTypes) { - types.Add(nestedType); - AddPublicNestedTypes(nestedType, types, exceptions); - } - } - - public override ManifestResourceInfo GetManifestResourceInfo (string resourceName) - { - if (resourceName == null) - throw new ArgumentNullException ("resourceName"); - if (resourceName.Length == 0) - throw new ArgumentException ("String cannot have zero length."); - ManifestResourceInfo result = new ManifestResourceInfo (null, null, 0); - bool found = GetManifestResourceInfoInternal (resourceName, result); - if (found) - return result; - else - return null; - } - - public override Stream GetManifestResourceStream (string name) - { - if (name == null) - throw new ArgumentNullException (nameof (name)); - - if (name.Length == 0) - throw new ArgumentException ("String cannot have zero length.", - "name"); - - unsafe { - byte* data = (byte*) GetManifestResourceInternal (name, out int length, out Module resourceModule); - if (data == null) - return null; - - // It cannot use SafeBuffer mode because not all methods are supported in this - // mode (e.g. UnmanagedMemoryStream.get_PositionPointer) - return new UnmanagedMemoryStreamForModule (data, length, resourceModule); - } - } - - public override Stream GetManifestResourceStream (Type type, string name) - { - if (type == null && name == null) - throw new ArgumentNullException (nameof (type)); - - string nameSpace = type?.Namespace; - - string resourceName = nameSpace != null && name != null ? - nameSpace + Type.Delimiter + name : - nameSpace + name; - - return GetManifestResourceStream (resourceName); - } - - public override AssemblyName GetName (bool copiedName) - { - return AssemblyName.Create (_mono_assembly, CodeBase); - } - - public override Type GetType (string name, bool throwOnError, bool ignoreCase) - { - if (name == null) - throw new ArgumentNullException (nameof (name)); - - if (name.Length == 0) - throw new ArgumentException ("Name cannot be empty"); - - return InternalGetType (null, name, throwOnError, ignoreCase); - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - return CustomAttribute.IsDefined (this, attributeType, inherit); - } - - public override IList GetCustomAttributesData () - { - return CustomAttributeData.GetCustomAttributes (this); - } - - public override object[] GetCustomAttributes (bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, inherit); - } - - public override object[] GetCustomAttributes (Type attributeType, bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - } - - public override Module GetModule (string name) - { - if (name == null) - throw new ArgumentNullException ("name"); - if (name.Length == 0) - throw new ArgumentException ("Name can't be empty"); - - Module[] modules = GetModules (true); - foreach (Module module in modules) { - if (module.ScopeName == name) - return module; - } - - return null; - } - - public override Module[] GetModules (bool getResourceModules) - { - Module[] modules = GetModulesInternal (); - - if (!getResourceModules) { - var result = new List (modules.Length); - foreach (Module m in modules) - if (!m.IsResource ()) - result.Add (m); - return result.ToArray (); - } - else - return modules; - } - - public override Module[] GetLoadedModules (bool getResourceModules) - { - return GetModules (getResourceModules); - } - - public override AssemblyName[] GetReferencedAssemblies () - { - using (var nativeNames = new Mono.SafeGPtrArrayHandle (InternalGetReferencedAssemblies (this))) { - var numAssemblies = nativeNames.Length; - try { - AssemblyName [] result = new AssemblyName[numAssemblies]; - const bool addVersion = true; - const bool addPublicKey = false; - const bool defaultToken = true; - for (int i = 0; i < numAssemblies; i++) { - AssemblyName name = new AssemblyName (); - unsafe { - Mono.MonoAssemblyName *nativeName = (Mono.MonoAssemblyName*) nativeNames[i]; - name.FillName (nativeName, null, addVersion, addPublicKey, defaultToken); - result[i] = name; - } - } - return result; - } finally { - for (int i = 0; i < numAssemblies; i++) { - unsafe { - Mono.MonoAssemblyName* nativeName = (Mono.MonoAssemblyName*) nativeNames[i]; - Mono.RuntimeMarshal.FreeAssemblyName (ref *nativeName, true); - } - } - } - } - } - - public override Assembly GetSatelliteAssembly (CultureInfo culture) - { - return GetSatelliteAssembly (culture, null); - } - - public override Assembly GetSatelliteAssembly (CultureInfo culture, Version version) - { - if (culture == null) - throw new ArgumentNullException (nameof (culture)); - - return InternalGetSatelliteAssembly (culture, version, true); - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - internal Assembly InternalGetSatelliteAssembly (CultureInfo culture, Version version, bool throwOnFileNotFound) - { - var aname = GetName (); - - var an = new AssemblyName (); - if (version == null) - an.Version = aname.Version; - else - an.Version = version; - - an.CultureInfo = culture; - an.Name = aname.Name + ".resources"; - - Assembly res = null; - try { - StackCrawlMark unused = default; - res = Assembly.Load (an, ref unused, null); - } catch { - } - - if (res == this) - res = null; - if (res == null && throwOnFileNotFound) - throw new FileNotFoundException (String.Format (culture, SR.IO_FileNotFound_FileName, an.Name)); - return res; - } - - public override FileStream GetFile (string name) - { - if (name == null) - throw new ArgumentNullException (nameof (name), SR.ArgumentNull_FileName); - if (name.Length == 0) - throw new ArgumentException (SR.Argument_EmptyFileName); - - string location = Location; - if (location != null && Path.GetFileName (location) == name) - return new FileStream (location, FileMode.Open, FileAccess.Read); - string filename = (string)GetFilesInternal (name, true); - if (filename != null) - return new FileStream (filename, FileMode.Open, FileAccess.Read); - else - return null; - } - - public override FileStream[] GetFiles (bool getResourceModules) - { - string[] names = (string[]) GetFilesInternal (null, getResourceModules); - if (names == null) - return Array.Empty (); - - string location = Location; - - FileStream[] res; - if (location != String.Empty) { - res = new FileStream [names.Length + 1]; - res [0] = new FileStream (location, FileMode.Open, FileAccess.Read); - for (int i = 0; i < names.Length; ++i) - res [i + 1] = new FileStream (names [i], FileMode.Open, FileAccess.Read); - } else { - res = new FileStream [names.Length]; - for (int i = 0; i < names.Length; ++i) - res [i] = new FileStream (names [i], FileMode.Open, FileAccess.Read); - } - return res; - } - - internal static RuntimeAssembly InternalLoad (AssemblyName assemblyRef, ref StackCrawlMark stackMark, AssemblyLoadContext assemblyLoadContext) - { - var assembly = (RuntimeAssembly) InternalLoad (assemblyRef.FullName, ref stackMark, assemblyLoadContext != null ? assemblyLoadContext.NativeALC : IntPtr.Zero); - if (assembly == null) - throw new FileNotFoundException (null, assemblyRef.Name); - return assembly; - } - - // FIXME: Merge some of these - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern string get_location (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static string get_code_base (Assembly a, bool escaped); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static string get_fullname (Assembly a); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static string InternalImageRuntimeVersion (Assembly a); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern bool GetManifestResourceInfoInternal (string name, ManifestResourceInfo info); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern IntPtr /* byte* */ GetManifestResourceInternal (string name, out int size, out Module module); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern Module GetManifestModuleInternal (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern Module[] GetModulesInternal (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern IntPtr InternalGetReferencedAssemblies (Assembly module); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - private extern object GetFilesInternal (String name, bool getResourceModules); - - internal string? GetSimpleName () - { - // TODO: Make this cheaper and faster - return GetName ().Name; - } - } + throw new ArgumentException(SR.Format_StringZeroLength); + + assemblyFromResolveEvent = null; + try + { + return new AssemblyName(assemblyString); + } + catch (Exception) + { + assemblyFromResolveEvent = (RuntimeAssembly)AssemblyLoadContext.DoAssemblyResolve(assemblyString); + if (assemblyFromResolveEvent == null) + throw new FileLoadException(assemblyString); + return null; + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public override extern string[] GetManifestResourceNames(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public override extern Type[] GetExportedTypes(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern Type[] GetTopLevelForwardedTypes(); + + public override Type[] GetForwardedTypes() + { + Type[] topLevelTypes = GetTopLevelForwardedTypes(); + List forwardedTypes = new List(topLevelTypes); + List exceptions = new List(); + + foreach (Type t in topLevelTypes) + AddPublicNestedTypes(t, forwardedTypes, exceptions); + + if (exceptions.Count > 0) + { + forwardedTypes.AddRange(new Type[exceptions.Count]); // add one null Type for each exception + exceptions.InsertRange(0, new Exception[forwardedTypes.Count]); // align the Exceptions with the null Types + throw new ReflectionTypeLoadException(forwardedTypes.ToArray(), exceptions.ToArray()); + } + + return forwardedTypes.ToArray(); + } + + private static void AddPublicNestedTypes(Type type, List types, List exceptions) + { + Type[] nestedTypes; + + try + { + nestedTypes = type.GetNestedTypes(BindingFlags.Public); + } + catch (FileLoadException e) { exceptions.Add(e); return; } + catch (FileNotFoundException e) { exceptions.Add(e); return; } + catch (TypeLoadException e) { exceptions.Add(e); return; } + catch (IOException e) { exceptions.Add(e); return; } + catch (UnauthorizedAccessException e) { exceptions.Add(e); return; } + + foreach (Type nestedType in nestedTypes) + { + types.Add(nestedType); + AddPublicNestedTypes(nestedType, types, exceptions); + } + } + + public override ManifestResourceInfo GetManifestResourceInfo(string resourceName) + { + if (resourceName == null) + throw new ArgumentNullException(nameof(resourceName)); + if (resourceName.Length == 0) + throw new ArgumentException("String cannot have zero length."); + ManifestResourceInfo result = new ManifestResourceInfo(null, null, 0); + bool found = GetManifestResourceInfoInternal(resourceName, result); + if (found) + return result; + else + return null; + } + + public override Stream GetManifestResourceStream(string name) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + + if (name.Length == 0) + throw new ArgumentException("String cannot have zero length.", + nameof(name)); + + unsafe + { + byte* data = (byte*)GetManifestResourceInternal(name, out int length, out Module resourceModule); + if (data == null) + return null; + + // It cannot use SafeBuffer mode because not all methods are supported in this + // mode (e.g. UnmanagedMemoryStream.get_PositionPointer) + return new UnmanagedMemoryStreamForModule(data, length, resourceModule); + } + } + + public override Stream GetManifestResourceStream(Type type, string name) + { + if (type == null && name == null) + throw new ArgumentNullException(nameof(type)); + + string nameSpace = type?.Namespace; + + string resourceName = nameSpace != null && name != null ? + nameSpace + Type.Delimiter + name : + nameSpace + name; + + return GetManifestResourceStream(resourceName); + } + + public override AssemblyName GetName(bool copiedName) + { + return AssemblyName.Create(_mono_assembly, CodeBase); + } + + public override Type GetType(string name, bool throwOnError, bool ignoreCase) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + + if (name.Length == 0) + throw new ArgumentException("Name cannot be empty"); + + return InternalGetType(null, name, throwOnError, ignoreCase); + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + return CustomAttribute.IsDefined(this, attributeType, inherit); + } + + public override IList GetCustomAttributesData() + { + return CustomAttributeData.GetCustomAttributes(this); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, inherit); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + } + + public override Module GetModule(string name) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + if (name.Length == 0) + throw new ArgumentException("Name can't be empty"); + + Module[] modules = GetModules(true); + foreach (Module module in modules) + { + if (module.ScopeName == name) + return module; + } + + return null; + } + + public override Module[] GetModules(bool getResourceModules) + { + Module[] modules = GetModulesInternal(); + + if (!getResourceModules) + { + var result = new List(modules.Length); + foreach (Module m in modules) + if (!m.IsResource()) + result.Add(m); + return result.ToArray(); + } + else + return modules; + } + + public override Module[] GetLoadedModules(bool getResourceModules) + { + return GetModules(getResourceModules); + } + + public override AssemblyName[] GetReferencedAssemblies() + { + using (var nativeNames = new Mono.SafeGPtrArrayHandle(InternalGetReferencedAssemblies(this))) + { + var numAssemblies = nativeNames.Length; + try + { + AssemblyName[] result = new AssemblyName[numAssemblies]; + const bool addVersion = true; + const bool addPublicKey = false; + const bool defaultToken = true; + for (int i = 0; i < numAssemblies; i++) + { + AssemblyName name = new AssemblyName(); + unsafe + { + Mono.MonoAssemblyName* nativeName = (Mono.MonoAssemblyName*)nativeNames[i]; + name.FillName(nativeName, null, addVersion, addPublicKey, defaultToken); + result[i] = name; + } + } + return result; + } + finally + { + for (int i = 0; i < numAssemblies; i++) + { + unsafe + { + Mono.MonoAssemblyName* nativeName = (Mono.MonoAssemblyName*)nativeNames[i]; + Mono.RuntimeMarshal.FreeAssemblyName(ref *nativeName, true); + } + } + } + } + } + + public override Assembly GetSatelliteAssembly(CultureInfo culture) + { + return GetSatelliteAssembly(culture, null); + } + + public override Assembly GetSatelliteAssembly(CultureInfo culture, Version version) + { + if (culture == null) + throw new ArgumentNullException(nameof(culture)); + + return InternalGetSatelliteAssembly(culture, version, true); + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + internal Assembly InternalGetSatelliteAssembly(CultureInfo culture, Version version, bool throwOnFileNotFound) + { + var aname = GetName(); + + var an = new AssemblyName(); + if (version == null) + an.Version = aname.Version; + else + an.Version = version; + + an.CultureInfo = culture; + an.Name = aname.Name + ".resources"; + + Assembly res = null; + try + { + StackCrawlMark unused = default; + res = Load(an, ref unused, null); + } + catch + { + } + + if (res == this) + res = null; + if (res == null && throwOnFileNotFound) + throw new FileNotFoundException(string.Format(culture, SR.IO_FileNotFound_FileName, an.Name)); + return res; + } + + public override FileStream GetFile(string name) + { + if (name == null) + throw new ArgumentNullException(nameof(name), SR.ArgumentNull_FileName); + if (name.Length == 0) + throw new ArgumentException(SR.Argument_EmptyFileName); + + string location = Location; + if (location != null && Path.GetFileName(location) == name) + return new FileStream(location, FileMode.Open, FileAccess.Read); + string filename = (string)GetFilesInternal(name, true); + if (filename != null) + return new FileStream(filename, FileMode.Open, FileAccess.Read); + else + return null; + } + + public override FileStream[] GetFiles(bool getResourceModules) + { + string[] names = (string[])GetFilesInternal(null, getResourceModules); + if (names == null) + return Array.Empty(); + + string location = Location; + + FileStream[] res; + if (location != string.Empty) + { + res = new FileStream[names.Length + 1]; + res[0] = new FileStream(location, FileMode.Open, FileAccess.Read); + for (int i = 0; i < names.Length; ++i) + res[i + 1] = new FileStream(names[i], FileMode.Open, FileAccess.Read); + } + else + { + res = new FileStream[names.Length]; + for (int i = 0; i < names.Length; ++i) + res[i] = new FileStream(names[i], FileMode.Open, FileAccess.Read); + } + return res; + } + + internal static RuntimeAssembly InternalLoad(AssemblyName assemblyRef, ref StackCrawlMark stackMark, AssemblyLoadContext assemblyLoadContext) + { + var assembly = (RuntimeAssembly)InternalLoad(assemblyRef.FullName, ref stackMark, assemblyLoadContext != null ? assemblyLoadContext.NativeALC : IntPtr.Zero); + if (assembly == null) + throw new FileNotFoundException(null, assemblyRef.Name); + return assembly; + } + + // FIXME: Merge some of these + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern string get_location(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern string get_code_base(Assembly a, bool escaped); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern string get_fullname(Assembly a); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern string InternalImageRuntimeVersion(Assembly a); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern bool GetManifestResourceInfoInternal(string name, ManifestResourceInfo info); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern IntPtr /* byte* */ GetManifestResourceInternal(string name, out int size, out Module module); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern Module GetManifestModuleInternal(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern Module[] GetModulesInternal(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern IntPtr InternalGetReferencedAssemblies(Assembly module); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern object GetFilesInternal(string name, bool getResourceModules); + + internal string? GetSimpleName() + { + // TODO: Make this cheaper and faster + return GetName().Name; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeEventInfo.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeEventInfo.cs index d2e178f702bdb..d0576ec344b08 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeEventInfo.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeEventInfo.cs @@ -9,10 +9,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -29,192 +29,211 @@ namespace System.Reflection { - internal struct MonoEventInfo - { - public Type declaring_type; - public Type reflected_type; - public String name; - public MethodInfo add_method; - public MethodInfo remove_method; - public MethodInfo raise_method; - public EventAttributes attrs; - public MethodInfo[] other_methods; - } - - [StructLayout (LayoutKind.Sequential)] - internal sealed class RuntimeEventInfo : EventInfo - { + internal struct MonoEventInfo + { + public Type declaring_type; + public Type reflected_type; + public string name; + public MethodInfo add_method; + public MethodInfo remove_method; + public MethodInfo raise_method; + public EventAttributes attrs; + public MethodInfo[] other_methods; + } + + [StructLayout(LayoutKind.Sequential)] + internal sealed class RuntimeEventInfo : EventInfo + { #pragma warning disable 169 - IntPtr klass; - IntPtr handle; + private IntPtr klass; + private IntPtr handle; #pragma warning restore 169 - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern void get_event_info (RuntimeEventInfo ev, out MonoEventInfo info); - - internal static MonoEventInfo GetEventInfo (RuntimeEventInfo ev) - { - MonoEventInfo mei; - get_event_info (ev, out mei); - return mei; - } - - public override Module Module { - get { - return GetRuntimeModule (); - } - } - - internal BindingFlags BindingFlags { - get { - return GetBindingFlags (); - } - } - - internal RuntimeType GetDeclaringTypeInternal () - { - return (RuntimeType) DeclaringType; - } - - RuntimeType ReflectedTypeInternal { - get { - return (RuntimeType) ReflectedType; - } - } - - internal RuntimeModule GetRuntimeModule () - { - return GetDeclaringTypeInternal ().GetRuntimeModule (); - } - - internal BindingFlags GetBindingFlags () - { - MonoEventInfo info = GetEventInfo (this); - - MethodInfo method = info.add_method; - if (method == null) - method = info.remove_method; - if (method == null) - method = info.raise_method; - - return RuntimeType.FilterPreCalculate (method != null && method.IsPublic, GetDeclaringTypeInternal () != ReflectedType , method != null && method.IsStatic); - } - - public override EventAttributes Attributes { - get { - return GetEventInfo (this).attrs; - } - } - - public override MethodInfo GetAddMethod (bool nonPublic) - { - MonoEventInfo info = GetEventInfo (this); - if (nonPublic || (info.add_method != null && info.add_method.IsPublic)) - return info.add_method; - return null; - } - - public override MethodInfo GetRaiseMethod (bool nonPublic) - { - MonoEventInfo info = GetEventInfo (this); - if (nonPublic || (info.raise_method != null && info.raise_method.IsPublic)) - return info.raise_method; - return null; - } - - public override MethodInfo GetRemoveMethod (bool nonPublic) - { - MonoEventInfo info = GetEventInfo (this); - if (nonPublic || (info.remove_method != null && info.remove_method.IsPublic)) - return info.remove_method; - return null; - } - - public override MethodInfo[] GetOtherMethods (bool nonPublic) - { - MonoEventInfo info = GetEventInfo (this); - if (nonPublic) - return info.other_methods; - int num_public = 0; - foreach (MethodInfo m in info.other_methods) { - if (m.IsPublic) - num_public++; - } - if (num_public == info.other_methods.Length) - return info.other_methods; - MethodInfo[] res = new MethodInfo [num_public]; - num_public = 0; - foreach (MethodInfo m in info.other_methods) { - if (m.IsPublic) - res [num_public++] = m; - } - return res; - } - - public override Type DeclaringType { - get { - return GetEventInfo (this).declaring_type; - } - } - - public override Type ReflectedType { - get { - return GetEventInfo (this).reflected_type; - } - } - - public override string Name { - get { - return GetEventInfo (this).name; - } - } - - public override string ToString () - { - return EventHandlerType + " " + Name; - } - - public override bool IsDefined (Type attributeType, bool inherit) - { - return CustomAttribute.IsDefined (this, attributeType, inherit); - } - - public override object[] GetCustomAttributes( bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, inherit); - } - - public override object[] GetCustomAttributes( Type attributeType, bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - } - - public override IList GetCustomAttributesData () { - return CustomAttributeData.GetCustomAttributes (this); - } - - public override int MetadataToken { - get { - return get_metadata_token (this); - } - } - - public sealed override bool HasSameMetadataDefinitionAs (MemberInfo other) => HasSameMetadataDefinitionAsCore (other); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal static extern int get_metadata_token (RuntimeEventInfo monoEvent); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern EventInfo internal_from_handle_type (IntPtr event_handle, IntPtr type_handle); - - internal static EventInfo GetEventFromHandle (Mono.RuntimeEventHandle handle, RuntimeTypeHandle reflectedType) - { - if (handle.Value == IntPtr.Zero) - throw new ArgumentException ("The handle is invalid."); - EventInfo ei = internal_from_handle_type (handle.Value, reflectedType.Value); - if (ei == null) - throw new ArgumentException ("The event handle and the type handle are incompatible."); - return ei; - } - } + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void get_event_info(RuntimeEventInfo ev, out MonoEventInfo info); + + internal static MonoEventInfo GetEventInfo(RuntimeEventInfo ev) + { + MonoEventInfo mei; + get_event_info(ev, out mei); + return mei; + } + + public override Module Module + { + get + { + return GetRuntimeModule(); + } + } + + internal BindingFlags BindingFlags + { + get + { + return GetBindingFlags(); + } + } + + internal RuntimeType GetDeclaringTypeInternal() + { + return (RuntimeType)DeclaringType; + } + + private RuntimeType ReflectedTypeInternal + { + get + { + return (RuntimeType)ReflectedType; + } + } + + internal RuntimeModule GetRuntimeModule() + { + return GetDeclaringTypeInternal().GetRuntimeModule(); + } + + internal BindingFlags GetBindingFlags() + { + MonoEventInfo info = GetEventInfo(this); + + MethodInfo method = info.add_method; + if (method == null) + method = info.remove_method; + if (method == null) + method = info.raise_method; + + return RuntimeType.FilterPreCalculate(method != null && method.IsPublic, GetDeclaringTypeInternal() != ReflectedType, method != null && method.IsStatic); + } + + public override EventAttributes Attributes + { + get + { + return GetEventInfo(this).attrs; + } + } + + public override MethodInfo GetAddMethod(bool nonPublic) + { + MonoEventInfo info = GetEventInfo(this); + if (nonPublic || (info.add_method != null && info.add_method.IsPublic)) + return info.add_method; + return null; + } + + public override MethodInfo GetRaiseMethod(bool nonPublic) + { + MonoEventInfo info = GetEventInfo(this); + if (nonPublic || (info.raise_method != null && info.raise_method.IsPublic)) + return info.raise_method; + return null; + } + + public override MethodInfo GetRemoveMethod(bool nonPublic) + { + MonoEventInfo info = GetEventInfo(this); + if (nonPublic || (info.remove_method != null && info.remove_method.IsPublic)) + return info.remove_method; + return null; + } + + public override MethodInfo[] GetOtherMethods(bool nonPublic) + { + MonoEventInfo info = GetEventInfo(this); + if (nonPublic) + return info.other_methods; + int num_public = 0; + foreach (MethodInfo m in info.other_methods) + { + if (m.IsPublic) + num_public++; + } + if (num_public == info.other_methods.Length) + return info.other_methods; + MethodInfo[] res = new MethodInfo[num_public]; + num_public = 0; + foreach (MethodInfo m in info.other_methods) + { + if (m.IsPublic) + res[num_public++] = m; + } + return res; + } + + public override Type DeclaringType + { + get + { + return GetEventInfo(this).declaring_type; + } + } + + public override Type ReflectedType + { + get + { + return GetEventInfo(this).reflected_type; + } + } + + public override string Name + { + get + { + return GetEventInfo(this).name; + } + } + + public override string ToString() + { + return EventHandlerType + " " + Name; + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + return CustomAttribute.IsDefined(this, attributeType, inherit); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, inherit); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + } + + public override IList GetCustomAttributesData() + { + return CustomAttributeData.GetCustomAttributes(this); + } + + public override int MetadataToken + { + get + { + return get_metadata_token(this); + } + } + + public sealed override bool HasSameMetadataDefinitionAs(MemberInfo other) => HasSameMetadataDefinitionAsCore(other); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern int get_metadata_token(RuntimeEventInfo monoEvent); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern EventInfo internal_from_handle_type(IntPtr event_handle, IntPtr type_handle); + + internal static EventInfo GetEventFromHandle(Mono.RuntimeEventHandle handle, RuntimeTypeHandle reflectedType) + { + if (handle.Value == IntPtr.Zero) + throw new ArgumentException("The handle is invalid."); + EventInfo ei = internal_from_handle_type(handle.Value, reflectedType.Value); + if (ei == null) + throw new ArgumentException("The event handle and the type handle are incompatible."); + return ei; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeExceptionHandlingClause.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeExceptionHandlingClause.cs index 75f6ac2a4a12f..4e9645be2a2fb 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeExceptionHandlingClause.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeExceptionHandlingClause.cs @@ -6,26 +6,26 @@ namespace System.Reflection { - [StructLayout (LayoutKind.Sequential)] - internal sealed class RuntimeExceptionHandlingClause : ExceptionHandlingClause - { - #region Keep in sync with MonoReflectionExceptionHandlingClause in object-internals.h - internal Type catch_type; - internal int filter_offset; - internal ExceptionHandlingClauseOptions flags; - internal int try_offset; - internal int try_length; - internal int handler_offset; - internal int handler_length; - #endregion + [StructLayout(LayoutKind.Sequential)] + internal sealed class RuntimeExceptionHandlingClause : ExceptionHandlingClause + { + #region Keep in sync with MonoReflectionExceptionHandlingClause in object-internals.h + internal Type catch_type; + internal int filter_offset; + internal ExceptionHandlingClauseOptions flags; + internal int try_offset; + internal int try_length; + internal int handler_offset; + internal int handler_length; + #endregion - public override ExceptionHandlingClauseOptions Flags => flags; + public override ExceptionHandlingClauseOptions Flags => flags; public override int TryOffset => try_offset; public override int TryLength => try_length; public override int HandlerOffset => handler_offset; public override int HandlerLength => handler_length; - public override int FilterOffset => filter_offset; - public override Type? CatchType => catch_type; - } + public override int FilterOffset => filter_offset; + public override Type? CatchType => catch_type; + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeFieldInfo.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeFieldInfo.cs index 56a82717a6dbc..1ad52ff27b979 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeFieldInfo.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeFieldInfo.cs @@ -8,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -30,56 +30,62 @@ namespace System.Reflection { - abstract class RtFieldInfo : FieldInfo - { - internal abstract object UnsafeGetValue (object obj); - internal abstract void UnsafeSetValue (Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture); - internal abstract void CheckConsistency(Object target); - } - - [StructLayout (LayoutKind.Sequential)] - class RuntimeFieldInfo : RtFieldInfo - { + internal abstract class RtFieldInfo : FieldInfo + { + internal abstract object UnsafeGetValue(object obj); + internal abstract void UnsafeSetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture); + internal abstract void CheckConsistency(object target); + } + + [StructLayout(LayoutKind.Sequential)] + internal class RuntimeFieldInfo : RtFieldInfo + { #pragma warning disable 649 - internal IntPtr klass; - internal RuntimeFieldHandle fhandle; - string name; - Type type; - FieldAttributes attrs; + internal IntPtr klass; + internal RuntimeFieldHandle fhandle; + private string name; + private Type type; + private FieldAttributes attrs; #pragma warning restore 649 - internal BindingFlags BindingFlags { - get { - return 0; - } - } - - public override Module Module { - get { - return GetRuntimeModule (); - } - } - - internal RuntimeType GetDeclaringTypeInternal () - { - return (RuntimeType) DeclaringType; - } - - RuntimeType ReflectedTypeInternal { - get { - return (RuntimeType) ReflectedType; - } - } - - internal RuntimeModule GetRuntimeModule () - { - return GetDeclaringTypeInternal ().GetRuntimeModule (); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal override extern object UnsafeGetValue (object obj); - - internal override void CheckConsistency(Object target) + internal BindingFlags BindingFlags + { + get + { + return 0; + } + } + + public override Module Module + { + get + { + return GetRuntimeModule(); + } + } + + internal RuntimeType GetDeclaringTypeInternal() + { + return (RuntimeType)DeclaringType; + } + + private RuntimeType ReflectedTypeInternal + { + get + { + return (RuntimeType)ReflectedType; + } + } + + internal RuntimeModule GetRuntimeModule() + { + return GetDeclaringTypeInternal().GetRuntimeModule(); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal override extern object UnsafeGetValue(object obj); + + internal override void CheckConsistency(object target) { // only test instance fields if ((Attributes & FieldAttributes.Static) != FieldAttributes.Static) @@ -93,24 +99,24 @@ internal override void CheckConsistency(Object target) else { throw new ArgumentException( - String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Arg_FieldDeclTarget"), + string.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Arg_FieldDeclTarget"), Name, DeclaringType, target.GetType())); } } } } - [DebuggerStepThroughAttribute] - [Diagnostics.DebuggerHidden] - internal override void UnsafeSetValue (Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture) - { - bool domainInitialized = false; - RuntimeFieldHandle.SetValue (this, obj, value, null, Attributes, null, ref domainInitialized); - } + [DebuggerStepThroughAttribute] + [Diagnostics.DebuggerHidden] + internal override void UnsafeSetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture) + { + bool domainInitialized = false; + RuntimeFieldHandle.SetValue(this, obj, value, null, Attributes, null, ref domainInitialized); + } [DebuggerStepThroughAttribute] [Diagnostics.DebuggerHidden] - public override void SetValueDirect(TypedReference obj, Object value) + public override void SetValueDirect(TypedReference obj, object value) { if (obj.IsNull) throw new ArgumentException(Environment.GetResourceString("Arg_TypedReference_Null")); @@ -124,7 +130,7 @@ public override void SetValueDirect(TypedReference obj, Object value) [DebuggerStepThroughAttribute] [Diagnostics.DebuggerHidden] - public override Object GetValueDirect(TypedReference obj) + public override object GetValueDirect(TypedReference obj) { if (obj.IsNull) throw new ArgumentException(Environment.GetResourceString("Arg_TypedReference_Null")); @@ -135,155 +141,178 @@ public override Object GetValueDirect(TypedReference obj) return RuntimeFieldHandle.GetValueDirect(this, (RuntimeType)FieldType, &obj, (RuntimeType)DeclaringType); } } - - public override FieldAttributes Attributes { - get { - return attrs; - } - } - public override RuntimeFieldHandle FieldHandle { - get { - return fhandle; - } - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern Type ResolveType (); - - public override Type FieldType { - get { - if (type == null) - type = ResolveType (); - return type; - } - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private extern Type GetParentType (bool declaring); - - public override Type ReflectedType { - get { - return GetParentType (false); - } - } - public override Type DeclaringType { - get { - Type parentType = GetParentType (true); - return parentType.Name != "" ? parentType : null; - } - } - public override string Name { - get { - return name; - } - } - - public override bool IsDefined (Type attributeType, bool inherit) { - return CustomAttribute.IsDefined (this, attributeType, inherit); - } - - public override object[] GetCustomAttributes( bool inherit) { - return CustomAttribute.GetCustomAttributes (this, inherit); - } - public override object[] GetCustomAttributes( Type attributeType, bool inherit) { - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal override extern int GetFieldOffset (); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private extern object GetValueInternal (object obj); - - public override object GetValue (object obj) - { - if (!IsStatic) { - if (obj == null) - throw new TargetException ("Non-static field requires a target"); - if (!DeclaringType.IsAssignableFrom (obj.GetType ())) - throw new ArgumentException (string.Format ( - "Field {0} defined on type {1} is not a field on the target object which is of type {2}.", - Name, DeclaringType, obj.GetType ()), - "obj"); - } - - if (!IsLiteral) - CheckGeneric (); - return GetValueInternal (obj); - } - - public override string ToString () { - return String.Format ("{0} {1}", FieldType, name); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern void SetValueInternal (FieldInfo fi, object obj, object value); - - public override void SetValue (object obj, object val, BindingFlags invokeAttr, Binder binder, CultureInfo culture) - { - if (!IsStatic) { - if (obj == null) - throw new TargetException ("Non-static field requires a target"); - if (!DeclaringType.IsAssignableFrom (obj.GetType ())) - throw new ArgumentException (string.Format ( - "Field {0} defined on type {1} is not a field on the target object which is of type {2}.", - Name, DeclaringType, obj.GetType ()), - "obj"); - } - if (IsLiteral) - throw new FieldAccessException ("Cannot set a constant field"); - if (binder == null) - binder = Type.DefaultBinder; - CheckGeneric (); - if (val != null) { - RuntimeType fieldType = (RuntimeType) FieldType; - val = fieldType.CheckValue (val, binder, culture, invokeAttr); - } - SetValueInternal (this, obj, val); - } - - internal RuntimeFieldInfo Clone (string newName) - { - RuntimeFieldInfo field = new RuntimeFieldInfo (); - field.name = newName; - field.type = type; - field.attrs = attrs; - field.klass = klass; - field.fhandle = fhandle; - return field; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public override extern object GetRawConstantValue (); - - public override IList GetCustomAttributesData () { - return CustomAttributeData.GetCustomAttributes (this); - } - - void CheckGeneric () { - Type declaringType = DeclaringType; - if (declaringType != null && declaringType.ContainsGenericParameters) - throw new InvalidOperationException ("Late bound operations cannot be performed on fields with types for which Type.ContainsGenericParameters is true."); - } - - public sealed override bool HasSameMetadataDefinitionAs (MemberInfo other) => HasSameMetadataDefinitionAsCore (other); - - public override int MetadataToken { - get { - return get_metadata_token (this); - } - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern int get_metadata_token (RuntimeFieldInfo monoField); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern Type[] GetTypeModifiers (bool optional); - - public override Type[] GetOptionalCustomModifiers () => GetCustomModifiers (true); - - public override Type[] GetRequiredCustomModifiers () => GetCustomModifiers (false); - - private Type[] GetCustomModifiers (bool optional) => GetTypeModifiers (optional) ?? Type.EmptyTypes; - } + + public override FieldAttributes Attributes + { + get + { + return attrs; + } + } + public override RuntimeFieldHandle FieldHandle + { + get + { + return fhandle; + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern Type ResolveType(); + + public override Type FieldType + { + get + { + if (type == null) + type = ResolveType(); + return type; + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern Type GetParentType(bool declaring); + + public override Type ReflectedType + { + get + { + return GetParentType(false); + } + } + public override Type DeclaringType + { + get + { + Type parentType = GetParentType(true); + return parentType.Name != "" ? parentType : null; + } + } + public override string Name + { + get + { + return name; + } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + return CustomAttribute.IsDefined(this, attributeType, inherit); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, inherit); + } + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal override extern int GetFieldOffset(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern object GetValueInternal(object obj); + + public override object GetValue(object obj) + { + if (!IsStatic) + { + if (obj == null) + throw new TargetException("Non-static field requires a target"); + if (!DeclaringType.IsAssignableFrom(obj.GetType())) + throw new ArgumentException(string.Format( + "Field {0} defined on type {1} is not a field on the target object which is of type {2}.", + Name, DeclaringType, obj.GetType()), + nameof(obj)); + } + + if (!IsLiteral) + CheckGeneric(); + return GetValueInternal(obj); + } + + public override string ToString() + { + return string.Format("{0} {1}", FieldType, name); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void SetValueInternal(FieldInfo fi, object obj, object value); + + public override void SetValue(object obj, object val, BindingFlags invokeAttr, Binder binder, CultureInfo culture) + { + if (!IsStatic) + { + if (obj == null) + throw new TargetException("Non-static field requires a target"); + if (!DeclaringType.IsAssignableFrom(obj.GetType())) + throw new ArgumentException(string.Format( + "Field {0} defined on type {1} is not a field on the target object which is of type {2}.", + Name, DeclaringType, obj.GetType()), + nameof(obj)); + } + if (IsLiteral) + throw new FieldAccessException("Cannot set a constant field"); + if (binder == null) + binder = Type.DefaultBinder; + CheckGeneric(); + if (val != null) + { + RuntimeType fieldType = (RuntimeType)FieldType; + val = fieldType.CheckValue(val, binder, culture, invokeAttr); + } + SetValueInternal(this, obj, val); + } + + internal RuntimeFieldInfo Clone(string newName) + { + RuntimeFieldInfo field = new RuntimeFieldInfo(); + field.name = newName; + field.type = type; + field.attrs = attrs; + field.klass = klass; + field.fhandle = fhandle; + return field; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public override extern object GetRawConstantValue(); + + public override IList GetCustomAttributesData() + { + return CustomAttributeData.GetCustomAttributes(this); + } + + private void CheckGeneric() + { + Type declaringType = DeclaringType; + if (declaringType != null && declaringType.ContainsGenericParameters) + throw new InvalidOperationException("Late bound operations cannot be performed on fields with types for which Type.ContainsGenericParameters is true."); + } + + public sealed override bool HasSameMetadataDefinitionAs(MemberInfo other) => HasSameMetadataDefinitionAsCore(other); + + public override int MetadataToken + { + get + { + return get_metadata_token(this); + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern int get_metadata_token(RuntimeFieldInfo monoField); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern Type[] GetTypeModifiers(bool optional); + + public override Type[] GetOptionalCustomModifiers() => GetCustomModifiers(true); + + public override Type[] GetRequiredCustomModifiers() => GetCustomModifiers(false); + + private Type[] GetCustomModifiers(bool optional) => GetTypeModifiers(optional) ?? Type.EmptyTypes; + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeLocalVariableInfo.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeLocalVariableInfo.cs index 6681ef929ee73..1f955d6735f1f 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeLocalVariableInfo.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeLocalVariableInfo.cs @@ -6,21 +6,22 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection { - [StructLayout (LayoutKind.Sequential)] - internal sealed class RuntimeLocalVariableInfo : LocalVariableInfo { - #region Keep in sync with MonoReflectionLocalVariableInfo in object-internals.h - internal Type type; - internal bool is_pinned; - internal ushort position; - #endregion +namespace System.Reflection +{ + [StructLayout(LayoutKind.Sequential)] + internal sealed class RuntimeLocalVariableInfo : LocalVariableInfo + { + #region Keep in sync with MonoReflectionLocalVariableInfo in object-internals.h + internal Type type; + internal bool is_pinned; + internal ushort position; + #endregion - public override bool IsPinned => is_pinned; + public override bool IsPinned => is_pinned; - public override int LocalIndex => position; + public override int LocalIndex => position; - public override Type LocalType => type; - } + public override Type LocalType => type; + } } - diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeMethodBody.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeMethodBody.cs index 7ded1e13589dd..97c20ed88b2b7 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeMethodBody.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeMethodBody.cs @@ -7,37 +7,36 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace System.Reflection { - - internal sealed class RuntimeMethodBody : MethodBody - { - ExceptionHandlingClause[] clauses; - LocalVariableInfo[] locals; - byte[] il; - bool init_locals; - int sig_token; - int max_stack; - - // Called by the runtime - internal RuntimeMethodBody (ExceptionHandlingClause[] clauses, LocalVariableInfo[] locals, - byte[] il, bool init_locals, int sig_token, int max_stack) - { - this.clauses = clauses; - this.locals = locals; - this.il = il; - this.init_locals = init_locals; - this.sig_token = sig_token; - this.max_stack = max_stack; - } +namespace System.Reflection +{ + + internal sealed class RuntimeMethodBody : MethodBody + { + private ExceptionHandlingClause[] clauses; + private LocalVariableInfo[] locals; + private byte[] il; + private bool init_locals; + private int sig_token; + private int max_stack; + + // Called by the runtime + internal RuntimeMethodBody(ExceptionHandlingClause[] clauses, LocalVariableInfo[] locals, + byte[] il, bool init_locals, int sig_token, int max_stack) + { + this.clauses = clauses; + this.locals = locals; + this.il = il; + this.init_locals = init_locals; + this.sig_token = sig_token; + this.max_stack = max_stack; + } public override int LocalSignatureMetadataToken => sig_token; - public override IList LocalVariables => Array.AsReadOnly (locals); + public override IList LocalVariables => Array.AsReadOnly(locals); public override int MaxStackSize => max_stack; public override bool InitLocals => init_locals; public override byte[] GetILAsByteArray() => il; - public override IList ExceptionHandlingClauses => Array.AsReadOnly (clauses); - } + public override IList ExceptionHandlingClauses => Array.AsReadOnly(clauses); + } } - - diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs index 763b4a52d11db..3bb9184855866 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs @@ -10,10 +10,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -36,132 +36,138 @@ namespace System.Reflection { - [Flags] - internal enum PInvokeAttributes - { - NoMangle = 0x0001, - - CharSetMask = 0x0006, - CharSetNotSpec = 0x0000, - CharSetAnsi = 0x0002, - CharSetUnicode = 0x0004, - CharSetAuto = 0x0006, - - BestFitUseAssem = 0x0000, - BestFitEnabled = 0x0010, - BestFitDisabled = 0x0020, - BestFitMask = 0x0030, - - ThrowOnUnmappableCharUseAssem = 0x0000, - ThrowOnUnmappableCharEnabled = 0x1000, - ThrowOnUnmappableCharDisabled = 0x2000, - ThrowOnUnmappableCharMask = 0x3000, - - SupportsLastError = 0x0040, - - CallConvMask = 0x0700, - CallConvWinapi = 0x0100, - CallConvCdecl = 0x0200, - CallConvStdcall = 0x0300, - CallConvThiscall = 0x0400, - CallConvFastcall = 0x0500, - - MaxValue = 0xFFFF, - } - - internal struct MonoMethodInfo - { -#pragma warning disable 649 - private Type parent; - private Type ret; - internal MethodAttributes attrs; - internal MethodImplAttributes iattrs; - private CallingConventions callconv; -#pragma warning restore 649 - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern void get_method_info (IntPtr handle, out MonoMethodInfo info); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern int get_method_attributes (IntPtr handle); - - internal static MonoMethodInfo GetMethodInfo (IntPtr handle) - { - MonoMethodInfo info; - MonoMethodInfo.get_method_info (handle, out info); - return info; - } - - internal static Type GetDeclaringType (IntPtr handle) - { - return GetMethodInfo (handle).parent; - } - - internal static Type GetReturnType (IntPtr handle) - { - return GetMethodInfo (handle).ret; - } - - internal static MethodAttributes GetAttributes (IntPtr handle) - { - return (MethodAttributes)get_method_attributes (handle); - } - - internal static CallingConventions GetCallingConvention (IntPtr handle) - { - return GetMethodInfo (handle).callconv; - } - - internal static MethodImplAttributes GetMethodImplementationFlags (IntPtr handle) - { - return GetMethodInfo (handle).iattrs; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern ParameterInfo[] get_parameter_info (IntPtr handle, MemberInfo member); - - static internal ParameterInfo[] GetParametersInfo (IntPtr handle, MemberInfo member) - { - return get_parameter_info (handle, member); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern MarshalAsAttribute get_retval_marshal (IntPtr handle); - - static internal ParameterInfo GetReturnParameterInfo (RuntimeMethodInfo method) - { - return RuntimeParameterInfo.New (GetReturnType (method.mhandle), method, get_retval_marshal (method.mhandle)); - } - } - - [StructLayout (LayoutKind.Sequential)] - class RuntimeMethodInfo : MethodInfo - { + [Flags] + internal enum PInvokeAttributes + { + NoMangle = 0x0001, + + CharSetMask = 0x0006, + CharSetNotSpec = 0x0000, + CharSetAnsi = 0x0002, + CharSetUnicode = 0x0004, + CharSetAuto = 0x0006, + + BestFitUseAssem = 0x0000, + BestFitEnabled = 0x0010, + BestFitDisabled = 0x0020, + BestFitMask = 0x0030, + + ThrowOnUnmappableCharUseAssem = 0x0000, + ThrowOnUnmappableCharEnabled = 0x1000, + ThrowOnUnmappableCharDisabled = 0x2000, + ThrowOnUnmappableCharMask = 0x3000, + + SupportsLastError = 0x0040, + + CallConvMask = 0x0700, + CallConvWinapi = 0x0100, + CallConvCdecl = 0x0200, + CallConvStdcall = 0x0300, + CallConvThiscall = 0x0400, + CallConvFastcall = 0x0500, + + MaxValue = 0xFFFF, + } + + internal struct MonoMethodInfo + { #pragma warning disable 649 - internal IntPtr mhandle; - string name; - Type reftype; + private Type parent; + private Type ret; + internal MethodAttributes attrs; + internal MethodImplAttributes iattrs; + private CallingConventions callconv; #pragma warning restore 649 - internal BindingFlags BindingFlags { - get { - return 0; - } - } + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void get_method_info(IntPtr handle, out MonoMethodInfo info); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int get_method_attributes(IntPtr handle); + + internal static MonoMethodInfo GetMethodInfo(IntPtr handle) + { + MonoMethodInfo info; + get_method_info(handle, out info); + return info; + } + + internal static Type GetDeclaringType(IntPtr handle) + { + return GetMethodInfo(handle).parent; + } + + internal static Type GetReturnType(IntPtr handle) + { + return GetMethodInfo(handle).ret; + } + + internal static MethodAttributes GetAttributes(IntPtr handle) + { + return (MethodAttributes)get_method_attributes(handle); + } + + internal static CallingConventions GetCallingConvention(IntPtr handle) + { + return GetMethodInfo(handle).callconv; + } + + internal static MethodImplAttributes GetMethodImplementationFlags(IntPtr handle) + { + return GetMethodInfo(handle).iattrs; + } - public override Module Module { - get { - return GetRuntimeModule (); - } - } + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern ParameterInfo[] get_parameter_info(IntPtr handle, MemberInfo member); - RuntimeType ReflectedTypeInternal { - get { - return (RuntimeType) ReflectedType; - } - } + internal static ParameterInfo[] GetParametersInfo(IntPtr handle, MemberInfo member) + { + return get_parameter_info(handle, member); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern MarshalAsAttribute get_retval_marshal(IntPtr handle); + + internal static ParameterInfo GetReturnParameterInfo(RuntimeMethodInfo method) + { + return RuntimeParameterInfo.New(GetReturnType(method.mhandle), method, get_retval_marshal(method.mhandle)); + } + } + + [StructLayout(LayoutKind.Sequential)] + internal class RuntimeMethodInfo : MethodInfo + { +#pragma warning disable 649 + internal IntPtr mhandle; + private string name; + private Type reftype; +#pragma warning restore 649 + + internal BindingFlags BindingFlags + { + get + { + return 0; + } + } + + public override Module Module + { + get + { + return GetRuntimeModule(); + } + } + + private RuntimeType ReflectedTypeInternal + { + get + { + return (RuntimeType)ReflectedType; + } + } - string FormatNameAndSig () + private string FormatNameAndSig() { // Serialization uses ToString to resolve MethodInfo overloads. StringBuilder sbName = new StringBuilder(Name); @@ -170,310 +176,354 @@ string FormatNameAndSig () sbName.Append(RuntimeMethodHandle.ConstructInstantiation(this, TypeNameFormatFlags.FormatBasic)); sbName.Append("("); - RuntimeParameterInfo.FormatParameters (sbName, GetParametersNoCopy (), CallingConvention); + RuntimeParameterInfo.FormatParameters(sbName, GetParametersNoCopy(), CallingConvention); sbName.Append(")"); return sbName.ToString(); } - public override Delegate CreateDelegate (Type delegateType) - { - return Delegate.CreateDelegate (delegateType, this); - } + public override Delegate CreateDelegate(Type delegateType) + { + return Delegate.CreateDelegate(delegateType, this); + } - public override Delegate CreateDelegate (Type delegateType, object target) - { - return Delegate.CreateDelegate (delegateType, target, this); - } + public override Delegate CreateDelegate(Type delegateType, object target) + { + return Delegate.CreateDelegate(delegateType, target, this); + } - public override String ToString() + public override string ToString() { return ReturnType.FormatTypeName() + " " + FormatNameAndSig(); } - internal RuntimeModule GetRuntimeModule () - { - return ((RuntimeType)DeclaringType).GetRuntimeModule(); - } - - internal static MethodBase GetMethodFromHandleNoGenericCheck (RuntimeMethodHandle handle) - { - return GetMethodFromHandleInternalType_native (handle.Value, IntPtr.Zero, false); - } - - internal static MethodBase GetMethodFromHandleNoGenericCheck (RuntimeMethodHandle handle, RuntimeTypeHandle reflectedType) - { - return GetMethodFromHandleInternalType_native (handle.Value, reflectedType.Value, false); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - [PreserveDependency(".ctor(System.Reflection.ExceptionHandlingClause[],System.Reflection.LocalVariableInfo[],System.Byte[],System.Boolean,System.Int32,System.Int32)", "System.Reflection.RuntimeMethodBody")] - internal extern static MethodBody GetMethodBodyInternal (IntPtr handle); - - internal static MethodBody GetMethodBody (IntPtr handle) - { - return GetMethodBodyInternal (handle); - } - - internal static MethodBase GetMethodFromHandleInternalType (IntPtr method_handle, IntPtr type_handle) { - return GetMethodFromHandleInternalType_native (method_handle, type_handle, true); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static MethodBase GetMethodFromHandleInternalType_native (IntPtr method_handle, IntPtr type_handle, bool genericCheck); - - internal RuntimeMethodInfo () { - } - - internal RuntimeMethodInfo (RuntimeMethodHandle mhandle) { - this.mhandle = mhandle.Value; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal static extern string get_name (MethodBase method); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal static extern RuntimeMethodInfo get_base_method (RuntimeMethodInfo method, bool definition); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal static extern int get_metadata_token (RuntimeMethodInfo method); - - public override MethodInfo GetBaseDefinition () - { - return get_base_method (this, true); - } - - // TODO: Remove, needed only for MonoCustomAttribute - internal MethodInfo GetBaseMethod () - { - return get_base_method (this, false); - } - - public override ParameterInfo ReturnParameter { - get { - return MonoMethodInfo.GetReturnParameterInfo (this); - } - } - - public override Type ReturnType { - get { - return MonoMethodInfo.GetReturnType (mhandle); - } - } - public override ICustomAttributeProvider ReturnTypeCustomAttributes { - get { - return MonoMethodInfo.GetReturnParameterInfo (this); - } - } - - public override int MetadataToken { - get { - return get_metadata_token (this); - } - } - - public override MethodImplAttributes GetMethodImplementationFlags () - { - return MonoMethodInfo.GetMethodImplementationFlags (mhandle); - } - - public override ParameterInfo[] GetParameters () - { - var src = MonoMethodInfo.GetParametersInfo (mhandle, this); - if (src.Length == 0) - return src; - - // Have to clone because GetParametersInfo icall returns cached value - var dest = new ParameterInfo [src.Length]; - Array.FastCopy (src, 0, dest, 0, src.Length); - return dest; - } - - internal override ParameterInfo[] GetParametersInternal () - { - return MonoMethodInfo.GetParametersInfo (mhandle, this); - } - - internal override int GetParametersCount () - { - return MonoMethodInfo.GetParametersInfo (mhandle, this).Length; - } - - /* - * InternalInvoke() receives the parameters correctly converted by the - * binder to match the types of the method signature. - * The exc argument is used to capture exceptions thrown by the icall. - * Exceptions thrown by the called method propagate normally. - */ - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern Object InternalInvoke (Object obj, Object[] parameters, out Exception exc); - - [DebuggerHidden] - [DebuggerStepThrough] - public override Object Invoke (Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - { - if (!IsStatic) { - if (!DeclaringType.IsInstanceOfType (obj)) { - if (obj == null) - throw new TargetException ("Non-static method requires a target."); - else - throw new TargetException ("Object does not match target type."); - } - } - - if (binder == null) - binder = Type.DefaultBinder; - - /*Avoid allocating an array every time*/ - ParameterInfo[] pinfo = GetParametersInternal (); - ConvertValues (binder, parameters, pinfo, culture, invokeAttr); - - if (ContainsGenericParameters) - throw new InvalidOperationException ("Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true."); - - Exception exc; - object o = null; - - if ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { - try { - o = InternalInvoke (obj, parameters, out exc); - } catch (Mono.NullByRefReturnException) { - throw new NullReferenceException (); - } catch (OverflowException) { - throw; - } catch (Exception e) { - throw new TargetInvocationException (e); - } - } - else - { - try { - o = InternalInvoke (obj, parameters, out exc); - } catch (Mono.NullByRefReturnException) { - throw new NullReferenceException (); - } - } - - if (exc != null) - throw exc; - return o; - } - - internal static void ConvertValues (Binder binder, object[] args, ParameterInfo[] pinfo, CultureInfo culture, BindingFlags invokeAttr) - { - if (args == null) { - if (pinfo.Length == 0) - return; - - throw new TargetParameterCountException (); - } - - if (pinfo.Length != args.Length) - throw new TargetParameterCountException (); - - for (int i = 0; i < args.Length; ++i) { - var arg = args [i]; - var pi = pinfo [i]; - if (arg == Type.Missing) { - if (pi.DefaultValue == System.DBNull.Value) - throw new ArgumentException(Environment.GetResourceString("Arg_VarMissNull"),"parameters"); - - args [i] = pi.DefaultValue; - continue; - } - - var rt = (RuntimeType) pi.ParameterType; - args [i] = rt.CheckValue (arg, binder, culture, invokeAttr); - } - } - - public override RuntimeMethodHandle MethodHandle { - get { - return new RuntimeMethodHandle (mhandle); - } - } - - public override MethodAttributes Attributes { - get { - return MonoMethodInfo.GetAttributes (mhandle); - } - } - - public override CallingConventions CallingConvention { - get { - return MonoMethodInfo.GetCallingConvention (mhandle); - } - } - - public override Type ReflectedType { - get { - return reftype; - } - } - public override Type DeclaringType { - get { - return MonoMethodInfo.GetDeclaringType (mhandle); - } - } - public override string Name { - get { - if (name != null) - return name; - return get_name (this); - } - } - - public override bool IsDefined (Type attributeType, bool inherit) { - return CustomAttribute.IsDefined (this, attributeType, inherit); - } - - public override object[] GetCustomAttributes( bool inherit) { - return CustomAttribute.GetCustomAttributes (this, inherit); - } - public override object[] GetCustomAttributes( Type attributeType, bool inherit) { - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern void GetPInvoke (out PInvokeAttributes flags, out string entryPoint, out string dllName); - - internal object[] GetPseudoCustomAttributes () - { - int count = 0; - - /* MS.NET doesn't report MethodImplAttribute */ - - MonoMethodInfo info = MonoMethodInfo.GetMethodInfo (mhandle); - if ((info.iattrs & MethodImplAttributes.PreserveSig) != 0) - count ++; - if ((info.attrs & MethodAttributes.PinvokeImpl) != 0) - count ++; - - if (count == 0) - return null; - object[] attrs = new object [count]; - count = 0; - - if ((info.iattrs & MethodImplAttributes.PreserveSig) != 0) - attrs [count ++] = new PreserveSigAttribute (); - if ((info.attrs & MethodAttributes.PinvokeImpl) != 0) { - attrs [count ++] = GetDllImportAttribute (); - } - - return attrs; - } - - Attribute GetDllImportAttribute () + internal RuntimeModule GetRuntimeModule() + { + return ((RuntimeType)DeclaringType).GetRuntimeModule(); + } + + internal static MethodBase GetMethodFromHandleNoGenericCheck(RuntimeMethodHandle handle) + { + return GetMethodFromHandleInternalType_native(handle.Value, IntPtr.Zero, false); + } + + internal static MethodBase GetMethodFromHandleNoGenericCheck(RuntimeMethodHandle handle, RuntimeTypeHandle reflectedType) + { + return GetMethodFromHandleInternalType_native(handle.Value, reflectedType.Value, false); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + [PreserveDependency(".ctor(System.Reflection.ExceptionHandlingClause[],System.Reflection.LocalVariableInfo[],System.Byte[],System.Boolean,System.Int32,System.Int32)", "System.Reflection.RuntimeMethodBody")] + internal static extern MethodBody GetMethodBodyInternal(IntPtr handle); + + internal static MethodBody GetMethodBody(IntPtr handle) + { + return GetMethodBodyInternal(handle); + } + + internal static MethodBase GetMethodFromHandleInternalType(IntPtr method_handle, IntPtr type_handle) + { + return GetMethodFromHandleInternalType_native(method_handle, type_handle, true); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern MethodBase GetMethodFromHandleInternalType_native(IntPtr method_handle, IntPtr type_handle, bool genericCheck); + + internal RuntimeMethodInfo() + { + } + + internal RuntimeMethodInfo(RuntimeMethodHandle mhandle) + { + this.mhandle = mhandle.Value; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern string get_name(MethodBase method); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern RuntimeMethodInfo get_base_method(RuntimeMethodInfo method, bool definition); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern int get_metadata_token(RuntimeMethodInfo method); + + public override MethodInfo GetBaseDefinition() + { + return get_base_method(this, true); + } + + // TODO: Remove, needed only for MonoCustomAttribute + internal MethodInfo GetBaseMethod() + { + return get_base_method(this, false); + } + + public override ParameterInfo ReturnParameter + { + get + { + return MonoMethodInfo.GetReturnParameterInfo(this); + } + } + + public override Type ReturnType + { + get + { + return MonoMethodInfo.GetReturnType(mhandle); + } + } + public override ICustomAttributeProvider ReturnTypeCustomAttributes + { + get + { + return MonoMethodInfo.GetReturnParameterInfo(this); + } + } + + public override int MetadataToken + { + get + { + return get_metadata_token(this); + } + } + + public override MethodImplAttributes GetMethodImplementationFlags() + { + return MonoMethodInfo.GetMethodImplementationFlags(mhandle); + } + + public override ParameterInfo[] GetParameters() + { + var src = MonoMethodInfo.GetParametersInfo(mhandle, this); + if (src.Length == 0) + return src; + + // Have to clone because GetParametersInfo icall returns cached value + var dest = new ParameterInfo[src.Length]; + Array.FastCopy(src, 0, dest, 0, src.Length); + return dest; + } + + internal override ParameterInfo[] GetParametersInternal() + { + return MonoMethodInfo.GetParametersInfo(mhandle, this); + } + + internal override int GetParametersCount() + { + return MonoMethodInfo.GetParametersInfo(mhandle, this).Length; + } + + /* + * InternalInvoke() receives the parameters correctly converted by the + * binder to match the types of the method signature. + * The exc argument is used to capture exceptions thrown by the icall. + * Exceptions thrown by the called method propagate normally. + */ + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern object InternalInvoke(object obj, object[] parameters, out Exception exc); + + [DebuggerHidden] + [DebuggerStepThrough] + public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) + { + if (!IsStatic) + { + if (!DeclaringType.IsInstanceOfType(obj)) + { + if (obj == null) + throw new TargetException("Non-static method requires a target."); + else + throw new TargetException("Object does not match target type."); + } + } + + if (binder == null) + binder = Type.DefaultBinder; + + /*Avoid allocating an array every time*/ + ParameterInfo[] pinfo = GetParametersInternal(); + ConvertValues(binder, parameters, pinfo, culture, invokeAttr); + + if (ContainsGenericParameters) + throw new InvalidOperationException("Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true."); + + Exception exc; + object o = null; + + if ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) + { + try + { + o = InternalInvoke(obj, parameters, out exc); + } + catch (Mono.NullByRefReturnException) + { + throw new NullReferenceException(); + } + catch (OverflowException) + { + throw; + } + catch (Exception e) + { + throw new TargetInvocationException(e); + } + } + else + { + try + { + o = InternalInvoke(obj, parameters, out exc); + } + catch (Mono.NullByRefReturnException) + { + throw new NullReferenceException(); + } + } + + if (exc != null) + throw exc; + return o; + } + + internal static void ConvertValues(Binder binder, object[] args, ParameterInfo[] pinfo, CultureInfo culture, BindingFlags invokeAttr) + { + if (args == null) + { + if (pinfo.Length == 0) + return; + + throw new TargetParameterCountException(); + } + + if (pinfo.Length != args.Length) + throw new TargetParameterCountException(); + + for (int i = 0; i < args.Length; ++i) + { + var arg = args[i]; + var pi = pinfo[i]; + if (arg == Type.Missing) + { + if (pi.DefaultValue == DBNull.Value) + throw new ArgumentException(Environment.GetResourceString("Arg_VarMissNull"), "parameters"); + + args[i] = pi.DefaultValue; + continue; + } + + var rt = (RuntimeType)pi.ParameterType; + args[i] = rt.CheckValue(arg, binder, culture, invokeAttr); + } + } + + public override RuntimeMethodHandle MethodHandle + { + get + { + return new RuntimeMethodHandle(mhandle); + } + } + + public override MethodAttributes Attributes + { + get + { + return MonoMethodInfo.GetAttributes(mhandle); + } + } + + public override CallingConventions CallingConvention + { + get + { + return MonoMethodInfo.GetCallingConvention(mhandle); + } + } + + public override Type ReflectedType + { + get + { + return reftype; + } + } + public override Type DeclaringType + { + get + { + return MonoMethodInfo.GetDeclaringType(mhandle); + } + } + public override string Name + { + get + { + if (name != null) + return name; + return get_name(this); + } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + return CustomAttribute.IsDefined(this, attributeType, inherit); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, inherit); + } + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern void GetPInvoke(out PInvokeAttributes flags, out string entryPoint, out string dllName); + + internal object[] GetPseudoCustomAttributes() + { + int count = 0; + + /* MS.NET doesn't report MethodImplAttribute */ + + MonoMethodInfo info = MonoMethodInfo.GetMethodInfo(mhandle); + if ((info.iattrs & MethodImplAttributes.PreserveSig) != 0) + count++; + if ((info.attrs & MethodAttributes.PinvokeImpl) != 0) + count++; + + if (count == 0) + return null; + object[] attrs = new object[count]; + count = 0; + + if ((info.iattrs & MethodImplAttributes.PreserveSig) != 0) + attrs[count++] = new PreserveSigAttribute(); + if ((info.attrs & MethodAttributes.PinvokeImpl) != 0) + { + attrs[count++] = GetDllImportAttribute(); + } + + return attrs; + } + + private Attribute GetDllImportAttribute() { string entryPoint, dllName = null; int token = MetadataToken; PInvokeAttributes flags = 0; - GetPInvoke (out flags, out entryPoint, out dllName); + GetPInvoke(out flags, out entryPoint, out dllName); CharSet charSet = CharSet.None; - switch (flags & PInvokeAttributes.CharSetMask) { + switch (flags & PInvokeAttributes.CharSetMask) + { case PInvokeAttributes.CharSetNotSpec: charSet = CharSet.None; break; case PInvokeAttributes.CharSetAnsi: charSet = CharSet.Ansi; break; case PInvokeAttributes.CharSetUnicode: charSet = CharSet.Unicode; break; @@ -485,7 +535,8 @@ Attribute GetDllImportAttribute () CallingConvention callingConvention = InteropServicesCallingConvention.Cdecl; - switch (flags & PInvokeAttributes.CallConvMask) { + switch (flags & PInvokeAttributes.CallConvMask) + { case PInvokeAttributes.CallConvWinapi: callingConvention = InteropServicesCallingConvention.Winapi; break; case PInvokeAttributes.CallConvCdecl: callingConvention = InteropServicesCallingConvention.Cdecl; break; case PInvokeAttributes.CallConvStdcall: callingConvention = InteropServicesCallingConvention.StdCall; break; @@ -502,412 +553,471 @@ Attribute GetDllImportAttribute () bool throwOnUnmappableChar = (flags & PInvokeAttributes.ThrowOnUnmappableCharMask) == PInvokeAttributes.ThrowOnUnmappableCharEnabled; bool preserveSig = (GetMethodImplementationFlags() & MethodImplAttributes.PreserveSig) != 0; - return new DllImportAttribute (dllName) { EntryPoint = entryPoint, CharSet = charSet, SetLastError = setLastError, - ExactSpelling = exactSpelling, PreserveSig = preserveSig, BestFitMapping = bestFitMapping, - ThrowOnUnmappableChar = throwOnUnmappableChar, CallingConvention = callingConvention }; - } - - internal CustomAttributeData[] GetPseudoCustomAttributesData () - { - int count = 0; - - /* MS.NET doesn't report MethodImplAttribute */ - - MonoMethodInfo info = MonoMethodInfo.GetMethodInfo (mhandle); - if ((info.iattrs & MethodImplAttributes.PreserveSig) != 0) - count++; - if ((info.attrs & MethodAttributes.PinvokeImpl) != 0) - count++; - - if (count == 0) - return null; - CustomAttributeData[] attrsData = new CustomAttributeData [count]; - count = 0; - - if ((info.iattrs & MethodImplAttributes.PreserveSig) != 0) - attrsData [count++] = new CustomAttributeData ((typeof (PreserveSigAttribute)).GetConstructor (Type.EmptyTypes)); - if ((info.attrs & MethodAttributes.PinvokeImpl) != 0) - attrsData [count++] = GetDllImportAttributeData (); - - return attrsData; - } - - private CustomAttributeData GetDllImportAttributeData () - { - if ((Attributes & MethodAttributes.PinvokeImpl) == 0) - return null; - - string entryPoint, dllName = null; - PInvokeAttributes flags = 0; - - GetPInvoke (out flags, out entryPoint, out dllName); - - CharSet charSet; - - switch (flags & PInvokeAttributes.CharSetMask) { - case PInvokeAttributes.CharSetNotSpec: - charSet = CharSet.None; - break; - case PInvokeAttributes.CharSetAnsi: - charSet = CharSet.Ansi; - break; - case PInvokeAttributes.CharSetUnicode: - charSet = CharSet.Unicode; - break; - case PInvokeAttributes.CharSetAuto: - charSet = CharSet.Auto; - break; - // Invalid: default to CharSet.None - default: - charSet = CharSet.None; - break; - } - - InteropServicesCallingConvention callingConvention; - - switch (flags & PInvokeAttributes.CallConvMask) { - case PInvokeAttributes.CallConvWinapi: - callingConvention = InteropServicesCallingConvention.Winapi; - break; - case PInvokeAttributes.CallConvCdecl: - callingConvention = InteropServicesCallingConvention.Cdecl; - break; - case PInvokeAttributes.CallConvStdcall: - callingConvention = InteropServicesCallingConvention.StdCall; - break; - case PInvokeAttributes.CallConvThiscall: - callingConvention = InteropServicesCallingConvention.ThisCall; - break; - case PInvokeAttributes.CallConvFastcall: - callingConvention = InteropServicesCallingConvention.FastCall; - break; - // Invalid: default to CallingConvention.Cdecl - default: - callingConvention = InteropServicesCallingConvention.Cdecl; - break; - } - - bool exactSpelling = (flags & PInvokeAttributes.NoMangle) != 0; - bool setLastError = (flags & PInvokeAttributes.SupportsLastError) != 0; - bool bestFitMapping = (flags & PInvokeAttributes.BestFitMask) == PInvokeAttributes.BestFitEnabled; - bool throwOnUnmappableChar = (flags & PInvokeAttributes.ThrowOnUnmappableCharMask) == PInvokeAttributes.ThrowOnUnmappableCharEnabled; - bool preserveSig = (GetMethodImplementationFlags () & MethodImplAttributes.PreserveSig) != 0; - - var ctorArgs = new CustomAttributeTypedArgument [] { - new CustomAttributeTypedArgument (typeof (string), dllName), - }; - - var attrType = typeof (DllImportAttribute); - - var namedArgs = new CustomAttributeNamedArgument [] { - new CustomAttributeNamedArgument (attrType.GetField ("EntryPoint"), entryPoint), - new CustomAttributeNamedArgument (attrType.GetField ("CharSet"), charSet), - new CustomAttributeNamedArgument (attrType.GetField ("ExactSpelling"), exactSpelling), - new CustomAttributeNamedArgument (attrType.GetField ("SetLastError"), setLastError), - new CustomAttributeNamedArgument (attrType.GetField ("PreserveSig"), preserveSig), - new CustomAttributeNamedArgument (attrType.GetField ("CallingConvention"), callingConvention), - new CustomAttributeNamedArgument (attrType.GetField ("BestFitMapping"), bestFitMapping), - new CustomAttributeNamedArgument (attrType.GetField ("ThrowOnUnmappableChar"), throwOnUnmappableChar) - }; - - return new CustomAttributeData ( - attrType.GetConstructor (new[] { typeof (string) }), - ctorArgs, - namedArgs); - } - - public override MethodInfo MakeGenericMethod (Type [] methodInstantiation) - { - if (methodInstantiation == null) - throw new ArgumentNullException ("methodInstantiation"); - - if (!IsGenericMethodDefinition) - throw new InvalidOperationException ("not a generic method definition"); - - /*FIXME add GetGenericArgumentsLength() internal vcall to speed this up*/ - if (GetGenericArguments ().Length != methodInstantiation.Length) - throw new ArgumentException ("Incorrect length"); - - bool hasUserType = false; - foreach (Type type in methodInstantiation) { - if (type == null) - throw new ArgumentNullException (); - if (!(type is RuntimeType)) - hasUserType = true; - } - - if (hasUserType) { - if (RuntimeFeature.IsDynamicCodeSupported) - return new MethodOnTypeBuilderInst (this, methodInstantiation); - - throw new NotSupportedException ("User types are not supported under full aot"); - } - - MethodInfo ret = MakeGenericMethod_impl (methodInstantiation); - if (ret == null) - throw new ArgumentException (String.Format ("The method has {0} generic parameter(s) but {1} generic argument(s) were provided.", GetGenericArguments ().Length, methodInstantiation.Length)); - return ret; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern MethodInfo MakeGenericMethod_impl (Type [] types); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public override extern Type [] GetGenericArguments (); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern MethodInfo GetGenericMethodDefinition_impl (); - - public override MethodInfo GetGenericMethodDefinition () - { - MethodInfo res = GetGenericMethodDefinition_impl (); - if (res == null) - throw new InvalidOperationException (); - - return res; - } - - public override extern bool IsGenericMethodDefinition { - [MethodImplAttribute(MethodImplOptions.InternalCall)] - get; - } - - public override extern bool IsGenericMethod { - [MethodImplAttribute(MethodImplOptions.InternalCall)] - get; - } - - public override bool ContainsGenericParameters { - get { - if (IsGenericMethod) { - foreach (Type arg in GetGenericArguments ()) - if (arg.ContainsGenericParameters) - return true; - } - return DeclaringType.ContainsGenericParameters; - } - } - - public override MethodBody GetMethodBody () { - return GetMethodBody (mhandle); - } - - public override IList GetCustomAttributesData () { - return CustomAttributeData.GetCustomAttributes (this); - } - - public sealed override bool HasSameMetadataDefinitionAs (MemberInfo other) => HasSameMetadataDefinitionAsCore (other); - } - - [StructLayout (LayoutKind.Sequential)] - class RuntimeConstructorInfo : ConstructorInfo - { + return new DllImportAttribute(dllName) + { + EntryPoint = entryPoint, + CharSet = charSet, + SetLastError = setLastError, + ExactSpelling = exactSpelling, + PreserveSig = preserveSig, + BestFitMapping = bestFitMapping, + ThrowOnUnmappableChar = throwOnUnmappableChar, + CallingConvention = callingConvention + }; + } + + internal CustomAttributeData[] GetPseudoCustomAttributesData() + { + int count = 0; + + /* MS.NET doesn't report MethodImplAttribute */ + + MonoMethodInfo info = MonoMethodInfo.GetMethodInfo(mhandle); + if ((info.iattrs & MethodImplAttributes.PreserveSig) != 0) + count++; + if ((info.attrs & MethodAttributes.PinvokeImpl) != 0) + count++; + + if (count == 0) + return null; + CustomAttributeData[] attrsData = new CustomAttributeData[count]; + count = 0; + + if ((info.iattrs & MethodImplAttributes.PreserveSig) != 0) + attrsData[count++] = new CustomAttributeData((typeof(PreserveSigAttribute)).GetConstructor(Type.EmptyTypes)); + if ((info.attrs & MethodAttributes.PinvokeImpl) != 0) + attrsData[count++] = GetDllImportAttributeData(); + + return attrsData; + } + + private CustomAttributeData GetDllImportAttributeData() + { + if ((Attributes & MethodAttributes.PinvokeImpl) == 0) + return null; + + string entryPoint, dllName = null; + PInvokeAttributes flags = 0; + + GetPInvoke(out flags, out entryPoint, out dllName); + + CharSet charSet; + + switch (flags & PInvokeAttributes.CharSetMask) + { + case PInvokeAttributes.CharSetNotSpec: + charSet = CharSet.None; + break; + case PInvokeAttributes.CharSetAnsi: + charSet = CharSet.Ansi; + break; + case PInvokeAttributes.CharSetUnicode: + charSet = CharSet.Unicode; + break; + case PInvokeAttributes.CharSetAuto: + charSet = CharSet.Auto; + break; + // Invalid: default to CharSet.None + default: + charSet = CharSet.None; + break; + } + + InteropServicesCallingConvention callingConvention; + + switch (flags & PInvokeAttributes.CallConvMask) + { + case PInvokeAttributes.CallConvWinapi: + callingConvention = InteropServicesCallingConvention.Winapi; + break; + case PInvokeAttributes.CallConvCdecl: + callingConvention = InteropServicesCallingConvention.Cdecl; + break; + case PInvokeAttributes.CallConvStdcall: + callingConvention = InteropServicesCallingConvention.StdCall; + break; + case PInvokeAttributes.CallConvThiscall: + callingConvention = InteropServicesCallingConvention.ThisCall; + break; + case PInvokeAttributes.CallConvFastcall: + callingConvention = InteropServicesCallingConvention.FastCall; + break; + // Invalid: default to CallingConvention.Cdecl + default: + callingConvention = InteropServicesCallingConvention.Cdecl; + break; + } + + bool exactSpelling = (flags & PInvokeAttributes.NoMangle) != 0; + bool setLastError = (flags & PInvokeAttributes.SupportsLastError) != 0; + bool bestFitMapping = (flags & PInvokeAttributes.BestFitMask) == PInvokeAttributes.BestFitEnabled; + bool throwOnUnmappableChar = (flags & PInvokeAttributes.ThrowOnUnmappableCharMask) == PInvokeAttributes.ThrowOnUnmappableCharEnabled; + bool preserveSig = (GetMethodImplementationFlags() & MethodImplAttributes.PreserveSig) != 0; + + var ctorArgs = new CustomAttributeTypedArgument[] { + new CustomAttributeTypedArgument (typeof(string), dllName), + }; + + var attrType = typeof(DllImportAttribute); + + var namedArgs = new CustomAttributeNamedArgument[] { + new CustomAttributeNamedArgument (attrType.GetField ("EntryPoint"), entryPoint), + new CustomAttributeNamedArgument (attrType.GetField ("CharSet"), charSet), + new CustomAttributeNamedArgument (attrType.GetField ("ExactSpelling"), exactSpelling), + new CustomAttributeNamedArgument (attrType.GetField ("SetLastError"), setLastError), + new CustomAttributeNamedArgument (attrType.GetField ("PreserveSig"), preserveSig), + new CustomAttributeNamedArgument (attrType.GetField ("CallingConvention"), callingConvention), + new CustomAttributeNamedArgument (attrType.GetField ("BestFitMapping"), bestFitMapping), + new CustomAttributeNamedArgument (attrType.GetField ("ThrowOnUnmappableChar"), throwOnUnmappableChar) + }; + + return new CustomAttributeData( + attrType.GetConstructor(new[] { typeof(string) }), + ctorArgs, + namedArgs); + } + + public override MethodInfo MakeGenericMethod(Type[] methodInstantiation) + { + if (methodInstantiation == null) + throw new ArgumentNullException(nameof(methodInstantiation)); + + if (!IsGenericMethodDefinition) + throw new InvalidOperationException("not a generic method definition"); + + /*FIXME add GetGenericArgumentsLength() internal vcall to speed this up*/ + if (GetGenericArguments().Length != methodInstantiation.Length) + throw new ArgumentException("Incorrect length"); + + bool hasUserType = false; + foreach (Type type in methodInstantiation) + { + if (type == null) + throw new ArgumentNullException(); + if (!(type is RuntimeType)) + hasUserType = true; + } + + if (hasUserType) + { + if (RuntimeFeature.IsDynamicCodeSupported) + return new MethodOnTypeBuilderInst(this, methodInstantiation); + + throw new NotSupportedException("User types are not supported under full aot"); + } + + MethodInfo ret = MakeGenericMethod_impl(methodInstantiation); + if (ret == null) + throw new ArgumentException(string.Format("The method has {0} generic parameter(s) but {1} generic argument(s) were provided.", GetGenericArguments().Length, methodInstantiation.Length)); + return ret; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern MethodInfo MakeGenericMethod_impl(Type[] types); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public override extern Type[] GetGenericArguments(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern MethodInfo GetGenericMethodDefinition_impl(); + + public override MethodInfo GetGenericMethodDefinition() + { + MethodInfo res = GetGenericMethodDefinition_impl(); + if (res == null) + throw new InvalidOperationException(); + + return res; + } + + public override extern bool IsGenericMethodDefinition + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + } + + public override extern bool IsGenericMethod + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + } + + public override bool ContainsGenericParameters + { + get + { + if (IsGenericMethod) + { + foreach (Type arg in GetGenericArguments()) + if (arg.ContainsGenericParameters) + return true; + } + return DeclaringType.ContainsGenericParameters; + } + } + + public override MethodBody GetMethodBody() + { + return GetMethodBody(mhandle); + } + + public override IList GetCustomAttributesData() + { + return CustomAttributeData.GetCustomAttributes(this); + } + + public sealed override bool HasSameMetadataDefinitionAs(MemberInfo other) => HasSameMetadataDefinitionAsCore(other); + } + + [StructLayout(LayoutKind.Sequential)] + internal class RuntimeConstructorInfo : ConstructorInfo + { #pragma warning disable 649 - internal IntPtr mhandle; - string name; - Type reftype; + internal IntPtr mhandle; + private string name; + private Type reftype; #pragma warning restore 649 - public override Module Module { - get { - return GetRuntimeModule (); - } - } - - internal RuntimeModule GetRuntimeModule () - { - return RuntimeTypeHandle.GetModule((RuntimeType)DeclaringType); - } - - internal BindingFlags BindingFlags { - get { - return 0; - } - } - - RuntimeType ReflectedTypeInternal { - get { - return (RuntimeType) ReflectedType; - } - } - - public override MethodImplAttributes GetMethodImplementationFlags () - { - return MonoMethodInfo.GetMethodImplementationFlags (mhandle); - } - - public override ParameterInfo[] GetParameters () - { - return MonoMethodInfo.GetParametersInfo (mhandle, this); - } - - internal override ParameterInfo[] GetParametersInternal () - { - return MonoMethodInfo.GetParametersInfo (mhandle, this); - } - - internal override int GetParametersCount () - { - var pi = MonoMethodInfo.GetParametersInfo (mhandle, this); - return pi == null ? 0 : pi.Length; - } - - /* - * InternalInvoke() receives the parameters correctly converted by the binder - * to match the types of the method signature. - */ - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern Object InternalInvoke (Object obj, Object[] parameters, out Exception exc); - - [DebuggerHidden] - [DebuggerStepThrough] - public override object Invoke (object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) - { - if (obj == null) { - if (!IsStatic) - throw new TargetException ("Instance constructor requires a target"); - } else if (!DeclaringType.IsInstanceOfType (obj)) { - throw new TargetException ("Constructor does not match target type"); - } - - return DoInvoke (obj, invokeAttr, binder, parameters, culture); - } - - object DoInvoke (object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) - { - if (binder == null) - binder = Type.DefaultBinder; - - ParameterInfo[] pinfo = MonoMethodInfo.GetParametersInfo (mhandle, this); - - RuntimeMethodInfo.ConvertValues (binder, parameters, pinfo, culture, invokeAttr); - - if (obj == null && DeclaringType.ContainsGenericParameters) - throw new MemberAccessException ("Cannot create an instance of " + DeclaringType + " because Type.ContainsGenericParameters is true."); - - if ((invokeAttr & BindingFlags.CreateInstance) != 0 && DeclaringType.IsAbstract) { - throw new MemberAccessException (String.Format ("Cannot create an instance of {0} because it is an abstract class", DeclaringType)); - } - - return InternalInvoke (obj, parameters, (invokeAttr & BindingFlags.DoNotWrapExceptions) == 0); - } - - public object InternalInvoke (object obj, object[] parameters, bool wrapExceptions) - { - Exception exc; - object o = null; - - if (wrapExceptions) { - try { - o = InternalInvoke (obj, parameters, out exc); - } catch (MethodAccessException) { - throw; - } catch (OverflowException) { - throw; - } catch (Exception e) { - throw new TargetInvocationException (e); - } - } else { - o = InternalInvoke (obj, parameters, out exc); - } - - if (exc != null) - throw exc; - - return obj == null ? o : null; - } - - [DebuggerHidden] - [DebuggerStepThrough] - public override Object Invoke (BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - { - return DoInvoke (null, invokeAttr, binder, parameters, culture); - } - - public override RuntimeMethodHandle MethodHandle { - get { - return new RuntimeMethodHandle (mhandle); - } - } - - public override MethodAttributes Attributes { - get { - return MonoMethodInfo.GetAttributes (mhandle); - } - } - - public override CallingConventions CallingConvention { - get { - return MonoMethodInfo.GetCallingConvention (mhandle); - } - } - - public override bool ContainsGenericParameters { - get { - return DeclaringType.ContainsGenericParameters; - } - } - - public override Type ReflectedType { - get { - return reftype; - } - } - public override Type DeclaringType { - get { - return MonoMethodInfo.GetDeclaringType (mhandle); - } - } - public override string Name { - get { - if (name != null) - return name; - return RuntimeMethodInfo.get_name (this); - } - } - - public override bool IsDefined (Type attributeType, bool inherit) { - return CustomAttribute.IsDefined (this, attributeType, inherit); - } - - public override object[] GetCustomAttributes( bool inherit) { - return CustomAttribute.GetCustomAttributes (this, inherit); - } - - public override object[] GetCustomAttributes( Type attributeType, bool inherit) { - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - } - - public override MethodBody GetMethodBody () { - return RuntimeMethodInfo.GetMethodBody (mhandle); - } - - public override string ToString () - { - StringBuilder sbName = new StringBuilder(Name); - sbName.Append ("Void "); - - sbName.Append("("); - RuntimeParameterInfo.FormatParameters (sbName, GetParametersNoCopy (), CallingConvention); - sbName.Append(")"); - - return sbName.ToString(); - } - - public override IList GetCustomAttributesData () - { - return CustomAttributeData.GetCustomAttributes (this); - } - - public sealed override bool HasSameMetadataDefinitionAs (MemberInfo other) => HasSameMetadataDefinitionAsCore (other); - - public override int MetadataToken { - get { - return get_metadata_token (this); - } - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern int get_metadata_token (RuntimeConstructorInfo method); - } + public override Module Module + { + get + { + return GetRuntimeModule(); + } + } + + internal RuntimeModule GetRuntimeModule() + { + return RuntimeTypeHandle.GetModule((RuntimeType)DeclaringType); + } + + internal BindingFlags BindingFlags + { + get + { + return 0; + } + } + + private RuntimeType ReflectedTypeInternal + { + get + { + return (RuntimeType)ReflectedType; + } + } + + public override MethodImplAttributes GetMethodImplementationFlags() + { + return MonoMethodInfo.GetMethodImplementationFlags(mhandle); + } + + public override ParameterInfo[] GetParameters() + { + return MonoMethodInfo.GetParametersInfo(mhandle, this); + } + + internal override ParameterInfo[] GetParametersInternal() + { + return MonoMethodInfo.GetParametersInfo(mhandle, this); + } + + internal override int GetParametersCount() + { + var pi = MonoMethodInfo.GetParametersInfo(mhandle, this); + return pi == null ? 0 : pi.Length; + } + + /* + * InternalInvoke() receives the parameters correctly converted by the binder + * to match the types of the method signature. + */ + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern object InternalInvoke(object obj, object[] parameters, out Exception exc); + + [DebuggerHidden] + [DebuggerStepThrough] + public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) + { + if (obj == null) + { + if (!IsStatic) + throw new TargetException("Instance constructor requires a target"); + } + else if (!DeclaringType.IsInstanceOfType(obj)) + { + throw new TargetException("Constructor does not match target type"); + } + + return DoInvoke(obj, invokeAttr, binder, parameters, culture); + } + + private object DoInvoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) + { + if (binder == null) + binder = Type.DefaultBinder; + + ParameterInfo[] pinfo = MonoMethodInfo.GetParametersInfo(mhandle, this); + + RuntimeMethodInfo.ConvertValues(binder, parameters, pinfo, culture, invokeAttr); + + if (obj == null && DeclaringType.ContainsGenericParameters) + throw new MemberAccessException("Cannot create an instance of " + DeclaringType + " because Type.ContainsGenericParameters is true."); + + if ((invokeAttr & BindingFlags.CreateInstance) != 0 && DeclaringType.IsAbstract) + { + throw new MemberAccessException(string.Format("Cannot create an instance of {0} because it is an abstract class", DeclaringType)); + } + + return InternalInvoke(obj, parameters, (invokeAttr & BindingFlags.DoNotWrapExceptions) == 0); + } + + public object InternalInvoke(object obj, object[] parameters, bool wrapExceptions) + { + Exception exc; + object o = null; + + if (wrapExceptions) + { + try + { + o = InternalInvoke(obj, parameters, out exc); + } + catch (MethodAccessException) + { + throw; + } + catch (OverflowException) + { + throw; + } + catch (Exception e) + { + throw new TargetInvocationException(e); + } + } + else + { + o = InternalInvoke(obj, parameters, out exc); + } + + if (exc != null) + throw exc; + + return obj == null ? o : null; + } + + [DebuggerHidden] + [DebuggerStepThrough] + public override object Invoke(BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) + { + return DoInvoke(null, invokeAttr, binder, parameters, culture); + } + + public override RuntimeMethodHandle MethodHandle + { + get + { + return new RuntimeMethodHandle(mhandle); + } + } + + public override MethodAttributes Attributes + { + get + { + return MonoMethodInfo.GetAttributes(mhandle); + } + } + + public override CallingConventions CallingConvention + { + get + { + return MonoMethodInfo.GetCallingConvention(mhandle); + } + } + + public override bool ContainsGenericParameters + { + get + { + return DeclaringType.ContainsGenericParameters; + } + } + + public override Type ReflectedType + { + get + { + return reftype; + } + } + public override Type DeclaringType + { + get + { + return MonoMethodInfo.GetDeclaringType(mhandle); + } + } + public override string Name + { + get + { + if (name != null) + return name; + return RuntimeMethodInfo.get_name(this); + } + } + + public override bool IsDefined(Type attributeType, bool inherit) + { + return CustomAttribute.IsDefined(this, attributeType, inherit); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, inherit); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + } + + public override MethodBody GetMethodBody() + { + return RuntimeMethodInfo.GetMethodBody(mhandle); + } + + public override string ToString() + { + StringBuilder sbName = new StringBuilder(Name); + sbName.Append("Void "); + + sbName.Append("("); + RuntimeParameterInfo.FormatParameters(sbName, GetParametersNoCopy(), CallingConvention); + sbName.Append(")"); + + return sbName.ToString(); + } + + public override IList GetCustomAttributesData() + { + return CustomAttributeData.GetCustomAttributes(this); + } + + public sealed override bool HasSameMetadataDefinitionAs(MemberInfo other) => HasSameMetadataDefinitionAsCore(other); + + public override int MetadataToken + { + get + { + return get_metadata_token(this); + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern int get_metadata_token(RuntimeConstructorInfo method); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeModule.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeModule.cs index 60e6708eaf725..42dd0e2f2cf38 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeModule.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeModule.cs @@ -8,10 +8,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -27,365 +27,399 @@ using System.Runtime.InteropServices; using System.Runtime.CompilerServices; -namespace System.Reflection { +namespace System.Reflection +{ - [StructLayout (LayoutKind.Sequential)] - class RuntimeModule : Module - { + [StructLayout(LayoutKind.Sequential)] + internal class RuntimeModule : Module + { #pragma warning disable 649 - #region Sync with object-internals.h - #region Sync with ModuleBuilder - internal IntPtr _impl; /* a pointer to a MonoImage */ - internal Assembly assembly; - internal string fqname; - internal string name; - internal string scopename; - internal bool is_resource; - internal int token; - #endregion - #endregion + #region Sync with object-internals.h + #region Sync with ModuleBuilder + internal IntPtr _impl; /* a pointer to a MonoImage */ + internal Assembly assembly; + internal string fqname; + internal string name; + internal string scopename; + internal bool is_resource; + internal int token; + #endregion + #endregion #pragma warning restore 649 - public - override - Assembly Assembly { - get { return assembly; } - } - - public - override - // Note: we do not ask for PathDiscovery because no path is returned here. - // However MS Fx requires it (see FDBK23572 for details). - string Name { - get { return name; } - } - - public - override - string ScopeName { - get { return scopename; } - } - - public - override - int MDStreamVersion { - get { - if (_impl == IntPtr.Zero) - throw new NotSupportedException (); - return GetMDStreamVersion (_impl); - } - } - - public - override - Guid ModuleVersionId { - get { - return GetModuleVersionId (); - } - } - - public override - string FullyQualifiedName { - get { - return fqname; - } - } - - public - override - bool IsResource() - { - return is_resource; - } - - public override - Type[] FindTypes(TypeFilter filter, object filterCriteria) - { - var filtered = new List (); - Type[] types = GetTypes (); - foreach (Type t in types) - if (filter (t, filterCriteria)) - filtered.Add (t); - return filtered.ToArray (); - } - - public override - object[] GetCustomAttributes(bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, inherit); - } - - public override - object[] GetCustomAttributes(Type attributeType, bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - } - - public override - FieldInfo GetField (string name, BindingFlags bindingAttr) - { - if (name == null) - throw new ArgumentNullException("name"); - - if (IsResource ()) - return null; - - Type globalType = GetGlobalType (_impl); - return (globalType != null) ? globalType.GetField (name, bindingAttr) : null; - } - - public override - FieldInfo[] GetFields (BindingFlags bindingFlags) - { - if (IsResource ()) - return new FieldInfo [0]; - - Type globalType = GetGlobalType (_impl); - return (globalType != null) ? globalType.GetFields (bindingFlags) : new FieldInfo [0]; - } - - public override - int MetadataToken { - get { - return get_MetadataToken (this); - } - } - - protected - override - MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) - { - if (IsResource ()) - return null; - - Type globalType = GetGlobalType (_impl); - if (globalType == null) - return null; - if (types == null) - return globalType.GetMethod (name); - return globalType.GetMethod (name, bindingAttr, binder, callConvention, types, modifiers); - } - - public - override - MethodInfo[] GetMethods (BindingFlags bindingFlags) { - if (IsResource ()) - return new MethodInfo [0]; - - Type globalType = GetGlobalType (_impl); - return (globalType != null) ? globalType.GetMethods (bindingFlags) : new MethodInfo [0]; - } - - public override - void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine) { - RuntimeModule.GetPEKind (_impl, out peKind, out machine); - } - - public override - Type GetType(string className, bool throwOnError, bool ignoreCase) - { - if (className == null) - throw new ArgumentNullException ("className"); - if (className == String.Empty) - throw new ArgumentException ("Type name can't be empty"); - return assembly.InternalGetType (this, className, throwOnError, ignoreCase); - } - - public override - bool IsDefined (Type attributeType, bool inherit) - { - return CustomAttribute.IsDefined (this, attributeType, inherit); - } - - public - override - FieldInfo ResolveField (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - return ResolveField (this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); - } - - internal static FieldInfo ResolveField (Module module, IntPtr monoModule, int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - ResolveTokenError error; - - IntPtr handle = ResolveFieldToken (monoModule, metadataToken, ptrs_from_types (genericTypeArguments), ptrs_from_types (genericMethodArguments), out error); - if (handle == IntPtr.Zero) - throw resolve_token_exception (module.Name, metadataToken, error, "Field"); - else - return FieldInfo.GetFieldFromHandle (new RuntimeFieldHandle (handle)); - } - - public - override - MemberInfo ResolveMember (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - return ResolveMember (this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); - } - - internal static MemberInfo ResolveMember (Module module, IntPtr monoModule, int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - ResolveTokenError error; - - MemberInfo m = ResolveMemberToken (monoModule, metadataToken, ptrs_from_types (genericTypeArguments), ptrs_from_types (genericMethodArguments), out error); - if (m == null) - throw resolve_token_exception (module.Name, metadataToken, error, "MemberInfo"); - else - return m; - } - - public - override - MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - return ResolveMethod (this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); - } - - internal static MethodBase ResolveMethod (Module module, IntPtr monoModule, int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - ResolveTokenError error; - - IntPtr handle = ResolveMethodToken (monoModule, metadataToken, ptrs_from_types (genericTypeArguments), ptrs_from_types (genericMethodArguments), out error); - if (handle == IntPtr.Zero) - throw resolve_token_exception (module.Name, metadataToken, error, "MethodBase"); - else - return RuntimeMethodInfo.GetMethodFromHandleNoGenericCheck (new RuntimeMethodHandle (handle)); - } - - public - override - string ResolveString (int metadataToken) { - return ResolveString (this, _impl, metadataToken); - } - - internal static string ResolveString (Module module, IntPtr monoModule, int metadataToken) { - ResolveTokenError error; - - string s = ResolveStringToken (monoModule, metadataToken, out error); - if (s == null) - throw resolve_token_exception (module.Name, metadataToken, error, "string"); - else - return s; - } - - public - override - Type ResolveType (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - return ResolveType (this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); - } - - internal static Type ResolveType (Module module, IntPtr monoModule, int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { - ResolveTokenError error; - - IntPtr handle = ResolveTypeToken (monoModule, metadataToken, ptrs_from_types (genericTypeArguments), ptrs_from_types (genericMethodArguments), out error); - if (handle == IntPtr.Zero) - throw resolve_token_exception (module.Name, metadataToken, error, "Type"); - else - return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle)); - } - - public - override - byte[] ResolveSignature (int metadataToken) { - return ResolveSignature (this, _impl, metadataToken); - } - - internal static byte[] ResolveSignature (Module module, IntPtr monoModule, int metadataToken) { - ResolveTokenError error; - - byte[] res = ResolveSignature (monoModule, metadataToken, out error); - if (res == null) - throw resolve_token_exception (module.Name, metadataToken, error, "signature"); - else - return res; - } - - public override - Type[] GetTypes() - { - return InternalGetTypes (_impl); - } - - public override IList GetCustomAttributesData () { - return CustomAttributeData.GetCustomAttributes (this); - } - - internal RuntimeAssembly GetRuntimeAssembly () - { - return (RuntimeAssembly)assembly; - } - - internal IntPtr MonoModule { - get { - return _impl; - } - } - - internal Guid GetModuleVersionId () - { - var guid = new byte [16]; - GetGuidInternal (_impl, guid); - return new Guid (guid); - } - - internal static Exception resolve_token_exception (string name, int metadataToken, ResolveTokenError error, string tokenType) { - if (error == ResolveTokenError.OutOfRange) - return new ArgumentOutOfRangeException ("metadataToken", String.Format ("Token 0x{0:x} is not valid in the scope of module {1}", metadataToken, name)); - else - return new ArgumentException (String.Format ("Token 0x{0:x} is not a valid {1} token in the scope of module {2}", metadataToken, tokenType, name), "metadataToken"); - } - - internal static IntPtr[] ptrs_from_types (Type[] types) { - if (types == null) - return null; - else { - IntPtr[] res = new IntPtr [types.Length]; - for (int i = 0; i < types.Length; ++i) { - if (types [i] == null) - throw new ArgumentException (); - res [i] = types [i].TypeHandle.Value; - } - return res; - } - } - - // This calls ves_icall_reflection_get_token, so needs a Module argument - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern int get_MetadataToken (Module module); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern int GetMDStreamVersion (IntPtr module); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern Type[] InternalGetTypes (IntPtr module); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern IntPtr GetHINSTANCE (IntPtr module); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - private static extern void GetGuidInternal (IntPtr module, byte[] guid); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern Type GetGlobalType (IntPtr module); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern IntPtr ResolveMethodToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern IntPtr ResolveFieldToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern string ResolveStringToken (IntPtr module, int token, out ResolveTokenError error); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern byte[] ResolveSignature (IntPtr module, int metadataToken, out ResolveTokenError error); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine); - } - - internal enum ResolveTokenError { - OutOfRange, - BadTable, - Other - } + public + override + Assembly Assembly + { + get { return assembly; } + } + + public + override + // Note: we do not ask for PathDiscovery because no path is returned here. + // However MS Fx requires it (see FDBK23572 for details). + string Name + { + get { return name; } + } + + public + override + string ScopeName + { + get { return scopename; } + } + + public + override + int MDStreamVersion + { + get + { + if (_impl == IntPtr.Zero) + throw new NotSupportedException(); + return GetMDStreamVersion(_impl); + } + } + + public + override + Guid ModuleVersionId + { + get + { + return GetModuleVersionId(); + } + } + + public override + string FullyQualifiedName + { + get + { + return fqname; + } + } + + public + override + bool IsResource() + { + return is_resource; + } + + public override + Type[] FindTypes(TypeFilter filter, object filterCriteria) + { + var filtered = new List(); + Type[] types = GetTypes(); + foreach (Type t in types) + if (filter(t, filterCriteria)) + filtered.Add(t); + return filtered.ToArray(); + } + + public override + object[] GetCustomAttributes(bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, inherit); + } + + public override + object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + } + + public override + FieldInfo GetField(string name, BindingFlags bindingAttr) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + + if (IsResource()) + return null; + + Type globalType = GetGlobalType(_impl); + return (globalType != null) ? globalType.GetField(name, bindingAttr) : null; + } + + public override + FieldInfo[] GetFields(BindingFlags bindingFlags) + { + if (IsResource()) + return Array.Empty(); + + Type globalType = GetGlobalType(_impl); + return (globalType != null) ? globalType.GetFields(bindingFlags) : Array.Empty(); + } + + public override + int MetadataToken + { + get + { + return get_MetadataToken(this); + } + } + + protected + override + MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) + { + if (IsResource()) + return null; + + Type globalType = GetGlobalType(_impl); + if (globalType == null) + return null; + if (types == null) + return globalType.GetMethod(name); + return globalType.GetMethod(name, bindingAttr, binder, callConvention, types, modifiers); + } + + public + override + MethodInfo[] GetMethods(BindingFlags bindingFlags) + { + if (IsResource()) + return Array.Empty(); + + Type globalType = GetGlobalType(_impl); + return (globalType != null) ? globalType.GetMethods(bindingFlags) : Array.Empty(); + } + + public override + void GetPEKind(out PortableExecutableKinds peKind, out ImageFileMachine machine) + { + GetPEKind(_impl, out peKind, out machine); + } + + public override + Type GetType(string className, bool throwOnError, bool ignoreCase) + { + if (className == null) + throw new ArgumentNullException(nameof(className)); + if (className == string.Empty) + throw new ArgumentException("Type name can't be empty"); + return assembly.InternalGetType(this, className, throwOnError, ignoreCase); + } + + public override + bool IsDefined(Type attributeType, bool inherit) + { + return CustomAttribute.IsDefined(this, attributeType, inherit); + } + + public + override + FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + return ResolveField(this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); + } + + internal static FieldInfo ResolveField(Module module, IntPtr monoModule, int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + ResolveTokenError error; + + IntPtr handle = ResolveFieldToken(monoModule, metadataToken, ptrs_from_types(genericTypeArguments), ptrs_from_types(genericMethodArguments), out error); + if (handle == IntPtr.Zero) + throw resolve_token_exception(module.Name, metadataToken, error, "Field"); + else + return FieldInfo.GetFieldFromHandle(new RuntimeFieldHandle(handle)); + } + + public + override + MemberInfo ResolveMember(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + return ResolveMember(this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); + } + + internal static MemberInfo ResolveMember(Module module, IntPtr monoModule, int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + ResolveTokenError error; + + MemberInfo m = ResolveMemberToken(monoModule, metadataToken, ptrs_from_types(genericTypeArguments), ptrs_from_types(genericMethodArguments), out error); + if (m == null) + throw resolve_token_exception(module.Name, metadataToken, error, "MemberInfo"); + else + return m; + } + + public + override + MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + return ResolveMethod(this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); + } + + internal static MethodBase ResolveMethod(Module module, IntPtr monoModule, int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + ResolveTokenError error; + + IntPtr handle = ResolveMethodToken(monoModule, metadataToken, ptrs_from_types(genericTypeArguments), ptrs_from_types(genericMethodArguments), out error); + if (handle == IntPtr.Zero) + throw resolve_token_exception(module.Name, metadataToken, error, "MethodBase"); + else + return RuntimeMethodInfo.GetMethodFromHandleNoGenericCheck(new RuntimeMethodHandle(handle)); + } + + public + override + string ResolveString(int metadataToken) + { + return ResolveString(this, _impl, metadataToken); + } + + internal static string ResolveString(Module module, IntPtr monoModule, int metadataToken) + { + ResolveTokenError error; + + string s = ResolveStringToken(monoModule, metadataToken, out error); + if (s == null) + throw resolve_token_exception(module.Name, metadataToken, error, "string"); + else + return s; + } + + public + override + Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + return ResolveType(this, _impl, metadataToken, genericTypeArguments, genericMethodArguments); + } + + internal static Type ResolveType(Module module, IntPtr monoModule, int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) + { + ResolveTokenError error; + + IntPtr handle = ResolveTypeToken(monoModule, metadataToken, ptrs_from_types(genericTypeArguments), ptrs_from_types(genericMethodArguments), out error); + if (handle == IntPtr.Zero) + throw resolve_token_exception(module.Name, metadataToken, error, "Type"); + else + return Type.GetTypeFromHandle(new RuntimeTypeHandle(handle)); + } + + public + override + byte[] ResolveSignature(int metadataToken) + { + return ResolveSignature(this, _impl, metadataToken); + } + + internal static byte[] ResolveSignature(Module module, IntPtr monoModule, int metadataToken) + { + ResolveTokenError error; + + byte[] res = ResolveSignature(monoModule, metadataToken, out error); + if (res == null) + throw resolve_token_exception(module.Name, metadataToken, error, "signature"); + else + return res; + } + + public override + Type[] GetTypes() + { + return InternalGetTypes(_impl); + } + + public override IList GetCustomAttributesData() + { + return CustomAttributeData.GetCustomAttributes(this); + } + + internal RuntimeAssembly GetRuntimeAssembly() + { + return (RuntimeAssembly)assembly; + } + + internal IntPtr MonoModule + { + get + { + return _impl; + } + } + + internal Guid GetModuleVersionId() + { + var guid = new byte[16]; + GetGuidInternal(_impl, guid); + return new Guid(guid); + } + + internal static Exception resolve_token_exception(string name, int metadataToken, ResolveTokenError error, string tokenType) + { + if (error == ResolveTokenError.OutOfRange) + return new ArgumentOutOfRangeException(nameof(metadataToken), string.Format("Token 0x{0:x} is not valid in the scope of module {1}", metadataToken, name)); + else + return new ArgumentException(string.Format("Token 0x{0:x} is not a valid {1} token in the scope of module {2}", metadataToken, tokenType, name), nameof(metadataToken)); + } + + internal static IntPtr[] ptrs_from_types(Type[] types) + { + if (types == null) + return null; + else + { + IntPtr[] res = new IntPtr[types.Length]; + for (int i = 0; i < types.Length; ++i) + { + if (types[i] == null) + throw new ArgumentException(); + res[i] = types[i].TypeHandle.Value; + } + return res; + } + } + + // This calls ves_icall_reflection_get_token, so needs a Module argument + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern int get_MetadataToken(Module module); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern int GetMDStreamVersion(IntPtr module); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern Type[] InternalGetTypes(IntPtr module); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern IntPtr GetHINSTANCE(IntPtr module); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void GetGuidInternal(IntPtr module, byte[] guid); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern Type GetGlobalType(IntPtr module); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern IntPtr ResolveTypeToken(IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern IntPtr ResolveMethodToken(IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern IntPtr ResolveFieldToken(IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern string ResolveStringToken(IntPtr module, int token, out ResolveTokenError error); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern MemberInfo ResolveMemberToken(IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern byte[] ResolveSignature(IntPtr module, int metadataToken, out ResolveTokenError error); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern void GetPEKind(IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine); + } + + internal enum ResolveTokenError + { + OutOfRange, + BadTable, + Other + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeParameterInfo.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeParameterInfo.cs index 2d6f842a786db..c7df70df12ef7 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeParameterInfo.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimeParameterInfo.cs @@ -11,284 +11,318 @@ namespace System.Reflection { - class RuntimeParameterInfo : ParameterInfo - { - internal MarshalAsAttribute marshalAs; - - // Called by the runtime - internal RuntimeParameterInfo (string name, Type type, int position, int attrs, object defaultValue, MemberInfo member, MarshalAsAttribute marshalAs) { - NameImpl = name; - ClassImpl = type; - PositionImpl = position; - AttrsImpl = (ParameterAttributes)attrs; - DefaultValueImpl = defaultValue; - MemberImpl = member; - this.marshalAs = marshalAs; - } - - internal static void FormatParameters (StringBuilder sb, ParameterInfo[] p, CallingConventions callingConvention) - { - for (int i = 0; i < p.Length; ++i) { - if (i > 0) - sb.Append (", "); - - Type t = p[i].ParameterType; - - string typeName = t.FormatTypeName (); - - // Legacy: Why use "ByRef" for by ref parameters? What language is this? - // VB uses "ByRef" but it should precede (not follow) the parameter name. - // Why don't we just use "&"? - if (t.IsByRef) { - sb.Append (typeName.TrimEnd (new char[] { '&' })); - sb.Append (" ByRef"); - } else { - sb.Append (typeName); - } - } - - if ((callingConvention & CallingConventions.VarArgs) != 0) { - if (p.Length > 0) - sb.Append (", "); - sb.Append ("..."); - } - } - - internal RuntimeParameterInfo (ParameterBuilder pb, Type type, MemberInfo member, int position) { - this.ClassImpl = type; - this.MemberImpl = member; - if (pb != null) { - this.NameImpl = pb.Name; - this.PositionImpl = pb.Position - 1; // ParameterInfo.Position is zero-based - this.AttrsImpl = (ParameterAttributes) pb.Attributes; - } else { - this.NameImpl = null; - this.PositionImpl = position - 1; - this.AttrsImpl = ParameterAttributes.None; - } - } - - internal static ParameterInfo New (ParameterBuilder pb, Type type, MemberInfo member, int position) - { - return new RuntimeParameterInfo (pb, type, member, position); - } - - /*FIXME this constructor looks very broken in the position parameter*/ - internal RuntimeParameterInfo (ParameterInfo pinfo, Type type, MemberInfo member, int position) { - this.ClassImpl = type; - this.MemberImpl = member; - if (pinfo != null) { - this.NameImpl = pinfo.Name; - this.PositionImpl = pinfo.Position - 1; // ParameterInfo.Position is zero-based - this.AttrsImpl = (ParameterAttributes) pinfo.Attributes; - } else { - this.NameImpl = null; - this.PositionImpl = position - 1; - this.AttrsImpl = ParameterAttributes.None; - } - } - - internal RuntimeParameterInfo (ParameterInfo pinfo, MemberInfo member) { - this.ClassImpl = pinfo.ParameterType; - this.MemberImpl = member; - this.NameImpl = pinfo.Name; - this.PositionImpl = pinfo.Position; - this.AttrsImpl = pinfo.Attributes; - this.DefaultValueImpl = GetDefaultValueImpl (pinfo); - } - - /* to build a ParameterInfo for the return type of a method */ - internal RuntimeParameterInfo (Type type, MemberInfo member, MarshalAsAttribute marshalAs) { - this.ClassImpl = type; - this.MemberImpl = member; - this.NameImpl = null; - this.PositionImpl = -1; // since parameter positions are zero-based, return type pos is -1 - this.AttrsImpl = ParameterAttributes.Retval; - this.marshalAs = marshalAs; - } - - public override - object DefaultValue { - get { - if (ClassImpl == typeof (Decimal) || ClassImpl == typeof (Decimal?)) { - /* default values for decimals are encoded using a custom attribute */ - DecimalConstantAttribute[] attrs = (DecimalConstantAttribute[])GetCustomAttributes (typeof (DecimalConstantAttribute), false); - if (attrs.Length > 0) - return attrs [0].Value; - } else if (ClassImpl == typeof (DateTime) || ClassImpl == typeof (DateTime?)) { - /* default values for DateTime are encoded using a custom attribute */ - DateTimeConstantAttribute[] attrs = (DateTimeConstantAttribute[])GetCustomAttributes (typeof (DateTimeConstantAttribute), false); - if (attrs.Length > 0) - return attrs [0].Value; - } - return DefaultValueImpl; - } - } - - public override - object RawDefaultValue { - get { - if (DefaultValue != null && DefaultValue.GetType ().IsEnum) - return ((Enum)DefaultValue).GetValue (); - /*FIXME right now DefaultValue doesn't throw for reflection-only assemblies. Change this once the former is fixed.*/ - return DefaultValue; - } - } - - public - override - int MetadataToken { - get { - if (MemberImpl is PropertyInfo) { - PropertyInfo prop = (PropertyInfo)MemberImpl; - MethodInfo mi = prop.GetGetMethod (true); - if (mi == null) - mi = prop.GetSetMethod (true); - - return mi.GetParametersInternal () [PositionImpl].MetadataToken; - } else if (MemberImpl is MethodBase) { - return GetMetadataToken (); - } - throw new ArgumentException ("Can't produce MetadataToken for member of type " + MemberImpl.GetType ()); - } - } - - - public - override - object[] GetCustomAttributes (bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, inherit); - } - - public - override - object[] GetCustomAttributes (Type attributeType, bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, attributeType, inherit); - } - - internal object GetDefaultValueImpl (ParameterInfo pinfo) - { - FieldInfo field = typeof (ParameterInfo).GetField ("DefaultValueImpl", BindingFlags.Instance | BindingFlags.NonPublic); - return field.GetValue (pinfo); - } - - public - override - bool IsDefined( Type attributeType, bool inherit) { - return CustomAttribute.IsDefined (this, attributeType, inherit); - } - - public override IList GetCustomAttributesData () { - return CustomAttributeData.GetCustomAttributes (this); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern int GetMetadataToken (); - - public override Type[] GetOptionalCustomModifiers () => GetCustomModifiers (true); - - internal object[] GetPseudoCustomAttributes () - { - int count = 0; - - if (IsIn) - count ++; - if (IsOut) - count ++; - if (IsOptional) - count ++; - if (marshalAs != null) - count ++; - - if (count == 0) - return null; - object[] attrs = new object [count]; - count = 0; - - if (IsIn) - attrs [count ++] = new InAttribute (); - if (IsOut) - attrs [count ++] = new OutAttribute (); - if (IsOptional) - attrs [count ++] = new OptionalAttribute (); - - if (marshalAs != null) { - attrs [count ++] = (MarshalAsAttribute)marshalAs.CloneInternal (); - } - - return attrs; - } - - internal CustomAttributeData[] GetPseudoCustomAttributesData () - { - int count = 0; - - if (IsIn) - count++; - if (IsOut) - count++; - if (IsOptional) - count++; - if (marshalAs != null) - count++; - - if (count == 0) - return null; - CustomAttributeData[] attrsData = new CustomAttributeData [count]; - count = 0; - - if (IsIn) - attrsData [count++] = new CustomAttributeData ((typeof (InAttribute)).GetConstructor (Type.EmptyTypes)); - if (IsOut) - attrsData [count++] = new CustomAttributeData ((typeof (OutAttribute)).GetConstructor (Type.EmptyTypes)); - if (IsOptional) - attrsData [count++] = new CustomAttributeData ((typeof (OptionalAttribute)).GetConstructor (Type.EmptyTypes)); - if (marshalAs != null) { - var ctorArgs = new CustomAttributeTypedArgument[] { new CustomAttributeTypedArgument (typeof (UnmanagedType), marshalAs.Value) }; - attrsData [count++] = new CustomAttributeData ( - (typeof (MarshalAsAttribute)).GetConstructor (new[] { typeof (UnmanagedType) }), - ctorArgs, - Array.Empty ());//FIXME Get named params - } - - return attrsData; - } - - public override Type[] GetRequiredCustomModifiers () => GetCustomModifiers (false); - - public override bool HasDefaultValue { - get { - object defaultValue = DefaultValue; - if (defaultValue == null) - return true; - - if (defaultValue.GetType () == typeof(DBNull) || defaultValue.GetType () == typeof(Missing)) - return false; - - return true; - } - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern Type[] GetTypeModifiers (Type type, MemberInfo member, int position, bool optional); - - internal static ParameterInfo New (ParameterInfo pinfo, Type type, MemberInfo member, int position) - { - return new RuntimeParameterInfo (pinfo, type, member, position); - } - - internal static ParameterInfo New (ParameterInfo pinfo, MemberInfo member) - { - return new RuntimeParameterInfo (pinfo, member); - } - - internal static ParameterInfo New (Type type, MemberInfo member, MarshalAsAttribute marshalAs) - { - return new RuntimeParameterInfo (type, member, marshalAs); - } - - private Type[] GetCustomModifiers (bool optional) => GetTypeModifiers (ParameterType, Member, Position, optional) ?? Type.EmptyTypes; - } + internal class RuntimeParameterInfo : ParameterInfo + { + internal MarshalAsAttribute marshalAs; + + // Called by the runtime + internal RuntimeParameterInfo(string name, Type type, int position, int attrs, object defaultValue, MemberInfo member, MarshalAsAttribute marshalAs) + { + NameImpl = name; + ClassImpl = type; + PositionImpl = position; + AttrsImpl = (ParameterAttributes)attrs; + DefaultValueImpl = defaultValue; + MemberImpl = member; + this.marshalAs = marshalAs; + } + + internal static void FormatParameters(StringBuilder sb, ParameterInfo[] p, CallingConventions callingConvention) + { + for (int i = 0; i < p.Length; ++i) + { + if (i > 0) + sb.Append(", "); + + Type t = p[i].ParameterType; + + string typeName = t.FormatTypeName(); + + // Legacy: Why use "ByRef" for by ref parameters? What language is this? + // VB uses "ByRef" but it should precede (not follow) the parameter name. + // Why don't we just use "&"? + if (t.IsByRef) + { + sb.Append(typeName.TrimEnd(new char[] { '&' })); + sb.Append(" ByRef"); + } + else + { + sb.Append(typeName); + } + } + + if ((callingConvention & CallingConventions.VarArgs) != 0) + { + if (p.Length > 0) + sb.Append(", "); + sb.Append("..."); + } + } + + internal RuntimeParameterInfo(ParameterBuilder pb, Type type, MemberInfo member, int position) + { + this.ClassImpl = type; + this.MemberImpl = member; + if (pb != null) + { + this.NameImpl = pb.Name; + this.PositionImpl = pb.Position - 1; // ParameterInfo.Position is zero-based + this.AttrsImpl = (ParameterAttributes)pb.Attributes; + } + else + { + this.NameImpl = null; + this.PositionImpl = position - 1; + this.AttrsImpl = ParameterAttributes.None; + } + } + + internal static ParameterInfo New(ParameterBuilder pb, Type type, MemberInfo member, int position) + { + return new RuntimeParameterInfo(pb, type, member, position); + } + + /*FIXME this constructor looks very broken in the position parameter*/ + internal RuntimeParameterInfo(ParameterInfo pinfo, Type type, MemberInfo member, int position) + { + this.ClassImpl = type; + this.MemberImpl = member; + if (pinfo != null) + { + this.NameImpl = pinfo.Name; + this.PositionImpl = pinfo.Position - 1; // ParameterInfo.Position is zero-based + this.AttrsImpl = (ParameterAttributes)pinfo.Attributes; + } + else + { + this.NameImpl = null; + this.PositionImpl = position - 1; + this.AttrsImpl = ParameterAttributes.None; + } + } + + internal RuntimeParameterInfo(ParameterInfo pinfo, MemberInfo member) + { + this.ClassImpl = pinfo.ParameterType; + this.MemberImpl = member; + this.NameImpl = pinfo.Name; + this.PositionImpl = pinfo.Position; + this.AttrsImpl = pinfo.Attributes; + this.DefaultValueImpl = GetDefaultValueImpl(pinfo); + } + + /* to build a ParameterInfo for the return type of a method */ + internal RuntimeParameterInfo(Type type, MemberInfo member, MarshalAsAttribute marshalAs) + { + this.ClassImpl = type; + this.MemberImpl = member; + this.NameImpl = null; + this.PositionImpl = -1; // since parameter positions are zero-based, return type pos is -1 + this.AttrsImpl = ParameterAttributes.Retval; + this.marshalAs = marshalAs; + } + + public override + object DefaultValue + { + get + { + if (ClassImpl == typeof(decimal) || ClassImpl == typeof(decimal?)) + { + /* default values for decimals are encoded using a custom attribute */ + DecimalConstantAttribute[] attrs = (DecimalConstantAttribute[])GetCustomAttributes(typeof(DecimalConstantAttribute), false); + if (attrs.Length > 0) + return attrs[0].Value; + } + else if (ClassImpl == typeof(DateTime) || ClassImpl == typeof(DateTime?)) + { + /* default values for DateTime are encoded using a custom attribute */ + DateTimeConstantAttribute[] attrs = (DateTimeConstantAttribute[])GetCustomAttributes(typeof(DateTimeConstantAttribute), false); + if (attrs.Length > 0) + return attrs[0].Value; + } + return DefaultValueImpl; + } + } + + public override + object RawDefaultValue + { + get + { + if (DefaultValue != null && DefaultValue.GetType().IsEnum) + return ((Enum)DefaultValue).GetValue(); + /*FIXME right now DefaultValue doesn't throw for reflection-only assemblies. Change this once the former is fixed.*/ + return DefaultValue; + } + } + + public + override + int MetadataToken + { + get + { + if (MemberImpl is PropertyInfo) + { + PropertyInfo prop = (PropertyInfo)MemberImpl; + MethodInfo mi = prop.GetGetMethod(true); + if (mi == null) + mi = prop.GetSetMethod(true); + + return mi.GetParametersInternal()[PositionImpl].MetadataToken; + } + else if (MemberImpl is MethodBase) + { + return GetMetadataToken(); + } + throw new ArgumentException("Can't produce MetadataToken for member of type " + MemberImpl.GetType()); + } + } + + + public + override + object[] GetCustomAttributes(bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, inherit); + } + + public + override + object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, attributeType, inherit); + } + + internal object GetDefaultValueImpl(ParameterInfo pinfo) + { + FieldInfo field = typeof(ParameterInfo).GetField("DefaultValueImpl", BindingFlags.Instance | BindingFlags.NonPublic); + return field.GetValue(pinfo); + } + + public + override + bool IsDefined(Type attributeType, bool inherit) + { + return CustomAttribute.IsDefined(this, attributeType, inherit); + } + + public override IList GetCustomAttributesData() + { + return CustomAttributeData.GetCustomAttributes(this); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern int GetMetadataToken(); + + public override Type[] GetOptionalCustomModifiers() => GetCustomModifiers(true); + + internal object[] GetPseudoCustomAttributes() + { + int count = 0; + + if (IsIn) + count++; + if (IsOut) + count++; + if (IsOptional) + count++; + if (marshalAs != null) + count++; + + if (count == 0) + return null; + object[] attrs = new object[count]; + count = 0; + + if (IsIn) + attrs[count++] = new InAttribute(); + if (IsOut) + attrs[count++] = new OutAttribute(); + if (IsOptional) + attrs[count++] = new OptionalAttribute(); + + if (marshalAs != null) + { + attrs[count++] = (MarshalAsAttribute)marshalAs.CloneInternal(); + } + + return attrs; + } + + internal CustomAttributeData[] GetPseudoCustomAttributesData() + { + int count = 0; + + if (IsIn) + count++; + if (IsOut) + count++; + if (IsOptional) + count++; + if (marshalAs != null) + count++; + + if (count == 0) + return null; + CustomAttributeData[] attrsData = new CustomAttributeData[count]; + count = 0; + + if (IsIn) + attrsData[count++] = new CustomAttributeData((typeof(InAttribute)).GetConstructor(Type.EmptyTypes)); + if (IsOut) + attrsData[count++] = new CustomAttributeData((typeof(OutAttribute)).GetConstructor(Type.EmptyTypes)); + if (IsOptional) + attrsData[count++] = new CustomAttributeData((typeof(OptionalAttribute)).GetConstructor(Type.EmptyTypes)); + if (marshalAs != null) + { + var ctorArgs = new CustomAttributeTypedArgument[] { new CustomAttributeTypedArgument(typeof(UnmanagedType), marshalAs.Value) }; + attrsData[count++] = new CustomAttributeData( + (typeof(MarshalAsAttribute)).GetConstructor(new[] { typeof(UnmanagedType) }), + ctorArgs, + Array.Empty());//FIXME Get named params + } + + return attrsData; + } + + public override Type[] GetRequiredCustomModifiers() => GetCustomModifiers(false); + + public override bool HasDefaultValue + { + get + { + object defaultValue = DefaultValue; + if (defaultValue == null) + return true; + + if (defaultValue.GetType() == typeof(DBNull) || defaultValue.GetType() == typeof(Missing)) + return false; + + return true; + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern Type[] GetTypeModifiers(Type type, MemberInfo member, int position, bool optional); + + internal static ParameterInfo New(ParameterInfo pinfo, Type type, MemberInfo member, int position) + { + return new RuntimeParameterInfo(pinfo, type, member, position); + } + + internal static ParameterInfo New(ParameterInfo pinfo, MemberInfo member) + { + return new RuntimeParameterInfo(pinfo, member); + } + + internal static ParameterInfo New(Type type, MemberInfo member, MarshalAsAttribute marshalAs) + { + return new RuntimeParameterInfo(type, member, marshalAs); + } + + private Type[] GetCustomModifiers(bool optional) => GetTypeModifiers(ParameterType, Member, Position, optional) ?? Type.EmptyTypes; + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs index d2c8abb949e35..9eca88b3d7d43 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs @@ -10,10 +10,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,107 +32,117 @@ using Mono; namespace System.Reflection -{ - internal struct MonoPropertyInfo { - public Type parent; - public Type declaring_type; - public String name; - public MethodInfo get_method; - public MethodInfo set_method; - public PropertyAttributes attrs; - } - - [Flags] - internal enum PInfo { - Attributes = 1, - GetMethod = 1 << 1, - SetMethod = 1 << 2, - ReflectedType = 1 << 3, - DeclaringType = 1 << 4, - Name = 1 << 5 - - } - - internal delegate object GetterAdapter (object _this); - internal delegate R Getter (T _this); - - [StructLayout (LayoutKind.Sequential)] - internal class RuntimePropertyInfo : PropertyInfo - { +{ + internal struct MonoPropertyInfo + { + public Type parent; + public Type declaring_type; + public string name; + public MethodInfo get_method; + public MethodInfo set_method; + public PropertyAttributes attrs; + } + + [Flags] + internal enum PInfo + { + Attributes = 1, + GetMethod = 1 << 1, + SetMethod = 1 << 2, + ReflectedType = 1 << 3, + DeclaringType = 1 << 4, + Name = 1 << 5 + + } + + internal delegate object GetterAdapter(object _this); + internal delegate R Getter(T _this); + + [StructLayout(LayoutKind.Sequential)] + internal class RuntimePropertyInfo : PropertyInfo + { #pragma warning disable 649 - internal IntPtr klass; - internal IntPtr prop; - MonoPropertyInfo info; - PInfo cached; - GetterAdapter cached_getter; + internal IntPtr klass; + internal IntPtr prop; + private MonoPropertyInfo info; + private PInfo cached; + private GetterAdapter cached_getter; #pragma warning restore 649 - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal static extern void get_property_info (RuntimePropertyInfo prop, ref MonoPropertyInfo info, - PInfo req_info); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern Type[] GetTypeModifiers (RuntimePropertyInfo prop, bool optional); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern object get_default_value (RuntimePropertyInfo prop); - - - internal BindingFlags BindingFlags { - get { - CachePropertyInfo (PInfo.GetMethod | PInfo.SetMethod); - bool isPublic = info.set_method?.IsPublic == true || info.get_method?.IsPublic == true; - bool isStatic = info.set_method?.IsStatic == true || info.get_method?.IsStatic == true; - bool isInherited = DeclaringType != ReflectedType; - return FilterPreCalculate (isPublic, isInherited, isStatic); - } - } - - // Copied from https://github.com/dotnet/coreclr/blob/7a24a538cd265993e5864179f51781398c28ecdf/src/System.Private.CoreLib/src/System/RtType.cs#L2022 - static BindingFlags FilterPreCalculate (bool isPublic, bool isInherited, bool isStatic) - { - BindingFlags bindingFlags = isPublic ? BindingFlags.Public : BindingFlags.NonPublic; - if (isInherited) { - // We arrange things so the DeclaredOnly flag means "include inherited members" - bindingFlags |= BindingFlags.DeclaredOnly; - if (isStatic) - bindingFlags |= BindingFlags.Static | BindingFlags.FlattenHierarchy; - else - bindingFlags |= BindingFlags.Instance; - } - else { - if (isStatic) - bindingFlags |= BindingFlags.Static; - else - bindingFlags |= BindingFlags.Instance; - } - return bindingFlags; - } - - public override Module Module { - get { - return GetRuntimeModule (); - } - } - - internal RuntimeType GetDeclaringTypeInternal () - { - return (RuntimeType) DeclaringType; - } - - RuntimeType ReflectedTypeInternal { - get { - return (RuntimeType) ReflectedType; - } - } - - internal RuntimeModule GetRuntimeModule () - { - return GetDeclaringTypeInternal ().GetRuntimeModule (); - } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern void get_property_info(RuntimePropertyInfo prop, ref MonoPropertyInfo info, + PInfo req_info); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern Type[] GetTypeModifiers(RuntimePropertyInfo prop, bool optional); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern object get_default_value(RuntimePropertyInfo prop); + + + internal BindingFlags BindingFlags + { + get + { + CachePropertyInfo(PInfo.GetMethod | PInfo.SetMethod); + bool isPublic = info.set_method?.IsPublic == true || info.get_method?.IsPublic == true; + bool isStatic = info.set_method?.IsStatic == true || info.get_method?.IsStatic == true; + bool isInherited = DeclaringType != ReflectedType; + return FilterPreCalculate(isPublic, isInherited, isStatic); + } + } + + // Copied from https://github.com/dotnet/coreclr/blob/7a24a538cd265993e5864179f51781398c28ecdf/src/System.Private.CoreLib/src/System/RtType.cs#L2022 + private static BindingFlags FilterPreCalculate(bool isPublic, bool isInherited, bool isStatic) + { + BindingFlags bindingFlags = isPublic ? BindingFlags.Public : BindingFlags.NonPublic; + if (isInherited) + { + // We arrange things so the DeclaredOnly flag means "include inherited members" + bindingFlags |= BindingFlags.DeclaredOnly; + if (isStatic) + bindingFlags |= BindingFlags.Static | BindingFlags.FlattenHierarchy; + else + bindingFlags |= BindingFlags.Instance; + } + else + { + if (isStatic) + bindingFlags |= BindingFlags.Static; + else + bindingFlags |= BindingFlags.Instance; + } + return bindingFlags; + } + + public override Module Module + { + get + { + return GetRuntimeModule(); + } + } + + internal RuntimeType GetDeclaringTypeInternal() + { + return (RuntimeType)DeclaringType; + } + + private RuntimeType ReflectedTypeInternal + { + get + { + return (RuntimeType)ReflectedType; + } + } + + internal RuntimeModule GetRuntimeModule() + { + return GetDeclaringTypeInternal().GetRuntimeModule(); + } #region Object Overrides - public override String ToString() + public override string ToString() { return FormatNameAndSig(); } @@ -144,316 +154,359 @@ private string FormatNameAndSig() sbName.Append(" "); sbName.Append(Name); - var pi = GetIndexParameters (); - if (pi.Length > 0) { - sbName.Append (" ["); - RuntimeParameterInfo.FormatParameters (sbName, pi, 0); - sbName.Append ("]"); - } + var pi = GetIndexParameters(); + if (pi.Length > 0) + { + sbName.Append(" ["); + RuntimeParameterInfo.FormatParameters(sbName, pi, 0); + sbName.Append("]"); + } return sbName.ToString(); } - #endregion - - void CachePropertyInfo (PInfo flags) - { - if ((cached & flags) != flags) { - get_property_info (this, ref info, flags); - cached |= flags; - } - } - - public override PropertyAttributes Attributes { - get { - CachePropertyInfo (PInfo.Attributes); - return info.attrs; - } - } - - public override bool CanRead { - get { - CachePropertyInfo (PInfo.GetMethod); - return (info.get_method != null); - } - } - - public override bool CanWrite { - get { - CachePropertyInfo (PInfo.SetMethod); - return (info.set_method != null); - } - } - - public override Type PropertyType { - get { - CachePropertyInfo (PInfo.GetMethod | PInfo.SetMethod); - - if (info.get_method != null) { - return info.get_method.ReturnType; - } else { - ParameterInfo[] parameters = info.set_method.GetParametersInternal (); - if (parameters.Length == 0) - throw new ArgumentException (SR.SetterHasNoParams, "indexer"); - - return parameters [parameters.Length - 1].ParameterType; - } - } - } - - public override Type ReflectedType { - get { - CachePropertyInfo (PInfo.ReflectedType); - return info.parent; - } - } - - public override Type DeclaringType { - get { - CachePropertyInfo (PInfo.DeclaringType); - return info.declaring_type; - } - } - - public override string Name { - get { - CachePropertyInfo (PInfo.Name); - return info.name; - } - } - - public override MethodInfo[] GetAccessors (bool nonPublic) - { - int nget = 0; - int nset = 0; - - CachePropertyInfo (PInfo.GetMethod | PInfo.SetMethod); - - if (info.set_method != null && (nonPublic || info.set_method.IsPublic)) - nset = 1; - if (info.get_method != null && (nonPublic || info.get_method.IsPublic)) - nget = 1; - - MethodInfo[] res = new MethodInfo [nget + nset]; - int n = 0; - if (nset != 0) - res [n++] = info.set_method; - if (nget != 0) - res [n++] = info.get_method; - return res; - } - - public override MethodInfo GetGetMethod (bool nonPublic) - { - CachePropertyInfo (PInfo.GetMethod); - if (info.get_method != null && (nonPublic || info.get_method.IsPublic)) - return info.get_method; - else - return null; - } - - public override ParameterInfo[] GetIndexParameters () - { - CachePropertyInfo (PInfo.GetMethod | PInfo.SetMethod); - ParameterInfo[] src; - int length; - if (info.get_method != null) { - src = info.get_method.GetParametersInternal (); - length = src.Length; - } else if (info.set_method != null) { - src = info.set_method.GetParametersInternal (); - length = src.Length - 1; - } else - return Array.Empty (); - - var dest = new ParameterInfo [length]; - for (int i = 0; i < length; ++i) { - dest [i] = RuntimeParameterInfo.New (src [i], this); - } - return dest; - } - - public override MethodInfo GetSetMethod (bool nonPublic) - { - CachePropertyInfo (PInfo.SetMethod); - if (info.set_method != null && (nonPublic || info.set_method.IsPublic)) - return info.set_method; - else - return null; - } - - - /*TODO verify for attribute based default values, just like ParameterInfo*/ - public override object GetConstantValue () - { - return get_default_value (this); - } - - public override object GetRawConstantValue() { - return get_default_value (this); - } - - // According to MSDN the inherit parameter is ignored here and - // the behavior always defaults to inherit = false - // - public override bool IsDefined (Type attributeType, bool inherit) - { - return CustomAttribute.IsDefined (this, attributeType, false); - } - - public override object[] GetCustomAttributes (bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, false); - } - - public override object[] GetCustomAttributes (Type attributeType, bool inherit) - { - return CustomAttribute.GetCustomAttributes (this, attributeType, false); - } - - - delegate object GetterAdapter (object _this); - delegate R Getter (T _this); - delegate R StaticGetter (); + #endregion + + private void CachePropertyInfo(PInfo flags) + { + if ((cached & flags) != flags) + { + get_property_info(this, ref info, flags); + cached |= flags; + } + } + + public override PropertyAttributes Attributes + { + get + { + CachePropertyInfo(PInfo.Attributes); + return info.attrs; + } + } + + public override bool CanRead + { + get + { + CachePropertyInfo(PInfo.GetMethod); + return (info.get_method != null); + } + } + + public override bool CanWrite + { + get + { + CachePropertyInfo(PInfo.SetMethod); + return (info.set_method != null); + } + } + + public override Type PropertyType + { + get + { + CachePropertyInfo(PInfo.GetMethod | PInfo.SetMethod); + + if (info.get_method != null) + { + return info.get_method.ReturnType; + } + else + { + ParameterInfo[] parameters = info.set_method.GetParametersInternal(); + if (parameters.Length == 0) + throw new ArgumentException(SR.SetterHasNoParams, "indexer"); + + return parameters[parameters.Length - 1].ParameterType; + } + } + } + + public override Type ReflectedType + { + get + { + CachePropertyInfo(PInfo.ReflectedType); + return info.parent; + } + } + + public override Type DeclaringType + { + get + { + CachePropertyInfo(PInfo.DeclaringType); + return info.declaring_type; + } + } + + public override string Name + { + get + { + CachePropertyInfo(PInfo.Name); + return info.name; + } + } + + public override MethodInfo[] GetAccessors(bool nonPublic) + { + int nget = 0; + int nset = 0; + + CachePropertyInfo(PInfo.GetMethod | PInfo.SetMethod); + + if (info.set_method != null && (nonPublic || info.set_method.IsPublic)) + nset = 1; + if (info.get_method != null && (nonPublic || info.get_method.IsPublic)) + nget = 1; + + MethodInfo[] res = new MethodInfo[nget + nset]; + int n = 0; + if (nset != 0) + res[n++] = info.set_method; + if (nget != 0) + res[n++] = info.get_method; + return res; + } + + public override MethodInfo GetGetMethod(bool nonPublic) + { + CachePropertyInfo(PInfo.GetMethod); + if (info.get_method != null && (nonPublic || info.get_method.IsPublic)) + return info.get_method; + else + return null; + } + + public override ParameterInfo[] GetIndexParameters() + { + CachePropertyInfo(PInfo.GetMethod | PInfo.SetMethod); + ParameterInfo[] src; + int length; + if (info.get_method != null) + { + src = info.get_method.GetParametersInternal(); + length = src.Length; + } + else if (info.set_method != null) + { + src = info.set_method.GetParametersInternal(); + length = src.Length - 1; + } + else + return Array.Empty(); + + var dest = new ParameterInfo[length]; + for (int i = 0; i < length; ++i) + { + dest[i] = RuntimeParameterInfo.New(src[i], this); + } + return dest; + } + + public override MethodInfo GetSetMethod(bool nonPublic) + { + CachePropertyInfo(PInfo.SetMethod); + if (info.set_method != null && (nonPublic || info.set_method.IsPublic)) + return info.set_method; + else + return null; + } + + + /*TODO verify for attribute based default values, just like ParameterInfo*/ + public override object GetConstantValue() + { + return get_default_value(this); + } + + public override object GetRawConstantValue() + { + return get_default_value(this); + } + + // According to MSDN the inherit parameter is ignored here and + // the behavior always defaults to inherit = false + // + public override bool IsDefined(Type attributeType, bool inherit) + { + return CustomAttribute.IsDefined(this, attributeType, false); + } + + public override object[] GetCustomAttributes(bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, false); + } + + public override object[] GetCustomAttributes(Type attributeType, bool inherit) + { + return CustomAttribute.GetCustomAttributes(this, attributeType, false); + } + + + private delegate object GetterAdapter(object _this); + private delegate R Getter(T _this); + private delegate R StaticGetter(); #pragma warning disable 169 - // Used via reflection - static object GetterAdapterFrame (Getter getter, object obj) - { - return getter ((T)obj); - } - - static object StaticGetterAdapterFrame (StaticGetter getter, object obj) - { - return getter (); - } + // Used via reflection + private static object GetterAdapterFrame(Getter getter, object obj) + { + return getter((T)obj); + } + + private static object StaticGetterAdapterFrame(StaticGetter getter, object obj) + { + return getter(); + } #pragma warning restore 169 - /* - * The idea behing this optimization is to use a pair of delegates to simulate the same effect of doing a reflection call. - * The first delegate cast the this argument to the right type and the second does points to the target method. - */ - static GetterAdapter CreateGetterDelegate (MethodInfo method) - { - Type[] typeVector; - Type getterType; - object getterDelegate; - MethodInfo adapterFrame; - Type getterDelegateType; - string frameName; - - if (method.IsStatic) { - typeVector = new Type[] { method.ReturnType }; - getterDelegateType = typeof (StaticGetter<>); - frameName = "StaticGetterAdapterFrame"; - } else { - typeVector = new Type[] { method.DeclaringType, method.ReturnType }; - getterDelegateType = typeof (Getter<,>); - frameName = "GetterAdapterFrame"; - } - - getterType = getterDelegateType.MakeGenericType (typeVector); - getterDelegate = Delegate.CreateDelegate (getterType, method); - adapterFrame = typeof (RuntimePropertyInfo).GetMethod (frameName, BindingFlags.Static | BindingFlags.NonPublic); - adapterFrame = adapterFrame.MakeGenericMethod (typeVector); - return (GetterAdapter)Delegate.CreateDelegate (typeof (GetterAdapter), getterDelegate, adapterFrame, true); - } - - public override object GetValue (object obj, object[] index) - { - if ((index == null || index.Length == 0) && RuntimeFeature.IsDynamicCodeSupported) { - /*FIXME we should check if the number of arguments matches the expected one, otherwise the error message will be pretty criptic.*/ - if (cached_getter == null) { - MethodInfo method = GetGetMethod (true); - if (method == null) - throw new ArgumentException ($"Get Method not found for '{Name}'"); - if (!DeclaringType.IsValueType && !PropertyType.IsByRef && !method.ContainsGenericParameters) { //FIXME find a way to build an invoke delegate for value types. - cached_getter = CreateGetterDelegate (method); - // The try-catch preserves the .Invoke () behaviour - try { - return cached_getter (obj); - } catch (Exception ex) { - throw new TargetInvocationException (ex); - } - } - } else { - try { - return cached_getter (obj); - } catch (Exception ex) { - throw new TargetInvocationException (ex); - } - } - } - - return GetValue (obj, BindingFlags.Default, null, index, null); - } - - public override object GetValue (object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) - { - object ret = null; - - MethodInfo method = GetGetMethod (true); - if (method == null) - throw new ArgumentException ($"Get Method not found for '{Name}'"); - - if (index == null || index.Length == 0) - ret = method.Invoke (obj, invokeAttr, binder, null, culture); - else - ret = method.Invoke (obj, invokeAttr, binder, index, culture); - - return ret; - } - - public override void SetValue (object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) - { - MethodInfo method = GetSetMethod (true); - if (method == null) - throw new ArgumentException ("Set Method not found for '" + Name + "'"); - - object [] parms; - if (index == null || index.Length == 0) - parms = new object [] {value}; - else { - int ilen = index.Length; - parms = new object [ilen+ 1]; - index.CopyTo (parms, 0); - parms [ilen] = value; - } - - method.Invoke (obj, invokeAttr, binder, parms, culture); - } - - public override Type[] GetOptionalCustomModifiers () => GetCustomModifiers (true); - - public override Type[] GetRequiredCustomModifiers () => GetCustomModifiers (false); - - private Type[] GetCustomModifiers (bool optional) => GetTypeModifiers (this, optional) ?? Type.EmptyTypes; - - public override IList GetCustomAttributesData () { - return CustomAttributeData.GetCustomAttributes (this); - } - - public sealed override bool HasSameMetadataDefinitionAs (MemberInfo other) => HasSameMetadataDefinitionAsCore (other); - - public override int MetadataToken { - get { - return get_metadata_token (this); - } - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern int get_metadata_token (RuntimePropertyInfo monoProperty); + /* + * The idea behing this optimization is to use a pair of delegates to simulate the same effect of doing a reflection call. + * The first delegate cast the this argument to the right type and the second does points to the target method. + */ + private static GetterAdapter CreateGetterDelegate(MethodInfo method) + { + Type[] typeVector; + Type getterType; + object getterDelegate; + MethodInfo adapterFrame; + Type getterDelegateType; + string frameName; + + if (method.IsStatic) + { + typeVector = new Type[] { method.ReturnType }; + getterDelegateType = typeof(StaticGetter<>); + frameName = "StaticGetterAdapterFrame"; + } + else + { + typeVector = new Type[] { method.DeclaringType, method.ReturnType }; + getterDelegateType = typeof(Getter<,>); + frameName = "GetterAdapterFrame"; + } + + getterType = getterDelegateType.MakeGenericType(typeVector); + getterDelegate = Delegate.CreateDelegate(getterType, method); + adapterFrame = typeof(RuntimePropertyInfo).GetMethod(frameName, BindingFlags.Static | BindingFlags.NonPublic); + adapterFrame = adapterFrame.MakeGenericMethod(typeVector); + return (GetterAdapter)Delegate.CreateDelegate(typeof(GetterAdapter), getterDelegate, adapterFrame, true); + } + + public override object GetValue(object obj, object[] index) + { + if ((index == null || index.Length == 0) && RuntimeFeature.IsDynamicCodeSupported) + { + /*FIXME we should check if the number of arguments matches the expected one, otherwise the error message will be pretty criptic.*/ + if (cached_getter == null) + { + MethodInfo method = GetGetMethod(true); + if (method == null) + throw new ArgumentException($"Get Method not found for '{Name}'"); + if (!DeclaringType.IsValueType && !PropertyType.IsByRef && !method.ContainsGenericParameters) + { //FIXME find a way to build an invoke delegate for value types. + cached_getter = CreateGetterDelegate(method); + // The try-catch preserves the .Invoke () behaviour + try + { + return cached_getter(obj); + } + catch (Exception ex) + { + throw new TargetInvocationException(ex); + } + } + } + else + { + try + { + return cached_getter(obj); + } + catch (Exception ex) + { + throw new TargetInvocationException(ex); + } + } + } + + return GetValue(obj, BindingFlags.Default, null, index, null); + } + + public override object GetValue(object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) + { + object ret = null; + + MethodInfo method = GetGetMethod(true); + if (method == null) + throw new ArgumentException($"Get Method not found for '{Name}'"); + + if (index == null || index.Length == 0) + ret = method.Invoke(obj, invokeAttr, binder, null, culture); + else + ret = method.Invoke(obj, invokeAttr, binder, index, culture); + + return ret; + } + + public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture) + { + MethodInfo method = GetSetMethod(true); + if (method == null) + throw new ArgumentException("Set Method not found for '" + Name + "'"); + + object[] parms; + if (index == null || index.Length == 0) + parms = new object[] { value }; + else + { + int ilen = index.Length; + parms = new object[ilen + 1]; + index.CopyTo(parms, 0); + parms[ilen] = value; + } + + method.Invoke(obj, invokeAttr, binder, parms, culture); + } + + public override Type[] GetOptionalCustomModifiers() => GetCustomModifiers(true); + + public override Type[] GetRequiredCustomModifiers() => GetCustomModifiers(false); + + private Type[] GetCustomModifiers(bool optional) => GetTypeModifiers(this, optional) ?? Type.EmptyTypes; + + public override IList GetCustomAttributesData() + { + return CustomAttributeData.GetCustomAttributes(this); + } + + public sealed override bool HasSameMetadataDefinitionAs(MemberInfo other) => HasSameMetadataDefinitionAsCore(other); + + public override int MetadataToken + { + get + { + return get_metadata_token(this); + } + } [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern PropertyInfo internal_from_handle_type (IntPtr event_handle, IntPtr type_handle); + internal static extern int get_metadata_token(RuntimePropertyInfo monoProperty); - internal static PropertyInfo GetPropertyFromHandle (RuntimePropertyHandle handle, RuntimeTypeHandle reflectedType) + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern PropertyInfo internal_from_handle_type(IntPtr event_handle, IntPtr type_handle); + + internal static PropertyInfo GetPropertyFromHandle(RuntimePropertyHandle handle, RuntimeTypeHandle reflectedType) { if (handle.Value == IntPtr.Zero) - throw new ArgumentException ("The handle is invalid."); - PropertyInfo pi = internal_from_handle_type (handle.Value, reflectedType.Value); + throw new ArgumentException("The handle is invalid."); + PropertyInfo pi = internal_from_handle_type(handle.Value, reflectedType.Value); if (pi == null) - throw new ArgumentException ("The property handle and the type handle are incompatible."); + throw new ArgumentException("The property handle and the type handle are incompatible."); return pi; - } - } + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Resources/ManifestBasedResourceGroveler.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Resources/ManifestBasedResourceGroveler.Mono.cs index c62ffdb3720b9..e14e962ffe654 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Resources/ManifestBasedResourceGroveler.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Resources/ManifestBasedResourceGroveler.Mono.cs @@ -7,11 +7,11 @@ namespace System.Resources { - partial class ManifestBasedResourceGroveler - { - static Assembly InternalGetSatelliteAssembly (Assembly mainAssembly, CultureInfo culture, Version version) - { - return ((RuntimeAssembly)mainAssembly).InternalGetSatelliteAssembly (culture, version, throwOnFileNotFound: false); - } - } + internal partial class ManifestBasedResourceGroveler + { + private static Assembly InternalGetSatelliteAssembly(Assembly mainAssembly, CultureInfo culture, Version version) + { + return ((RuntimeAssembly)mainAssembly).InternalGetSatelliteAssembly(culture, version, throwOnFileNotFound: false); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/DependentHandle.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/DependentHandle.cs index c70be1bb984e2..c622ba73f427a 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/DependentHandle.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/DependentHandle.cs @@ -4,70 +4,71 @@ namespace System.Runtime.CompilerServices { - struct Ephemeron - { - public object key; - public object value; - } + internal struct Ephemeron + { + public object key; + public object value; + } - // - // Instead of dependent handles, mono uses arrays of Ephemeron objects. - // - struct DependentHandle - { - Ephemeron[] data; + // + // Instead of dependent handles, mono uses arrays of Ephemeron objects. + // + internal struct DependentHandle + { + private Ephemeron[] data; - public DependentHandle (object primary, object secondary) - { - data = new Ephemeron [1]; - data [0].key = primary; - data [0].value = secondary; - GC.register_ephemeron_array (data); - } + public DependentHandle(object primary, object secondary) + { + data = new Ephemeron[1]; + data[0].key = primary; + data[0].value = secondary; + GC.register_ephemeron_array(data); + } - public bool IsAllocated => data != null; + public bool IsAllocated => data != null; - // Getting the secondary object is more expensive than getting the first so - // we provide a separate primary-only accessor for those times we only want the - // primary. - public object GetPrimary () - { - if (!IsAllocated) - throw new NotSupportedException (); - if (data [0].key == GC.EPHEMERON_TOMBSTONE) - return null; - return data [0].key; - } + // Getting the secondary object is more expensive than getting the first so + // we provide a separate primary-only accessor for those times we only want the + // primary. + public object GetPrimary() + { + if (!IsAllocated) + throw new NotSupportedException(); + if (data[0].key == GC.EPHEMERON_TOMBSTONE) + return null; + return data[0].key; + } - public object GetPrimaryAndSecondary (out object secondary) - { - if (!IsAllocated) - throw new NotSupportedException (); - if (data [0].key == GC.EPHEMERON_TOMBSTONE) { - secondary = null; - return null; - } - secondary = data [0].value; - return data [0].key; - } + public object GetPrimaryAndSecondary(out object secondary) + { + if (!IsAllocated) + throw new NotSupportedException(); + if (data[0].key == GC.EPHEMERON_TOMBSTONE) + { + secondary = null; + return null; + } + secondary = data[0].value; + return data[0].key; + } - public void SetPrimary (object primary) - { - if (!IsAllocated) - throw new NotSupportedException (); - data [0].key = primary; - } + public void SetPrimary(object primary) + { + if (!IsAllocated) + throw new NotSupportedException(); + data[0].key = primary; + } - public void SetSecondary (object secondary) - { - if (!IsAllocated) - throw new NotSupportedException (); - data [0].value = secondary; - } + public void SetSecondary(object secondary) + { + if (!IsAllocated) + throw new NotSupportedException(); + data[0].value = secondary; + } - public void Free () - { - data = null; - } - } + public void Free() + { + data = null; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/JitHelpers.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/JitHelpers.cs index 8c23159dd414e..972644ecacbcf 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/JitHelpers.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/JitHelpers.cs @@ -4,12 +4,12 @@ namespace System.Runtime.CompilerServices { - static class JitHelpers - { - [Intrinsic] - public static bool EnumEquals (T x, T y) where T : struct, Enum => throw new NotImplementedException (); + internal static class JitHelpers + { + [Intrinsic] + public static bool EnumEquals(T x, T y) where T : struct, Enum => throw new NotImplementedException(); - [Intrinsic] - public static int EnumCompareTo (T x, T y) where T : struct, Enum => throw new NotImplementedException (); - } + [Intrinsic] + public static int EnumCompareTo(T x, T y) where T : struct, Enum => throw new NotImplementedException(); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeFeature.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeFeature.Mono.cs index 00b5c9814193a..d0e3c978ae7d0 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeFeature.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeFeature.Mono.cs @@ -4,16 +4,18 @@ namespace System.Runtime.CompilerServices { - partial class RuntimeFeature - { - public static bool IsDynamicCodeSupported { - [Intrinsic] // the JIT/AOT compiler will change this flag to false for FullAOT scenarios, otherwise true - get => IsDynamicCodeSupported; - } + public partial class RuntimeFeature + { + public static bool IsDynamicCodeSupported + { + [Intrinsic] // the JIT/AOT compiler will change this flag to false for FullAOT scenarios, otherwise true + get => IsDynamicCodeSupported; + } - public static bool IsDynamicCodeCompiled { - [Intrinsic] // the JIT/AOT compiler will change this flag to false for FullAOT scenarios, otherwise true - get => IsDynamicCodeCompiled; - } - } + public static bool IsDynamicCodeCompiled + { + [Intrinsic] // the JIT/AOT compiler will change this flag to false for FullAOT scenarios, otherwise true + get => IsDynamicCodeCompiled; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.Mono.cs index e054eee0ab2cf..b4449ea52ced4 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.Mono.cs @@ -4,143 +4,147 @@ namespace System.Runtime.CompilerServices { - partial class RuntimeHelpers - { - public static void InitializeArray (Array array, RuntimeFieldHandle fldHandle) - { - if (array == null || fldHandle.Value == IntPtr.Zero) - throw new ArgumentNullException (); - - InitializeArray (array, fldHandle.Value); - } - - public static int OffsetToStringData { - [Intrinsic] - get => OffsetToStringData; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern int InternalGetHashCode (object? o); - - public static int GetHashCode (object? o) - { - return InternalGetHashCode (o); - } - - public static new bool Equals (object? o1, object? o2) - { - if (o1 == o2) - return true; - - if (o1 == null || o2 == null) - return false; - - if (o1 is ValueType) - return ValueType.DefaultEquals (o1, o2); - - return false; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public static extern object GetObjectValue (object obj); - - public static void RunClassConstructor (RuntimeTypeHandle type) - { - if (type.Value == IntPtr.Zero) - throw new ArgumentException ("Handle is not initialized.", "type"); - - RunClassConstructor (type.Value); - } - - public static void EnsureSufficientExecutionStack () - { - if (SufficientExecutionStack ()) - return; - - throw new InsufficientExecutionStackException (); - } - - public static bool TryEnsureSufficientExecutionStack () - { - return SufficientExecutionStack (); - } - - public static void PrepareDelegate (Delegate d) - { - } - - public static void PrepareMethod (RuntimeMethodHandle method) - { - if (method.IsNullHandle ()) - throw new ArgumentException (SR.Argument_InvalidHandle); - unsafe { - PrepareMethod (method.Value, null, 0); - } - } - - public static void PrepareMethod (RuntimeMethodHandle method, RuntimeTypeHandle[] instantiation) - { - if (method.IsNullHandle ()) - throw new ArgumentException (SR.Argument_InvalidHandle); - unsafe { - IntPtr[] instantiations = RuntimeTypeHandle.CopyRuntimeTypeHandles (instantiation, out int length); - fixed (IntPtr* pinst = instantiations) { - PrepareMethod (method.Value, pinst, length); - GC.KeepAlive (instantiation); - } - } - } - - public static void RunModuleConstructor (ModuleHandle module) - { - if (module == ModuleHandle.EmptyHandle) - throw new ArgumentException ("Handle is not initialized.", "module"); - - RunModuleConstructor (module.Value); - } - - public static IntPtr AllocateTypeAssociatedMemory (Type type, int size) - { - throw new PlatformNotSupportedException (); - } - - [Intrinsic] - public static bool IsReferenceOrContainsReferences () => IsReferenceOrContainsReferences (); - - [Intrinsic] - internal static bool IsBitwiseEquatable () => IsBitwiseEquatable (); - - [Intrinsic] - internal static bool ObjectHasComponentSize (object obj) => ObjectHasComponentSize (obj); - - [Intrinsic] - internal static bool ObjectHasReferences (object obj) - { - // TODO: Missing intrinsic in interpreter - return RuntimeTypeHandle.HasReferences (obj.GetType () as RuntimeType); - } - - static object GetUninitializedObjectInternal (Type type) - { - return GetUninitializedObjectInternal (new RuntimeTypeHandle ((RuntimeType)type).Value); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern unsafe void PrepareMethod (IntPtr method, IntPtr* instantiations, int ninst); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern object GetUninitializedObjectInternal (IntPtr type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern void InitializeArray (Array array, IntPtr fldHandle); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern void RunClassConstructor (IntPtr type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern void RunModuleConstructor (IntPtr module); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern bool SufficientExecutionStack (); - } + public partial class RuntimeHelpers + { + public static void InitializeArray(Array array, RuntimeFieldHandle fldHandle) + { + if (array == null || fldHandle.Value == IntPtr.Zero) + throw new ArgumentNullException(); + + InitializeArray(array, fldHandle.Value); + } + + public static int OffsetToStringData + { + [Intrinsic] + get => OffsetToStringData; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int InternalGetHashCode(object? o); + + public static int GetHashCode(object? o) + { + return InternalGetHashCode(o); + } + + public static new bool Equals(object? o1, object? o2) + { + if (o1 == o2) + return true; + + if (o1 == null || o2 == null) + return false; + + if (o1 is ValueType) + return ValueType.DefaultEquals(o1, o2); + + return false; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern object GetObjectValue(object obj); + + public static void RunClassConstructor(RuntimeTypeHandle type) + { + if (type.Value == IntPtr.Zero) + throw new ArgumentException("Handle is not initialized.", nameof(type)); + + RunClassConstructor(type.Value); + } + + public static void EnsureSufficientExecutionStack() + { + if (SufficientExecutionStack()) + return; + + throw new InsufficientExecutionStackException(); + } + + public static bool TryEnsureSufficientExecutionStack() + { + return SufficientExecutionStack(); + } + + public static void PrepareDelegate(Delegate d) + { + } + + public static void PrepareMethod(RuntimeMethodHandle method) + { + if (method.IsNullHandle()) + throw new ArgumentException(SR.Argument_InvalidHandle); + unsafe + { + PrepareMethod(method.Value, null, 0); + } + } + + public static void PrepareMethod(RuntimeMethodHandle method, RuntimeTypeHandle[] instantiation) + { + if (method.IsNullHandle()) + throw new ArgumentException(SR.Argument_InvalidHandle); + unsafe + { + IntPtr[] instantiations = RuntimeTypeHandle.CopyRuntimeTypeHandles(instantiation, out int length); + fixed (IntPtr* pinst = instantiations) + { + PrepareMethod(method.Value, pinst, length); + GC.KeepAlive(instantiation); + } + } + } + + public static void RunModuleConstructor(ModuleHandle module) + { + if (module == ModuleHandle.EmptyHandle) + throw new ArgumentException("Handle is not initialized.", nameof(module)); + + RunModuleConstructor(module.Value); + } + + public static IntPtr AllocateTypeAssociatedMemory(Type type, int size) + { + throw new PlatformNotSupportedException(); + } + + [Intrinsic] + public static bool IsReferenceOrContainsReferences() => IsReferenceOrContainsReferences(); + + [Intrinsic] + internal static bool IsBitwiseEquatable() => IsBitwiseEquatable(); + + [Intrinsic] + internal static bool ObjectHasComponentSize(object obj) => ObjectHasComponentSize(obj); + + [Intrinsic] + internal static bool ObjectHasReferences(object obj) + { + // TODO: Missing intrinsic in interpreter + return RuntimeTypeHandle.HasReferences(obj.GetType() as RuntimeType); + } + + private static object GetUninitializedObjectInternal(Type type) + { + return GetUninitializedObjectInternal(new RuntimeTypeHandle((RuntimeType)type).Value); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern unsafe void PrepareMethod(IntPtr method, IntPtr* instantiations, int ninst); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern object GetUninitializedObjectInternal(IntPtr type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void InitializeArray(Array array, IntPtr fldHandle); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void RunClassConstructor(IntPtr type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void RunModuleConstructor(IntPtr module); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool SufficientExecutionStack(); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/GCSettings.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/GCSettings.Mono.cs index c7374f939750f..5767b2cbf3418 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/GCSettings.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/GCSettings.Mono.cs @@ -4,26 +4,26 @@ namespace System.Runtime { - partial class GCSettings - { - public static bool IsServerGC => false; + public partial class GCSettings + { + public static bool IsServerGC => false; - static GCLatencyMode GetGCLatencyMode() => GCLatencyMode.Batch; + private static GCLatencyMode GetGCLatencyMode() => GCLatencyMode.Batch; - static SetLatencyModeStatus SetGCLatencyMode(GCLatencyMode newLatencyMode) - { - if (newLatencyMode != GCLatencyMode.Batch) - throw new PlatformNotSupportedException (); + private static SetLatencyModeStatus SetGCLatencyMode(GCLatencyMode newLatencyMode) + { + if (newLatencyMode != GCLatencyMode.Batch) + throw new PlatformNotSupportedException(); - return SetLatencyModeStatus.Succeeded; - } + return SetLatencyModeStatus.Succeeded; + } - static GCLargeObjectHeapCompactionMode GetLOHCompactionMode() => GCLargeObjectHeapCompactionMode.Default; + private static GCLargeObjectHeapCompactionMode GetLOHCompactionMode() => GCLargeObjectHeapCompactionMode.Default; - static void SetLOHCompactionMode (GCLargeObjectHeapCompactionMode newLOHCompactionMode) - { - if (newLOHCompactionMode != GCLargeObjectHeapCompactionMode.Default) - throw new PlatformNotSupportedException (); - } - } + private static void SetLOHCompactionMode(GCLargeObjectHeapCompactionMode newLOHCompactionMode) + { + if (newLOHCompactionMode != GCLargeObjectHeapCompactionMode.Default) + throw new PlatformNotSupportedException(); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/CriticalHandle.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/CriticalHandle.Mono.cs index 9dc17ee4aaa8f..40bcff4562212 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/CriticalHandle.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/CriticalHandle.Mono.cs @@ -4,10 +4,10 @@ namespace System.Runtime.InteropServices { - partial class CriticalHandle - { - void ReleaseHandleFailed () - { - } - } + public partial class CriticalHandle + { + private void ReleaseHandleFailed() + { + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/GCHandle.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/GCHandle.Mono.cs index 08038b4c6481f..017e687cbeb61 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/GCHandle.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/GCHandle.Mono.cs @@ -6,18 +6,18 @@ namespace System.Runtime.InteropServices { - partial struct GCHandle - { - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern IntPtr InternalAlloc (object value, GCHandleType type); + public partial struct GCHandle + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern IntPtr InternalAlloc(object value, GCHandleType type); - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern void InternalFree (IntPtr handle); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void InternalFree(IntPtr handle); - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern object InternalGet (IntPtr handle); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern object InternalGet(IntPtr handle); - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern void InternalSet (IntPtr handle, object value); - } + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void InternalSet(IntPtr handle, object value); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.Mono.cs index bc13dd6c316f7..12bf24216cc0b 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.Mono.cs @@ -8,416 +8,423 @@ namespace System.Runtime.InteropServices { - partial class Marshal - { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static IntPtr AllocCoTaskMem (int cb); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static IntPtr AllocHGlobal (IntPtr cb); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static void FreeBSTR (IntPtr ptr); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static void FreeCoTaskMem (IntPtr ptr); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static void FreeHGlobal (IntPtr hglobal); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public static extern int GetLastWin32Error (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static void DestroyStructure (IntPtr ptr, Type structuretype); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static IntPtr OffsetOf (Type t, string fieldName); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static string PtrToStringBSTR (IntPtr ptr); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static IntPtr ReAllocCoTaskMem (IntPtr pv, int cb); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public extern static IntPtr ReAllocHGlobal (IntPtr pv, IntPtr cb); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern unsafe static IntPtr BufferToBSTR (char* ptr, int slen); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static bool IsPinnableType (Type type); - - internal static bool IsPinnable (object obj) - { - if (obj == null || obj is string) - return true; - return IsPinnableType (obj.GetType ()); - //Type type = obj.GetType (); - //return !type.IsValueType || RuntimeTypeHandle.HasReferences (type as RuntimeType); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal static extern void SetLastWin32Error (int error); - - static Exception GetExceptionForHRInternal (int errorCode, IntPtr errorInfo) - { - switch (errorCode) { - case HResults.S_OK: - case HResults.S_FALSE: - return null; - case HResults.COR_E_AMBIGUOUSMATCH: - return new System.Reflection.AmbiguousMatchException (); - case HResults.COR_E_APPLICATION: - return new System.ApplicationException (); - case HResults.COR_E_ARGUMENT: - return new System.ArgumentException (); - case HResults.COR_E_ARGUMENTOUTOFRANGE: - return new System.ArgumentOutOfRangeException (); - case HResults.COR_E_ARITHMETIC: - return new System.ArithmeticException (); - case HResults.COR_E_ARRAYTYPEMISMATCH: - return new System.ArrayTypeMismatchException (); - case HResults.COR_E_BADEXEFORMAT: - return new System.BadImageFormatException (); - case HResults.COR_E_BADIMAGEFORMAT: - return new System.BadImageFormatException (); - //case HResults.COR_E_CODECONTRACTFAILED: - //return new System.Diagnostics.Contracts.ContractException (); - //case HResults.COR_E_COMEMULATE: - case HResults.COR_E_CUSTOMATTRIBUTEFORMAT: - return new System.Reflection.CustomAttributeFormatException (); - case HResults.COR_E_DATAMISALIGNED: - return new System.DataMisalignedException (); - case HResults.COR_E_DIRECTORYNOTFOUND: - return new System.IO.DirectoryNotFoundException (); - case HResults.COR_E_DIVIDEBYZERO: - return new System.DivideByZeroException (); - case HResults.COR_E_DLLNOTFOUND: - return new System.DllNotFoundException (); - case HResults.COR_E_DUPLICATEWAITOBJECT: - return new System.DuplicateWaitObjectException (); - case HResults.COR_E_ENDOFSTREAM: - return new System.IO.EndOfStreamException (); - case HResults.COR_E_ENTRYPOINTNOTFOUND: - return new System.EntryPointNotFoundException (); - case HResults.COR_E_EXCEPTION: - return new System.Exception (); - case HResults.COR_E_EXECUTIONENGINE: - return new System.ExecutionEngineException (); - case HResults.COR_E_FIELDACCESS: - return new System.FieldAccessException (); - case HResults.COR_E_FILELOAD: - return new System.IO.FileLoadException (); - case HResults.COR_E_FILENOTFOUND: - return new System.IO.FileNotFoundException (); - case HResults.COR_E_FORMAT: - return new System.FormatException (); - case HResults.COR_E_INDEXOUTOFRANGE: - return new System.IndexOutOfRangeException (); - case HResults.COR_E_INSUFFICIENTEXECUTIONSTACK: - return new System.InsufficientExecutionStackException (); - case HResults.COR_E_INVALIDCAST: - return new System.InvalidCastException (); - case HResults.COR_E_INVALIDFILTERCRITERIA: - return new System.Reflection.InvalidFilterCriteriaException (); - case HResults.COR_E_INVALIDOLEVARIANTTYPE: - return new System.Runtime.InteropServices.InvalidOleVariantTypeException (); - case HResults.COR_E_INVALIDOPERATION: - return new System.InvalidOperationException (); - case HResults.COR_E_INVALIDPROGRAM: - return new System.InvalidProgramException (); - case HResults.COR_E_IO: - return new System.IO.IOException (); - case HResults.COR_E_MARSHALDIRECTIVE: - return new System.Runtime.InteropServices.MarshalDirectiveException (); - case HResults.COR_E_MEMBERACCESS: - return new System.MemberAccessException (); - case HResults.COR_E_METHODACCESS: - return new System.MethodAccessException (); - case HResults.COR_E_MISSINGFIELD: - return new System.MissingFieldException (); - case HResults.COR_E_MISSINGMANIFESTRESOURCE: - return new System.Resources.MissingManifestResourceException (); - case HResults.COR_E_MISSINGMEMBER: - return new System.MissingMemberException (); - case HResults.COR_E_MISSINGMETHOD: - return new System.MissingMethodException (); - case HResults.COR_E_MULTICASTNOTSUPPORTED: - return new System.MulticastNotSupportedException (); - case HResults.COR_E_NOTFINITENUMBER: - return new System.NotFiniteNumberException (); - case HResults.COR_E_NOTSUPPORTED: - return new System.NotSupportedException (); - case HResults.E_POINTER: - return new System.NullReferenceException (); - case HResults.COR_E_OBJECTDISPOSED: - return new System.ObjectDisposedException (""); - case HResults.COR_E_OPERATIONCANCELED: - return new System.OperationCanceledException (); - case HResults.COR_E_OUTOFMEMORY: - return new System.OutOfMemoryException (); - case HResults.COR_E_OVERFLOW: - return new System.OverflowException (); - case HResults.COR_E_PATHTOOLONG: - return new System.IO.PathTooLongException (); - case HResults.COR_E_PLATFORMNOTSUPPORTED: - return new System.PlatformNotSupportedException (); - case HResults.COR_E_RANK: - return new System.RankException (); - case HResults.COR_E_REFLECTIONTYPELOAD: - return new System.MissingMethodException (); - case HResults.COR_E_RUNTIMEWRAPPED: - return new System.MissingMethodException (); - case HResults.COR_E_SECURITY: - return new System.Security.SecurityException (); - case HResults.COR_E_SERIALIZATION: - return new System.Runtime.Serialization.SerializationException (); - case HResults.COR_E_STACKOVERFLOW: - return new System.StackOverflowException (); - case HResults.COR_E_SYNCHRONIZATIONLOCK: - return new System.Threading.SynchronizationLockException (); - case HResults.COR_E_SYSTEM: - return new System.SystemException (); - case HResults.COR_E_TARGET: - return new System.Reflection.TargetException (); - case HResults.COR_E_TARGETINVOCATION: - return new System.MissingMethodException (); - case HResults.COR_E_TARGETPARAMCOUNT: - return new System.Reflection.TargetParameterCountException (); - case HResults.COR_E_THREADABORTED: - return new System.Threading.ThreadAbortException (); - case HResults.COR_E_THREADINTERRUPTED: - return new System.Threading.ThreadInterruptedException (); - case HResults.COR_E_THREADSTART: - return new System.Threading.ThreadStartException (); - case HResults.COR_E_THREADSTATE: - return new System.Threading.ThreadStateException (); - case HResults.COR_E_TYPEACCESS: - return new System.TypeAccessException (); - case HResults.COR_E_TYPEINITIALIZATION: - return new System.TypeInitializationException (""); - case HResults.COR_E_TYPELOAD: - return new System.TypeLoadException (); - case HResults.COR_E_TYPEUNLOADED: - return new System.TypeUnloadedException (); - case HResults.COR_E_UNAUTHORIZEDACCESS: - return new System.UnauthorizedAccessException (); - //case HResults.COR_E_UNSUPPORTEDFORMAT: - case HResults.COR_E_VERIFICATION: - return new System.Security.VerificationException (); - //case HResults.E_INVALIDARG: - case HResults.E_NOTIMPL: - return new System.NotImplementedException (); - //case HResults.E_POINTER: - case HResults.RO_E_CLOSED: - return new System.ObjectDisposedException (""); - case HResults.COR_E_ABANDONEDMUTEX: - case HResults.COR_E_AMBIGUOUSIMPLEMENTATION: - case HResults.COR_E_CANNOTUNLOADAPPDOMAIN: - case HResults.COR_E_CONTEXTMARSHAL: - //case HResults.COR_E_HOSTPROTECTION: - case HResults.COR_E_INSUFFICIENTMEMORY: - case HResults.COR_E_INVALIDCOMOBJECT: - case HResults.COR_E_KEYNOTFOUND: - case HResults.COR_E_MISSINGSATELLITEASSEMBLY: - case HResults.COR_E_SAFEARRAYRANKMISMATCH: - case HResults.COR_E_SAFEARRAYTYPEMISMATCH: - //case HResults.COR_E_SAFEHANDLEMISSINGATTRIBUTE: - //case HResults.COR_E_SEMAPHOREFULL: - //case HResults.COR_E_THREADSTOP: - case HResults.COR_E_TIMEOUT: - case HResults.COR_E_WAITHANDLECANNOTBEOPENED: - case HResults.DISP_E_OVERFLOW: - case HResults.E_BOUNDS: - case HResults.E_CHANGED_STATE: - case HResults.E_FAIL: - case HResults.E_HANDLE: - case HResults.ERROR_MRM_MAP_NOT_FOUND: - case HResults.TYPE_E_TYPEMISMATCH: - case HResults.CO_E_NOTINITIALIZED: - case HResults.RPC_E_CHANGED_MODE: - return new COMException ("", errorCode); - - case HResults.STG_E_PATHNOTFOUND: - case HResults.CTL_E_PATHNOTFOUND: { - return new System.IO.DirectoryNotFoundException { - HResult = errorCode - }; - } - case HResults.FUSION_E_INVALID_PRIVATE_ASM_LOCATION: - case HResults.FUSION_E_SIGNATURE_CHECK_FAILED: - case HResults.FUSION_E_LOADFROM_BLOCKED: - case HResults.FUSION_E_CACHEFILE_FAILED: - case HResults.FUSION_E_ASM_MODULE_MISSING: - case HResults.FUSION_E_INVALID_NAME: - case HResults.FUSION_E_PRIVATE_ASM_DISALLOWED: - case HResults.FUSION_E_HOST_GAC_ASM_MISMATCH: - case HResults.COR_E_MODULE_HASH_CHECK_FAILED: - case HResults.FUSION_E_REF_DEF_MISMATCH: - case HResults.SECURITY_E_INCOMPATIBLE_SHARE: - case HResults.SECURITY_E_INCOMPATIBLE_EVIDENCE: - case HResults.SECURITY_E_UNVERIFIABLE: - case HResults.COR_E_FIXUPSINEXE: - case HResults.ERROR_TOO_MANY_OPEN_FILES: - case HResults.ERROR_SHARING_VIOLATION: - case HResults.ERROR_LOCK_VIOLATION: - case HResults.ERROR_OPEN_FAILED: - case HResults.ERROR_DISK_CORRUPT: - case HResults.ERROR_UNRECOGNIZED_VOLUME: - case HResults.ERROR_DLL_INIT_FAILED: - case HResults.FUSION_E_CODE_DOWNLOAD_DISABLED: - case HResults.CORSEC_E_MISSING_STRONGNAME: - case HResults.MSEE_E_ASSEMBLYLOADINPROGRESS: - case HResults.ERROR_FILE_INVALID: { - return new System.IO.FileLoadException { - HResult = errorCode - }; - } - case HResults.CTL_E_FILENOTFOUND: { - return new System.IO.FileNotFoundException { - HResult = errorCode - }; - } - default: - return new COMException ("", errorCode); - } - } - - static void PrelinkCore (MethodInfo m) - { - if (!(m is RuntimeMethodInfo)) - { - throw new ArgumentException (SR.Argument_MustBeRuntimeMethodInfo, nameof(m)); - } - - PrelinkInternal (m); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static void PtrToStructureInternal (IntPtr ptr, object structure, bool allowValueClasses); - - static void PtrToStructureHelper (IntPtr ptr, object structure, bool allowValueClasses) - { - if (structure == null) - throw new ArgumentNullException (nameof (structure)); - PtrToStructureInternal (ptr, structure, allowValueClasses); - } - - static object PtrToStructureHelper (IntPtr ptr, Type structureType) - { - var obj = Activator.CreateInstance (structureType); - PtrToStructureHelper (ptr, obj, true); - return obj; - } - - [MethodImpl (MethodImplOptions.InternalCall)] - static extern Delegate GetDelegateForFunctionPointerInternal (IntPtr ptr, Type t); - - [MethodImpl (MethodImplOptions.InternalCall)] - static extern IntPtr GetFunctionPointerForDelegateInternal (Delegate d); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void PrelinkInternal (MethodInfo m); - - [MethodImpl (MethodImplOptions.InternalCall)] - static extern int SizeOfHelper (Type t, bool throwIfNotMarshalable); - - public static IntPtr GetExceptionPointers () - { - throw new PlatformNotSupportedException (); - } - - internal unsafe static IntPtr AllocBSTR (int length) - { - var res = BufferToBSTR ((char*)IntPtr.Zero, length); - if (res == IntPtr.Zero) - throw new OutOfMemoryException (); - return res; - } - - public unsafe static IntPtr StringToBSTR (string s) - { - if (s == null) - return IntPtr.Zero; - fixed (char* fixed_s = s) - return BufferToBSTR (fixed_s, s.Length); - } - - #region PlatformNotSupported - - public static int GetExceptionCode() - { - // Obsolete - throw new PlatformNotSupportedException (); - } - - public static byte ReadByte(Object ptr, int ofs) - { - // Obsolete - throw new PlatformNotSupportedException (); - } - - public static short ReadInt16(Object ptr, int ofs) - { - // Obsolete - throw new PlatformNotSupportedException (); - } - - public static int ReadInt32(Object ptr, int ofs) - { - // Obsolete - throw new PlatformNotSupportedException (); - } - - public static long ReadInt64(Object ptr, int ofs) - { - // Obsolete - throw new PlatformNotSupportedException (); - } - - public static void WriteByte(Object ptr, int ofs, byte val) - { - // Obsolete - throw new PlatformNotSupportedException (); - } - - public static void WriteInt16(Object ptr, int ofs, short val) - { - // Obsolete - throw new PlatformNotSupportedException (); - } - - public static void WriteInt32(Object ptr, int ofs, int val) - { - // Obsolete - throw new PlatformNotSupportedException (); - } - - public static void WriteInt64(Object ptr, int ofs, long val) - { - // Obsolete - throw new PlatformNotSupportedException (); - } - - #endregion - } + public partial class Marshal + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern IntPtr AllocCoTaskMem(int cb); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern IntPtr AllocHGlobal(IntPtr cb); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern void FreeBSTR(IntPtr ptr); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern void FreeCoTaskMem(IntPtr ptr); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern void FreeHGlobal(IntPtr hglobal); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern int GetLastWin32Error(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern void DestroyStructure(IntPtr ptr, Type structuretype); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern IntPtr OffsetOf(Type t, string fieldName); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern string PtrToStringBSTR(IntPtr ptr); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern IntPtr ReAllocCoTaskMem(IntPtr pv, int cb); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern IntPtr ReAllocHGlobal(IntPtr pv, IntPtr cb); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern void StructureToPtr(object structure, IntPtr ptr, bool fDeleteOld); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern unsafe IntPtr BufferToBSTR(char* ptr, int slen); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool IsPinnableType(Type type); + + internal static bool IsPinnable(object obj) + { + if (obj == null || obj is string) + return true; + return IsPinnableType(obj.GetType()); + //Type type = obj.GetType (); + //return !type.IsValueType || RuntimeTypeHandle.HasReferences (type as RuntimeType); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern void SetLastWin32Error(int error); + + private static Exception GetExceptionForHRInternal(int errorCode, IntPtr errorInfo) + { + switch (errorCode) + { + case HResults.S_OK: + case HResults.S_FALSE: + return null; + case HResults.COR_E_AMBIGUOUSMATCH: + return new System.Reflection.AmbiguousMatchException(); + case HResults.COR_E_APPLICATION: + return new System.ApplicationException(); + case HResults.COR_E_ARGUMENT: + return new System.ArgumentException(); + case HResults.COR_E_ARGUMENTOUTOFRANGE: + return new System.ArgumentOutOfRangeException(); + case HResults.COR_E_ARITHMETIC: + return new System.ArithmeticException(); + case HResults.COR_E_ARRAYTYPEMISMATCH: + return new System.ArrayTypeMismatchException(); + case HResults.COR_E_BADEXEFORMAT: + return new System.BadImageFormatException(); + case HResults.COR_E_BADIMAGEFORMAT: + return new System.BadImageFormatException(); + //case HResults.COR_E_CODECONTRACTFAILED: + //return new System.Diagnostics.Contracts.ContractException (); + //case HResults.COR_E_COMEMULATE: + case HResults.COR_E_CUSTOMATTRIBUTEFORMAT: + return new System.Reflection.CustomAttributeFormatException(); + case HResults.COR_E_DATAMISALIGNED: + return new System.DataMisalignedException(); + case HResults.COR_E_DIRECTORYNOTFOUND: + return new System.IO.DirectoryNotFoundException(); + case HResults.COR_E_DIVIDEBYZERO: + return new System.DivideByZeroException(); + case HResults.COR_E_DLLNOTFOUND: + return new System.DllNotFoundException(); + case HResults.COR_E_DUPLICATEWAITOBJECT: + return new System.DuplicateWaitObjectException(); + case HResults.COR_E_ENDOFSTREAM: + return new System.IO.EndOfStreamException(); + case HResults.COR_E_ENTRYPOINTNOTFOUND: + return new System.EntryPointNotFoundException(); + case HResults.COR_E_EXCEPTION: + return new System.Exception(); + case HResults.COR_E_EXECUTIONENGINE: + return new System.ExecutionEngineException(); + case HResults.COR_E_FIELDACCESS: + return new System.FieldAccessException(); + case HResults.COR_E_FILELOAD: + return new System.IO.FileLoadException(); + case HResults.COR_E_FILENOTFOUND: + return new System.IO.FileNotFoundException(); + case HResults.COR_E_FORMAT: + return new System.FormatException(); + case HResults.COR_E_INDEXOUTOFRANGE: + return new System.IndexOutOfRangeException(); + case HResults.COR_E_INSUFFICIENTEXECUTIONSTACK: + return new System.InsufficientExecutionStackException(); + case HResults.COR_E_INVALIDCAST: + return new System.InvalidCastException(); + case HResults.COR_E_INVALIDFILTERCRITERIA: + return new System.Reflection.InvalidFilterCriteriaException(); + case HResults.COR_E_INVALIDOLEVARIANTTYPE: + return new System.Runtime.InteropServices.InvalidOleVariantTypeException(); + case HResults.COR_E_INVALIDOPERATION: + return new System.InvalidOperationException(); + case HResults.COR_E_INVALIDPROGRAM: + return new System.InvalidProgramException(); + case HResults.COR_E_IO: + return new System.IO.IOException(); + case HResults.COR_E_MARSHALDIRECTIVE: + return new System.Runtime.InteropServices.MarshalDirectiveException(); + case HResults.COR_E_MEMBERACCESS: + return new System.MemberAccessException(); + case HResults.COR_E_METHODACCESS: + return new System.MethodAccessException(); + case HResults.COR_E_MISSINGFIELD: + return new System.MissingFieldException(); + case HResults.COR_E_MISSINGMANIFESTRESOURCE: + return new System.Resources.MissingManifestResourceException(); + case HResults.COR_E_MISSINGMEMBER: + return new System.MissingMemberException(); + case HResults.COR_E_MISSINGMETHOD: + return new System.MissingMethodException(); + case HResults.COR_E_MULTICASTNOTSUPPORTED: + return new System.MulticastNotSupportedException(); + case HResults.COR_E_NOTFINITENUMBER: + return new System.NotFiniteNumberException(); + case HResults.COR_E_NOTSUPPORTED: + return new System.NotSupportedException(); + case HResults.E_POINTER: + return new System.NullReferenceException(); + case HResults.COR_E_OBJECTDISPOSED: + return new System.ObjectDisposedException(""); + case HResults.COR_E_OPERATIONCANCELED: + return new System.OperationCanceledException(); + case HResults.COR_E_OUTOFMEMORY: + return new System.OutOfMemoryException(); + case HResults.COR_E_OVERFLOW: + return new System.OverflowException(); + case HResults.COR_E_PATHTOOLONG: + return new System.IO.PathTooLongException(); + case HResults.COR_E_PLATFORMNOTSUPPORTED: + return new System.PlatformNotSupportedException(); + case HResults.COR_E_RANK: + return new System.RankException(); + case HResults.COR_E_REFLECTIONTYPELOAD: + return new System.MissingMethodException(); + case HResults.COR_E_RUNTIMEWRAPPED: + return new System.MissingMethodException(); + case HResults.COR_E_SECURITY: + return new System.Security.SecurityException(); + case HResults.COR_E_SERIALIZATION: + return new System.Runtime.Serialization.SerializationException(); + case HResults.COR_E_STACKOVERFLOW: + return new System.StackOverflowException(); + case HResults.COR_E_SYNCHRONIZATIONLOCK: + return new System.Threading.SynchronizationLockException(); + case HResults.COR_E_SYSTEM: + return new System.SystemException(); + case HResults.COR_E_TARGET: + return new System.Reflection.TargetException(); + case HResults.COR_E_TARGETINVOCATION: + return new System.MissingMethodException(); + case HResults.COR_E_TARGETPARAMCOUNT: + return new System.Reflection.TargetParameterCountException(); + case HResults.COR_E_THREADABORTED: + return new System.Threading.ThreadAbortException(); + case HResults.COR_E_THREADINTERRUPTED: + return new System.Threading.ThreadInterruptedException(); + case HResults.COR_E_THREADSTART: + return new System.Threading.ThreadStartException(); + case HResults.COR_E_THREADSTATE: + return new System.Threading.ThreadStateException(); + case HResults.COR_E_TYPEACCESS: + return new System.TypeAccessException(); + case HResults.COR_E_TYPEINITIALIZATION: + return new System.TypeInitializationException(""); + case HResults.COR_E_TYPELOAD: + return new System.TypeLoadException(); + case HResults.COR_E_TYPEUNLOADED: + return new System.TypeUnloadedException(); + case HResults.COR_E_UNAUTHORIZEDACCESS: + return new System.UnauthorizedAccessException(); + //case HResults.COR_E_UNSUPPORTEDFORMAT: + case HResults.COR_E_VERIFICATION: + return new System.Security.VerificationException(); + //case HResults.E_INVALIDARG: + case HResults.E_NOTIMPL: + return new System.NotImplementedException(); + //case HResults.E_POINTER: + case HResults.RO_E_CLOSED: + return new System.ObjectDisposedException(""); + case HResults.COR_E_ABANDONEDMUTEX: + case HResults.COR_E_AMBIGUOUSIMPLEMENTATION: + case HResults.COR_E_CANNOTUNLOADAPPDOMAIN: + case HResults.COR_E_CONTEXTMARSHAL: + //case HResults.COR_E_HOSTPROTECTION: + case HResults.COR_E_INSUFFICIENTMEMORY: + case HResults.COR_E_INVALIDCOMOBJECT: + case HResults.COR_E_KEYNOTFOUND: + case HResults.COR_E_MISSINGSATELLITEASSEMBLY: + case HResults.COR_E_SAFEARRAYRANKMISMATCH: + case HResults.COR_E_SAFEARRAYTYPEMISMATCH: + //case HResults.COR_E_SAFEHANDLEMISSINGATTRIBUTE: + //case HResults.COR_E_SEMAPHOREFULL: + //case HResults.COR_E_THREADSTOP: + case HResults.COR_E_TIMEOUT: + case HResults.COR_E_WAITHANDLECANNOTBEOPENED: + case HResults.DISP_E_OVERFLOW: + case HResults.E_BOUNDS: + case HResults.E_CHANGED_STATE: + case HResults.E_FAIL: + case HResults.E_HANDLE: + case HResults.ERROR_MRM_MAP_NOT_FOUND: + case HResults.TYPE_E_TYPEMISMATCH: + case HResults.CO_E_NOTINITIALIZED: + case HResults.RPC_E_CHANGED_MODE: + return new COMException("", errorCode); + + case HResults.STG_E_PATHNOTFOUND: + case HResults.CTL_E_PATHNOTFOUND: + { + return new System.IO.DirectoryNotFoundException + { + HResult = errorCode + }; + } + case HResults.FUSION_E_INVALID_PRIVATE_ASM_LOCATION: + case HResults.FUSION_E_SIGNATURE_CHECK_FAILED: + case HResults.FUSION_E_LOADFROM_BLOCKED: + case HResults.FUSION_E_CACHEFILE_FAILED: + case HResults.FUSION_E_ASM_MODULE_MISSING: + case HResults.FUSION_E_INVALID_NAME: + case HResults.FUSION_E_PRIVATE_ASM_DISALLOWED: + case HResults.FUSION_E_HOST_GAC_ASM_MISMATCH: + case HResults.COR_E_MODULE_HASH_CHECK_FAILED: + case HResults.FUSION_E_REF_DEF_MISMATCH: + case HResults.SECURITY_E_INCOMPATIBLE_SHARE: + case HResults.SECURITY_E_INCOMPATIBLE_EVIDENCE: + case HResults.SECURITY_E_UNVERIFIABLE: + case HResults.COR_E_FIXUPSINEXE: + case HResults.ERROR_TOO_MANY_OPEN_FILES: + case HResults.ERROR_SHARING_VIOLATION: + case HResults.ERROR_LOCK_VIOLATION: + case HResults.ERROR_OPEN_FAILED: + case HResults.ERROR_DISK_CORRUPT: + case HResults.ERROR_UNRECOGNIZED_VOLUME: + case HResults.ERROR_DLL_INIT_FAILED: + case HResults.FUSION_E_CODE_DOWNLOAD_DISABLED: + case HResults.CORSEC_E_MISSING_STRONGNAME: + case HResults.MSEE_E_ASSEMBLYLOADINPROGRESS: + case HResults.ERROR_FILE_INVALID: + { + return new System.IO.FileLoadException + { + HResult = errorCode + }; + } + case HResults.CTL_E_FILENOTFOUND: + { + return new System.IO.FileNotFoundException + { + HResult = errorCode + }; + } + default: + return new COMException("", errorCode); + } + } + + private static void PrelinkCore(MethodInfo m) + { + if (!(m is RuntimeMethodInfo)) + { + throw new ArgumentException(SR.Argument_MustBeRuntimeMethodInfo, nameof(m)); + } + + PrelinkInternal(m); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void PtrToStructureInternal(IntPtr ptr, object structure, bool allowValueClasses); + + private static void PtrToStructureHelper(IntPtr ptr, object structure, bool allowValueClasses) + { + if (structure == null) + throw new ArgumentNullException(nameof(structure)); + PtrToStructureInternal(ptr, structure, allowValueClasses); + } + + private static object PtrToStructureHelper(IntPtr ptr, Type structureType) + { + var obj = Activator.CreateInstance(structureType); + PtrToStructureHelper(ptr, obj, true); + return obj; + } + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern Delegate GetDelegateForFunctionPointerInternal(IntPtr ptr, Type t); + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern IntPtr GetFunctionPointerForDelegateInternal(Delegate d); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void PrelinkInternal(MethodInfo m); + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern int SizeOfHelper(Type t, bool throwIfNotMarshalable); + + public static IntPtr GetExceptionPointers() + { + throw new PlatformNotSupportedException(); + } + + internal static unsafe IntPtr AllocBSTR(int length) + { + var res = BufferToBSTR((char*)IntPtr.Zero, length); + if (res == IntPtr.Zero) + throw new OutOfMemoryException(); + return res; + } + + public static unsafe IntPtr StringToBSTR(string s) + { + if (s == null) + return IntPtr.Zero; + fixed (char* fixed_s = s) + return BufferToBSTR(fixed_s, s.Length); + } + + #region PlatformNotSupported + + public static int GetExceptionCode() + { + // Obsolete + throw new PlatformNotSupportedException(); + } + + public static byte ReadByte(object ptr, int ofs) + { + // Obsolete + throw new PlatformNotSupportedException(); + } + + public static short ReadInt16(object ptr, int ofs) + { + // Obsolete + throw new PlatformNotSupportedException(); + } + + public static int ReadInt32(object ptr, int ofs) + { + // Obsolete + throw new PlatformNotSupportedException(); + } + + public static long ReadInt64(object ptr, int ofs) + { + // Obsolete + throw new PlatformNotSupportedException(); + } + + public static void WriteByte(object ptr, int ofs, byte val) + { + // Obsolete + throw new PlatformNotSupportedException(); + } + + public static void WriteInt16(object ptr, int ofs, short val) + { + // Obsolete + throw new PlatformNotSupportedException(); + } + + public static void WriteInt32(object ptr, int ofs, int val) + { + // Obsolete + throw new PlatformNotSupportedException(); + } + + public static void WriteInt64(object ptr, int ofs, long val) + { + // Obsolete + throw new PlatformNotSupportedException(); + } + + #endregion + } } namespace System { internal static partial class HResults - { + { // DirectoryNotFoundException - public const int STG_E_PATHNOTFOUND = unchecked((int)0x80030003); + public const int STG_E_PATHNOTFOUND = unchecked((int)0x80030003); public const int CTL_E_PATHNOTFOUND = unchecked((int)0x800A004C); // FileNotFoundException - public const int CTL_E_FILENOTFOUND = unchecked((int)0x800A0035); + public const int CTL_E_FILENOTFOUND = unchecked((int)0x800A0035); public const int FUSION_E_INVALID_PRIVATE_ASM_LOCATION = unchecked((int)0x80131041); public const int FUSION_E_SIGNATURE_CHECK_FAILED = unchecked((int)0x80131045); @@ -444,5 +451,5 @@ internal static partial class HResults public const int CORSEC_E_MISSING_STRONGNAME = unchecked((int)0x8013141b); public const int MSEE_E_ASSEMBLYLOADINPROGRESS = unchecked((int)0x80131016); public const int ERROR_FILE_INVALID = unchecked((int)0x800703EE); - } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/MarshalAsAttribute.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/MarshalAsAttribute.Mono.cs index 89353dbdd21b6..61d9fadf0ef1a 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/MarshalAsAttribute.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/MarshalAsAttribute.Mono.cs @@ -4,8 +4,8 @@ namespace System.Runtime.InteropServices { - [StructLayout (LayoutKind.Sequential)] - partial class MarshalAsAttribute + [StructLayout(LayoutKind.Sequential)] + public partial class MarshalAsAttribute { } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/MemoryMarshal.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/MemoryMarshal.Mono.cs index db4cc2aea4fc8..46c606e4aac39 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/MemoryMarshal.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/MemoryMarshal.Mono.cs @@ -22,6 +22,6 @@ public static partial class MemoryMarshal [Intrinsic] [NonVersionable] public static ref T GetArrayDataReference(T[] array) => - ref Unsafe.As(ref array.GetRawArrayData ()); + ref Unsafe.As(ref array.GetRawArrayData()); } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/NativeLibrary.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/NativeLibrary.Mono.cs index 32605afc5e1aa..bfd7ce58d34c1 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/NativeLibrary.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/NativeLibrary.Mono.cs @@ -8,32 +8,32 @@ namespace System.Runtime.InteropServices { - partial class NativeLibrary - { - static IntPtr LoadLibraryByName (string libraryName, Assembly assembly, DllImportSearchPath? searchPath, bool throwOnError) - { - return LoadByName (libraryName, - (RuntimeAssembly)assembly, - searchPath.HasValue, - (uint)searchPath.GetValueOrDefault(), - throwOnError); - } + public partial class NativeLibrary + { + private static IntPtr LoadLibraryByName(string libraryName, Assembly assembly, DllImportSearchPath? searchPath, bool throwOnError) + { + return LoadByName(libraryName, + (RuntimeAssembly)assembly, + searchPath.HasValue, + (uint)searchPath.GetValueOrDefault(), + throwOnError); + } - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static IntPtr LoadFromPath (string libraryName, bool throwOnError); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern IntPtr LoadFromPath(string libraryName, bool throwOnError); - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static IntPtr LoadByName (string libraryName, RuntimeAssembly callingAssembly, bool hasDllImportSearchPathFlag, uint dllImportSearchPathFlag, bool throwOnError); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern IntPtr LoadByName(string libraryName, RuntimeAssembly callingAssembly, bool hasDllImportSearchPathFlag, uint dllImportSearchPathFlag, bool throwOnError); - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void FreeLib (IntPtr handle); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void FreeLib(IntPtr handle); - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static IntPtr GetSymbol (IntPtr handle, string symbolName, bool throwOnError); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern IntPtr GetSymbol(IntPtr handle, string symbolName, bool throwOnError); - private static void MonoLoadLibraryCallbackStub (string libraryName, Assembly assembly, bool hasDllImportSearchPathFlags, uint dllImportSearchPathFlags, ref IntPtr dll) - { - dll = LoadLibraryCallbackStub (libraryName, assembly, hasDllImportSearchPathFlags, dllImportSearchPathFlags); - } - } + private static void MonoLoadLibraryCallbackStub(string libraryName, Assembly assembly, bool hasDllImportSearchPathFlags, uint dllImportSearchPathFlags, ref IntPtr dll) + { + dll = LoadLibraryCallbackStub(libraryName, assembly, hasDllImportSearchPathFlags, dllImportSearchPathFlags); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/SafeHandle.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/SafeHandle.Mono.cs index c9910f9271450..b36730f7901fa 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/SafeHandle.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/SafeHandle.Mono.cs @@ -6,9 +6,9 @@ namespace System.Runtime.InteropServices { - // Mono runtime relies on exact layout - [StructLayout (LayoutKind.Sequential)] - public abstract partial class SafeHandle - { - } + // Mono runtime relies on exact layout + [StructLayout(LayoutKind.Sequential)] + public abstract partial class SafeHandle + { + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeMarshal.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeMarshal.cs index cad77cf8d1ead..e0c38813282e6 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeMarshal.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeMarshal.cs @@ -1,14 +1,7 @@ - // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Collections.Generic; -using System.Diagnostics; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Threading; - namespace System.Runtime.InteropServices.WindowsRuntime { public static class WindowsRuntimeMarshal diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.Mono.cs index eea013780c88a..807706f40f23d 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.Mono.cs @@ -10,150 +10,154 @@ namespace System.Runtime.Loader { - partial class AssemblyLoadContext - { - internal IntPtr NativeALC { - get { - return _nativeAssemblyLoadContext; - } - } - - static IntPtr InitializeAssemblyLoadContext (IntPtr thisHandlePtr, bool representsTPALoadContext, bool isCollectible) - { - return InternalInitializeNativeALC (thisHandlePtr, representsTPALoadContext, isCollectible); - } - - static void PrepareForAssemblyLoadContextRelease (IntPtr nativeAssemblyLoadContext, IntPtr assemblyLoadContextStrong) - { - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - Assembly InternalLoadFromPath (string assemblyPath, string nativeImagePath) - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - - assemblyPath = assemblyPath.Replace ('\\', Path.DirectorySeparatorChar); - // TODO: Handle nativeImagePath - return InternalLoadFile (NativeALC, assemblyPath, ref stackMark); - } - - internal Assembly InternalLoad (byte[] arrAssembly, byte[] arrSymbols) - { - unsafe { - int symbolsLength = arrSymbols?.Length ?? 0; - fixed (byte* ptrAssembly = arrAssembly, ptrSymbols = arrSymbols) - { - return InternalLoadFromStream (NativeALC, new IntPtr (ptrAssembly), arrAssembly.Length, - new IntPtr (ptrSymbols), symbolsLength); - } - } - } - - internal static Assembly[] GetLoadedAssemblies () - { - return InternalGetLoadedAssemblies (); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static IntPtr GetLoadContextForAssembly (RuntimeAssembly rtAsm); - - // Returns the load context in which the specified assembly has been loaded - public static AssemblyLoadContext? GetLoadContext (Assembly assembly) - { - if (assembly == null) - throw new ArgumentNullException (nameof (assembly)); - - AssemblyLoadContext? loadContextForAssembly = null; - - RuntimeAssembly? rtAsm = assembly as RuntimeAssembly; - - // We only support looking up load context for runtime assemblies. - if (rtAsm != null) { - RuntimeAssembly runtimeAssembly = rtAsm; - IntPtr ptrAssemblyLoadContext = GetLoadContextForAssembly (runtimeAssembly); - loadContextForAssembly = GetAssemblyLoadContext (ptrAssemblyLoadContext); - } - - return loadContextForAssembly; - } - - public void SetProfileOptimizationRoot (string directoryPath) - { - } - - public void StartProfileOptimization (string profile) - { - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static Assembly InternalLoadFile (IntPtr nativeAssemblyLoadContext, string assemblyFile, ref StackCrawlMark stackMark); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static IntPtr InternalInitializeNativeALC (IntPtr thisHandlePtr, bool representsTPALoadContext, bool isCollectible); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static Assembly InternalLoadFromStream (IntPtr nativeAssemblyLoadContext, IntPtr assm, int assmLength, IntPtr symbols, int symbolsLength); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static Assembly[] InternalGetLoadedAssemblies (); - - internal static Assembly DoAssemblyResolve (string name) - { - return AssemblyResolve (null, new ResolveEventArgs (name)); - } - - // Invoked by Mono to resolve using the load method. - static Assembly? MonoResolveUsingLoad (IntPtr gchALC, string assemblyName) - { - return Resolve (gchALC, new AssemblyName (assemblyName)); - } - - // Invoked by Mono to resolve using the Resolving event after - // trying the Load override and default load context without - // success. - static Assembly? MonoResolveUsingResolvingEvent (IntPtr gchALC, string assemblyName) - { - return ResolveUsingResolvingEvent (gchALC, new AssemblyName (assemblyName)); - } - - // Invoked by Mono to resolve requests to load satellite assemblies. - static Assembly? MonoResolveUsingResolveSatelliteAssembly (IntPtr gchALC, string assemblyName) - { - return ResolveSatelliteAssembly (gchALC, new AssemblyName (assemblyName)); - } - - private static AssemblyLoadContext GetAssemblyLoadContext (IntPtr gchManagedAssemblyLoadContext) - { - AssemblyLoadContext context; - // This check exists because the function can be called early in startup, before the default ALC is initialized - if (gchManagedAssemblyLoadContext == IntPtr.Zero) - context = AssemblyLoadContext.Default; - else - context = (AssemblyLoadContext)(GCHandle.FromIntPtr (gchManagedAssemblyLoadContext).Target)!; - return context; - } - - private static void MonoResolveUnmanagedDll (string unmanagedDllName, IntPtr gchManagedAssemblyLoadContext, ref IntPtr dll) - { - AssemblyLoadContext context = GetAssemblyLoadContext (gchManagedAssemblyLoadContext); - dll = context.LoadUnmanagedDll(unmanagedDllName); - } - - private static void MonoResolveUnmanagedDllUsingEvent (string unmanagedDllName, Assembly assembly, IntPtr gchManagedAssemblyLoadContext, ref IntPtr dll) - { - AssemblyLoadContext context = GetAssemblyLoadContext (gchManagedAssemblyLoadContext); - dll = context.GetResolvedUnmanagedDll(assembly, unmanagedDllName); - } - -#region Copied from AssemblyLoadContext.CoreCLR.cs, modified until our AssemblyBuilder implementation is functional - private static RuntimeAssembly? GetRuntimeAssembly(Assembly? asm) - { - return - asm == null ? null : - asm is RuntimeAssembly rtAssembly ? rtAssembly : - //asm is System.Reflection.Emit.AssemblyBuilder ab ? ab.InternalAssembly : - null; - } -#endregion - } + public partial class AssemblyLoadContext + { + internal IntPtr NativeALC + { + get + { + return _nativeAssemblyLoadContext; + } + } + + private static IntPtr InitializeAssemblyLoadContext(IntPtr thisHandlePtr, bool representsTPALoadContext, bool isCollectible) + { + return InternalInitializeNativeALC(thisHandlePtr, representsTPALoadContext, isCollectible); + } + + private static void PrepareForAssemblyLoadContextRelease(IntPtr nativeAssemblyLoadContext, IntPtr assemblyLoadContextStrong) + { + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + private Assembly InternalLoadFromPath(string assemblyPath, string nativeImagePath) + { + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + + assemblyPath = assemblyPath.Replace('\\', Path.DirectorySeparatorChar); + // TODO: Handle nativeImagePath + return InternalLoadFile(NativeALC, assemblyPath, ref stackMark); + } + + internal Assembly InternalLoad(byte[] arrAssembly, byte[] arrSymbols) + { + unsafe + { + int symbolsLength = arrSymbols?.Length ?? 0; + fixed (byte* ptrAssembly = arrAssembly, ptrSymbols = arrSymbols) + { + return InternalLoadFromStream(NativeALC, new IntPtr(ptrAssembly), arrAssembly.Length, + new IntPtr(ptrSymbols), symbolsLength); + } + } + } + + internal static Assembly[] GetLoadedAssemblies() + { + return InternalGetLoadedAssemblies(); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern IntPtr GetLoadContextForAssembly(RuntimeAssembly rtAsm); + + // Returns the load context in which the specified assembly has been loaded + public static AssemblyLoadContext? GetLoadContext(Assembly assembly) + { + if (assembly == null) + throw new ArgumentNullException(nameof(assembly)); + + AssemblyLoadContext? loadContextForAssembly = null; + + RuntimeAssembly? rtAsm = assembly as RuntimeAssembly; + + // We only support looking up load context for runtime assemblies. + if (rtAsm != null) + { + RuntimeAssembly runtimeAssembly = rtAsm; + IntPtr ptrAssemblyLoadContext = GetLoadContextForAssembly(runtimeAssembly); + loadContextForAssembly = GetAssemblyLoadContext(ptrAssemblyLoadContext); + } + + return loadContextForAssembly; + } + + public void SetProfileOptimizationRoot(string directoryPath) + { + } + + public void StartProfileOptimization(string profile) + { + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern Assembly InternalLoadFile(IntPtr nativeAssemblyLoadContext, string assemblyFile, ref StackCrawlMark stackMark); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern IntPtr InternalInitializeNativeALC(IntPtr thisHandlePtr, bool representsTPALoadContext, bool isCollectible); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern Assembly InternalLoadFromStream(IntPtr nativeAssemblyLoadContext, IntPtr assm, int assmLength, IntPtr symbols, int symbolsLength); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern Assembly[] InternalGetLoadedAssemblies(); + + internal static Assembly DoAssemblyResolve(string name) + { + return AssemblyResolve(null, new ResolveEventArgs(name)); + } + + // Invoked by Mono to resolve using the load method. + private static Assembly? MonoResolveUsingLoad(IntPtr gchALC, string assemblyName) + { + return Resolve(gchALC, new AssemblyName(assemblyName)); + } + + // Invoked by Mono to resolve using the Resolving event after + // trying the Load override and default load context without + // success. + private static Assembly? MonoResolveUsingResolvingEvent(IntPtr gchALC, string assemblyName) + { + return ResolveUsingResolvingEvent(gchALC, new AssemblyName(assemblyName)); + } + + // Invoked by Mono to resolve requests to load satellite assemblies. + private static Assembly? MonoResolveUsingResolveSatelliteAssembly(IntPtr gchALC, string assemblyName) + { + return ResolveSatelliteAssembly(gchALC, new AssemblyName(assemblyName)); + } + + private static AssemblyLoadContext GetAssemblyLoadContext(IntPtr gchManagedAssemblyLoadContext) + { + AssemblyLoadContext context; + // This check exists because the function can be called early in startup, before the default ALC is initialized + if (gchManagedAssemblyLoadContext == IntPtr.Zero) + context = Default; + else + context = (AssemblyLoadContext)(GCHandle.FromIntPtr(gchManagedAssemblyLoadContext).Target)!; + return context; + } + + private static void MonoResolveUnmanagedDll(string unmanagedDllName, IntPtr gchManagedAssemblyLoadContext, ref IntPtr dll) + { + AssemblyLoadContext context = GetAssemblyLoadContext(gchManagedAssemblyLoadContext); + dll = context.LoadUnmanagedDll(unmanagedDllName); + } + + private static void MonoResolveUnmanagedDllUsingEvent(string unmanagedDllName, Assembly assembly, IntPtr gchManagedAssemblyLoadContext, ref IntPtr dll) + { + AssemblyLoadContext context = GetAssemblyLoadContext(gchManagedAssemblyLoadContext); + dll = context.GetResolvedUnmanagedDll(assembly, unmanagedDllName); + } + + #region Copied from AssemblyLoadContext.CoreCLR.cs, modified until our AssemblyBuilder implementation is functional + private static RuntimeAssembly? GetRuntimeAssembly(Assembly? asm) + { + return + asm == null ? null : + asm is RuntimeAssembly rtAssembly ? rtAssembly : + //asm is System.Reflection.Emit.AssemblyBuilder ab ? ab.InternalAssembly : + null; + } + #endregion + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/Remoting/Contexts/Context.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/Remoting/Contexts/Context.cs index 33064066db8d0..9826d9228785e 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/Remoting/Contexts/Context.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Runtime/Remoting/Contexts/Context.cs @@ -5,40 +5,41 @@ using System.Runtime.InteropServices; using System.Runtime.CompilerServices; -namespace System.Runtime.Remoting.Contexts { +namespace System.Runtime.Remoting.Contexts +{ - [StructLayout (LayoutKind.Sequential)] - /* FIXME: Mono: this was public in mscorlib */ - internal class Context - { + [StructLayout(LayoutKind.Sequential)] + /* FIXME: Mono: this was public in mscorlib */ + internal class Context + { #pragma warning disable 169, 414 - #region Sync with domain-internals.h - int domain_id; - int context_id; - UIntPtr static_data; /* GC-tracked */ - UIntPtr data; - #endregion + #region Sync with domain-internals.h + private int domain_id; + private int context_id; + private UIntPtr static_data; /* GC-tracked */ + private UIntPtr data; + #endregion #pragma warning restore 169, 414 - [MethodImpl (MethodImplOptions.InternalCall)] - extern static void RegisterContext (Context ctx); + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern void RegisterContext(Context ctx); - [MethodImpl (MethodImplOptions.InternalCall)] - extern static void ReleaseContext (Context ctx); - - public Context () - { + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern void ReleaseContext(Context ctx); + + public Context() + { #if false domain_id = Thread.GetDomainID(); context_id = Interlocked.Increment (ref global_count); RegisterContext (this); #endif - } + } - ~Context () - { - ReleaseContext (this); - } - } + ~Context() + { + ReleaseContext(this); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeArgumentHandle.cs b/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeArgumentHandle.cs index 983606c90b27f..b5708519d8eba 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeArgumentHandle.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeArgumentHandle.cs @@ -5,8 +5,8 @@ namespace System { - public ref struct RuntimeArgumentHandle - { - internal IntPtr args; - } + public ref struct RuntimeArgumentHandle + { + internal IntPtr args; + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeFieldHandle.cs b/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeFieldHandle.cs index 46fff28b4ccf9..159ffbdec78b5 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeFieldHandle.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeFieldHandle.cs @@ -8,78 +8,80 @@ namespace System { - [Serializable] - public struct RuntimeFieldHandle : ISerializable - { - readonly IntPtr value; - - internal RuntimeFieldHandle (IntPtr v) - { - value = v; - } - - RuntimeFieldHandle (SerializationInfo info, StreamingContext context) - { - throw new PlatformNotSupportedException (); - } - - public void GetObjectData (SerializationInfo info, StreamingContext context) - { - throw new PlatformNotSupportedException (); - } - - public IntPtr Value { - get { - return value; - } - } - - internal bool IsNullHandle () - { - return value == IntPtr.Zero; - } - - public override bool Equals (object? obj) - { - if (obj == null || GetType () != obj.GetType ()) - return false; - - return value == ((RuntimeFieldHandle)obj).Value; - } - - public bool Equals (RuntimeFieldHandle handle) - { - return value == handle.Value; - } - - public override int GetHashCode () - { - return value.GetHashCode (); - } - - public static bool operator == (RuntimeFieldHandle left, RuntimeFieldHandle right) - { - return left.Equals (right); - } - - public static bool operator != (RuntimeFieldHandle left, RuntimeFieldHandle right) - { - return !left.Equals (right); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern void SetValueInternal (FieldInfo fi, object obj, object value); - - internal static void SetValue (RuntimeFieldInfo field, Object obj, Object value, RuntimeType fieldType, FieldAttributes fieldAttr, RuntimeType declaringType, ref bool domainInitialized) - { - SetValueInternal (field, obj, value); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static unsafe extern internal Object GetValueDirect (RuntimeFieldInfo field, RuntimeType fieldType, void *pTypedRef, RuntimeType contextType); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static unsafe extern internal void SetValueDirect (RuntimeFieldInfo field, RuntimeType fieldType, void* pTypedRef, Object value, RuntimeType contextType); - } + [Serializable] + public struct RuntimeFieldHandle : ISerializable + { + private readonly IntPtr value; + + internal RuntimeFieldHandle(IntPtr v) + { + value = v; + } + + private RuntimeFieldHandle(SerializationInfo info, StreamingContext context) + { + throw new PlatformNotSupportedException(); + } + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + throw new PlatformNotSupportedException(); + } + + public IntPtr Value + { + get + { + return value; + } + } + + internal bool IsNullHandle() + { + return value == IntPtr.Zero; + } + + public override bool Equals(object? obj) + { + if (obj == null || GetType() != obj.GetType()) + return false; + + return value == ((RuntimeFieldHandle)obj).Value; + } + + public bool Equals(RuntimeFieldHandle handle) + { + return value == handle.Value; + } + + public override int GetHashCode() + { + return value.GetHashCode(); + } + + public static bool operator ==(RuntimeFieldHandle left, RuntimeFieldHandle right) + { + return left.Equals(right); + } + + public static bool operator !=(RuntimeFieldHandle left, RuntimeFieldHandle right) + { + return !left.Equals(right); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void SetValueInternal(FieldInfo fi, object obj, object value); + + internal static void SetValue(RuntimeFieldInfo field, object obj, object value, RuntimeType fieldType, FieldAttributes fieldAttr, RuntimeType declaringType, ref bool domainInitialized) + { + SetValueInternal(field, obj, value); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static unsafe extern object GetValueDirect(RuntimeFieldInfo field, RuntimeType fieldType, void* pTypedRef, RuntimeType contextType); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static unsafe extern void SetValueDirect(RuntimeFieldInfo field, RuntimeType fieldType, void* pTypedRef, object value, RuntimeType contextType); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeMethodHandle.cs b/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeMethodHandle.cs index 2e48cb4c68657..c1119fcbcdc74 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeMethodHandle.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeMethodHandle.cs @@ -10,81 +10,82 @@ namespace System { - [Serializable] - public struct RuntimeMethodHandle : ISerializable - { - readonly IntPtr value; - - internal RuntimeMethodHandle (IntPtr v) - { - value = v; - } - - RuntimeMethodHandle (SerializationInfo info, StreamingContext context) - { - throw new PlatformNotSupportedException (); - } - - public IntPtr Value => value; - - public void GetObjectData (SerializationInfo info, StreamingContext context) - { - throw new PlatformNotSupportedException (); - } - - [MethodImpl (MethodImplOptions.InternalCall)] - static extern IntPtr GetFunctionPointer (IntPtr m); - - public IntPtr GetFunctionPointer () - { - return GetFunctionPointer (value); - } - - public override bool Equals (object? obj) - { - if (obj == null || GetType () != obj.GetType ()) - return false; - - return value == ((RuntimeMethodHandle)obj).Value; - } - - public bool Equals (RuntimeMethodHandle handle) - { - return value == handle.Value; - } - - public override int GetHashCode () - { - return value.GetHashCode (); - } - - public static bool operator == (RuntimeMethodHandle left, RuntimeMethodHandle right) - { - return left.Equals (right); - } - - public static bool operator != (RuntimeMethodHandle left, RuntimeMethodHandle right) - { - return !left.Equals (right); - } - - internal static string ConstructInstantiation (RuntimeMethodInfo method, TypeNameFormatFlags format) - { - var sb = new StringBuilder (); - var gen_params = method.GetGenericArguments (); - sb.Append ("["); - for (int j = 0; j < gen_params.Length; j++) { - if (j > 0) - sb.Append (","); - sb.Append (gen_params [j].Name); - } - sb.Append ("]"); - return sb.ToString (); - } - - internal bool IsNullHandle () - { - return value == IntPtr.Zero; - } - } + [Serializable] + public struct RuntimeMethodHandle : ISerializable + { + private readonly IntPtr value; + + internal RuntimeMethodHandle(IntPtr v) + { + value = v; + } + + private RuntimeMethodHandle(SerializationInfo info, StreamingContext context) + { + throw new PlatformNotSupportedException(); + } + + public IntPtr Value => value; + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + throw new PlatformNotSupportedException(); + } + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern IntPtr GetFunctionPointer(IntPtr m); + + public IntPtr GetFunctionPointer() + { + return GetFunctionPointer(value); + } + + public override bool Equals(object? obj) + { + if (obj == null || GetType() != obj.GetType()) + return false; + + return value == ((RuntimeMethodHandle)obj).Value; + } + + public bool Equals(RuntimeMethodHandle handle) + { + return value == handle.Value; + } + + public override int GetHashCode() + { + return value.GetHashCode(); + } + + public static bool operator ==(RuntimeMethodHandle left, RuntimeMethodHandle right) + { + return left.Equals(right); + } + + public static bool operator !=(RuntimeMethodHandle left, RuntimeMethodHandle right) + { + return !left.Equals(right); + } + + internal static string ConstructInstantiation(RuntimeMethodInfo method, TypeNameFormatFlags format) + { + var sb = new StringBuilder(); + var gen_params = method.GetGenericArguments(); + sb.Append("["); + for (int j = 0; j < gen_params.Length; j++) + { + if (j > 0) + sb.Append(","); + sb.Append(gen_params[j].Name); + } + sb.Append("]"); + return sb.ToString(); + } + + internal bool IsNullHandle() + { + return value == IntPtr.Zero; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeType.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeType.Mono.cs index ec008d25acf96..a7d1bd3fc23e8 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeType.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeType.Mono.cs @@ -6,29 +6,29 @@ using System.Globalization; using System.Threading; using System.Collections.Generic; -using System.Runtime.Serialization; +using System.Runtime.Serialization; using System.Runtime.CompilerServices; using System.Diagnostics.Contracts; using System.Runtime.InteropServices; using System.Diagnostics; -namespace System +namespace System { // Keep this in sync with FormatFlags defined in typestring.h internal enum TypeNameFormatFlags { - FormatBasic = 0x00000000, // Not a bitmask, simply the tersest flag settings possible - FormatNamespace = 0x00000001, // Include namespace and/or enclosing class names in type names - FormatFullInst = 0x00000002, // Include namespace and assembly in generic types (regardless of other flag settings) - FormatAssembly = 0x00000004, // Include assembly display name in type names - FormatSignature = 0x00000008, // Include signature in method names - FormatNoVersion = 0x00000010, // Suppress version and culture information in all assembly names + FormatBasic = 0x00000000, // Not a bitmask, simply the tersest flag settings possible + FormatNamespace = 0x00000001, // Include namespace and/or enclosing class names in type names + FormatFullInst = 0x00000002, // Include namespace and assembly in generic types (regardless of other flag settings) + FormatAssembly = 0x00000004, // Include assembly display name in type names + FormatSignature = 0x00000008, // Include signature in method names + FormatNoVersion = 0x00000010, // Suppress version and culture information in all assembly names #if _DEBUG FormatDebug = 0x00000020, // For debug printing of types only #endif FormatAngleBrackets = 0x00000040, // Whether generic types are C or C[T] - FormatStubInfo = 0x00000080, // Include stub info like {unbox-stub} - FormatGenericParam = 0x00000100, // Use !name and !!name for generic type and method parameters + FormatStubInfo = 0x00000080, // Include stub info like {unbox-stub} + FormatGenericParam = 0x00000100, // Use !name and !!name for generic type and method parameters // If we want to be able to distinguish between overloads whose parameter types have the same name but come from different assemblies, // we can add FormatAssembly | FormatNoVersion to FormatSerialization. But we are omitting it because it is not a useful scenario @@ -46,7 +46,7 @@ internal enum TypeNameKind FullName, } - partial class RuntimeType + internal partial class RuntimeType { #region Definitions @@ -61,10 +61,10 @@ internal enum MemberListType // Helper to build lists of MemberInfos. Special cased to avoid allocations for lists of one element. private struct ListBuilder where T : class { - T[] _items; - T _item; - int _count; - int _capacity; + private T[] _items; + private T _item; + private int _count; + private int _capacity; public ListBuilder(int capacity) { @@ -86,7 +86,7 @@ public T this[int index] public T[] ToArray() { if (_count == 0) - return Array.Empty (); + return Array.Empty(); if (_count == 1) return new T[1] { _item }; @@ -95,7 +95,7 @@ public T[] ToArray() return _items; } - public void CopyTo(Object[] array, int index) + public void CopyTo(object[] array, int index) { if (_count == 0) return; @@ -123,7 +123,7 @@ public void Add(T item) { _item = item; } - else + else { if (_count == 1) { @@ -152,35 +152,35 @@ public void Add(T item) #region Internal - internal static RuntimeType GetType(String typeName, bool throwOnError, bool ignoreCase, bool reflectionOnly, + internal static RuntimeType GetType(string typeName, bool throwOnError, bool ignoreCase, bool reflectionOnly, ref StackCrawlMark stackMark) { if (typeName == null) - throw new ArgumentNullException("typeName"); + throw new ArgumentNullException(nameof(typeName)); Contract.EndContractBlock(); return RuntimeTypeHandle.GetTypeByName( typeName, throwOnError, ignoreCase, reflectionOnly, ref stackMark, false); } - + private static void ThrowIfTypeNeverValidGenericArgument(RuntimeType type) { if (type.IsPointer || type.IsByRef || type == typeof(void)) throw new ArgumentException( Environment.GetResourceString("Argument_NeverValidGenericArgument", type.ToString())); } - + internal static void SanityCheckGenericArguments(RuntimeType[] genericArguments, RuntimeType[] genericParamters) { if (genericArguments == null) throw new ArgumentNullException(); Contract.EndContractBlock(); - for(int i = 0; i < genericArguments.Length; i++) - { + for (int i = 0; i < genericArguments.Length; i++) + { if (genericArguments[i] == null) throw new ArgumentNullException(); - + ThrowIfTypeNeverValidGenericArgument(genericArguments[i]); } @@ -199,7 +199,7 @@ private static void SplitName(string fullname, out string name, out string ns) // Get namespace int nsDelimiter = fullname.LastIndexOf(".", StringComparison.Ordinal); - if (nsDelimiter != -1 ) + if (nsDelimiter != -1) { ns = fullname.Substring(0, nsDelimiter); int nameLength = fullname.Length - ns.Length - 1; @@ -222,10 +222,10 @@ internal static BindingFlags FilterPreCalculate(bool isPublic, bool isInherited, { BindingFlags bindingFlags = isPublic ? BindingFlags.Public : BindingFlags.NonPublic; - if (isInherited) - { + if (isInherited) + { // We arrange things so the DeclaredOnly flag means "include inherited members" - bindingFlags |= BindingFlags.DeclaredOnly; + bindingFlags |= BindingFlags.DeclaredOnly; if (isStatic) { @@ -253,7 +253,7 @@ internal static BindingFlags FilterPreCalculate(bool isPublic, bool isInherited, // Calculate prefixLookup, ignoreCase, and listType for use by GetXXXCandidates private static void FilterHelper( - BindingFlags bindingFlags, ref string name, bool allowPrefixLookup, out bool prefixLookup, + BindingFlags bindingFlags, ref string name, bool allowPrefixLookup, out bool prefixLookup, out bool ignoreCase, out MemberListType listType) { prefixLookup = false; @@ -275,7 +275,7 @@ private static void FilterHelper( if (allowPrefixLookup && name.EndsWith("*", StringComparison.Ordinal)) { // We set prefixLookup to true if name ends with a "*". - // We will also set listType to All so that all members are included in + // We will also set listType to All so that all members are included in // the candidates which are later filtered by FilterApplyPrefixLookup. name = name.Substring(0, name.Length - 1); prefixLookup = true; @@ -310,7 +310,7 @@ private static bool FilterApplyPrefixLookup(MemberInfo memberInfo, string name, { if (!memberInfo.Name.StartsWith(name, StringComparison.Ordinal)) return false; - } + } return true; } @@ -339,7 +339,7 @@ private static bool FilterApplyBase( } #endregion - bool isInherited = !Object.ReferenceEquals(memberInfo.DeclaringType, memberInfo.ReflectedType); + bool isInherited = !ReferenceEquals(memberInfo.DeclaringType, memberInfo.ReflectedType); #region Filter by DeclaredOnly if ((bindingFlags & BindingFlags.DeclaredOnly) != 0 && isInherited) @@ -347,7 +347,7 @@ private static bool FilterApplyBase( #endregion #region Filter by Static & Instance - if (memberInfo.MemberType != MemberTypes.TypeInfo && + if (memberInfo.MemberType != MemberTypes.TypeInfo && memberInfo.MemberType != MemberTypes.NestedType) { if (isStatic) @@ -375,16 +375,16 @@ private static bool FilterApplyBase( #endregion #region Asymmetries - // @Asymmetry - Internal, inherited, instance, non-protected, non-virtual, non-abstract members returned + // @Asymmetry - Internal, inherited, instance, non-protected, non-virtual, non-abstract members returned // iff BindingFlags !DeclaredOnly, Instance and Public are present except for fields if (((bindingFlags & BindingFlags.DeclaredOnly) == 0) && // DeclaredOnly not present - isInherited && // Is inherited Member - + isInherited && // Is inherited Member + (isNonProtectedInternal) && // Is non-protected internal member - ((bindingFlags & BindingFlags.NonPublic) != 0) && // BindingFlag.NonPublic present + ((bindingFlags & BindingFlags.NonPublic) != 0) && // BindingFlag.NonPublic present (!isStatic) && // Is instance member - ((bindingFlags & BindingFlags.Instance) != 0)) // BindingFlag.Instance present + ((bindingFlags & BindingFlags.Instance) != 0)) // BindingFlag.Instance present { MethodInfo methodInfo = memberInfo as MethodInfo; @@ -445,11 +445,11 @@ private static bool FilterApplyMethodBase( #region Check CallingConvention if ((callConv & CallingConventions.Any) == 0) { - if ((callConv & CallingConventions.VarArgs) != 0 && + if ((callConv & CallingConventions.VarArgs) != 0 && (methodBase.CallingConvention & CallingConventions.VarArgs) == 0) return false; - if ((callConv & CallingConventions.Standard) != 0 && + if ((callConv & CallingConventions.Standard) != 0 && (methodBase.CallingConvention & CallingConventions.Standard) == 0) return false; } @@ -465,14 +465,14 @@ private static bool FilterApplyMethodBase( #region Invoke Member, Get\Set & Create Instance specific case // If the number of supplied arguments differs than the number in the signature AND // we are not filtering for a dynamic call -- InvokeMethod or CreateInstance -- filter out the method. - if ((bindingFlags & + if ((bindingFlags & (BindingFlags.InvokeMethod | BindingFlags.CreateInstance | BindingFlags.GetProperty | BindingFlags.SetProperty)) == 0) return false; - + bool testForParamArray = false; bool excessSuppliedArguments = argumentTypes.Length > parameterInfos.Length; - if (excessSuppliedArguments) + if (excessSuppliedArguments) { // more supplied arguments than parameters, additional arguments could be vararg #region Varargs // If method is not vararg, additional arguments can not be passed as vararg @@ -480,7 +480,7 @@ private static bool FilterApplyMethodBase( { testForParamArray = true; } - else + else { // If Binding flags did not include varargs we would have filtered this vararg method. // This Invariant established during callConv check. @@ -488,7 +488,7 @@ private static bool FilterApplyMethodBase( } #endregion } - else + else {// fewer supplied arguments than parameters, missing arguments could be optional #region OptionalParamBinding if ((bindingFlags & BindingFlags.OptionalParamBinding) == 0) @@ -497,8 +497,8 @@ private static bool FilterApplyMethodBase( } else { - // From our existing code, our policy here is that if a parameterInfo - // is optional then all subsequent parameterInfos shall be optional. + // From our existing code, our policy here is that if a parameterInfo + // is optional then all subsequent parameterInfos shall be optional. // Thus, iff the first parameterInfo is not optional then this MethodInfo is no longer a canidate. if (!parameterInfos[argumentTypes.Length].IsOptional) @@ -510,10 +510,10 @@ private static bool FilterApplyMethodBase( #region ParamArray if (testForParamArray) { - if (parameterInfos.Length == 0) + if (parameterInfos.Length == 0) return false; - // The last argument of the signature could be a param array. + // The last argument of the signature could be a param array. bool shortByMoreThanOneSuppliedArgument = argumentTypes.Length < parameterInfos.Length - 1; if (shortByMoreThanOneSuppliedArgument) @@ -539,11 +539,11 @@ private static bool FilterApplyMethodBase( // Legacy behavior is to ignore ExactBinding when InvokeMember is specified. // Why filter by InvokeMember? If the answer is we leave this to the binder then why not leave // all the rest of this to the binder too? Further, what other semanitc would the binder - // use for BindingFlags.ExactBinding besides this one? Further, why not include CreateInstance + // use for BindingFlags.ExactBinding besides this one? Further, why not include CreateInstance // in this if statement? That's just InvokeMethod with a constructor, right? if ((bindingFlags & (BindingFlags.InvokeMethod)) == 0) { - for(int i = 0; i < parameterInfos.Length; i ++) + for (int i = 0; i < parameterInfos.Length; i++) { // a null argument type implies a null arg which is always a perfect match if ((object)argumentTypes[i] != null && !argumentTypes[i].MatchesParameterTypeExactly(parameterInfos[i])) @@ -555,7 +555,7 @@ private static bool FilterApplyMethodBase( } } #endregion - + return true; } @@ -568,9 +568,8 @@ private static bool FilterApplyMethodBase( internal static readonly RuntimeType ValueType = (RuntimeType)typeof(System.ValueType); internal static readonly RuntimeType EnumType = (RuntimeType)typeof(System.Enum); - private static readonly RuntimeType ObjectType = (RuntimeType)typeof(System.Object); - private static readonly RuntimeType StringType = (RuntimeType)typeof(System.String); - private static readonly RuntimeType DelegateType = (RuntimeType)typeof(System.Delegate); + private static readonly RuntimeType ObjectType = (RuntimeType)typeof(object); + private static readonly RuntimeType StringType = (RuntimeType)typeof(string); #endregion @@ -582,29 +581,30 @@ private static bool FilterApplyMethodBase( #region Get XXXInfo Candidates private ListBuilder GetMethodCandidates( - String name, BindingFlags bindingAttr, CallingConventions callConv, + string name, BindingFlags bindingAttr, CallingConventions callConv, Type[] types, int genericParamCount, bool allowPrefixLookup) { bool prefixLookup, ignoreCase; MemberListType listType; FilterHelper(bindingAttr, ref name, allowPrefixLookup, out prefixLookup, out ignoreCase, out listType); - RuntimeMethodInfo[] cache = GetMethodsByName (name, bindingAttr, listType, this); + RuntimeMethodInfo[] cache = GetMethodsByName(name, bindingAttr, listType, this); ListBuilder candidates = new ListBuilder(cache.Length); for (int i = 0; i < cache.Length; i++) { RuntimeMethodInfo methodInfo = cache[i]; - if (genericParamCount != -1) { - bool is_generic = methodInfo.IsGenericMethod; - if (genericParamCount == 0 && is_generic) - continue; - else if (genericParamCount > 0 && !is_generic) - continue; - var args = methodInfo.GetGenericArguments (); - if (args.Length != genericParamCount) - continue; - } + if (genericParamCount != -1) + { + bool is_generic = methodInfo.IsGenericMethod; + if (genericParamCount == 0 && is_generic) + continue; + else if (genericParamCount > 0 && !is_generic) + continue; + var args = methodInfo.GetGenericArguments(); + if (args.Length != genericParamCount) + continue; + } if (FilterApplyMethodInfo(methodInfo, bindingAttr, callConv, types) && (!prefixLookup || FilterApplyPrefixLookup(methodInfo, name, ignoreCase))) { @@ -616,23 +616,23 @@ private ListBuilder GetMethodCandidates( } private ListBuilder GetConstructorCandidates( - string name, BindingFlags bindingAttr, CallingConventions callConv, + string name, BindingFlags bindingAttr, CallingConventions callConv, Type[] types, bool allowPrefixLookup) { bool prefixLookup, ignoreCase; MemberListType listType; FilterHelper(bindingAttr, ref name, allowPrefixLookup, out prefixLookup, out ignoreCase, out listType); - if (!string.IsNullOrEmpty (name) && name != ConstructorInfo.ConstructorName && name != ConstructorInfo.TypeConstructorName) - return new ListBuilder (0); - RuntimeConstructorInfo[] cache = GetConstructors_internal (bindingAttr, this); + if (!string.IsNullOrEmpty(name) && name != ConstructorInfo.ConstructorName && name != ConstructorInfo.TypeConstructorName) + return new ListBuilder(0); + RuntimeConstructorInfo[] cache = GetConstructors_internal(bindingAttr, this); ListBuilder candidates = new ListBuilder(cache.Length); for (int i = 0; i < cache.Length; i++) { RuntimeConstructorInfo constructorInfo = cache[i]; if (FilterApplyConstructorInfo(constructorInfo, bindingAttr, callConv, types) && (!prefixLookup || FilterApplyPrefixLookup(constructorInfo, name, ignoreCase))) - { + { candidates.Add(constructorInfo); } } @@ -642,13 +642,13 @@ private ListBuilder GetConstructorCandidates( private ListBuilder GetPropertyCandidates( - String name, BindingFlags bindingAttr, Type[] types, bool allowPrefixLookup) - { + string name, BindingFlags bindingAttr, Type[] types, bool allowPrefixLookup) + { bool prefixLookup, ignoreCase; MemberListType listType; FilterHelper(bindingAttr, ref name, allowPrefixLookup, out prefixLookup, out ignoreCase, out listType); - RuntimePropertyInfo[] cache = GetPropertiesByName (name, bindingAttr, listType, this); + RuntimePropertyInfo[] cache = GetPropertiesByName(name, bindingAttr, listType, this); bindingAttr ^= BindingFlags.DeclaredOnly; ListBuilder candidates = new ListBuilder(cache.Length); @@ -666,13 +666,13 @@ private ListBuilder GetPropertyCandidates( return candidates; } - private ListBuilder GetEventCandidates(String name, BindingFlags bindingAttr, bool allowPrefixLookup) + private ListBuilder GetEventCandidates(string name, BindingFlags bindingAttr, bool allowPrefixLookup) { bool prefixLookup, ignoreCase; MemberListType listType; FilterHelper(bindingAttr, ref name, allowPrefixLookup, out prefixLookup, out ignoreCase, out listType); - RuntimeEventInfo[] cache = GetEvents_internal (name, bindingAttr, listType, this); + RuntimeEventInfo[] cache = GetEvents_internal(name, bindingAttr, listType, this); bindingAttr ^= BindingFlags.DeclaredOnly; ListBuilder candidates = new ListBuilder(cache.Length); @@ -689,20 +689,20 @@ private ListBuilder GetEventCandidates(String name, BindingFlags bind return candidates; } - private ListBuilder GetFieldCandidates(String name, BindingFlags bindingAttr, bool allowPrefixLookup) + private ListBuilder GetFieldCandidates(string name, BindingFlags bindingAttr, bool allowPrefixLookup) { bool prefixLookup, ignoreCase; MemberListType listType; FilterHelper(bindingAttr, ref name, allowPrefixLookup, out prefixLookup, out ignoreCase, out listType); - RuntimeFieldInfo[] cache = GetFields_internal (name, bindingAttr, listType, this); + RuntimeFieldInfo[] cache = GetFields_internal(name, bindingAttr, listType, this); bindingAttr ^= BindingFlags.DeclaredOnly; ListBuilder candidates = new ListBuilder(cache.Length); for (int i = 0; i < cache.Length; i++) { RuntimeFieldInfo fieldInfo = cache[i]; - if ((bindingAttr & fieldInfo.BindingFlags) == fieldInfo.BindingFlags && + if ((bindingAttr & fieldInfo.BindingFlags) == fieldInfo.BindingFlags && (!prefixLookup || FilterApplyPrefixLookup(fieldInfo, name, ignoreCase))) { candidates.Add(fieldInfo); @@ -712,16 +712,16 @@ private ListBuilder GetFieldCandidates(String name, BindingFlags bind return candidates; } - private ListBuilder GetNestedTypeCandidates(String fullname, BindingFlags bindingAttr, bool allowPrefixLookup) + private ListBuilder GetNestedTypeCandidates(string fullname, BindingFlags bindingAttr, bool allowPrefixLookup) { bool prefixLookup, ignoreCase; bindingAttr &= ~BindingFlags.Static; string name, ns; MemberListType listType; - SplitName(fullname, out name, out ns); + SplitName(fullname, out name, out ns); FilterHelper(bindingAttr, ref name, allowPrefixLookup, out prefixLookup, out ignoreCase, out listType); - RuntimeType[] cache = GetNestedTypes_internal (name, bindingAttr, listType); + RuntimeType[] cache = GetNestedTypes_internal(name, bindingAttr, listType); ListBuilder candidates = new ListBuilder(cache.Length); for (int i = 0; i < cache.Length; i++) { @@ -802,19 +802,19 @@ public override MemberInfo[] GetMembers(BindingFlags bindingAttr) #endregion protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, Type[]? types, ParameterModifier[]? modifiers) - { - return GetMethodImpl (name, -1, bindingAttr, binder, callConvention, types, modifiers); - } - - protected override MethodInfo GetMethodImpl(String name, int genericParamCount, - BindingFlags bindingAttr, Binder? binder, CallingConventions callConv, - Type[]? types, ParameterModifier[]? modifiers) - { + { + return GetMethodImpl(name, -1, bindingAttr, binder, callConvention, types, modifiers); + } + + protected override MethodInfo GetMethodImpl(string name, int genericParamCount, + BindingFlags bindingAttr, Binder? binder, CallingConventions callConv, + Type[]? types, ParameterModifier[]? modifiers) + { ListBuilder candidates = GetMethodCandidates(name, bindingAttr, callConv, types, genericParamCount, false); - if (candidates.Count == 0) + if (candidates.Count == 0) return null; - if (types == null || types.Length == 0) + if (types == null || types.Length == 0) { MethodInfo firstCandidate = candidates[0]; @@ -822,41 +822,41 @@ protected override MethodInfo GetMethodImpl(String name, int genericParamCount, { return firstCandidate; } - else if (types == null) - { + else if (types == null) + { for (int j = 1; j < candidates.Count; j++) { MethodInfo methodInfo = candidates[j]; - if (!System.DefaultBinder.CompareMethodSig (methodInfo, firstCandidate)) + if (!System.DefaultBinder.CompareMethodSig(methodInfo, firstCandidate)) throw new AmbiguousMatchException(Environment.GetResourceString("Arg_AmbiguousMatchException")); } // All the methods have the exact same name and sig so return the most derived one. return System.DefaultBinder.FindMostDerivedNewSlotMeth(candidates.ToArray(), candidates.Count) as MethodInfo; } - } + } - if (binder == null) + if (binder == null) binder = DefaultBinder; - return binder.SelectMethod(bindingAttr, candidates.ToArray(), types, modifiers) as MethodInfo; + return binder.SelectMethod(bindingAttr, candidates.ToArray(), types, modifiers) as MethodInfo; } protected override ConstructorInfo GetConstructorImpl( - BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, + BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, Type[] types, ParameterModifier[]? modifiers) { ListBuilder candidates = GetConstructorCandidates(null, bindingAttr, CallingConventions.Any, types, false); if (candidates.Count == 0) return null; - - if (types.Length == 0 && candidates.Count == 1) + + if (types.Length == 0 && candidates.Count == 1) { ConstructorInfo firstCandidate = candidates[0]; ParameterInfo[] parameters = firstCandidate.GetParametersNoCopy(); - if (parameters == null || parameters.Length == 0) + if (parameters == null || parameters.Length == 0) { return firstCandidate; } @@ -873,7 +873,7 @@ protected override ConstructorInfo GetConstructorImpl( protected override PropertyInfo GetPropertyImpl( - String name, BindingFlags bindingAttr, Binder? binder, Type? returnType, Type[]? types, ParameterModifier[]? modifiers) + string name, BindingFlags bindingAttr, Binder? binder, Type? returnType, Type[]? types, ParameterModifier[]? modifiers) { if (name == null) throw new ArgumentNullException(); Contract.EndContractBlock(); @@ -882,11 +882,11 @@ protected override PropertyInfo GetPropertyImpl( if (candidates.Count == 0) return null; - - if (types == null || types.Length == 0) + + if (types == null || types.Length == 0) { // no arguments - if (candidates.Count == 1) + if (candidates.Count == 1) { PropertyInfo firstCandidate = candidates[0]; @@ -895,24 +895,24 @@ protected override PropertyInfo GetPropertyImpl( return firstCandidate; } - else + else { if ((object)returnType == null) // if we are here we have no args or property type to select over and we have more than one property with that name throw new AmbiguousMatchException(Environment.GetResourceString("Arg_AmbiguousMatchException")); } } - + if ((bindingAttr & BindingFlags.ExactBinding) != 0) return System.DefaultBinder.ExactPropertyBinding(candidates.ToArray(), returnType, types, modifiers); if (binder == null) binder = DefaultBinder; - + return binder.SelectProperty(bindingAttr, candidates.ToArray(), returnType, types, modifiers); } - public override EventInfo GetEvent(String name, BindingFlags bindingAttr) + public override EventInfo GetEvent(string name, BindingFlags bindingAttr) { if (name == null) throw new ArgumentNullException(); Contract.EndContractBlock(); @@ -921,7 +921,7 @@ public override EventInfo GetEvent(String name, BindingFlags bindingAttr) MemberListType listType; FilterHelper(bindingAttr, ref name, out ignoreCase, out listType); - RuntimeEventInfo[] cache = GetEvents_internal (name, bindingAttr, listType, this); + RuntimeEventInfo[] cache = GetEvents_internal(name, bindingAttr, listType, this); EventInfo match = null; bindingAttr ^= BindingFlags.DeclaredOnly; @@ -941,7 +941,7 @@ public override EventInfo GetEvent(String name, BindingFlags bindingAttr) return match; } - public override FieldInfo GetField(String name, BindingFlags bindingAttr) + public override FieldInfo GetField(string name, BindingFlags bindingAttr) { if (name == null) throw new ArgumentNullException(); Contract.EndContractBlock(); @@ -950,7 +950,7 @@ public override FieldInfo GetField(String name, BindingFlags bindingAttr) MemberListType listType; FilterHelper(bindingAttr, ref name, out ignoreCase, out listType); - RuntimeFieldInfo[] cache = GetFields_internal (name, bindingAttr, listType, this); + RuntimeFieldInfo[] cache = GetFields_internal(name, bindingAttr, listType, this); FieldInfo match = null; bindingAttr ^= BindingFlags.DeclaredOnly; @@ -963,13 +963,13 @@ public override FieldInfo GetField(String name, BindingFlags bindingAttr) { if (match != null) { - if (Object.ReferenceEquals(fieldInfo.DeclaringType, match.DeclaringType)) + if (ReferenceEquals(fieldInfo.DeclaringType, match.DeclaringType)) throw new AmbiguousMatchException(Environment.GetResourceString("Arg_AmbiguousMatchException")); if ((match.DeclaringType.IsInterface == true) && (fieldInfo.DeclaringType.IsInterface == true)) multipleStaticFieldMatches = true; } - + if (match == null || fieldInfo.DeclaringType.IsSubclassOf(match.DeclaringType) || match.DeclaringType.IsInterface) match = fieldInfo; } @@ -981,13 +981,13 @@ public override FieldInfo GetField(String name, BindingFlags bindingAttr) return match; } - public override Type GetInterface(String fullname, bool ignoreCase) + public override Type GetInterface(string fullname, bool ignoreCase) { if (fullname == null) throw new ArgumentNullException(); Contract.EndContractBlock(); BindingFlags bindingAttr = BindingFlags.Public | BindingFlags.NonPublic; - + bindingAttr &= ~BindingFlags.Static; if (ignoreCase) @@ -995,27 +995,29 @@ public override Type GetInterface(String fullname, bool ignoreCase) string name, ns; MemberListType listType; - SplitName(fullname, out name, out ns); + SplitName(fullname, out name, out ns); FilterHelper(bindingAttr, ref name, out ignoreCase, out listType); List list = null; var nameComparison = ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; - foreach (RuntimeType t in GetInterfaces ()) { + foreach (RuntimeType t in GetInterfaces()) + { - if (!String.Equals(t.Name, name, nameComparison)) { - continue; + if (!string.Equals(t.Name, name, nameComparison)) + { + continue; } if (list == null) - list = new List (2); + list = new List(2); - list.Add (t); + list.Add(t); } if (list == null) return null; - var cache = list.ToArray (); + var cache = list.ToArray(); RuntimeType match = null; for (int i = 0; i < cache.Length; i++) @@ -1033,7 +1035,7 @@ public override Type GetInterface(String fullname, bool ignoreCase) return match; } - public override Type GetNestedType(String fullname, BindingFlags bindingAttr) + public override Type GetNestedType(string fullname, BindingFlags bindingAttr) { if (fullname == null) throw new ArgumentNullException(); Contract.EndContractBlock(); @@ -1042,9 +1044,9 @@ public override Type GetNestedType(String fullname, BindingFlags bindingAttr) bindingAttr &= ~BindingFlags.Static; string name, ns; MemberListType listType; - SplitName(fullname, out name, out ns); + SplitName(fullname, out name, out ns); FilterHelper(bindingAttr, ref name, out ignoreCase, out listType); - RuntimeType[] cache = GetNestedTypes_internal (name, bindingAttr, listType); + RuntimeType[] cache = GetNestedTypes_internal(name, bindingAttr, listType); RuntimeType match = null; for (int i = 0; i < cache.Length; i++) @@ -1062,17 +1064,17 @@ public override Type GetNestedType(String fullname, BindingFlags bindingAttr) return match; } - public override MemberInfo[] GetMember(String name, MemberTypes type, BindingFlags bindingAttr) + public override MemberInfo[] GetMember(string name, MemberTypes type, BindingFlags bindingAttr) { if (name == null) throw new ArgumentNullException(); Contract.EndContractBlock(); - ListBuilder methods = new ListBuilder(); - ListBuilder constructors = new ListBuilder(); - ListBuilder properties = new ListBuilder(); - ListBuilder events = new ListBuilder(); - ListBuilder fields = new ListBuilder(); - ListBuilder nestedTypes = new ListBuilder(); + ListBuilder methods = default; + ListBuilder constructors = default; + ListBuilder properties = default; + ListBuilder events = default; + ListBuilder fields = default; + ListBuilder nestedTypes = default; int totalCount = 0; @@ -1183,7 +1185,7 @@ public override GenericParameterAttributes GenericParameterAttributes throw new InvalidOperationException(Environment.GetResourceString("Arg_NotGenericParameter")); Contract.EndContractBlock(); - return GetGenericParameterAttributes (); + return GetGenericParameterAttributes(); } } @@ -1193,15 +1195,15 @@ public override GenericParameterAttributes GenericParameterAttributes internal RuntimeType[] GetGenericArgumentsInternal() { - return (RuntimeType[]) GetGenericArgumentsInternal (true); + return (RuntimeType[])GetGenericArgumentsInternal(true); } - public override Type[] GetGenericArguments() + public override Type[] GetGenericArguments() { - Type[] types = GetGenericArgumentsInternal (false); + Type[] types = GetGenericArgumentsInternal(false); if (types == null) - types = Array.Empty (); + types = Array.Empty(); return types; } @@ -1209,7 +1211,7 @@ public override Type[] GetGenericArguments() public override Type MakeGenericType(Type[] instantiation) { if (instantiation == null) - throw new ArgumentNullException("instantiation"); + throw new ArgumentNullException(nameof(instantiation)); Contract.EndContractBlock(); RuntimeType[] instantiationRuntimeType = new RuntimeType[instantiation.Length]; @@ -1219,9 +1221,9 @@ public override Type MakeGenericType(Type[] instantiation) Environment.GetResourceString("Arg_NotGenericTypeDefinition", this)); if (GetGenericArguments().Length != instantiation.Length) - throw new ArgumentException(Environment.GetResourceString("Argument_GenericArgsCount"), "instantiation"); + throw new ArgumentException(Environment.GetResourceString("Argument_GenericArgsCount"), nameof(instantiation)); - for (int i = 0; i < instantiation.Length; i ++) + for (int i = 0; i < instantiation.Length; i++) { Type instantiationElem = instantiation[i]; if (instantiationElem == null) @@ -1232,13 +1234,13 @@ public override Type MakeGenericType(Type[] instantiation) if (rtInstantiationElem == null) { if (instantiationElem.IsSignatureType) - return MakeGenericSignatureType (this, instantiation); + return MakeGenericSignatureType(this, instantiation); Type[] instantiationCopy = new Type[instantiation.Length]; for (int iCopy = 0; iCopy < instantiation.Length; iCopy++) instantiationCopy[iCopy] = instantiation[iCopy]; instantiation = instantiationCopy; - - throw new NotImplementedException (); + + throw new NotImplementedException(); } instantiationRuntimeType[i] = rtInstantiationElem; @@ -1249,61 +1251,54 @@ public override Type MakeGenericType(Type[] instantiation) SanityCheckGenericArguments(instantiationRuntimeType, genericParameters); Type ret = null; - ret = MakeGenericType (this, instantiationRuntimeType); + ret = MakeGenericType(this, instantiationRuntimeType); if (ret == null) - throw new TypeLoadException (); + throw new TypeLoadException(); return ret; } public override int GenericParameterPosition { - get + get { if (!IsGenericParameter) throw new InvalidOperationException(Environment.GetResourceString("Arg_NotGenericParameter")); Contract.EndContractBlock(); - return GetGenericParameterPosition (); + return GetGenericParameterPosition(); } } #endregion #region Invoke Member - private const BindingFlags MemberBindingMask = (BindingFlags)0x000000FF; - private const BindingFlags InvocationMask = (BindingFlags)0x0000FF00; - private const BindingFlags BinderNonCreateInstance = BindingFlags.InvokeMethod | BinderGetSetField | BinderGetSetProperty; - private const BindingFlags BinderGetSetProperty = BindingFlags.GetProperty | BindingFlags.SetProperty; - private const BindingFlags BinderSetInvokeProperty = BindingFlags.InvokeMethod | BindingFlags.SetProperty; - private const BindingFlags BinderGetSetField = BindingFlags.GetField | BindingFlags.SetField; - private const BindingFlags BinderSetInvokeField = BindingFlags.SetField | BindingFlags.InvokeMethod; - private const BindingFlags BinderNonFieldGetSet = (BindingFlags)0x00FFF300; - private const BindingFlags ClassicBindingMask = - BindingFlags.InvokeMethod | BindingFlags.GetProperty | BindingFlags.SetProperty | - BindingFlags.PutDispProperty | BindingFlags.PutRefDispProperty; - private static RuntimeType s_typedRef = (RuntimeType)typeof(TypedReference); - - + private const BindingFlags MemberBindingMask = (BindingFlags)0x000000FF; + private const BindingFlags InvocationMask = (BindingFlags)0x0000FF00; + private const BindingFlags BinderNonCreateInstance = BindingFlags.InvokeMethod | BinderGetSetField | BinderGetSetProperty; + private const BindingFlags BinderGetSetProperty = BindingFlags.GetProperty | BindingFlags.SetProperty; + private const BindingFlags BinderGetSetField = BindingFlags.GetField | BindingFlags.SetField; + private const BindingFlags BinderNonFieldGetSet = (BindingFlags)0x00FFF300; + [DebuggerStepThroughAttribute] [Diagnostics.DebuggerHidden] - public override Object InvokeMember( - String name, BindingFlags bindingFlags, Binder? binder, Object? target, - Object?[]? providedArgs, ParameterModifier[]? modifiers, CultureInfo? culture, String[]? namedParams) + public override object InvokeMember( + string name, BindingFlags bindingFlags, Binder? binder, object? target, + object?[]? providedArgs, ParameterModifier[]? modifiers, CultureInfo? culture, string[]? namedParams) { if (IsGenericParameter) throw new InvalidOperationException(Environment.GetResourceString("Arg_GenericParameter")); Contract.EndContractBlock(); - + #region Preconditions if ((bindingFlags & InvocationMask) == 0) // "Must specify binding flags describing the invoke operation required." - throw new ArgumentException(Environment.GetResourceString("Arg_NoAccessSpec"),"bindingFlags"); + throw new ArgumentException(Environment.GetResourceString("Arg_NoAccessSpec"), nameof(bindingFlags)); - // Provide a default binding mask if none is provided - if ((bindingFlags & MemberBindingMask) == 0) + // Provide a default binding mask if none is provided + if ((bindingFlags & MemberBindingMask) == 0) { bindingFlags |= BindingFlags.Instance | BindingFlags.Public; - if ((bindingFlags & BindingFlags.CreateInstance) == 0) + if ((bindingFlags & BindingFlags.CreateInstance) == 0) bindingFlags |= BindingFlags.Static; } @@ -1314,13 +1309,13 @@ public override Object InvokeMember( { if (namedParams.Length > providedArgs.Length) // "Named parameter array can not be bigger than argument array." - throw new ArgumentException(Environment.GetResourceString("Arg_NamedParamTooBig"), "namedParams"); + throw new ArgumentException(Environment.GetResourceString("Arg_NamedParamTooBig"), nameof(namedParams)); } else { if (namedParams.Length != 0) // "Named parameter array can not be bigger than argument array." - throw new ArgumentException(Environment.GetResourceString("Arg_NamedParamTooBig"), "namedParams"); + throw new ArgumentException(Environment.GetResourceString("Arg_NamedParamTooBig"), nameof(namedParams)); } } #endregion @@ -1328,23 +1323,23 @@ public override Object InvokeMember( #region Check that any named paramters are not null if (namedParams != null && Array.IndexOf(namedParams, null) != -1) // "Named parameter value must not be null." - throw new ArgumentException(Environment.GetResourceString("Arg_NamedParamNull"),"namedParams"); + throw new ArgumentException(Environment.GetResourceString("Arg_NamedParamNull"), nameof(namedParams)); #endregion int argCnt = (providedArgs != null) ? providedArgs.Length : 0; - + #region Get a Binder if (binder == null) binder = DefaultBinder; #endregion - + #region Delegate to Activator.CreateInstance - if ((bindingFlags & BindingFlags.CreateInstance) != 0) + if ((bindingFlags & BindingFlags.CreateInstance) != 0) { if ((bindingFlags & BindingFlags.CreateInstance) != 0 && (bindingFlags & BinderNonCreateInstance) != 0) // "Can not specify both CreateInstance and another access type." - throw new ArgumentException(Environment.GetResourceString("Arg_CreatInstAccess"),"bindingFlags"); + throw new ArgumentException(Environment.GetResourceString("Arg_CreatInstAccess"), nameof(bindingFlags)); return Activator.CreateInstance(this, bindingFlags, binder, providedArgs, culture); } @@ -1356,13 +1351,13 @@ public override Object InvokeMember( #region Name if (name == null) - throw new ArgumentNullException("name"); - - if (name.Length == 0 || name.Equals(@"[DISPID=0]")) + throw new ArgumentNullException(nameof(name)); + + if (name.Length == 0 || name.Equals(@"[DISPID=0]")) { name = GetDefaultMemberName(); - if (name == null) + if (name == null) { // in InvokeMember we always pretend there is a default member if none is provided and we make it ToString name = "ToString"; @@ -1381,31 +1376,31 @@ public override Object InvokeMember( { if (IsSetField) // "Can not specify both Get and Set on a field." - throw new ArgumentException(Environment.GetResourceString("Arg_FldSetGet"),"bindingFlags"); + throw new ArgumentException(Environment.GetResourceString("Arg_FldSetGet"), nameof(bindingFlags)); if ((bindingFlags & BindingFlags.SetProperty) != 0) // "Can not specify both GetField and SetProperty." - throw new ArgumentException(Environment.GetResourceString("Arg_FldGetPropSet"),"bindingFlags"); + throw new ArgumentException(Environment.GetResourceString("Arg_FldGetPropSet"), nameof(bindingFlags)); } else { Contract.Assert(IsSetField); - if (providedArgs == null) - throw new ArgumentNullException("providedArgs"); + if (providedArgs == null) + throw new ArgumentNullException(nameof(providedArgs)); if ((bindingFlags & BindingFlags.GetProperty) != 0) // "Can not specify both SetField and GetProperty." - throw new ArgumentException(Environment.GetResourceString("Arg_FldSetPropGet"),"bindingFlags"); + throw new ArgumentException(Environment.GetResourceString("Arg_FldSetPropGet"), nameof(bindingFlags)); if ((bindingFlags & BindingFlags.InvokeMethod) != 0) // "Can not specify Set on a Field and Invoke on a method." - throw new ArgumentException(Environment.GetResourceString("Arg_FldSetInvoke"),"bindingFlags"); + throw new ArgumentException(Environment.GetResourceString("Arg_FldSetInvoke"), nameof(bindingFlags)); } #endregion - + #region Lookup Field - FieldInfo selFld = null; + FieldInfo selFld = null; FieldInfo[] flds = GetMember(name, MemberTypes.Field, bindingFlags) as FieldInfo[]; Contract.Assert(flds != null); @@ -1419,31 +1414,31 @@ public override Object InvokeMember( selFld = binder.BindToField(bindingFlags, flds, IsGetField ? Empty.Value : providedArgs[0], culture); } #endregion - - if (selFld != null) + + if (selFld != null) { #region Invocation on a field - if (selFld.FieldType.IsArray || Object.ReferenceEquals(selFld.FieldType, typeof(System.Array))) + if (selFld.FieldType.IsArray || ReferenceEquals(selFld.FieldType, typeof(System.Array))) { #region Invocation of an array Field int idxCnt; - if ((bindingFlags & BindingFlags.GetField) != 0) + if ((bindingFlags & BindingFlags.GetField) != 0) { - idxCnt = argCnt; + idxCnt = argCnt; } else { idxCnt = argCnt - 1; } - if (idxCnt > 0) + if (idxCnt > 0) { // Verify that all of the index values are ints int[] idx = new int[idxCnt]; - for (int i=0;i results = null; - - for(int i = 0; i < semiFinalists.Length; i ++) + + for (int i = 0; i < semiFinalists.Length; i++) { MethodInfo semiFinalist = semiFinalists[i]; Contract.Assert(semiFinalist != null); if (!FilterApplyMethodInfo((RuntimeMethodInfo)semiFinalist, bindingFlags, CallingConventions.Any, new Type[argCnt])) continue; - + if (finalist == null) { finalist = semiFinalist; @@ -1582,7 +1577,7 @@ public override Object InvokeMember( results.Add(semiFinalist); } } - + if (results != null) { Contract.Assert(results.Count > 1); @@ -1592,17 +1587,17 @@ public override Object InvokeMember( #endregion } #endregion - + Contract.Assert(finalists == null || finalist != null); #region BindingFlags.GetProperty or BindingFlags.SetProperty - if (finalist == null && isGetProperty || isSetProperty) + if (finalist == null && isGetProperty || isSetProperty) { #region Lookup Property - PropertyInfo[] semiFinalists = GetMember(name, MemberTypes.Property, bindingFlags) as PropertyInfo[]; + PropertyInfo[] semiFinalists = GetMember(name, MemberTypes.Property, bindingFlags) as PropertyInfo[]; List results = null; - for(int i = 0; i < semiFinalists.Length; i ++) + for (int i = 0; i < semiFinalists.Length; i++) { MethodInfo semiFinalist = null; @@ -1620,7 +1615,7 @@ public override Object InvokeMember( if (!FilterApplyMethodInfo((RuntimeMethodInfo)semiFinalist, bindingFlags, CallingConventions.Any, new Type[argCnt])) continue; - + if (finalist == null) { finalist = semiFinalist; @@ -1643,16 +1638,16 @@ public override Object InvokeMember( finalists = new MethodInfo[results.Count]; results.CopyTo(finalists); } - #endregion + #endregion } #endregion - if (finalist != null) + if (finalist != null) { #region Invoke - if (finalists == null && - argCnt == 0 && - finalist.GetParametersNoCopy().Length == 0 && + if (finalists == null && + argCnt == 0 && + finalist.GetParametersNoCopy().Length == 0 && (bindingFlags & BindingFlags.OptionalParamBinding) == 0) { //if (useCache && argCnt == props[0].GetParameters().Length) @@ -1660,20 +1655,20 @@ public override Object InvokeMember( return finalist.Invoke(target, bindingFlags, binder, providedArgs, culture); } - + if (finalists == null) finalists = new MethodInfo[] { finalist }; if (providedArgs == null) - providedArgs = Array.Empty(); + providedArgs = Array.Empty(); + + object state = null; - Object state = null; - MethodBase invokeMethod = null; try { invokeMethod = binder.BindToMethod(bindingFlags, finalists, ref providedArgs, modifiers, culture, namedParams, out state); } - catch(MissingMethodException) { } + catch (MissingMethodException) { } if (invokeMethod == null) throw new MissingMethodException(FullName, name); @@ -1681,7 +1676,7 @@ public override Object InvokeMember( //if (useCache && argCnt == invokeMethod.GetParameters().Length) // AddMethodToCache(name, bindingFlags, argCnt, providedArgs, invokeMethod); - Object result = ((MethodInfo)invokeMethod).Invoke(target, bindingFlags, binder, providedArgs, culture); + object result = ((MethodInfo)invokeMethod).Invoke(target, bindingFlags, binder, providedArgs, culture); if (state != null) binder.ReorderArgumentArray(ref providedArgs, state); @@ -1689,19 +1684,19 @@ public override Object InvokeMember( return result; #endregion } - + throw new MissingMethodException(FullName, name); - } + } #endregion public static bool operator ==(RuntimeType left, RuntimeType right) { - return object.ReferenceEquals(left, right); + return ReferenceEquals(left, right); } public static bool operator !=(RuntimeType left, RuntimeType right) { - return !object.ReferenceEquals(left, right); + return !ReferenceEquals(left, right); } #region Legacy Internal @@ -1714,26 +1709,26 @@ private void CreateInstanceCheckThis() Type elementType = this.GetRootElementType(); - if (Object.ReferenceEquals(elementType, typeof(ArgIterator))) + if (ReferenceEquals(elementType, typeof(ArgIterator))) throw new NotSupportedException(Environment.GetResourceString("Acc_CreateArgIterator")); - if (Object.ReferenceEquals(elementType, typeof(void))) + if (ReferenceEquals(elementType, typeof(void))) throw new NotSupportedException(Environment.GetResourceString("Acc_CreateVoid")); } - - internal Object CreateInstanceImpl( - BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture) - { + + internal object CreateInstanceImpl( + BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture) + { CreateInstanceCheckThis(); - - Object server = null; + + object server = null; try { try { if (args == null) - args = Array.Empty (); + args = Array.Empty(); int argCnt = args.Length; @@ -1746,11 +1741,11 @@ internal Object CreateInstanceImpl( bool publicOnly = (bindingAttr & BindingFlags.NonPublic) == 0; bool wrapExceptions = (bindingAttr & BindingFlags.DoNotWrapExceptions) == 0; if (argCnt == 0 && (bindingAttr & BindingFlags.Public) != 0 && (bindingAttr & BindingFlags.Instance) != 0 - && (IsValueType)) + && (IsValueType)) { server = CreateInstanceDefaultCtor(publicOnly, false, true, wrapExceptions); } - else + else { ConstructorInfo[] candidates = GetConstructors(bindingAttr); List matches = new List(candidates.Length); @@ -1765,7 +1760,7 @@ internal Object CreateInstanceImpl( } } - for(int i = 0; i < candidates.Length; i ++) + for (int i = 0; i < candidates.Length; i++) { if (FilterApplyConstructorInfo((RuntimeConstructorInfo)candidates[i], bindingAttr, CallingConventions.Any, argsType)) matches.Add(candidates[i]); @@ -1776,13 +1771,13 @@ internal Object CreateInstanceImpl( if (cons != null && cons.Length == 0) cons = null; - if (cons == null) + if (cons == null) { throw new MissingMethodException(Environment.GetResourceString("MissingConstructor_Name", FullName)); } MethodBase invokeMethod; - Object state = null; + object state = null; try { @@ -1800,9 +1795,9 @@ internal Object CreateInstanceImpl( if (args.Length != 0) { - Contract.Assert((invokeMethod.CallingConvention & CallingConventions.VarArgs) == - CallingConventions.VarArgs); - throw new NotSupportedException(String.Format(CultureInfo.CurrentCulture, + Contract.Assert((invokeMethod.CallingConvention & CallingConventions.VarArgs) == + CallingConventions.VarArgs); + throw new NotSupportedException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("NotSupported_CallToVarArg"))); } @@ -1816,40 +1811,42 @@ internal Object CreateInstanceImpl( binder.ReorderArgumentArray(ref args, state); } } - } + } finally - { + { } } catch (Exception) { throw; } - + //Console.WriteLine(server); - return server; + return server; } - + // Helper to invoke the default (parameterless) ctor. // fillCache is set in the SL2/3 compat mode or when called from Marshal.PtrToStructure. [DebuggerStepThroughAttribute] [Diagnostics.DebuggerHidden] - internal Object CreateInstanceDefaultCtor(bool publicOnly, bool skipCheckThis, bool fillCache, bool wrapExceptions) + internal object CreateInstanceDefaultCtor(bool publicOnly, bool skipCheckThis, bool fillCache, bool wrapExceptions) { - if (IsByRefLike) - throw new NotSupportedException (SR.NotSupported_ByRefLike); + if (IsByRefLike) + throw new NotSupportedException(SR.NotSupported_ByRefLike); return CreateInstanceSlow(publicOnly, wrapExceptions, skipCheckThis, fillCache); } #endregion - TypeCache cache; + private TypeCache cache; - internal TypeCache Cache { - get { + internal TypeCache Cache + { + get + { if (cache == null) - LazyInitializer.EnsureInitialized (ref cache, () => new TypeCache ()); + LazyInitializer.EnsureInitialized(ref cache, () => new TypeCache()); return cache; } @@ -1868,666 +1865,723 @@ internal sealed class TypeCache } - internal RuntimeType (Object obj) - { - throw new NotImplementedException (); - } - - internal RuntimeConstructorInfo GetDefaultConstructor () - { - var cache = Cache; - RuntimeConstructorInfo ctor = null; - - if (Volatile.Read (ref cache.default_ctor_cached)) - return cache.default_ctor; - - var ctors = GetConstructorCandidates ( - null, - BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, CallingConventions.Any, - Array.Empty (), false); - - if (ctors.Count == 1) - cache.default_ctor = ctor = (RuntimeConstructorInfo) ctors [0]; - - // Note down even if we found no constructors - Volatile.Write (ref cache.default_ctor_cached, true); - - return ctor; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern MethodInfo GetCorrespondingInflatedMethod (MethodInfo generic); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern ConstructorInfo GetCorrespondingInflatedConstructor (ConstructorInfo generic); - - internal override MethodInfo GetMethod (MethodInfo fromNoninstanciated) - { - if (fromNoninstanciated == null) - throw new ArgumentNullException ("fromNoninstanciated"); - return GetCorrespondingInflatedMethod (fromNoninstanciated); - } - - internal override ConstructorInfo GetConstructor (ConstructorInfo fromNoninstanciated) - { - if (fromNoninstanciated == null) - throw new ArgumentNullException ("fromNoninstanciated"); - return GetCorrespondingInflatedConstructor (fromNoninstanciated); - } - - internal override FieldInfo GetField (FieldInfo fromNoninstanciated) - { - /* create sensible flags from given FieldInfo */ - BindingFlags flags = fromNoninstanciated.IsStatic ? BindingFlags.Static : BindingFlags.Instance; - flags |= fromNoninstanciated.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; - return GetField (fromNoninstanciated.Name, flags); - } - - string GetDefaultMemberName () - { - object [] att = GetCustomAttributes (typeof (DefaultMemberAttribute), true); - return att.Length != 0 ? ((DefaultMemberAttribute) att [0]).MemberName : null; - } - - RuntimeConstructorInfo m_serializationCtor; - internal RuntimeConstructorInfo GetSerializationCtor() - { - if (m_serializationCtor == null) { - var s_SICtorParamTypes = new Type[] { typeof(SerializationInfo), typeof(StreamingContext) }; - - m_serializationCtor = GetConstructor( - BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, - null, - CallingConventions.Any, - s_SICtorParamTypes, - null) as RuntimeConstructorInfo; - } - - return m_serializationCtor; - } - - internal Object CreateInstanceSlow(bool publicOnly, bool wrapExceptions, bool skipCheckThis, bool fillCache) - { - //bool bNeedSecurityCheck = true; - //bool bCanBeCached = false; - //bool bSecurityCheckOff = false; - - if (!skipCheckThis) - CreateInstanceCheckThis(); - - //if (!fillCache) - // bSecurityCheckOff = true; - - return CreateInstanceMono (!publicOnly, wrapExceptions); - } - - object CreateInstanceMono (bool nonPublic, bool wrapExceptions) - { - var ctor = GetDefaultConstructor (); - if (!nonPublic && ctor != null && !ctor.IsPublic) { - throw new MissingMethodException(SR.Format(SR.Arg_NoDefCTor, FullName)); - } - - if (ctor == null) { - Type elementType = this.GetRootElementType(); - if (ReferenceEquals (elementType, typeof (TypedReference)) || ReferenceEquals (elementType, typeof (RuntimeArgumentHandle))) - throw new NotSupportedException (Environment.GetResourceString ("NotSupported_ContainsStackPtr")); - - if (IsValueType) - return CreateInstanceInternal (this); - - throw new MissingMethodException ("Default constructor not found for type " + FullName); - } - - // TODO: .net does more checks in unmanaged land in RuntimeTypeHandle::CreateInstance - if (IsAbstract) { - throw new MissingMethodException ("Cannot create an abstract class '{0}'.", FullName); - } - - return ctor.InternalInvoke (null, null, wrapExceptions); - } - - internal Object CheckValue (Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) - { - bool failed = false; - var res = TryConvertToType (value, ref failed); - if (!failed) - return res; - - if ((invokeAttr & BindingFlags.ExactBinding) == BindingFlags.ExactBinding) - throw new ArgumentException(String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Arg_ObjObjEx"), value.GetType(), this)); - - if (binder != null && binder != Type.DefaultBinder) - return binder.ChangeType (value, this, culture); - - throw new ArgumentException(String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Arg_ObjObjEx"), value.GetType(), this)); - } - - object TryConvertToType (object value, ref bool failed) - { - if (IsInstanceOfType (value)) { - return value; - } - - if (IsByRef) { - var elementType = GetElementType (); - if (value == null || elementType.IsInstanceOfType (value)) { - return value; - } - } - - if (value == null) - return value; - - if (IsEnum) { - var type = Enum.GetUnderlyingType (this); - if (type == value.GetType ()) - return value; - var res = IsConvertibleToPrimitiveType (value, this); - if (res != null) - return res; - } else if (IsPrimitive) { - var res = IsConvertibleToPrimitiveType (value, this); - if (res != null) - return res; - } else if (IsPointer) { - var vtype = value.GetType (); - if (vtype == typeof (IntPtr) || vtype == typeof (UIntPtr)) - return value; - if (value is Pointer pointer) { - Type pointerType = pointer.GetPointerType (); - if (pointerType == this) - return pointer.GetPointerValue (); - } - } - - failed = true; - return null; - } - - // Binder uses some incompatible conversion rules. For example - // int value cannot be used with decimal parameter but in other - // ways it's more flexible than normal convertor, for example - // long value can be used with int based enum - static object IsConvertibleToPrimitiveType (object value, Type targetType) - { - var type = value.GetType (); - if (type.IsEnum) { - type = Enum.GetUnderlyingType (type); - if (type == targetType) - return value; - } - - var from = Type.GetTypeCode (type); - var to = Type.GetTypeCode (targetType); - - switch (to) { - case TypeCode.Char: - switch (from) { - case TypeCode.Byte: - return (Char) (Byte) value; - case TypeCode.UInt16: - return value; - } - break; - case TypeCode.Int16: - switch (from) { - case TypeCode.Byte: - return (Int16) (Byte) value; - case TypeCode.SByte: - return (Int16) (SByte) value; - } - break; - case TypeCode.UInt16: - switch (from) { - case TypeCode.Byte: - return (UInt16) (Byte) value; - case TypeCode.Char: - return value; - } - break; - case TypeCode.Int32: - switch (from) { - case TypeCode.Byte: - return (Int32) (Byte) value; - case TypeCode.SByte: - return (Int32) (SByte) value; - case TypeCode.Char: - return (Int32) (Char) value; - case TypeCode.Int16: - return (Int32) (Int16) value; - case TypeCode.UInt16: - return (Int32) (UInt16) value; - } - break; - case TypeCode.UInt32: - switch (from) { - case TypeCode.Byte: - return (UInt32) (Byte) value; - case TypeCode.Char: - return (UInt32) (Char) value; - case TypeCode.UInt16: - return (UInt32) (UInt16) value; - } - break; - case TypeCode.Int64: - switch (from) { - case TypeCode.Byte: - return (Int64) (Byte) value; - case TypeCode.SByte: - return (Int64) (SByte) value; - case TypeCode.Int16: - return (Int64) (Int16) value; - case TypeCode.Char: - return (Int64) (Char) value; - case TypeCode.UInt16: - return (Int64) (UInt16) value; - case TypeCode.Int32: - return (Int64) (Int32) value; - case TypeCode.UInt32: - return (Int64) (UInt32) value; - } - break; - case TypeCode.UInt64: - switch (from) { - case TypeCode.Byte: - return (UInt64) (Byte) value; - case TypeCode.Char: - return (UInt64) (Char) value; - case TypeCode.UInt16: - return (UInt64) (UInt16) value; - case TypeCode.UInt32: - return (UInt64) (UInt32) value; - } - break; - case TypeCode.Single: - switch (from) { - case TypeCode.Byte: - return (Single) (Byte) value; - case TypeCode.SByte: - return (Single) (SByte) value; - case TypeCode.Int16: - return (Single) (Int16) value; - case TypeCode.Char: - return (Single) (Char) value; - case TypeCode.UInt16: - return (Single) (UInt16) value; - case TypeCode.Int32: - return (Single) (Int32) value; - case TypeCode.UInt32: - return (Single) (UInt32) value; - case TypeCode.Int64: - return (Single) (Int64) value; - case TypeCode.UInt64: - return (Single) (UInt64) value; - } - break; - case TypeCode.Double: - switch (from) { - case TypeCode.Byte: - return (Double) (Byte) value; - case TypeCode.SByte: - return (Double) (SByte) value; - case TypeCode.Char: - return (Double) (Char) value; - case TypeCode.Int16: - return (Double) (Int16) value; - case TypeCode.UInt16: - return (Double) (UInt16) value; - case TypeCode.Int32: - return (Double) (Int32) value; - case TypeCode.UInt32: - return (Double) (UInt32) value; - case TypeCode.Int64: - return (Double) (Int64) value; - case TypeCode.UInt64: - return (Double) (UInt64) value; - case TypeCode.Single: - return (Double) (Single) value; - } - break; - } - - // Everything else is rejected - return null; - } - - string GetCachedName (TypeNameKind kind) - { - switch (kind) { - case TypeNameKind.SerializationName: - return ToString (); - default: - throw new NotImplementedException (); - } - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern Type make_array_type (int rank); - - public override Type MakeArrayType () - { - return make_array_type (0); - } - - public override Type MakeArrayType (int rank) - { - if (rank < 1 || rank > 255) - throw new IndexOutOfRangeException (); - return make_array_type (rank); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern Type make_byref_type (); - - public override Type MakeByRefType () - { - if (IsByRef) - throw new TypeLoadException ("Can not call MakeByRefType on a ByRef type"); - return make_byref_type (); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern Type MakePointerType (Type type); - - public override Type MakePointerType () - { - if (IsByRef) - throw new TypeLoadException ($"Could not load type '{GetType()}' from assembly '{AssemblyQualifiedName}"); - return MakePointerType (this); - } - - public override StructLayoutAttribute? StructLayoutAttribute { - get { - return GetStructLayoutAttribute (); - } - } - - public override bool ContainsGenericParameters { - get { - if (IsGenericParameter) - return true; - - if (IsGenericType) { - foreach (Type arg in GetGenericArguments ()) - if (arg.ContainsGenericParameters) - return true; - } - - if (HasElementType) - return GetElementType ().ContainsGenericParameters; - - return false; - } - } - - public override Type[] GetGenericParameterConstraints () - { - if (!IsGenericParameter) - throw new InvalidOperationException(Environment.GetResourceString("Arg_NotGenericParameter")); - - var paramInfo = new Mono.RuntimeGenericParamInfoHandle (RuntimeTypeHandle.GetGenericParameterInfo (this)); - Type[] constraints = paramInfo.Constraints; - - return constraints ?? Array.Empty (); - } - - internal static object CreateInstanceForAnotherGenericParameter (Type genericType, RuntimeType genericArgument) - { - var gt = (RuntimeType) MakeGenericType (genericType, new Type [] { genericArgument }); - var ctor = gt.GetDefaultConstructor (); - return ctor.InternalInvoke (null, null, wrapExceptions: true); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern Type MakeGenericType (Type gt, Type [] types); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern IntPtr GetMethodsByName_native (IntPtr namePtr, BindingFlags bindingAttr, MemberListType listType); - - internal RuntimeMethodInfo[] GetMethodsByName (string name, BindingFlags bindingAttr, MemberListType listType, RuntimeType reflectedType) - { - var refh = new RuntimeTypeHandle (reflectedType); - using (var namePtr = new Mono.SafeStringMarshal (name)) - using (var h = new Mono.SafeGPtrArrayHandle (GetMethodsByName_native (namePtr.Value, bindingAttr, listType))) { - var n = h.Length; - var a = new RuntimeMethodInfo [n]; - for (int i = 0; i < n; i++) { - var mh = new RuntimeMethodHandle (h[i]); - a[i] = (RuntimeMethodInfo) RuntimeMethodInfo.GetMethodFromHandleNoGenericCheck (mh, refh); - } - return a; - } - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern IntPtr GetPropertiesByName_native (IntPtr name, BindingFlags bindingAttr, MemberListType listType); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern IntPtr GetConstructors_native (BindingFlags bindingAttr); - - RuntimeConstructorInfo[] GetConstructors_internal (BindingFlags bindingAttr, RuntimeType reflectedType) - { - var refh = new RuntimeTypeHandle (reflectedType); - using (var h = new Mono.SafeGPtrArrayHandle (GetConstructors_native (bindingAttr))) { - var n = h.Length; - var a = new RuntimeConstructorInfo [n]; - for (int i = 0; i < n; i++) { - var mh = new RuntimeMethodHandle (h[i]); - a[i] = (RuntimeConstructorInfo) RuntimeMethodInfo.GetMethodFromHandleNoGenericCheck (mh, refh); - } - return a; - } - } - - RuntimePropertyInfo[] GetPropertiesByName (string name, BindingFlags bindingAttr, MemberListType listType, RuntimeType reflectedType) - { - var refh = new RuntimeTypeHandle (reflectedType); - using (var namePtr = new Mono.SafeStringMarshal (name)) - using (var h = new Mono.SafeGPtrArrayHandle (GetPropertiesByName_native (namePtr.Value, bindingAttr, listType))) { - var n = h.Length; - var a = new RuntimePropertyInfo [n]; - for (int i = 0; i < n; i++) { - var ph = new Mono.RuntimePropertyHandle (h[i]); - a[i] = (RuntimePropertyInfo) RuntimePropertyInfo.GetPropertyFromHandle (ph, refh); - } - return a; - } - } - - public override InterfaceMapping GetInterfaceMap (Type ifaceType) - { - if (IsGenericParameter) - throw new InvalidOperationException(Environment.GetResourceString("Arg_GenericParameter")); - - if ((object)ifaceType == null) - throw new ArgumentNullException("ifaceType"); - - RuntimeType ifaceRtType = ifaceType as RuntimeType; - - if (ifaceRtType == null) - throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"), "ifaceType"); - - InterfaceMapping res; - if (!ifaceType.IsInterface) - throw new ArgumentException ("Argument must be an interface.", "ifaceType"); - if (IsInterface) - throw new ArgumentException ("'this' type cannot be an interface itself"); - res.TargetType = this; - res.InterfaceType = ifaceType; - GetInterfaceMapData (this, ifaceType, out res.TargetMethods, out res.InterfaceMethods); - if (res.TargetMethods == null) - throw new ArgumentException ("Interface not found", "ifaceType"); - - return res; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - static extern void GetInterfaceMapData (Type t, Type iface, out MethodInfo[] targets, out MethodInfo[] methods); - - public override Guid GUID { - get { - object[] att = GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), true); - if (att.Length == 0) - return Guid.Empty; - return new Guid(((System.Runtime.InteropServices.GuidAttribute)att[0]).Value); - } - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern void GetPacking (out int packing, out int size); - - public override string ToString() - { - return getFullName (false, false); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern object CreateInstanceInternal (Type type); - - public extern override MethodBase? DeclaringMethod { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern string getFullName(bool full_name, bool assembly_qualified); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern Type[] GetGenericArgumentsInternal (bool runtimeArray); - - GenericParameterAttributes GetGenericParameterAttributes () { - return (new Mono.RuntimeGenericParamInfoHandle (RuntimeTypeHandle.GetGenericParameterInfo (this))).Attributes; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern int GetGenericParameterPosition (); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern IntPtr GetEvents_native (IntPtr name, MemberListType listType); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern IntPtr GetFields_native (IntPtr name, BindingFlags bindingAttr, MemberListType listType); - - RuntimeFieldInfo[] GetFields_internal (string name, BindingFlags bindingAttr, MemberListType listType, RuntimeType reflectedType) - { - var refh = new RuntimeTypeHandle (reflectedType); - using (var namePtr = new Mono.SafeStringMarshal (name)) - using (var h = new Mono.SafeGPtrArrayHandle (GetFields_native (namePtr.Value, bindingAttr, listType))) { - int n = h.Length; - var a = new RuntimeFieldInfo[n]; - for (int i = 0; i < n; i++) { - var fh = new RuntimeFieldHandle (h[i]); - a[i] = (RuntimeFieldInfo) FieldInfo.GetFieldFromHandle (fh, refh); - } - return a; - } - } - - RuntimeEventInfo[] GetEvents_internal (string name, BindingFlags bindingAttr, MemberListType listType, RuntimeType reflectedType) - { - var refh = new RuntimeTypeHandle (reflectedType); - using (var namePtr = new Mono.SafeStringMarshal (name)) - using (var h = new Mono.SafeGPtrArrayHandle (GetEvents_native (namePtr.Value, listType))) { - int n = h.Length; - var a = new RuntimeEventInfo[n]; - for (int i = 0; i < n; i++) { - var eh = new Mono.RuntimeEventHandle (h[i]); - a[i] = (RuntimeEventInfo) RuntimeEventInfo.GetEventFromHandle (eh, refh); - } - return a; - } - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public extern override Type[] GetInterfaces(); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern IntPtr GetNestedTypes_native (IntPtr name, BindingFlags bindingAttr, MemberListType listType); - - RuntimeType[] GetNestedTypes_internal (string displayName, BindingFlags bindingAttr, MemberListType listType) - { - string internalName = null; - if (displayName != null) - internalName = displayName; - using (var namePtr = new Mono.SafeStringMarshal (internalName)) - using (var h = new Mono.SafeGPtrArrayHandle (GetNestedTypes_native (namePtr.Value, bindingAttr, listType))) { - int n = h.Length; - var a = new RuntimeType [n]; - for (int i = 0; i < n; i++) { - var th = new RuntimeTypeHandle (h[i]); - a[i] = (RuntimeType) Type.GetTypeFromHandle (th); - } - return a; - } - } - - public override string? AssemblyQualifiedName { - get { - return getFullName (true, true); - } - } - - public extern override Type? DeclaringType { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } - - public extern override string Name { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } - - public extern override string? Namespace { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } - - public override string? FullName { - get { - // See https://github.com/mono/mono/issues/18180 and - // https://github.com/dotnet/runtime/blob/f23e2796ab5f6fea71c9fdacac024822280253db/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs#L1468-L1472 - if (ContainsGenericParameters && !GetRootElementType().IsGenericTypeDefinition) - return null; - - string fullName; - var cache = Cache; - if ((fullName = cache.full_name) == null) - fullName = cache.full_name = getFullName (true, false); - - return fullName; - } - } - - public sealed override bool HasSameMetadataDefinitionAs (MemberInfo other) => HasSameMetadataDefinitionAsCore (other); - - public override bool IsSZArray { - get { - return RuntimeTypeHandle.IsSzArray (this); - } - } - - internal override bool IsUserType { - get { - return false; - } - } - - public override bool IsSubclassOf(Type type) - { - if ((object)type == null) - throw new ArgumentNullException("type"); - - RuntimeType rtType = type as RuntimeType; - if (rtType == null) - return false; - - return RuntimeTypeHandle.IsSubclassOf (this, rtType); - } + internal RuntimeType(object obj) + { + throw new NotImplementedException(); + } + + internal RuntimeConstructorInfo GetDefaultConstructor() + { + var cache = Cache; + RuntimeConstructorInfo ctor = null; + + if (Volatile.Read(ref cache.default_ctor_cached)) + return cache.default_ctor; + + var ctors = GetConstructorCandidates( + null, + BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, CallingConventions.Any, + Array.Empty(), false); + + if (ctors.Count == 1) + cache.default_ctor = ctor = (RuntimeConstructorInfo)ctors[0]; + + // Note down even if we found no constructors + Volatile.Write(ref cache.default_ctor_cached, true); + + return ctor; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern MethodInfo GetCorrespondingInflatedMethod(MethodInfo generic); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern ConstructorInfo GetCorrespondingInflatedConstructor(ConstructorInfo generic); + + internal override MethodInfo GetMethod(MethodInfo fromNoninstanciated) + { + if (fromNoninstanciated == null) + throw new ArgumentNullException(nameof(fromNoninstanciated)); + return GetCorrespondingInflatedMethod(fromNoninstanciated); + } + + internal override ConstructorInfo GetConstructor(ConstructorInfo fromNoninstanciated) + { + if (fromNoninstanciated == null) + throw new ArgumentNullException(nameof(fromNoninstanciated)); + return GetCorrespondingInflatedConstructor(fromNoninstanciated); + } + + internal override FieldInfo GetField(FieldInfo fromNoninstanciated) + { + /* create sensible flags from given FieldInfo */ + BindingFlags flags = fromNoninstanciated.IsStatic ? BindingFlags.Static : BindingFlags.Instance; + flags |= fromNoninstanciated.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic; + return GetField(fromNoninstanciated.Name, flags); + } + + private string GetDefaultMemberName() + { + object[] att = GetCustomAttributes(typeof(DefaultMemberAttribute), true); + return att.Length != 0 ? ((DefaultMemberAttribute)att[0]).MemberName : null; + } + + private RuntimeConstructorInfo m_serializationCtor; + internal RuntimeConstructorInfo GetSerializationCtor() + { + if (m_serializationCtor == null) + { + var s_SICtorParamTypes = new Type[] { typeof(SerializationInfo), typeof(StreamingContext) }; + + m_serializationCtor = GetConstructor( + BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, + null, + CallingConventions.Any, + s_SICtorParamTypes, + null) as RuntimeConstructorInfo; + } + + return m_serializationCtor; + } + + internal object CreateInstanceSlow(bool publicOnly, bool wrapExceptions, bool skipCheckThis, bool fillCache) + { + //bool bNeedSecurityCheck = true; + //bool bCanBeCached = false; + //bool bSecurityCheckOff = false; + + if (!skipCheckThis) + CreateInstanceCheckThis(); + + //if (!fillCache) + // bSecurityCheckOff = true; + + return CreateInstanceMono(!publicOnly, wrapExceptions); + } + + private object CreateInstanceMono(bool nonPublic, bool wrapExceptions) + { + var ctor = GetDefaultConstructor(); + if (!nonPublic && ctor != null && !ctor.IsPublic) + { + throw new MissingMethodException(SR.Format(SR.Arg_NoDefCTor, FullName)); + } + + if (ctor == null) + { + Type elementType = this.GetRootElementType(); + if (ReferenceEquals(elementType, typeof(TypedReference)) || ReferenceEquals(elementType, typeof(RuntimeArgumentHandle))) + throw new NotSupportedException(Environment.GetResourceString("NotSupported_ContainsStackPtr")); + + if (IsValueType) + return CreateInstanceInternal(this); + + throw new MissingMethodException("Default constructor not found for type " + FullName); + } + + // TODO: .net does more checks in unmanaged land in RuntimeTypeHandle::CreateInstance + if (IsAbstract) + { + throw new MissingMethodException("Cannot create an abstract class '{0}'.", FullName); + } + + return ctor.InternalInvoke(null, null, wrapExceptions); + } + + internal object CheckValue(object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) + { + bool failed = false; + var res = TryConvertToType(value, ref failed); + if (!failed) + return res; + + if ((invokeAttr & BindingFlags.ExactBinding) == BindingFlags.ExactBinding) + throw new ArgumentException(string.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Arg_ObjObjEx"), value.GetType(), this)); + + if (binder != null && binder != DefaultBinder) + return binder.ChangeType(value, this, culture); + + throw new ArgumentException(string.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Arg_ObjObjEx"), value.GetType(), this)); + } + + private object TryConvertToType(object value, ref bool failed) + { + if (IsInstanceOfType(value)) + { + return value; + } + + if (IsByRef) + { + var elementType = GetElementType(); + if (value == null || elementType.IsInstanceOfType(value)) + { + return value; + } + } + + if (value == null) + return value; + + if (IsEnum) + { + var type = Enum.GetUnderlyingType(this); + if (type == value.GetType()) + return value; + var res = IsConvertibleToPrimitiveType(value, this); + if (res != null) + return res; + } + else if (IsPrimitive) + { + var res = IsConvertibleToPrimitiveType(value, this); + if (res != null) + return res; + } + else if (IsPointer) + { + var vtype = value.GetType(); + if (vtype == typeof(IntPtr) || vtype == typeof(UIntPtr)) + return value; + if (value is Pointer pointer) + { + Type pointerType = pointer.GetPointerType(); + if (pointerType == this) + return pointer.GetPointerValue(); + } + } + + failed = true; + return null; + } + + // Binder uses some incompatible conversion rules. For example + // int value cannot be used with decimal parameter but in other + // ways it's more flexible than normal convertor, for example + // long value can be used with int based enum + private static object IsConvertibleToPrimitiveType(object value, Type targetType) + { + var type = value.GetType(); + if (type.IsEnum) + { + type = Enum.GetUnderlyingType(type); + if (type == targetType) + return value; + } + + var from = GetTypeCode(type); + var to = GetTypeCode(targetType); + + switch (to) + { + case TypeCode.Char: + switch (from) + { + case TypeCode.Byte: + return (char)(byte)value; + case TypeCode.UInt16: + return value; + } + break; + case TypeCode.Int16: + switch (from) + { + case TypeCode.Byte: + return (short)(byte)value; + case TypeCode.SByte: + return (short)(sbyte)value; + } + break; + case TypeCode.UInt16: + switch (from) + { + case TypeCode.Byte: + return (ushort)(byte)value; + case TypeCode.Char: + return value; + } + break; + case TypeCode.Int32: + switch (from) + { + case TypeCode.Byte: + return (int)(byte)value; + case TypeCode.SByte: + return (int)(sbyte)value; + case TypeCode.Char: + return (int)(char)value; + case TypeCode.Int16: + return (int)(short)value; + case TypeCode.UInt16: + return (int)(ushort)value; + } + break; + case TypeCode.UInt32: + switch (from) + { + case TypeCode.Byte: + return (uint)(byte)value; + case TypeCode.Char: + return (uint)(char)value; + case TypeCode.UInt16: + return (uint)(ushort)value; + } + break; + case TypeCode.Int64: + switch (from) + { + case TypeCode.Byte: + return (long)(byte)value; + case TypeCode.SByte: + return (long)(sbyte)value; + case TypeCode.Int16: + return (long)(short)value; + case TypeCode.Char: + return (long)(char)value; + case TypeCode.UInt16: + return (long)(ushort)value; + case TypeCode.Int32: + return (long)(int)value; + case TypeCode.UInt32: + return (long)(uint)value; + } + break; + case TypeCode.UInt64: + switch (from) + { + case TypeCode.Byte: + return (ulong)(byte)value; + case TypeCode.Char: + return (ulong)(char)value; + case TypeCode.UInt16: + return (ulong)(ushort)value; + case TypeCode.UInt32: + return (ulong)(uint)value; + } + break; + case TypeCode.Single: + switch (from) + { + case TypeCode.Byte: + return (float)(byte)value; + case TypeCode.SByte: + return (float)(sbyte)value; + case TypeCode.Int16: + return (float)(short)value; + case TypeCode.Char: + return (float)(char)value; + case TypeCode.UInt16: + return (float)(ushort)value; + case TypeCode.Int32: + return (float)(int)value; + case TypeCode.UInt32: + return (float)(uint)value; + case TypeCode.Int64: + return (float)(long)value; + case TypeCode.UInt64: + return (float)(ulong)value; + } + break; + case TypeCode.Double: + switch (from) + { + case TypeCode.Byte: + return (double)(byte)value; + case TypeCode.SByte: + return (double)(sbyte)value; + case TypeCode.Char: + return (double)(char)value; + case TypeCode.Int16: + return (double)(short)value; + case TypeCode.UInt16: + return (double)(ushort)value; + case TypeCode.Int32: + return (double)(int)value; + case TypeCode.UInt32: + return (double)(uint)value; + case TypeCode.Int64: + return (double)(long)value; + case TypeCode.UInt64: + return (double)(ulong)value; + case TypeCode.Single: + return (double)(float)value; + } + break; + } + + // Everything else is rejected + return null; + } + + private string GetCachedName(TypeNameKind kind) + { + switch (kind) + { + case TypeNameKind.SerializationName: + return ToString(); + default: + throw new NotImplementedException(); + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern Type make_array_type(int rank); + + public override Type MakeArrayType() + { + return make_array_type(0); + } + + public override Type MakeArrayType(int rank) + { + if (rank < 1 || rank > 255) + throw new IndexOutOfRangeException(); + return make_array_type(rank); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern Type make_byref_type(); + + public override Type MakeByRefType() + { + if (IsByRef) + throw new TypeLoadException("Can not call MakeByRefType on a ByRef type"); + return make_byref_type(); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern Type MakePointerType(Type type); + + public override Type MakePointerType() + { + if (IsByRef) + throw new TypeLoadException($"Could not load type '{GetType()}' from assembly '{AssemblyQualifiedName}"); + return MakePointerType(this); + } + + public override StructLayoutAttribute? StructLayoutAttribute + { + get + { + return GetStructLayoutAttribute(); + } + } + + public override bool ContainsGenericParameters + { + get + { + if (IsGenericParameter) + return true; + + if (IsGenericType) + { + foreach (Type arg in GetGenericArguments()) + if (arg.ContainsGenericParameters) + return true; + } + + if (HasElementType) + return GetElementType().ContainsGenericParameters; + + return false; + } + } + + public override Type[] GetGenericParameterConstraints() + { + if (!IsGenericParameter) + throw new InvalidOperationException(Environment.GetResourceString("Arg_NotGenericParameter")); + + var paramInfo = new Mono.RuntimeGenericParamInfoHandle(RuntimeTypeHandle.GetGenericParameterInfo(this)); + Type[] constraints = paramInfo.Constraints; + + return constraints ?? Array.Empty(); + } + + internal static object CreateInstanceForAnotherGenericParameter(Type genericType, RuntimeType genericArgument) + { + var gt = (RuntimeType)MakeGenericType(genericType, new Type[] { genericArgument }); + var ctor = gt.GetDefaultConstructor(); + return ctor.InternalInvoke(null, null, wrapExceptions: true); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern Type MakeGenericType(Type gt, Type[] types); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern IntPtr GetMethodsByName_native(IntPtr namePtr, BindingFlags bindingAttr, MemberListType listType); + + internal RuntimeMethodInfo[] GetMethodsByName(string name, BindingFlags bindingAttr, MemberListType listType, RuntimeType reflectedType) + { + var refh = new RuntimeTypeHandle(reflectedType); + using (var namePtr = new Mono.SafeStringMarshal(name)) + using (var h = new Mono.SafeGPtrArrayHandle(GetMethodsByName_native(namePtr.Value, bindingAttr, listType))) + { + var n = h.Length; + var a = new RuntimeMethodInfo[n]; + for (int i = 0; i < n; i++) + { + var mh = new RuntimeMethodHandle(h[i]); + a[i] = (RuntimeMethodInfo)RuntimeMethodInfo.GetMethodFromHandleNoGenericCheck(mh, refh); + } + return a; + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern IntPtr GetPropertiesByName_native(IntPtr name, BindingFlags bindingAttr, MemberListType listType); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern IntPtr GetConstructors_native(BindingFlags bindingAttr); + + private RuntimeConstructorInfo[] GetConstructors_internal(BindingFlags bindingAttr, RuntimeType reflectedType) + { + var refh = new RuntimeTypeHandle(reflectedType); + using (var h = new Mono.SafeGPtrArrayHandle(GetConstructors_native(bindingAttr))) + { + var n = h.Length; + var a = new RuntimeConstructorInfo[n]; + for (int i = 0; i < n; i++) + { + var mh = new RuntimeMethodHandle(h[i]); + a[i] = (RuntimeConstructorInfo)RuntimeMethodInfo.GetMethodFromHandleNoGenericCheck(mh, refh); + } + return a; + } + } + + private RuntimePropertyInfo[] GetPropertiesByName(string name, BindingFlags bindingAttr, MemberListType listType, RuntimeType reflectedType) + { + var refh = new RuntimeTypeHandle(reflectedType); + using (var namePtr = new Mono.SafeStringMarshal(name)) + using (var h = new Mono.SafeGPtrArrayHandle(GetPropertiesByName_native(namePtr.Value, bindingAttr, listType))) + { + var n = h.Length; + var a = new RuntimePropertyInfo[n]; + for (int i = 0; i < n; i++) + { + var ph = new Mono.RuntimePropertyHandle(h[i]); + a[i] = (RuntimePropertyInfo)RuntimePropertyInfo.GetPropertyFromHandle(ph, refh); + } + return a; + } + } + + public override InterfaceMapping GetInterfaceMap(Type ifaceType) + { + if (IsGenericParameter) + throw new InvalidOperationException(Environment.GetResourceString("Arg_GenericParameter")); + + if ((object)ifaceType == null) + throw new ArgumentNullException(nameof(ifaceType)); + + RuntimeType ifaceRtType = ifaceType as RuntimeType; + + if (ifaceRtType == null) + throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"), nameof(ifaceType)); + + InterfaceMapping res; + if (!ifaceType.IsInterface) + throw new ArgumentException("Argument must be an interface.", nameof(ifaceType)); + if (IsInterface) + throw new ArgumentException("'this' type cannot be an interface itself"); + res.TargetType = this; + res.InterfaceType = ifaceType; + GetInterfaceMapData(this, ifaceType, out res.TargetMethods, out res.InterfaceMethods); + if (res.TargetMethods == null) + throw new ArgumentException("Interface not found", nameof(ifaceType)); + + return res; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void GetInterfaceMapData(Type t, Type iface, out MethodInfo[] targets, out MethodInfo[] methods); + + public override Guid GUID + { + get + { + object[] att = GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), true); + if (att.Length == 0) + return Guid.Empty; + return new Guid(((System.Runtime.InteropServices.GuidAttribute)att[0]).Value); + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern void GetPacking(out int packing, out int size); + + public override string ToString() + { + return getFullName(false, false); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern object CreateInstanceInternal(Type type); + + public extern override MethodBase? DeclaringMethod + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern string getFullName(bool full_name, bool assembly_qualified); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern Type[] GetGenericArgumentsInternal(bool runtimeArray); + + private GenericParameterAttributes GetGenericParameterAttributes() + { + return (new Mono.RuntimeGenericParamInfoHandle(RuntimeTypeHandle.GetGenericParameterInfo(this))).Attributes; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern int GetGenericParameterPosition(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern IntPtr GetEvents_native(IntPtr name, MemberListType listType); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern IntPtr GetFields_native(IntPtr name, BindingFlags bindingAttr, MemberListType listType); + + private RuntimeFieldInfo[] GetFields_internal(string name, BindingFlags bindingAttr, MemberListType listType, RuntimeType reflectedType) + { + var refh = new RuntimeTypeHandle(reflectedType); + using (var namePtr = new Mono.SafeStringMarshal(name)) + using (var h = new Mono.SafeGPtrArrayHandle(GetFields_native(namePtr.Value, bindingAttr, listType))) + { + int n = h.Length; + var a = new RuntimeFieldInfo[n]; + for (int i = 0; i < n; i++) + { + var fh = new RuntimeFieldHandle(h[i]); + a[i] = (RuntimeFieldInfo)FieldInfo.GetFieldFromHandle(fh, refh); + } + return a; + } + } + + private RuntimeEventInfo[] GetEvents_internal(string name, BindingFlags bindingAttr, MemberListType listType, RuntimeType reflectedType) + { + var refh = new RuntimeTypeHandle(reflectedType); + using (var namePtr = new Mono.SafeStringMarshal(name)) + using (var h = new Mono.SafeGPtrArrayHandle(GetEvents_native(namePtr.Value, listType))) + { + int n = h.Length; + var a = new RuntimeEventInfo[n]; + for (int i = 0; i < n; i++) + { + var eh = new Mono.RuntimeEventHandle(h[i]); + a[i] = (RuntimeEventInfo)RuntimeEventInfo.GetEventFromHandle(eh, refh); + } + return a; + } + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public extern override Type[] GetInterfaces(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern IntPtr GetNestedTypes_native(IntPtr name, BindingFlags bindingAttr, MemberListType listType); + + private RuntimeType[] GetNestedTypes_internal(string displayName, BindingFlags bindingAttr, MemberListType listType) + { + string internalName = null; + if (displayName != null) + internalName = displayName; + using (var namePtr = new Mono.SafeStringMarshal(internalName)) + using (var h = new Mono.SafeGPtrArrayHandle(GetNestedTypes_native(namePtr.Value, bindingAttr, listType))) + { + int n = h.Length; + var a = new RuntimeType[n]; + for (int i = 0; i < n; i++) + { + var th = new RuntimeTypeHandle(h[i]); + a[i] = (RuntimeType)GetTypeFromHandle(th); + } + return a; + } + } + + public override string? AssemblyQualifiedName + { + get + { + return getFullName(true, true); + } + } + + public extern override Type? DeclaringType + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + } + + public extern override string Name + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + } + + public extern override string? Namespace + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + } + + public override string? FullName + { + get + { + // See https://github.com/mono/mono/issues/18180 and + // https://github.com/dotnet/runtime/blob/f23e2796ab5f6fea71c9fdacac024822280253db/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs#L1468-L1472 + if (ContainsGenericParameters && !GetRootElementType().IsGenericTypeDefinition) + return null; + + string fullName; + var cache = Cache; + if ((fullName = cache.full_name) == null) + fullName = cache.full_name = getFullName(true, false); + + return fullName; + } + } + + public sealed override bool HasSameMetadataDefinitionAs(MemberInfo other) => HasSameMetadataDefinitionAsCore(other); + + public override bool IsSZArray + { + get + { + return RuntimeTypeHandle.IsSzArray(this); + } + } + + internal override bool IsUserType + { + get + { + return false; + } + } + + public override bool IsSubclassOf(Type type) + { + if ((object)type == null) + throw new ArgumentNullException(nameof(type)); + + RuntimeType rtType = type as RuntimeType; + if (rtType == null) + return false; + + return RuntimeTypeHandle.IsSubclassOf(this, rtType); + } private const int DEFAULT_PACKING_SIZE = 8; - internal StructLayoutAttribute GetStructLayoutAttribute () + internal StructLayoutAttribute GetStructLayoutAttribute() { if (IsInterface || HasElementType || IsGenericParameter) return null; @@ -2551,15 +2605,15 @@ internal StructLayoutAttribute GetStructLayoutAttribute () default: break; } - GetPacking (out pack, out size); + GetPacking(out pack, out size); // Metadata parameter checking should not have allowed 0 for packing size. // The runtime later converts a packing size of 0 to 8 so do the same here - // because it's more useful from a user perspective. + // because it's more useful from a user perspective. if (pack == 0) pack = DEFAULT_PACKING_SIZE; - return new StructLayoutAttribute (layoutKind) { Pack = pack, Size = size, CharSet = charSet }; + return new StructLayoutAttribute(layoutKind) { Pack = pack, Size = size, CharSet = charSet }; } } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeTypeHandle.cs b/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeTypeHandle.cs index b19012cb7c1bb..11d957c040e92 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeTypeHandle.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/RuntimeTypeHandle.cs @@ -15,10 +15,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -35,297 +35,304 @@ namespace System { - [Serializable] - public struct RuntimeTypeHandle : ISerializable - { - readonly IntPtr value; - - internal RuntimeTypeHandle (IntPtr val) - { - value = val; - } - - internal RuntimeTypeHandle (RuntimeType type) - : this (type._impl.value) - { - } - - RuntimeTypeHandle (SerializationInfo info, StreamingContext context) - { - throw new PlatformNotSupportedException (); - } - - public IntPtr Value { - get { - return value; - } - } - - public void GetObjectData (SerializationInfo info, StreamingContext context) - { - throw new PlatformNotSupportedException (); - } - - public override bool Equals (object? obj) - { - if (obj == null || GetType () != obj.GetType ()) - return false; - - return value == ((RuntimeTypeHandle)obj).Value; - } - - public bool Equals (RuntimeTypeHandle handle) - { - return value == handle.Value; - } - - public override int GetHashCode () - { - return value.GetHashCode (); - } - - public static bool operator == (RuntimeTypeHandle left, Object right) - { - return (right != null) && (right is RuntimeTypeHandle) && left.Equals ((RuntimeTypeHandle)right); - } - - public static bool operator != (RuntimeTypeHandle left, Object right) - { - return (right == null) || !(right is RuntimeTypeHandle) || !left.Equals ((RuntimeTypeHandle)right); - } - - public static bool operator == (Object left, RuntimeTypeHandle right) - { - return (left != null) && (left is RuntimeTypeHandle) && ((RuntimeTypeHandle)left).Equals (right); - } - - public static bool operator != (Object left, RuntimeTypeHandle right) - { - return (left == null) || !(left is RuntimeTypeHandle) || !((RuntimeTypeHandle)left).Equals (right); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern TypeAttributes GetAttributes (RuntimeType type); - - public ModuleHandle GetModuleHandle () - { - // Although MS' runtime is crashing here, we prefer throwing an exception. - // The check is needed because Type.GetTypeFromHandle returns null - // for zero handles. - if (value == IntPtr.Zero) - throw new InvalidOperationException ("Object fields may not be properly initialized"); - - return Type.GetTypeFromHandle (this).Module.ModuleHandle; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern int GetMetadataToken (RuntimeType type); - - internal static int GetToken (RuntimeType type) - { - return GetMetadataToken (type); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static Type GetGenericTypeDefinition_impl (RuntimeType type); - - internal static Type GetGenericTypeDefinition (RuntimeType type) - { - return GetGenericTypeDefinition_impl (type); - } - - internal static bool IsPrimitive (RuntimeType type) - { - CorElementType corElemType = GetCorElementType (type); - return (corElemType >= CorElementType.ELEMENT_TYPE_BOOLEAN && corElemType <= CorElementType.ELEMENT_TYPE_R8) || - corElemType == CorElementType.ELEMENT_TYPE_I || - corElemType == CorElementType.ELEMENT_TYPE_U; - } - - internal static bool IsByRef (RuntimeType type) - { - CorElementType corElemType = GetCorElementType (type); - return corElemType == CorElementType.ELEMENT_TYPE_BYREF; - } - - internal static bool IsPointer (RuntimeType type) - { - CorElementType corElemType = GetCorElementType (type); - return corElemType == CorElementType.ELEMENT_TYPE_PTR; - } - - internal static bool IsArray (RuntimeType type) - { - CorElementType corElemType = GetCorElementType (type); - return corElemType == CorElementType.ELEMENT_TYPE_ARRAY || corElemType == CorElementType.ELEMENT_TYPE_SZARRAY; - } - - internal static bool IsSzArray (RuntimeType type) - { - CorElementType corElemType = GetCorElementType (type); - return corElemType == CorElementType.ELEMENT_TYPE_SZARRAY; - } - - internal static bool HasElementType (RuntimeType type) - { - CorElementType corElemType = GetCorElementType(type); - - return ((corElemType == CorElementType.ELEMENT_TYPE_ARRAY || corElemType == CorElementType.ELEMENT_TYPE_SZARRAY) // IsArray - || (corElemType == CorElementType.ELEMENT_TYPE_PTR) // IsPointer - || (corElemType == CorElementType.ELEMENT_TYPE_BYREF)); // IsByRef - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern CorElementType GetCorElementType (RuntimeType type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static bool HasInstantiation (RuntimeType type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static bool IsComObject (RuntimeType type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static bool IsInstanceOfType (RuntimeType type, Object o); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static bool HasReferences (RuntimeType type); - - internal static bool IsComObject (RuntimeType type, bool isGenericCOM) - { - return isGenericCOM ? false : IsComObject (type); - } - - internal static bool IsContextful (RuntimeType type) - { - return false; - } - - internal static bool IsEquivalentTo (RuntimeType rtType1, RuntimeType rtType2) - { - // refence check is done earlier and we don't recognize anything else - return false; - } - - internal static bool IsInterface (RuntimeType type) - { - return (type.Attributes & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static int GetArrayRank(RuntimeType type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static RuntimeAssembly GetAssembly (RuntimeType type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static RuntimeType GetElementType (RuntimeType type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static RuntimeModule GetModule (RuntimeType type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static bool IsGenericVariable (RuntimeType type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static RuntimeType GetBaseType (RuntimeType type); - - internal static bool CanCastTo (RuntimeType type, RuntimeType target) - { - return type_is_assignable_from (target, type); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern bool type_is_assignable_from (Type a, Type b); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static bool IsGenericTypeDefinition (RuntimeType type); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static IntPtr GetGenericParameterInfo (RuntimeType type); - - internal static bool IsSubclassOf (RuntimeType childType, RuntimeType baseType) - { - return is_subclass_of (childType._impl.Value, baseType._impl.Value); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static bool is_subclass_of (IntPtr childType, IntPtr baseType); - - [PreserveDependency (".ctor()", "System.Runtime.CompilerServices.IsByRefLikeAttribute")] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static bool IsByRefLike (RuntimeType type); - - internal static bool IsTypeDefinition (RuntimeType type) - { - // That's how it has been done on CoreFX but we have no GetCorElementType method implementation - // see https://github.com/dotnet/coreclr/pull/11355 - - // CorElementType corElemType = GetCorElementType (type); - // if (!((corElemType >= CorElementType.Void && corElemType < CorElementType.Ptr) || - // corElemType == CorElementType.ValueType || - // corElemType == CorElementType.Class || - // corElemType == CorElementType.TypedByRef || - // corElemType == CorElementType.I || - // corElemType == CorElementType.U || - // corElemType == CorElementType.Object)) - // return false; - // if (HasInstantiation (type) && !IsGenericTypeDefinition (type)) - // return false; - // return true; - - // It's like a workaround mentioned in https://github.com/dotnet/corefx/issues/17345 - return !type.HasElementType && !type.IsConstructedGenericType && !type.IsGenericParameter; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern RuntimeType internal_from_name (string name, ref StackCrawlMark stackMark, Assembly callerAssembly, bool throwOnError, bool ignoreCase, bool reflectionOnly); - - internal static RuntimeType GetTypeByName (string typeName, bool throwOnError, bool ignoreCase, bool reflectionOnly, ref StackCrawlMark stackMark, - bool loadTypeFromPartialName) - { - if (typeName == null) - throw new ArgumentNullException ("typeName"); - - if (typeName == String.Empty) - if (throwOnError) - throw new TypeLoadException ("A null or zero length string does not represent a valid Type."); - else - return null; - - if (reflectionOnly) { - int idx = typeName.IndexOf (','); - if (idx < 0 || idx == 0 || idx == typeName.Length - 1) - throw new ArgumentException ("Assembly qualifed type name is required", "typeName"); - string an = typeName.Substring (idx + 1); - Assembly a; - try { - a = Assembly.ReflectionOnlyLoad (an); - } catch { - if (throwOnError) - throw; - return null; - } - return (RuntimeType)a.GetType (typeName.Substring (0, idx), throwOnError, ignoreCase); - } - - var t = internal_from_name (typeName, ref stackMark, null, throwOnError, ignoreCase, false); - if (throwOnError && t == null) - throw new TypeLoadException ("Error loading '" + typeName + "'"); - return t; - } - - internal static IntPtr[] CopyRuntimeTypeHandles (RuntimeTypeHandle[] inHandles, out int length) - { - if (inHandles == null || inHandles.Length == 0) { - length = 0; - return null; - } - - IntPtr[] outHandles = new IntPtr [inHandles.Length]; - for (int i = 0; i < inHandles.Length; i++) - outHandles [i] = inHandles [i].Value; - length = outHandles.Length; - return outHandles; - } - } + [Serializable] + public struct RuntimeTypeHandle : ISerializable + { + private readonly IntPtr value; + + internal RuntimeTypeHandle(IntPtr val) + { + value = val; + } + + internal RuntimeTypeHandle(RuntimeType type) + : this(type._impl.value) + { + } + + private RuntimeTypeHandle(SerializationInfo info, StreamingContext context) + { + throw new PlatformNotSupportedException(); + } + + public IntPtr Value + { + get + { + return value; + } + } + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + throw new PlatformNotSupportedException(); + } + + public override bool Equals(object? obj) + { + if (obj == null || GetType() != obj.GetType()) + return false; + + return value == ((RuntimeTypeHandle)obj).Value; + } + + public bool Equals(RuntimeTypeHandle handle) + { + return value == handle.Value; + } + + public override int GetHashCode() + { + return value.GetHashCode(); + } + + public static bool operator ==(RuntimeTypeHandle left, object right) + { + return (right != null) && (right is RuntimeTypeHandle) && left.Equals((RuntimeTypeHandle)right); + } + + public static bool operator !=(RuntimeTypeHandle left, object right) + { + return (right == null) || !(right is RuntimeTypeHandle) || !left.Equals((RuntimeTypeHandle)right); + } + + public static bool operator ==(object left, RuntimeTypeHandle right) + { + return (left != null) && (left is RuntimeTypeHandle) && ((RuntimeTypeHandle)left).Equals(right); + } + + public static bool operator !=(object left, RuntimeTypeHandle right) + { + return (left == null) || !(left is RuntimeTypeHandle) || !((RuntimeTypeHandle)left).Equals(right); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern TypeAttributes GetAttributes(RuntimeType type); + + public ModuleHandle GetModuleHandle() + { + // Although MS' runtime is crashing here, we prefer throwing an exception. + // The check is needed because Type.GetTypeFromHandle returns null + // for zero handles. + if (value == IntPtr.Zero) + throw new InvalidOperationException("Object fields may not be properly initialized"); + + return Type.GetTypeFromHandle(this).Module.ModuleHandle; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int GetMetadataToken(RuntimeType type); + + internal static int GetToken(RuntimeType type) + { + return GetMetadataToken(type); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern Type GetGenericTypeDefinition_impl(RuntimeType type); + + internal static Type GetGenericTypeDefinition(RuntimeType type) + { + return GetGenericTypeDefinition_impl(type); + } + + internal static bool IsPrimitive(RuntimeType type) + { + CorElementType corElemType = GetCorElementType(type); + return (corElemType >= CorElementType.ELEMENT_TYPE_BOOLEAN && corElemType <= CorElementType.ELEMENT_TYPE_R8) || + corElemType == CorElementType.ELEMENT_TYPE_I || + corElemType == CorElementType.ELEMENT_TYPE_U; + } + + internal static bool IsByRef(RuntimeType type) + { + CorElementType corElemType = GetCorElementType(type); + return corElemType == CorElementType.ELEMENT_TYPE_BYREF; + } + + internal static bool IsPointer(RuntimeType type) + { + CorElementType corElemType = GetCorElementType(type); + return corElemType == CorElementType.ELEMENT_TYPE_PTR; + } + + internal static bool IsArray(RuntimeType type) + { + CorElementType corElemType = GetCorElementType(type); + return corElemType == CorElementType.ELEMENT_TYPE_ARRAY || corElemType == CorElementType.ELEMENT_TYPE_SZARRAY; + } + + internal static bool IsSzArray(RuntimeType type) + { + CorElementType corElemType = GetCorElementType(type); + return corElemType == CorElementType.ELEMENT_TYPE_SZARRAY; + } + + internal static bool HasElementType(RuntimeType type) + { + CorElementType corElemType = GetCorElementType(type); + + return ((corElemType == CorElementType.ELEMENT_TYPE_ARRAY || corElemType == CorElementType.ELEMENT_TYPE_SZARRAY) // IsArray + || (corElemType == CorElementType.ELEMENT_TYPE_PTR) // IsPointer + || (corElemType == CorElementType.ELEMENT_TYPE_BYREF)); // IsByRef + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern CorElementType GetCorElementType(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern bool HasInstantiation(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern bool IsComObject(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern bool IsInstanceOfType(RuntimeType type, object o); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern bool HasReferences(RuntimeType type); + + internal static bool IsComObject(RuntimeType type, bool isGenericCOM) + { + return isGenericCOM ? false : IsComObject(type); + } + + internal static bool IsContextful(RuntimeType type) + { + return false; + } + + internal static bool IsEquivalentTo(RuntimeType rtType1, RuntimeType rtType2) + { + // refence check is done earlier and we don't recognize anything else + return false; + } + + internal static bool IsInterface(RuntimeType type) + { + return (type.Attributes & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern int GetArrayRank(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern RuntimeAssembly GetAssembly(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern RuntimeType GetElementType(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern RuntimeModule GetModule(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern bool IsGenericVariable(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern RuntimeType GetBaseType(RuntimeType type); + + internal static bool CanCastTo(RuntimeType type, RuntimeType target) + { + return type_is_assignable_from(target, type); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool type_is_assignable_from(Type a, Type b); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern bool IsGenericTypeDefinition(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern IntPtr GetGenericParameterInfo(RuntimeType type); + + internal static bool IsSubclassOf(RuntimeType childType, RuntimeType baseType) + { + return is_subclass_of(childType._impl.Value, baseType._impl.Value); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern bool is_subclass_of(IntPtr childType, IntPtr baseType); + + [PreserveDependency(".ctor()", "System.Runtime.CompilerServices.IsByRefLikeAttribute")] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern bool IsByRefLike(RuntimeType type); + + internal static bool IsTypeDefinition(RuntimeType type) + { + // That's how it has been done on CoreFX but we have no GetCorElementType method implementation + // see https://github.com/dotnet/coreclr/pull/11355 + + // CorElementType corElemType = GetCorElementType (type); + // if (!((corElemType >= CorElementType.Void && corElemType < CorElementType.Ptr) || + // corElemType == CorElementType.ValueType || + // corElemType == CorElementType.Class || + // corElemType == CorElementType.TypedByRef || + // corElemType == CorElementType.I || + // corElemType == CorElementType.U || + // corElemType == CorElementType.Object)) + // return false; + // if (HasInstantiation (type) && !IsGenericTypeDefinition (type)) + // return false; + // return true; + + // It's like a workaround mentioned in https://github.com/dotnet/corefx/issues/17345 + return !type.HasElementType && !type.IsConstructedGenericType && !type.IsGenericParameter; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern RuntimeType internal_from_name(string name, ref StackCrawlMark stackMark, Assembly callerAssembly, bool throwOnError, bool ignoreCase, bool reflectionOnly); + + internal static RuntimeType GetTypeByName(string typeName, bool throwOnError, bool ignoreCase, bool reflectionOnly, ref StackCrawlMark stackMark, + bool loadTypeFromPartialName) + { + if (typeName == null) + throw new ArgumentNullException(nameof(typeName)); + + if (typeName == string.Empty) + if (throwOnError) + throw new TypeLoadException("A null or zero length string does not represent a valid Type."); + else + return null; + + if (reflectionOnly) + { + int idx = typeName.IndexOf(','); + if (idx < 0 || idx == 0 || idx == typeName.Length - 1) + throw new ArgumentException("Assembly qualifed type name is required", nameof(typeName)); + string an = typeName.Substring(idx + 1); + Assembly a; + try + { + a = Assembly.ReflectionOnlyLoad(an); + } + catch + { + if (throwOnError) + throw; + return null; + } + return (RuntimeType)a.GetType(typeName.Substring(0, idx), throwOnError, ignoreCase); + } + + var t = internal_from_name(typeName, ref stackMark, null, throwOnError, ignoreCase, false); + if (throwOnError && t == null) + throw new TypeLoadException("Error loading '" + typeName + "'"); + return t; + } + + internal static IntPtr[] CopyRuntimeTypeHandles(RuntimeTypeHandle[] inHandles, out int length) + { + if (inHandles == null || inHandles.Length == 0) + { + length = 0; + return null; + } + + IntPtr[] outHandles = new IntPtr[inHandles.Length]; + for (int i = 0; i < inHandles.Length; i++) + outHandles[i] = inHandles[i].Value; + length = outHandles.Length; + return outHandles; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Security/DynamicSecurityMethodAttribute.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Security/DynamicSecurityMethodAttribute.cs index 83be902a2c59b..9948485969669 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Security/DynamicSecurityMethodAttribute.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Security/DynamicSecurityMethodAttribute.cs @@ -10,8 +10,8 @@ namespace System.Security // All methods that use StackCrawlMark should be marked with this attribute. This attribute // disables inlining of the calling method to allow stackwalking to find the exact caller. // - // This attribute used to indicate that the target method requires space for a security object - // to be allocated on the callers stack. It is not used for this purpose anymore because of security + // This attribute used to indicate that the target method requires space for a security object + // to be allocated on the callers stack. It is not used for this purpose anymore because of security // stackwalks are not ever done in CoreCLR. [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor, AllowMultiple = true, Inherited = false)] internal sealed class DynamicSecurityMethodAttribute : Attribute diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/String.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/String.Mono.cs index c103a1e8ac099..393efec176a24 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/String.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/String.Mono.cs @@ -7,138 +7,157 @@ namespace System { - partial class String - { - [Intrinsic] - public static readonly String Empty; - - public int Length { - [Intrinsic] - get => _stringLength; - } - - [IndexerName ("Chars")] - public char this [int index] { - [Intrinsic] - get => this [index]; - } - - public static String Intern (String str) - { - if (str == null) - throw new ArgumentNullException(nameof(str)); - - return InternalIntern (str); - } - - public static String IsInterned (String str) - { - if (str == null) - throw new ArgumentNullException(nameof(str)); - - return InternalIsInterned (str); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static String FastAllocateString (int length); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static String InternalIsInterned (String str); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static String InternalIntern (String str); - - // TODO: Should be pointing to Buffer instead - #region Runtime method-to-ir dependencies - - static unsafe void memset (byte *dest, int val, int len) - { - if (len < 8) { - while (len != 0) { - *dest = (byte)val; - ++dest; - --len; - } - return; - } - if (val != 0) { - val = val | (val << 8); - val = val | (val << 16); - } - // align to 4 - int rest = (int)dest & 3; - if (rest != 0) { - rest = 4 - rest; - len -= rest; - do { - *dest = (byte)val; - ++dest; - --rest; - } while (rest != 0); - } - while (len >= 16) { - ((int*)dest) [0] = val; - ((int*)dest) [1] = val; - ((int*)dest) [2] = val; - ((int*)dest) [3] = val; - dest += 16; - len -= 16; - } - while (len >= 4) { - ((int*)dest) [0] = val; - dest += 4; - len -= 4; - } - // tail bytes - while (len > 0) { - *dest = (byte)val; - dest++; - len--; - } - } - - static unsafe void memcpy (byte *dest, byte *src, int size) - { - Buffer.Memcpy (dest, src, size); - } - - /* Used by the runtime */ - internal static unsafe void bzero (byte *dest, int len) { - memset (dest, 0, len); - } - - internal static unsafe void bzero_aligned_1 (byte *dest, int len) { - ((byte*)dest) [0] = 0; - } - - internal static unsafe void bzero_aligned_2 (byte *dest, int len) { - ((short*)dest) [0] = 0; - } - - internal static unsafe void bzero_aligned_4 (byte *dest, int len) { - ((int*)dest) [0] = 0; - } - - internal static unsafe void bzero_aligned_8 (byte *dest, int len) { - ((long*)dest) [0] = 0; - } - - internal static unsafe void memcpy_aligned_1 (byte *dest, byte *src, int size) { - ((byte*)dest) [0] = ((byte*)src) [0]; - } - - internal static unsafe void memcpy_aligned_2 (byte *dest, byte *src, int size) { - ((short*)dest) [0] = ((short*)src) [0]; - } - - internal static unsafe void memcpy_aligned_4 (byte *dest, byte *src, int size) { - ((int*)dest) [0] = ((int*)src) [0]; - } - - internal static unsafe void memcpy_aligned_8 (byte *dest, byte *src, int size) { - ((long*)dest) [0] = ((long*)src) [0]; - } - - #endregion - } + public partial class String + { + [Intrinsic] + public static readonly string Empty; + + public int Length + { + [Intrinsic] + get => _stringLength; + } + + [IndexerName("Chars")] + public char this[int index] + { + [Intrinsic] + get => this[index]; + } + + public static string Intern(string str) + { + if (str == null) + throw new ArgumentNullException(nameof(str)); + + return InternalIntern(str); + } + + public static string IsInterned(string str) + { + if (str == null) + throw new ArgumentNullException(nameof(str)); + + return InternalIsInterned(str); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern string FastAllocateString(int length); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern string InternalIsInterned(string str); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern string InternalIntern(string str); + + // TODO: Should be pointing to Buffer instead + #region Runtime method-to-ir dependencies + + private static unsafe void memset(byte* dest, int val, int len) + { + if (len < 8) + { + while (len != 0) + { + *dest = (byte)val; + ++dest; + --len; + } + return; + } + if (val != 0) + { + val = val | (val << 8); + val = val | (val << 16); + } + // align to 4 + int rest = (int)dest & 3; + if (rest != 0) + { + rest = 4 - rest; + len -= rest; + do + { + *dest = (byte)val; + ++dest; + --rest; + } while (rest != 0); + } + while (len >= 16) + { + ((int*)dest)[0] = val; + ((int*)dest)[1] = val; + ((int*)dest)[2] = val; + ((int*)dest)[3] = val; + dest += 16; + len -= 16; + } + while (len >= 4) + { + ((int*)dest)[0] = val; + dest += 4; + len -= 4; + } + // tail bytes + while (len > 0) + { + *dest = (byte)val; + dest++; + len--; + } + } + + private static unsafe void memcpy(byte* dest, byte* src, int size) + { + Buffer.Memcpy(dest, src, size); + } + + /* Used by the runtime */ + internal static unsafe void bzero(byte* dest, int len) + { + memset(dest, 0, len); + } + + internal static unsafe void bzero_aligned_1(byte* dest, int len) + { + ((byte*)dest)[0] = 0; + } + + internal static unsafe void bzero_aligned_2(byte* dest, int len) + { + ((short*)dest)[0] = 0; + } + + internal static unsafe void bzero_aligned_4(byte* dest, int len) + { + ((int*)dest)[0] = 0; + } + + internal static unsafe void bzero_aligned_8(byte* dest, int len) + { + ((long*)dest)[0] = 0; + } + + internal static unsafe void memcpy_aligned_1(byte* dest, byte* src, int size) + { + ((byte*)dest)[0] = ((byte*)src)[0]; + } + + internal static unsafe void memcpy_aligned_2(byte* dest, byte* src, int size) + { + ((short*)dest)[0] = ((short*)src)[0]; + } + + internal static unsafe void memcpy_aligned_4(byte* dest, byte* src, int size) + { + ((int*)dest)[0] = ((int*)src)[0]; + } + + internal static unsafe void memcpy_aligned_8(byte* dest, byte* src, int size) + { + ((long*)dest)[0] = ((long*)src)[0]; + } + + #endregion + } } \ No newline at end of file diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/EventWaitHandle.Unix.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/EventWaitHandle.Unix.Mono.cs index 5318ecbfbdae2..7a776ee3232fd 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/EventWaitHandle.Unix.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/EventWaitHandle.Unix.Mono.cs @@ -7,85 +7,94 @@ namespace System.Threading { - partial class EventWaitHandle - { - public bool Set () - { - SafeWaitHandle handle = ValidateHandle (out bool release); - - try { - return SetEventInternal (handle.DangerousGetHandle ()); - } finally { - if (release) - handle.DangerousRelease (); - } - } - - public bool Reset () - { - SafeWaitHandle handle = ValidateHandle (out bool release); - - try { - return ResetEventInternal (handle.DangerousGetHandle ()); - } finally { - if (release) - handle.DangerousRelease (); - } - } - - unsafe void CreateEventCore (bool initialState, EventResetMode mode, string name, out bool createdNew) - { - if (name != null) - throw new PlatformNotSupportedException (SR.PlatformNotSupported_NamedSynchronizationPrimitives); - - SafeWaitHandle handle = new SafeWaitHandle (CreateEventInternal (mode == EventResetMode.ManualReset, initialState, null, 0, out int errorCode), ownsHandle: true); - if (errorCode != 0) - throw new NotImplementedException ("errorCode"); - SafeWaitHandle = handle; - - createdNew = true; - } - - static OpenExistingResult OpenExistingWorker (string name, out EventWaitHandle result) - { - throw new PlatformNotSupportedException (SR.PlatformNotSupported_NamedSynchronizationPrimitives); - } - - internal static bool Set (SafeWaitHandle waitHandle) - { - bool release = false; - try { - waitHandle.DangerousAddRef (ref release); - return SetEventInternal (waitHandle.DangerousGetHandle ()); - } finally { - if (release) - waitHandle.DangerousRelease (); - } - } - - SafeWaitHandle ValidateHandle (out bool success) - { - // The field value is modifiable via the public property, save it locally - // to ensure that one instance is used in all places in this method - SafeWaitHandle waitHandle = SafeWaitHandle; - if (waitHandle.IsInvalid) - { - throw new InvalidOperationException (); - } - - success = false; - waitHandle.DangerousAddRef (ref success); - return waitHandle; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - unsafe static extern IntPtr CreateEventInternal (bool manual, bool initialState, char *name, int name_length, out int errorCode); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern bool ResetEventInternal (IntPtr handle); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern bool SetEventInternal (IntPtr handle); - - } + public partial class EventWaitHandle + { + public bool Set() + { + SafeWaitHandle handle = ValidateHandle(out bool release); + + try + { + return SetEventInternal(handle.DangerousGetHandle()); + } + finally + { + if (release) + handle.DangerousRelease(); + } + } + + public bool Reset() + { + SafeWaitHandle handle = ValidateHandle(out bool release); + + try + { + return ResetEventInternal(handle.DangerousGetHandle()); + } + finally + { + if (release) + handle.DangerousRelease(); + } + } + + private unsafe void CreateEventCore(bool initialState, EventResetMode mode, string name, out bool createdNew) + { + if (name != null) + throw new PlatformNotSupportedException(SR.PlatformNotSupported_NamedSynchronizationPrimitives); + + SafeWaitHandle handle = new SafeWaitHandle(CreateEventInternal(mode == EventResetMode.ManualReset, initialState, null, 0, out int errorCode), ownsHandle: true); + if (errorCode != 0) + throw new NotImplementedException("errorCode"); + SafeWaitHandle = handle; + + createdNew = true; + } + + private static OpenExistingResult OpenExistingWorker(string name, out EventWaitHandle result) + { + throw new PlatformNotSupportedException(SR.PlatformNotSupported_NamedSynchronizationPrimitives); + } + + internal static bool Set(SafeWaitHandle waitHandle) + { + bool release = false; + try + { + waitHandle.DangerousAddRef(ref release); + return SetEventInternal(waitHandle.DangerousGetHandle()); + } + finally + { + if (release) + waitHandle.DangerousRelease(); + } + } + + private SafeWaitHandle ValidateHandle(out bool success) + { + // The field value is modifiable via the public property, save it locally + // to ensure that one instance is used in all places in this method + SafeWaitHandle waitHandle = SafeWaitHandle; + if (waitHandle.IsInvalid) + { + throw new InvalidOperationException(); + } + + success = false; + waitHandle.DangerousAddRef(ref success); + return waitHandle; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static unsafe extern IntPtr CreateEventInternal(bool manual, bool initialState, char* name, int name_length, out int errorCode); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool ResetEventInternal(IntPtr handle); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool SetEventInternal(IntPtr handle); + + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Interlocked.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Interlocked.Mono.cs index ff25f260c86e3..83cb71da108ce 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Interlocked.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Interlocked.Mono.cs @@ -8,158 +8,160 @@ namespace System.Threading { - public static partial class Interlocked - { - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static int CompareExchange (ref int location1, int value, int comparand); - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void CompareExchange (ref object location1, ref object value, ref object comparand, ref object result); - - [Intrinsic] - public static object CompareExchange (ref object location1, object value, object comparand) - { - // This avoids coop handles, esp. on the output which would be particularly inefficient. - // Passing everything by ref is equivalent to coop handles -- ref to locals at least. - // - // location1's treatment is unclear. But note that passing it by handle would be incorrect, - // as it would use a local alias, which the coop marshaling does, to avoid the unclarity here, - // that of a ref being to a managed frame vs. a native frame. Perhaps that could be revisited. - // - // So there a hole here, that of calling this function with location1 being in a native frame. - // Usually it will be to a field, static or not, and not even to managed stack. - // - // This is usually intrinsified. Ideally it is always intrinisified. - // - object result = null; - CompareExchange (ref location1, ref value, ref comparand, ref result); - return result; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public extern static float CompareExchange (ref float location1, float value, float comparand); - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static int Decrement (ref int location); - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static long Decrement (ref long location); - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static int Increment (ref int location); - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static long Increment (ref long location); - - [Intrinsic] - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public extern static int Exchange (ref int location1, int value); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static void Exchange (ref object location1, ref object value, ref object result); - - public static object Exchange (ref object location1, object value) - { - // See CompareExchange(object) for comments. - object result = null; - Exchange (ref location1, ref value, ref result); - return result; - } - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static float Exchange (ref float location1, float value); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public extern static long CompareExchange (ref long location1, long value, long comparand); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public extern static IntPtr CompareExchange (ref IntPtr location1, IntPtr value, IntPtr comparand); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public extern static double CompareExchange (ref double location1, double value, double comparand); - - [return: NotNullIfNotNull("location1")] - [Intrinsic] - public static T CompareExchange (ref T location1, T value, T comparand) where T : class? - { - unsafe { - if (Unsafe.AsPointer (ref location1) == null) - throw new NullReferenceException (); - } - // Besides avoiding coop handles for efficiency, - // and correctness, this also appears needed to - // avoid an assertion failure in the runtime, related to - // coop handles over generics. - // - // See CompareExchange(object) for comments. - // - // This is not entirely convincing due to lack of volatile. - // + public static partial class Interlocked + { + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern int CompareExchange(ref int location1, int value, int comparand); + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void CompareExchange(ref object location1, ref object value, ref object comparand, ref object result); + + [Intrinsic] + public static object CompareExchange(ref object location1, object value, object comparand) + { + // This avoids coop handles, esp. on the output which would be particularly inefficient. + // Passing everything by ref is equivalent to coop handles -- ref to locals at least. + // + // location1's treatment is unclear. But note that passing it by handle would be incorrect, + // as it would use a local alias, which the coop marshaling does, to avoid the unclarity here, + // that of a ref being to a managed frame vs. a native frame. Perhaps that could be revisited. + // + // So there a hole here, that of calling this function with location1 being in a native frame. + // Usually it will be to a field, static or not, and not even to managed stack. + // + // This is usually intrinsified. Ideally it is always intrinisified. + // + object result = null; + CompareExchange(ref location1, ref value, ref comparand, ref result); + return result; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern float CompareExchange(ref float location1, float value, float comparand); + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern int Decrement(ref int location); + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern long Decrement(ref long location); + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern int Increment(ref int location); + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern long Increment(ref long location); + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern int Exchange(ref int location1, int value); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void Exchange(ref object location1, ref object value, ref object result); + + public static object Exchange(ref object location1, object value) + { + // See CompareExchange(object) for comments. + object result = null; + Exchange(ref location1, ref value, ref result); + return result; + } + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern float Exchange(ref float location1, float value); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern long CompareExchange(ref long location1, long value, long comparand); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern IntPtr CompareExchange(ref IntPtr location1, IntPtr value, IntPtr comparand); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern double CompareExchange(ref double location1, double value, double comparand); + + [return: NotNullIfNotNull("location1")] + [Intrinsic] + public static T CompareExchange(ref T location1, T value, T comparand) where T : class? + { + unsafe + { + if (Unsafe.AsPointer(ref location1) == null) + throw new NullReferenceException(); + } + // Besides avoiding coop handles for efficiency, + // and correctness, this also appears needed to + // avoid an assertion failure in the runtime, related to + // coop handles over generics. + // + // See CompareExchange(object) for comments. + // + // This is not entirely convincing due to lack of volatile. + // #pragma warning disable 8654 // null problems; is there another way? - T result = null; + T result = null; #pragma warning restore 8654 - // T : class so call the object overload. - CompareExchange (ref Unsafe.As (ref location1), ref Unsafe.As(ref value), ref Unsafe.As(ref comparand), ref Unsafe.As(ref result)); - return result; - } - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static long Exchange (ref long location1, long value); - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static IntPtr Exchange (ref IntPtr location1, IntPtr value); - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static double Exchange (ref double location1, double value); - - [return: NotNullIfNotNull("location1")] - [Intrinsic] - public static T Exchange (ref T location1, T value) where T : class? - { - unsafe { - if (Unsafe.AsPointer (ref location1) == null) - throw new NullReferenceException (); - } - // See CompareExchange(T) for comments. - // - // This is not entirely convincing due to lack of volatile. - // + // T : class so call the object overload. + CompareExchange(ref Unsafe.As(ref location1), ref Unsafe.As(ref value), ref Unsafe.As(ref comparand), ref Unsafe.As(ref result)); + return result; + } + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern long Exchange(ref long location1, long value); + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern IntPtr Exchange(ref IntPtr location1, IntPtr value); + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern double Exchange(ref double location1, double value); + + [return: NotNullIfNotNull("location1")] + [Intrinsic] + public static T Exchange(ref T location1, T value) where T : class? + { + unsafe + { + if (Unsafe.AsPointer(ref location1) == null) + throw new NullReferenceException(); + } + // See CompareExchange(T) for comments. + // + // This is not entirely convincing due to lack of volatile. + // #pragma warning disable 8654 // null problems; is there another way? - T result = null; + T result = null; #pragma warning restore 8654 - // T : class so call the object overload. - Exchange (ref Unsafe.As(ref location1), ref Unsafe.As(ref value), ref Unsafe.As(ref result)); - return result; - } - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static long Read (ref long location); - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static int Add (ref int location1, int value); - - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static long Add (ref long location1, long value); - - [Intrinsic] - public static void MemoryBarrier () - { - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - public extern static void MemoryBarrierProcessWide (); - } + // T : class so call the object overload. + Exchange(ref Unsafe.As(ref location1), ref Unsafe.As(ref value), ref Unsafe.As(ref result)); + return result; + } + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern long Read(ref long location); + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern int Add(ref int location1, int value); + + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern long Add(ref long location1, long value); + + [Intrinsic] + public static void MemoryBarrier() + { + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern void MemoryBarrierProcessWide(); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Unix.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Unix.Mono.cs index 440ae938d44cd..cf664501d7e7f 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Unix.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Unix.Mono.cs @@ -6,41 +6,41 @@ namespace System.Threading { - internal unsafe sealed partial class LowLevelLifoSemaphore : IDisposable - { - IntPtr lifo_semaphore; - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static IntPtr InitInternal (); - - private void Create (int maximumSignalCount) - { - lifo_semaphore = InitInternal (); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void DeleteInternal (IntPtr semaphore); - - public void Dispose () - { - DeleteInternal (lifo_semaphore); - lifo_semaphore = IntPtr.Zero; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static int TimedWaitInternal (IntPtr semaphore, int timeoutMs); - - private bool WaitCore (int timeoutMs) - { - return TimedWaitInternal (lifo_semaphore, timeoutMs) != 0; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void ReleaseInternal (IntPtr semaphore, int count); - - private void ReleaseCore (int count) - { - ReleaseInternal (lifo_semaphore, count); - } - } + internal unsafe sealed partial class LowLevelLifoSemaphore : IDisposable + { + private IntPtr lifo_semaphore; + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern IntPtr InitInternal(); + + private void Create(int maximumSignalCount) + { + lifo_semaphore = InitInternal(); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void DeleteInternal(IntPtr semaphore); + + public void Dispose() + { + DeleteInternal(lifo_semaphore); + lifo_semaphore = IntPtr.Zero; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int TimedWaitInternal(IntPtr semaphore, int timeoutMs); + + private bool WaitCore(int timeoutMs) + { + return TimedWaitInternal(lifo_semaphore, timeoutMs) != 0; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void ReleaseInternal(IntPtr semaphore, int count); + + private void ReleaseCore(int count) + { + ReleaseInternal(lifo_semaphore, count); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelLock.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelLock.cs index d2fc5cfedebc5..c6036e64110fc 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelLock.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelLock.cs @@ -6,36 +6,36 @@ namespace System.Threading { - // This class provides implementation of uninterruptible lock for internal - // use by thread pool. - internal class LowLevelLock : IDisposable - { - public void Dispose () - { - } + // This class provides implementation of uninterruptible lock for internal + // use by thread pool. + internal class LowLevelLock : IDisposable + { + public void Dispose() + { + } - public bool TryAcquire() - { - bool lockTaken = false; - Monitor.try_enter_with_atomic_var (this, 0, false, ref lockTaken); - return lockTaken; - } + public bool TryAcquire() + { + bool lockTaken = false; + Monitor.try_enter_with_atomic_var(this, 0, false, ref lockTaken); + return lockTaken; + } - public void Acquire() - { - bool lockTaken = false; - Monitor.try_enter_with_atomic_var (this, Timeout.Infinite, false, ref lockTaken); - } + public void Acquire() + { + bool lockTaken = false; + Monitor.try_enter_with_atomic_var(this, Timeout.Infinite, false, ref lockTaken); + } - public void Release() - { - Monitor.Exit (this); - } + public void Release() + { + Monitor.Exit(this); + } - [Conditional("DEBUG")] - public void VerifyIsLocked() - { - Debug.Assert (Monitor.IsEntered (this)); - } - } + [Conditional("DEBUG")] + public void VerifyIsLocked() + { + Debug.Assert(Monitor.IsEntered(this)); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelSpinWaiter.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelSpinWaiter.cs index f5d5222376811..dcb71844331c5 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelSpinWaiter.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/LowLevelSpinWaiter.cs @@ -6,50 +6,51 @@ namespace System.Threading { - internal struct LowLevelSpinWaiter - { - public static void Wait (int spinIndex, int sleep0Threshold, int processorCount) - { - Debug.Assert (spinIndex >= 0); - Debug.Assert (sleep0Threshold >= 0); + internal struct LowLevelSpinWaiter + { + public static void Wait(int spinIndex, int sleep0Threshold, int processorCount) + { + Debug.Assert(spinIndex >= 0); + Debug.Assert(sleep0Threshold >= 0); - // Wait - // - // (spinIndex - Sleep0Threshold) % 2 != 0: The purpose of this check is to interleave Thread.Yield/Sleep(0) with - // Thread.SpinWait. Otherwise, the following issues occur: - // - When there are no threads to switch to, Yield and Sleep(0) become no-op and it turns the spin loop into a - // busy-spin that may quickly reach the max spin count and cause the thread to enter a wait state. Completing the - // spin loop too early can cause excessive context switcing from the wait. - // - If there are multiple threads doing Yield and Sleep(0) (typically from the same spin loop due to contention), - // they may switch between one another, delaying work that can make progress. - if (processorCount > 1 && (spinIndex < sleep0Threshold || (spinIndex - sleep0Threshold) % 2 != 0)) { - // Cap the maximum spin count to a value such that many thousands of CPU cycles would not be wasted doing - // the equivalent of YieldProcessor(), as that that point SwitchToThread/Sleep(0) are more likely to be able to - // allow other useful work to run. Long YieldProcessor() loops can help to reduce contention, but Sleep(1) is - // usually better for that. - // - // Thread.OptimalMaxSpinWaitsPerSpinIteration: - // - See Thread::InitializeYieldProcessorNormalized(), which describes and calculates this value. - // - int n = Thread.OptimalMaxSpinWaitsPerSpinIteration; - if (spinIndex <= 30 && (1 << spinIndex) < n) - { - n = 1 << spinIndex; - } - Thread.SpinWait (n); - return; - } + // Wait + // + // (spinIndex - Sleep0Threshold) % 2 != 0: The purpose of this check is to interleave Thread.Yield/Sleep(0) with + // Thread.SpinWait. Otherwise, the following issues occur: + // - When there are no threads to switch to, Yield and Sleep(0) become no-op and it turns the spin loop into a + // busy-spin that may quickly reach the max spin count and cause the thread to enter a wait state. Completing the + // spin loop too early can cause excessive context switcing from the wait. + // - If there are multiple threads doing Yield and Sleep(0) (typically from the same spin loop due to contention), + // they may switch between one another, delaying work that can make progress. + if (processorCount > 1 && (spinIndex < sleep0Threshold || (spinIndex - sleep0Threshold) % 2 != 0)) + { + // Cap the maximum spin count to a value such that many thousands of CPU cycles would not be wasted doing + // the equivalent of YieldProcessor(), as that that point SwitchToThread/Sleep(0) are more likely to be able to + // allow other useful work to run. Long YieldProcessor() loops can help to reduce contention, but Sleep(1) is + // usually better for that. + // + // Thread.OptimalMaxSpinWaitsPerSpinIteration: + // - See Thread::InitializeYieldProcessorNormalized(), which describes and calculates this value. + // + int n = Thread.OptimalMaxSpinWaitsPerSpinIteration; + if (spinIndex <= 30 && (1 << spinIndex) < n) + { + n = 1 << spinIndex; + } + Thread.SpinWait(n); + return; + } - // Thread.Sleep(int) is interruptible. The current operation may not allow thread interrupt - // (for instance, LowLevelLock.Acquire as part of EventWaitHandle.Set). Use the - // uninterruptible version of Sleep(0). Not doing Thread.Yield, it does not seem to have any - // benefit over Sleep(0). - Thread.UninterruptibleSleep0 (); + // Thread.Sleep(int) is interruptible. The current operation may not allow thread interrupt + // (for instance, LowLevelLock.Acquire as part of EventWaitHandle.Set). Use the + // uninterruptible version of Sleep(0). Not doing Thread.Yield, it does not seem to have any + // benefit over Sleep(0). + Thread.UninterruptibleSleep0(); - // Don't want to Sleep(1) in this spin wait: - // - Don't want to spin for that long, since a proper wait will follow when the spin wait fails - // - Sleep(1) would put the thread into a wait state, and a proper wait will follow when the spin wait fails - // anyway (the intended use for this class), so it's preferable to put the thread into the proper wait state - } - } + // Don't want to Sleep(1) in this spin wait: + // - Don't want to spin for that long, since a proper wait will follow when the spin wait fails + // - Sleep(1) would put the thread into a wait state, and a proper wait will follow when the spin wait fails + // anyway (the intended use for this class), so it's preferable to put the thread into the proper wait state + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Monitor.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Monitor.cs index 5c94a164ca7d8..21b8c873a18f6 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Monitor.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Monitor.cs @@ -6,173 +6,174 @@ namespace System.Threading { - public static class Monitor - { - [Intrinsic] - [MethodImplAttribute (MethodImplOptions.InternalCall)] // Interpreter is missing this intrinsic - public static void Enter (object obj) => Enter (obj); - - [Intrinsic] - public static void Enter (object obj, ref bool lockTaken) - { - // TODO: Interpreter is missing this intrinsic - if (lockTaken) - throw new ArgumentException (SR.Argument_MustBeFalse, nameof (lockTaken)); - - ReliableEnterTimeout (obj, (int) Timeout.Infinite, ref lockTaken); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public static extern void Exit (object obj); - - public static bool TryEnter (object obj) - { - bool lockTaken = false; - TryEnter (obj, 0, ref lockTaken); - return lockTaken; - } - - public static void TryEnter (object obj, ref bool lockTaken) - { - if (lockTaken) - throw new ArgumentException (SR.Argument_MustBeFalse, nameof (lockTaken)); - - ReliableEnterTimeout (obj, 0, ref lockTaken); - } - - public static bool TryEnter (object obj, int millisecondsTimeout) - { - bool lockTaken = false; - TryEnter (obj, millisecondsTimeout, ref lockTaken); - return lockTaken; - } - - static int MillisecondsTimeoutFromTimeSpan (TimeSpan timeout) - { - long tm = (long) timeout.TotalMilliseconds; - if (tm < -1 || tm > (long) int.MaxValue) - throw new ArgumentOutOfRangeException (nameof (timeout), SR.ArgumentOutOfRange_NeedNonNegOrNegative1); - return (int) tm; - } - - public static bool TryEnter (object obj, TimeSpan timeout) - { - return TryEnter (obj, MillisecondsTimeoutFromTimeSpan (timeout)); - } - - public static void TryEnter (object obj, int millisecondsTimeout, ref bool lockTaken) - { - if (lockTaken) - throw new ArgumentException (SR.Argument_MustBeFalse, nameof (lockTaken)); - ReliableEnterTimeout (obj, millisecondsTimeout, ref lockTaken); - } - - public static void TryEnter(object obj, TimeSpan timeout, ref bool lockTaken) - { - if (lockTaken) - throw new ArgumentException (SR.Argument_MustBeFalse, nameof (lockTaken)); - ReliableEnterTimeout (obj, MillisecondsTimeoutFromTimeSpan (timeout), ref lockTaken); - } - - public static bool IsEntered (object obj) - { - if (obj == null) - throw new ArgumentNullException (nameof (obj)); - return IsEnteredNative (obj); - } - - public static bool Wait (object obj, int millisecondsTimeout, bool exitContext) - { - if (obj == null) - throw new ArgumentNullException (nameof (obj)); - return ObjWait (exitContext, millisecondsTimeout, obj); - } - - public static bool Wait (object obj, TimeSpan timeout, bool exitContext) => Wait (obj, MillisecondsTimeoutFromTimeSpan (timeout), exitContext); - - public static bool Wait (object obj, int millisecondsTimeout) => Wait (obj, millisecondsTimeout, false); - - public static bool Wait(object obj, TimeSpan timeout) => Wait (obj, MillisecondsTimeoutFromTimeSpan (timeout), false); - - public static bool Wait(object obj) => Wait (obj, Timeout.Infinite, false); - - public static void Pulse (object obj) - { - if (obj == null) - throw new ArgumentNullException (nameof (obj)); - ObjPulse (obj); - } - - public static void PulseAll (object obj) - { - if (obj == null) - throw new ArgumentNullException (nameof (obj)); - ObjPulseAll (obj); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static bool Monitor_test_synchronised (object obj); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void Monitor_pulse (object obj); - - static void ObjPulse (object obj) - { - if (!Monitor_test_synchronised (obj)) - throw new SynchronizationLockException ("Object is not synchronized"); - - Monitor_pulse (obj); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void Monitor_pulse_all (object obj); - - static void ObjPulseAll (object obj) - { - if (!Monitor_test_synchronised (obj)) - throw new SynchronizationLockException ("Object is not synchronized"); - - Monitor_pulse_all (obj); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static bool Monitor_wait (object obj, int ms, bool allowInterruption); - - static bool ObjWait (bool exitContext, int millisecondsTimeout, object obj) - { - if (millisecondsTimeout < 0 && millisecondsTimeout != (int) Timeout.Infinite) - throw new ArgumentOutOfRangeException ("millisecondsTimeout"); - if (!Monitor_test_synchronised (obj)) - throw new SynchronizationLockException ("Object is not synchronized"); - - return Monitor_wait (obj, millisecondsTimeout, true); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal extern static void try_enter_with_atomic_var (object obj, int millisecondsTimeout, bool allowInterruption, ref bool lockTaken); - - static void ReliableEnterTimeout (object obj, int timeout, ref bool lockTaken) - { - if (obj == null) - throw new ArgumentNullException (nameof (obj)); - - if (timeout < 0 && timeout != (int) Timeout.Infinite) - throw new ArgumentOutOfRangeException (nameof (timeout)); - - try_enter_with_atomic_var (obj, timeout, true, ref lockTaken); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static bool Monitor_test_owner (object obj); - - static bool IsEnteredNative (object obj) - { - return Monitor_test_owner (obj); - } - - public extern static long LockContentionCount { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } - } + public static class Monitor + { + [Intrinsic] + [MethodImplAttribute(MethodImplOptions.InternalCall)] // Interpreter is missing this intrinsic + public static void Enter(object obj) => Enter(obj); + + [Intrinsic] + public static void Enter(object obj, ref bool lockTaken) + { + // TODO: Interpreter is missing this intrinsic + if (lockTaken) + throw new ArgumentException(SR.Argument_MustBeFalse, nameof(lockTaken)); + + ReliableEnterTimeout(obj, (int)Timeout.Infinite, ref lockTaken); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public static extern void Exit(object obj); + + public static bool TryEnter(object obj) + { + bool lockTaken = false; + TryEnter(obj, 0, ref lockTaken); + return lockTaken; + } + + public static void TryEnter(object obj, ref bool lockTaken) + { + if (lockTaken) + throw new ArgumentException(SR.Argument_MustBeFalse, nameof(lockTaken)); + + ReliableEnterTimeout(obj, 0, ref lockTaken); + } + + public static bool TryEnter(object obj, int millisecondsTimeout) + { + bool lockTaken = false; + TryEnter(obj, millisecondsTimeout, ref lockTaken); + return lockTaken; + } + + private static int MillisecondsTimeoutFromTimeSpan(TimeSpan timeout) + { + long tm = (long)timeout.TotalMilliseconds; + if (tm < -1 || tm > (long)int.MaxValue) + throw new ArgumentOutOfRangeException(nameof(timeout), SR.ArgumentOutOfRange_NeedNonNegOrNegative1); + return (int)tm; + } + + public static bool TryEnter(object obj, TimeSpan timeout) + { + return TryEnter(obj, MillisecondsTimeoutFromTimeSpan(timeout)); + } + + public static void TryEnter(object obj, int millisecondsTimeout, ref bool lockTaken) + { + if (lockTaken) + throw new ArgumentException(SR.Argument_MustBeFalse, nameof(lockTaken)); + ReliableEnterTimeout(obj, millisecondsTimeout, ref lockTaken); + } + + public static void TryEnter(object obj, TimeSpan timeout, ref bool lockTaken) + { + if (lockTaken) + throw new ArgumentException(SR.Argument_MustBeFalse, nameof(lockTaken)); + ReliableEnterTimeout(obj, MillisecondsTimeoutFromTimeSpan(timeout), ref lockTaken); + } + + public static bool IsEntered(object obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + return IsEnteredNative(obj); + } + + public static bool Wait(object obj, int millisecondsTimeout, bool exitContext) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + return ObjWait(exitContext, millisecondsTimeout, obj); + } + + public static bool Wait(object obj, TimeSpan timeout, bool exitContext) => Wait(obj, MillisecondsTimeoutFromTimeSpan(timeout), exitContext); + + public static bool Wait(object obj, int millisecondsTimeout) => Wait(obj, millisecondsTimeout, false); + + public static bool Wait(object obj, TimeSpan timeout) => Wait(obj, MillisecondsTimeoutFromTimeSpan(timeout), false); + + public static bool Wait(object obj) => Wait(obj, Timeout.Infinite, false); + + public static void Pulse(object obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + ObjPulse(obj); + } + + public static void PulseAll(object obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + ObjPulseAll(obj); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool Monitor_test_synchronised(object obj); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void Monitor_pulse(object obj); + + private static void ObjPulse(object obj) + { + if (!Monitor_test_synchronised(obj)) + throw new SynchronizationLockException("Object is not synchronized"); + + Monitor_pulse(obj); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void Monitor_pulse_all(object obj); + + private static void ObjPulseAll(object obj) + { + if (!Monitor_test_synchronised(obj)) + throw new SynchronizationLockException("Object is not synchronized"); + + Monitor_pulse_all(obj); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern bool Monitor_wait(object obj, int ms, bool allowInterruption); + + private static bool ObjWait(bool exitContext, int millisecondsTimeout, object obj) + { + if (millisecondsTimeout < 0 && millisecondsTimeout != (int)Timeout.Infinite) + throw new ArgumentOutOfRangeException(nameof(millisecondsTimeout)); + if (!Monitor_test_synchronised(obj)) + throw new SynchronizationLockException("Object is not synchronized"); + + return Monitor_wait(obj, millisecondsTimeout, true); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern void try_enter_with_atomic_var(object obj, int millisecondsTimeout, bool allowInterruption, ref bool lockTaken); + + private static void ReliableEnterTimeout(object obj, int timeout, ref bool lockTaken) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + if (timeout < 0 && timeout != (int)Timeout.Infinite) + throw new ArgumentOutOfRangeException(nameof(timeout)); + + try_enter_with_atomic_var(obj, timeout, true, ref lockTaken); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool Monitor_test_owner(object obj); + + private static bool IsEnteredNative(object obj) + { + return Monitor_test_owner(obj); + } + + public static extern long LockContentionCount + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Mutex.Unix.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Mutex.Unix.Mono.cs index d5065da354743..c12d39928c2b1 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Mutex.Unix.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Mutex.Unix.Mono.cs @@ -7,66 +7,73 @@ namespace System.Threading { - partial class Mutex - { - Mutex (IntPtr handle) => Handle = handle; + public partial class Mutex + { + private Mutex(IntPtr handle) => Handle = handle; - public void ReleaseMutex () - { - if (!ReleaseMutex_internal (Handle)) - throw new ApplicationException (SR.Arg_SynchronizationLockException); - } + public void ReleaseMutex() + { + if (!ReleaseMutex_internal(Handle)) + throw new ApplicationException(SR.Arg_SynchronizationLockException); + } - void CreateMutexCore (bool initiallyOwned, string name, out bool createdNew) => - Handle = CreateMutex_internal (initiallyOwned, name, out createdNew); + private void CreateMutexCore(bool initiallyOwned, string name, out bool createdNew) => + Handle = CreateMutex_internal(initiallyOwned, name, out createdNew); - unsafe static IntPtr CreateMutex_internal (bool initiallyOwned, string name, out bool created) - { - fixed (char *fixed_name = name) - return CreateMutex_icall (initiallyOwned, fixed_name, - name?.Length ?? 0, out created); - } + private static unsafe IntPtr CreateMutex_internal(bool initiallyOwned, string name, out bool created) + { + fixed (char* fixed_name = name) + return CreateMutex_icall(initiallyOwned, fixed_name, + name?.Length ?? 0, out created); + } - static OpenExistingResult OpenExistingWorker (string name, out Mutex result) - { - if (name == null) - throw new ArgumentNullException (nameof (name)); + private static OpenExistingResult OpenExistingWorker(string name, out Mutex result) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); - result = null; - if ((name.Length == 0) || - (name.Length > 260)) { - return OpenExistingResult.NameInvalid; - } - - MonoIOError error; - IntPtr handle = OpenMutex_internal (name, out error); - if (handle == IntPtr.Zero) { - if (error == MonoIOError.ERROR_FILE_NOT_FOUND) { - return OpenExistingResult.NameNotFound; - } else if (error == MonoIOError.ERROR_ACCESS_DENIED) { - throw new UnauthorizedAccessException (); - } else { - return OpenExistingResult.PathNotFound; - } - } - - result = new Mutex (handle); - return OpenExistingResult.Success; - } + result = null; + if ((name.Length == 0) || + (name.Length > 260)) + { + return OpenExistingResult.NameInvalid; + } - unsafe static IntPtr OpenMutex_internal (string name, out MonoIOError error) - { - fixed (char *fixed_name = name) - return OpenMutex_icall (fixed_name, name?.Length ?? 0, 0x000001 /* MutexRights.Modify */, out error); - } + MonoIOError error; + IntPtr handle = OpenMutex_internal(name, out error); + if (handle == IntPtr.Zero) + { + if (error == MonoIOError.ERROR_FILE_NOT_FOUND) + { + return OpenExistingResult.NameNotFound; + } + else if (error == MonoIOError.ERROR_ACCESS_DENIED) + { + throw new UnauthorizedAccessException(); + } + else + { + return OpenExistingResult.PathNotFound; + } + } - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private unsafe static extern IntPtr CreateMutex_icall (bool initiallyOwned, char *name, int name_length, out bool created); + result = new Mutex(handle); + return OpenExistingResult.Success; + } - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private unsafe static extern IntPtr OpenMutex_icall (char *name, int name_length, int rights, out MonoIOError error); + private static unsafe IntPtr OpenMutex_internal(string name, out MonoIOError error) + { + fixed (char* fixed_name = name) + return OpenMutex_icall(fixed_name, name?.Length ?? 0, 0x000001 /* MutexRights.Modify */, out error); + } - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern bool ReleaseMutex_internal (IntPtr handle); - } + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static unsafe extern IntPtr CreateMutex_icall(bool initiallyOwned, char* name, int name_length, out bool created); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static unsafe extern IntPtr OpenMutex_icall(char* name, int name_length, int rights, out MonoIOError error); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool ReleaseMutex_internal(IntPtr handle); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Overlapped.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Overlapped.cs index 321207172d4e8..ff37e273e4976 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Overlapped.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Overlapped.cs @@ -14,7 +14,7 @@ internal unsafe class _IOCompletionCallback private IOCompletionCallback _ioCompletionCallback; private ExecutionContext _executionContext; private uint _errorCode; // Error code - private uint _numBytes; // No. of bytes transferred + private uint _numBytes; // No. of bytes transferred private NativeOverlapped* _pNativeOverlapped; internal _IOCompletionCallback(IOCompletionCallback ioCompletionCallback, ExecutionContext executionContext) @@ -71,7 +71,7 @@ internal unsafe sealed class OverlappedData internal object _callback; // IOCompletionCallback or _IOCompletionCallback internal Overlapped _overlapped; private object _userObject; - private NativeOverlapped * _pNativeOverlapped; + private NativeOverlapped* _pNativeOverlapped; private IntPtr _eventHandle; private int _offsetLow; private int _offsetHigh; @@ -141,9 +141,9 @@ internal unsafe sealed class OverlappedData } //CORERT: NativeOverlapped* pNativeOverlapped = (NativeOverlapped*)Interop.MemAlloc((UIntPtr)(sizeof(NativeOverlapped) + sizeof(GCHandle))); - NativeOverlapped* pNativeOverlapped = (NativeOverlapped*) Marshal.AllocHGlobal((IntPtr) (sizeof(NativeOverlapped) + sizeof(GCHandle))); + NativeOverlapped* pNativeOverlapped = (NativeOverlapped*)Marshal.AllocHGlobal((IntPtr)(sizeof(NativeOverlapped) + sizeof(GCHandle))); - *(GCHandle*)(pNativeOverlapped + 1) = default(GCHandle); + *(GCHandle*)(pNativeOverlapped + 1) = default; _pNativeOverlapped = pNativeOverlapped; _pNativeOverlapped->InternalLow = default; @@ -166,7 +166,7 @@ internal unsafe sealed class OverlappedData internal static unsafe void FreeNativeOverlapped(NativeOverlapped* nativeOverlappedPtr) { - OverlappedData overlappedData = OverlappedData.GetOverlappedFromNative(nativeOverlappedPtr); + OverlappedData overlappedData = GetOverlappedFromNative(nativeOverlappedPtr); overlappedData.FreeNativeOverlapped(); } @@ -263,8 +263,8 @@ public IntPtr EventHandleIntPtr /*==================================================================== * Packs a managed overlapped class into native Overlapped struct. - * Roots the iocb and stores it in the ReservedCOR field of native Overlapped - * Pins the native Overlapped struct and returns the pinned index. + * Roots the iocb and stores it in the ReservedCOR field of native Overlapped + * Pins the native Overlapped struct and returns the pinned index. ====================================================================*/ [Obsolete("This method is not safe. Use Pack (iocb, userData) instead. http://go.microsoft.com/fwlink/?linkid=14202")] [CLSCompliant(false)] @@ -293,7 +293,7 @@ public IntPtr EventHandleIntPtr } /*==================================================================== - * Unpacks an unmanaged native Overlapped struct. + * Unpacks an unmanaged native Overlapped struct. * Unpins the native Overlapped struct ====================================================================*/ [CLSCompliant(false)] diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/PreAllocatedOverlapped.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/PreAllocatedOverlapped.cs index 580bda2b692d3..25e3d4cb4a4b1 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/PreAllocatedOverlapped.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/PreAllocatedOverlapped.cs @@ -4,10 +4,10 @@ namespace System.Threading { - public sealed class PreAllocatedOverlapped : System.IDisposable - { - [System.CLSCompliantAttribute(false)] - public PreAllocatedOverlapped(System.Threading.IOCompletionCallback callback, object state, object pinData) { } - public void Dispose() { } - } + public sealed class PreAllocatedOverlapped : System.IDisposable + { + [System.CLSCompliantAttribute(false)] + public PreAllocatedOverlapped(System.Threading.IOCompletionCallback callback, object state, object pinData) { } + public void Dispose() { } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Semaphore.Unix.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Semaphore.Unix.Mono.cs index fe0426cb510ed..c9f5b56240c82 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Semaphore.Unix.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Semaphore.Unix.Mono.cs @@ -8,95 +8,98 @@ namespace System.Threading { - partial class Semaphore - { - const int MAX_PATH = 260; - - Semaphore (SafeWaitHandle handle) => this.SafeWaitHandle = handle; - - int ReleaseCore (int releaseCount) - { - if (!ReleaseSemaphore_internal (SafeWaitHandle.DangerousGetHandle (), releaseCount, out int previousCount)) - throw new SemaphoreFullException (); - - return previousCount; - } - - static OpenExistingResult OpenExistingWorker (string name, out Semaphore result) - { - if (name == null) - throw new ArgumentNullException (nameof (name)); - - if (name.Length == 0) - throw new ArgumentException (SR.Argument_StringZeroLength, nameof (name)); - - if (name.Length > MAX_PATH) - throw new ArgumentException (SR.Argument_WaitHandleNameTooLong); - - var myHandle = new SafeWaitHandle (OpenSemaphore_internal (name, - /*SemaphoreRights.Modify | SemaphoreRights.Synchronize*/ 0x000002 | 0x100000, - out MonoIOError errorCode), true); - - if (myHandle.IsInvalid) { - result = null; - switch (errorCode) { - case MonoIOError.ERROR_FILE_NOT_FOUND: - case MonoIOError.ERROR_INVALID_NAME: - return OpenExistingResult.NameNotFound; - case MonoIOError.ERROR_PATH_NOT_FOUND: - return OpenExistingResult.PathNotFound; - case MonoIOError.ERROR_INVALID_HANDLE when !string.IsNullOrEmpty (name): - return OpenExistingResult.NameInvalid; - default: - //this is for passed through NativeMethods Errors - throw new IOException ($"Unknown Error '{errorCode}'"); - } - } - - result = new Semaphore (myHandle); - return OpenExistingResult.Success; - } - - void CreateSemaphoreCore (int initialCount, int maximumCount, string name, out bool createdNew) - { - if (name?.Length > MAX_PATH) - throw new ArgumentException (SR.Argument_WaitHandleNameTooLong); - - var myHandle = new SafeWaitHandle (CreateSemaphore_internal (initialCount, maximumCount, name, out MonoIOError errorCode), true); - - if (myHandle.IsInvalid) { - if (errorCode == MonoIOError.ERROR_INVALID_HANDLE && !string.IsNullOrEmpty (name)) - throw new WaitHandleCannotBeOpenedException (SR.Format (SR.Threading_WaitHandleCannotBeOpenedException_InvalidHandle, name)); - - throw new IOException ($"Unknown Error '{errorCode}'"); - } - - this.SafeWaitHandle = myHandle; - createdNew = errorCode != MonoIOError.ERROR_ALREADY_EXISTS; - } - - unsafe static IntPtr CreateSemaphore_internal (int initialCount, int maximumCount, string name, out MonoIOError errorCode) - { - // FIXME Check for embedded nuls in name. - fixed (char *fixed_name = name) - return CreateSemaphore_icall (initialCount, maximumCount, - fixed_name, name?.Length ?? 0, out errorCode); - } - - unsafe static IntPtr OpenSemaphore_internal (string name, int rights, out MonoIOError errorCode) - { - // FIXME Check for embedded nuls in name. - fixed (char *fixed_name = name) - return OpenSemaphore_icall (fixed_name, name?.Length ?? 0, rights, out errorCode); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - unsafe static extern IntPtr CreateSemaphore_icall (int initialCount, int maximumCount, char* name, int nameLength, out MonoIOError errorCode); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - unsafe static extern IntPtr OpenSemaphore_icall (char* name, int nameLength, int rights, out MonoIOError errorCode); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern bool ReleaseSemaphore_internal (IntPtr handle, int releaseCount, out int previousCount); - } + public partial class Semaphore + { + private const int MAX_PATH = 260; + + private Semaphore(SafeWaitHandle handle) => this.SafeWaitHandle = handle; + + private int ReleaseCore(int releaseCount) + { + if (!ReleaseSemaphore_internal(SafeWaitHandle.DangerousGetHandle(), releaseCount, out int previousCount)) + throw new SemaphoreFullException(); + + return previousCount; + } + + private static OpenExistingResult OpenExistingWorker(string name, out Semaphore result) + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + + if (name.Length == 0) + throw new ArgumentException(SR.Argument_StringZeroLength, nameof(name)); + + if (name.Length > MAX_PATH) + throw new ArgumentException(SR.Argument_WaitHandleNameTooLong); + + var myHandle = new SafeWaitHandle(OpenSemaphore_internal(name, + /*SemaphoreRights.Modify | SemaphoreRights.Synchronize*/ 0x000002 | 0x100000, + out MonoIOError errorCode), true); + + if (myHandle.IsInvalid) + { + result = null; + switch (errorCode) + { + case MonoIOError.ERROR_FILE_NOT_FOUND: + case MonoIOError.ERROR_INVALID_NAME: + return OpenExistingResult.NameNotFound; + case MonoIOError.ERROR_PATH_NOT_FOUND: + return OpenExistingResult.PathNotFound; + case MonoIOError.ERROR_INVALID_HANDLE when !string.IsNullOrEmpty(name): + return OpenExistingResult.NameInvalid; + default: + //this is for passed through NativeMethods Errors + throw new IOException($"Unknown Error '{errorCode}'"); + } + } + + result = new Semaphore(myHandle); + return OpenExistingResult.Success; + } + + private void CreateSemaphoreCore(int initialCount, int maximumCount, string name, out bool createdNew) + { + if (name?.Length > MAX_PATH) + throw new ArgumentException(SR.Argument_WaitHandleNameTooLong); + + var myHandle = new SafeWaitHandle(CreateSemaphore_internal(initialCount, maximumCount, name, out MonoIOError errorCode), true); + + if (myHandle.IsInvalid) + { + if (errorCode == MonoIOError.ERROR_INVALID_HANDLE && !string.IsNullOrEmpty(name)) + throw new WaitHandleCannotBeOpenedException(SR.Format(SR.Threading_WaitHandleCannotBeOpenedException_InvalidHandle, name)); + + throw new IOException($"Unknown Error '{errorCode}'"); + } + + this.SafeWaitHandle = myHandle; + createdNew = errorCode != MonoIOError.ERROR_ALREADY_EXISTS; + } + + private static unsafe IntPtr CreateSemaphore_internal(int initialCount, int maximumCount, string name, out MonoIOError errorCode) + { + // FIXME Check for embedded nuls in name. + fixed (char* fixed_name = name) + return CreateSemaphore_icall(initialCount, maximumCount, + fixed_name, name?.Length ?? 0, out errorCode); + } + + private static unsafe IntPtr OpenSemaphore_internal(string name, int rights, out MonoIOError errorCode) + { + // FIXME Check for embedded nuls in name. + fixed (char* fixed_name = name) + return OpenSemaphore_icall(fixed_name, name?.Length ?? 0, rights, out errorCode); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static unsafe extern IntPtr CreateSemaphore_icall(int initialCount, int maximumCount, char* name, int nameLength, out MonoIOError errorCode); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static unsafe extern IntPtr OpenSemaphore_icall(char* name, int nameLength, int rights, out MonoIOError errorCode); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool ReleaseSemaphore_internal(IntPtr handle, int releaseCount, out int previousCount); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/StackCrawlMark.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/StackCrawlMark.cs index ebcd9d8e5f9b6..98fe78e6dd431 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/StackCrawlMark.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/StackCrawlMark.cs @@ -4,14 +4,14 @@ namespace System.Threading { - // declaring a local var of this enum type and passing it by ref into a function that needs to do a - // stack crawl will both prevent inlining of the calle and pass an ESP point to stack crawl to - // Declaring these in EH clauses is illegal; they must declared in the main method body - internal enum StackCrawlMark - { - LookForMe = 0, - LookForMyCaller = 1, - LookForMyCallersCaller = 2, - LookForThread = 3 - } + // declaring a local var of this enum type and passing it by ref into a function that needs to do a + // stack crawl will both prevent inlining of the calle and pass an ESP point to stack crawl to + // Declaring these in EH clauses is illegal; they must declared in the main method body + internal enum StackCrawlMark + { + LookForMe = 0, + LookForMyCaller = 1, + LookForMyCallersCaller = 2, + LookForThread = 3 + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Thread.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Thread.Mono.cs index a7426abadcb64..9c1823323372f 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Thread.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/Thread.Mono.cs @@ -8,350 +8,372 @@ namespace System.Threading { - // - // Under netcore, there is only one thread object per thread - // - [StructLayout (LayoutKind.Sequential)] - partial class Thread - { + // + // Under netcore, there is only one thread object per thread + // + [StructLayout(LayoutKind.Sequential)] + public partial class Thread + { #pragma warning disable 169, 414, 649 - #region Sync with metadata/object-internals.h and InternalThread in mcs/class/corlib/System.Threading/Thread.cs - int lock_thread_id; - // stores a thread handle - IntPtr handle; - IntPtr native_handle; // used only on Win32 - /* accessed only from unmanaged code */ - private IntPtr name; - private int name_free; // bool - private int name_length; - private ThreadState state; - private object abort_exc; - private int abort_state_handle; - /* thread_id is only accessed from unmanaged code */ - internal Int64 thread_id; - private IntPtr debugger_thread; // FIXME switch to bool as soon as CI testing with corlib version bump works - private UIntPtr static_data; /* GC-tracked */ - private IntPtr runtime_thread_info; - /* current System.Runtime.Remoting.Contexts.Context instance - keep as an object to avoid triggering its class constructor when not needed */ - private object current_appcontext; - private object root_domain_thread; - internal byte[] _serialized_principal; - internal int _serialized_principal_version; - private IntPtr appdomain_refs; - private int interruption_requested; - private IntPtr longlived; - internal bool threadpool_thread; - private bool thread_interrupt_requested; - /* These are used from managed code */ - internal int stack_size; - internal byte apartment_state; - internal volatile int critical_region_level; - internal int managed_id; - private int small_id; - private IntPtr manage_callback; - private IntPtr flags; - private IntPtr thread_pinning_ref; - private IntPtr abort_protected_block_count; - private int priority; - private IntPtr owned_mutex; - private IntPtr suspended_event; - private int self_suspended; - private IntPtr thread_state; - - private Thread self; - private object pending_exception; - private object start_obj; - - /* This is used only to check that we are in sync between the representation - * of MonoInternalThread in native and InternalThread in managed - * - * DO NOT RENAME! DO NOT ADD FIELDS AFTER! */ - private IntPtr last; - #endregion + #region Sync with metadata/object-internals.h and InternalThread in mcs/class/corlib/System.Threading/Thread.cs + private int lock_thread_id; + // stores a thread handle + private IntPtr handle; + private IntPtr native_handle; // used only on Win32 + /* accessed only from unmanaged code */ + private IntPtr name; + private int name_free; // bool + private int name_length; + private ThreadState state; + private object abort_exc; + private int abort_state_handle; + /* thread_id is only accessed from unmanaged code */ + internal long thread_id; + private IntPtr debugger_thread; // FIXME switch to bool as soon as CI testing with corlib version bump works + private UIntPtr static_data; /* GC-tracked */ + private IntPtr runtime_thread_info; + /* current System.Runtime.Remoting.Contexts.Context instance + keep as an object to avoid triggering its class constructor when not needed */ + private object current_appcontext; + private object root_domain_thread; + internal byte[] _serialized_principal; + internal int _serialized_principal_version; + private IntPtr appdomain_refs; + private int interruption_requested; + private IntPtr longlived; + internal bool threadpool_thread; + private bool thread_interrupt_requested; + /* These are used from managed code */ + internal int stack_size; + internal byte apartment_state; + internal volatile int critical_region_level; + internal int managed_id; + private int small_id; + private IntPtr manage_callback; + private IntPtr flags; + private IntPtr thread_pinning_ref; + private IntPtr abort_protected_block_count; + private int priority; + private IntPtr owned_mutex; + private IntPtr suspended_event; + private int self_suspended; + private IntPtr thread_state; + + private Thread self; + private object pending_exception; + private object start_obj; + + /* This is used only to check that we are in sync between the representation + * of MonoInternalThread in native and InternalThread in managed + * + * DO NOT RENAME! DO NOT ADD FIELDS AFTER! */ + private IntPtr last; + #endregion #pragma warning restore 169, 414, 649 - string _name; - Delegate m_start; - object m_start_arg; - CultureInfo culture, ui_culture; - internal ExecutionContext _executionContext; - internal SynchronizationContext _synchronizationContext; - - Thread () - { - InitInternal (this); - } - - ~Thread () - { - FreeInternal (); - } - - internal static ulong CurrentOSThreadId { - get { - return GetCurrentOSThreadId (); - } - } - - public bool IsAlive { - get { - var state = GetState (this); - return (state & (ThreadState.Unstarted | ThreadState.Stopped | ThreadState.Aborted)) == 0; - } - } - - public bool IsBackground { - get { - var state = ValidateThreadState (); - return (state & ThreadState.Background) != 0; - } - set { - ValidateThreadState (); - if (value) { - SetState (this, ThreadState.Background); - } else { - ClrState (this, ThreadState.Background); - } - } - } - - public bool IsThreadPoolThread { - get { - ValidateThreadState (); - return threadpool_thread; - } - internal set { - threadpool_thread = value; - } - } - - public int ManagedThreadId => managed_id; - - internal static int OptimalMaxSpinWaitsPerSpinIteration { - get { - // Default from coreclr (src/utilcode/yieldprocessornormalized.cpp) - return 7; - } - } - - public ThreadPriority Priority { - get { - ValidateThreadState (); - return (ThreadPriority) priority; - } - set { - // TODO: arguments check - SetPriority (this, (int) value); - } - } - - public ThreadState ThreadState => GetState (this); - - void Create (ThreadStart start) => SetStartHelper ((Delegate) start, 0); // 0 will setup Thread with default stackSize - - void Create (ThreadStart start, int maxStackSize) => SetStartHelper ((Delegate) start, maxStackSize); - - void Create (ParameterizedThreadStart start) => SetStartHelper ((Delegate) start, 0); - - void Create (ParameterizedThreadStart start, int maxStackSize) => SetStartHelper ((Delegate) start, maxStackSize); - - public ApartmentState GetApartmentState () => ApartmentState.Unknown; - - public void DisableComObjectEagerCleanup () - { - // no-op - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static int GetCurrentProcessorNumber (); - - public static int GetCurrentProcessorId () - { - int id = GetCurrentProcessorNumber (); - - if (id < 0) - id = Environment.CurrentManagedThreadId; - - return id; - } - - public void Interrupt () - { - InterruptInternal (this); - } - - public bool Join (int millisecondsTimeout) - { - if (millisecondsTimeout < Timeout.Infinite) - throw new ArgumentOutOfRangeException (nameof (millisecondsTimeout), millisecondsTimeout, SR.ArgumentOutOfRange_NeedNonNegOrNegative1); - return JoinInternal (this, millisecondsTimeout); - } - - internal void ResetThreadPoolThread () - { - if (_name != null) - Name = null; - - if ((state & ThreadState.Background) == 0) - IsBackground = true; - - if ((ThreadPriority) priority != ThreadPriority.Normal) - Priority = ThreadPriority.Normal; - } - - void SetCultureOnUnstartedThreadNoCheck (CultureInfo value, bool uiCulture) - { - if (uiCulture) - ui_culture = value; - else - culture = value; - } - - void SetStartHelper (Delegate start, int maxStackSize) - { - m_start = start; - stack_size = maxStackSize; - } - - public static void SpinWait (int iterations) - { - if (iterations < 0) - return; - - while (iterations-- > 0) - SpinWait_nop (); - } - - public static void Sleep (int millisecondsTimeout) - { - if (millisecondsTimeout < Timeout.Infinite) - throw new ArgumentOutOfRangeException (nameof (millisecondsTimeout), millisecondsTimeout, SR.ArgumentOutOfRange_NeedNonNegOrNegative1); - - SleepInternal (millisecondsTimeout, true); - } - - internal static void UninterruptibleSleep0 () => SleepInternal (0, false); - - public void Start () - { - StartInternal (this); - } - - public void Start (object parameter) - { - if (m_start is ThreadStart) - throw new InvalidOperationException (SR.InvalidOperation_ThreadWrongThreadStart); - - m_start_arg = parameter; - StartInternal (this); - } - - // Called from the runtime - internal void StartCallback () - { - if (culture != null) - CurrentCulture = culture; - if (ui_culture != null) - CurrentUICulture = ui_culture; - if (m_start is ThreadStart del) { - m_start = null; - del (); - } else { - var pdel = (ParameterizedThreadStart) m_start; - var arg = m_start_arg; - m_start = null; - m_start_arg = null; - pdel (arg); - } - } - - partial void ThreadNameChanged (string value) - { - // TODO: Should only raise the events - SetName (this, value); - } - - public static bool Yield () - { - return YieldInternal (); - } - - bool TrySetApartmentStateUnchecked (ApartmentState state) => state == ApartmentState.Unknown; - - ThreadState ValidateThreadState () - { - var state = GetState (this); - if ((state & ThreadState.Stopped) != 0) - throw new ThreadStateException ("Thread is dead; state can not be accessed."); - return state; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - private extern static ulong GetCurrentOSThreadId (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void InitInternal (Thread thread); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private extern static void InitializeCurrentThread_icall (ref Thread thread); - - [MethodImpl (MethodImplOptions.NoInlining)] - static Thread InitializeCurrentThread () { - Thread thread = null; - InitializeCurrentThread_icall (ref thread); - return thread; - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern void FreeInternal (); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static ThreadState GetState (Thread thread); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void SetState (Thread thread, ThreadState set); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void ClrState (Thread thread, ThreadState clr); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static string GetName (Thread thread); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static unsafe extern void SetName_icall (Thread thread, char *name, int nameLength); - - static unsafe void SetName (Thread thread, String name) - { - fixed (char* fixed_name = name) - SetName_icall (thread, fixed_name, name?.Length ?? 0); - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static bool YieldInternal (); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static void SleepInternal (int millisecondsTimeout, bool allowInterruption); - - [Intrinsic] - static void SpinWait_nop () - { - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static Thread CreateInternal (); - - [PreserveDependency (nameof (StartCallback))] - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static void StartInternal (Thread runtime_thread); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static bool JoinInternal (Thread thread, int millisecondsTimeout); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static void InterruptInternal (Thread thread); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern static void SetPriority (Thread thread, int priority); - } + private string _name; + private Delegate m_start; + private object m_start_arg; + private CultureInfo culture, ui_culture; + internal ExecutionContext _executionContext; + internal SynchronizationContext _synchronizationContext; + + private Thread() + { + InitInternal(this); + } + + ~Thread() + { + FreeInternal(); + } + + internal static ulong CurrentOSThreadId + { + get + { + return GetCurrentOSThreadId(); + } + } + + public bool IsAlive + { + get + { + var state = GetState(this); + return (state & (ThreadState.Unstarted | ThreadState.Stopped | ThreadState.Aborted)) == 0; + } + } + + public bool IsBackground + { + get + { + var state = ValidateThreadState(); + return (state & ThreadState.Background) != 0; + } + set + { + ValidateThreadState(); + if (value) + { + SetState(this, ThreadState.Background); + } + else + { + ClrState(this, ThreadState.Background); + } + } + } + + public bool IsThreadPoolThread + { + get + { + ValidateThreadState(); + return threadpool_thread; + } + internal set + { + threadpool_thread = value; + } + } + + public int ManagedThreadId => managed_id; + + internal static int OptimalMaxSpinWaitsPerSpinIteration + { + get + { + // Default from coreclr (src/utilcode/yieldprocessornormalized.cpp) + return 7; + } + } + + public ThreadPriority Priority + { + get + { + ValidateThreadState(); + return (ThreadPriority)priority; + } + set + { + // TODO: arguments check + SetPriority(this, (int)value); + } + } + + public ThreadState ThreadState => GetState(this); + + private void Create(ThreadStart start) => SetStartHelper((Delegate)start, 0); // 0 will setup Thread with default stackSize + + private void Create(ThreadStart start, int maxStackSize) => SetStartHelper((Delegate)start, maxStackSize); + + private void Create(ParameterizedThreadStart start) => SetStartHelper((Delegate)start, 0); + + private void Create(ParameterizedThreadStart start, int maxStackSize) => SetStartHelper((Delegate)start, maxStackSize); + + public ApartmentState GetApartmentState() => ApartmentState.Unknown; + + public void DisableComObjectEagerCleanup() + { + // no-op + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int GetCurrentProcessorNumber(); + + public static int GetCurrentProcessorId() + { + int id = GetCurrentProcessorNumber(); + + if (id < 0) + id = Environment.CurrentManagedThreadId; + + return id; + } + + public void Interrupt() + { + InterruptInternal(this); + } + + public bool Join(int millisecondsTimeout) + { + if (millisecondsTimeout < Timeout.Infinite) + throw new ArgumentOutOfRangeException(nameof(millisecondsTimeout), millisecondsTimeout, SR.ArgumentOutOfRange_NeedNonNegOrNegative1); + return JoinInternal(this, millisecondsTimeout); + } + + internal void ResetThreadPoolThread() + { + if (_name != null) + Name = null; + + if ((state & ThreadState.Background) == 0) + IsBackground = true; + + if ((ThreadPriority)priority != ThreadPriority.Normal) + Priority = ThreadPriority.Normal; + } + + private void SetCultureOnUnstartedThreadNoCheck(CultureInfo value, bool uiCulture) + { + if (uiCulture) + ui_culture = value; + else + culture = value; + } + + private void SetStartHelper(Delegate start, int maxStackSize) + { + m_start = start; + stack_size = maxStackSize; + } + + public static void SpinWait(int iterations) + { + if (iterations < 0) + return; + + while (iterations-- > 0) + SpinWait_nop(); + } + + public static void Sleep(int millisecondsTimeout) + { + if (millisecondsTimeout < Timeout.Infinite) + throw new ArgumentOutOfRangeException(nameof(millisecondsTimeout), millisecondsTimeout, SR.ArgumentOutOfRange_NeedNonNegOrNegative1); + + SleepInternal(millisecondsTimeout, true); + } + + internal static void UninterruptibleSleep0() => SleepInternal(0, false); + + public void Start() + { + StartInternal(this); + } + + public void Start(object parameter) + { + if (m_start is ThreadStart) + throw new InvalidOperationException(SR.InvalidOperation_ThreadWrongThreadStart); + + m_start_arg = parameter; + StartInternal(this); + } + + // Called from the runtime + internal void StartCallback() + { + if (culture != null) + CurrentCulture = culture; + if (ui_culture != null) + CurrentUICulture = ui_culture; + if (m_start is ThreadStart del) + { + m_start = null; + del(); + } + else + { + var pdel = (ParameterizedThreadStart)m_start; + var arg = m_start_arg; + m_start = null; + m_start_arg = null; + pdel(arg); + } + } + + partial void ThreadNameChanged(string value) + { + // TODO: Should only raise the events + SetName(this, value); + } + + public static bool Yield() + { + return YieldInternal(); + } + + private bool TrySetApartmentStateUnchecked(ApartmentState state) => state == ApartmentState.Unknown; + + private ThreadState ValidateThreadState() + { + var state = GetState(this); + if ((state & ThreadState.Stopped) != 0) + throw new ThreadStateException("Thread is dead; state can not be accessed."); + return state; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern ulong GetCurrentOSThreadId(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void InitInternal(Thread thread); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void InitializeCurrentThread_icall(ref Thread thread); + + [MethodImpl(MethodImplOptions.NoInlining)] + private static Thread InitializeCurrentThread() + { + Thread thread = null; + InitializeCurrentThread_icall(ref thread); + return thread; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern void FreeInternal(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern ThreadState GetState(Thread thread); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void SetState(Thread thread, ThreadState set); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void ClrState(Thread thread, ThreadState clr); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern string GetName(Thread thread); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static unsafe extern void SetName_icall(Thread thread, char* name, int nameLength); + + private static unsafe void SetName(Thread thread, string name) + { + fixed (char* fixed_name = name) + SetName_icall(thread, fixed_name, name?.Length ?? 0); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool YieldInternal(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void SleepInternal(int millisecondsTimeout, bool allowInterruption); + + [Intrinsic] + private static void SpinWait_nop() + { + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern Thread CreateInternal(); + + [PreserveDependency(nameof(StartCallback))] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void StartInternal(Thread runtime_thread); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool JoinInternal(Thread thread, int millisecondsTimeout); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void InterruptInternal(Thread thread); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void SetPriority(Thread thread, int priority); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/ThreadPool.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/ThreadPool.Mono.cs index b3b3039bc59f2..023574d218002 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/ThreadPool.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/ThreadPool.Mono.cs @@ -6,44 +6,44 @@ namespace System.Threading { - public static partial class ThreadPool - { - private static void EnsureInitialized() - { - ThreadPoolGlobals.threadPoolInitialized = true; - ThreadPoolGlobals.enableWorkerTracking = false; - } - - internal static void ReportThreadStatus(bool isWorking) - { - } - - unsafe private static void NativeOverlappedCallback(object? obj) - { - NativeOverlapped* overlapped = (NativeOverlapped*)(IntPtr)obj!; - _IOCompletionCallback.PerformIOCompletionCallback (0, 0, overlapped); - } - - [CLSCompliant(false)] - unsafe public static bool UnsafeQueueNativeOverlapped(NativeOverlapped* overlapped) - { - // OS doesn't signal handle, so do it here (CoreCLR does this assignment in ThreadPoolNative::CorPostQueuedCompletionStatus) - overlapped->InternalLow = (IntPtr)0; - // Both types of callbacks are executed on the same thread pool - return UnsafeQueueUserWorkItem (NativeOverlappedCallback, (IntPtr)overlapped); - } - - [Obsolete("ThreadPool.BindHandle(IntPtr) has been deprecated. Please use ThreadPool.BindHandle(SafeHandle) instead.", false)] - public static bool BindHandle(IntPtr osHandle) - { - throw new PlatformNotSupportedException (SR.Arg_PlatformNotSupported); // Replaced by ThreadPoolBoundHandle.BindHandle - } - - public static bool BindHandle(SafeHandle osHandle) - { - throw new PlatformNotSupportedException (SR.Arg_PlatformNotSupported); // Replaced by ThreadPoolBoundHandle.BindHandle - } - - private static long PendingUnmanagedWorkItemCount => 0; - } + public static partial class ThreadPool + { + private static void EnsureInitialized() + { + ThreadPoolGlobals.threadPoolInitialized = true; + ThreadPoolGlobals.enableWorkerTracking = false; + } + + internal static void ReportThreadStatus(bool isWorking) + { + } + + private static unsafe void NativeOverlappedCallback(object? obj) + { + NativeOverlapped* overlapped = (NativeOverlapped*)(IntPtr)obj!; + _IOCompletionCallback.PerformIOCompletionCallback(0, 0, overlapped); + } + + [CLSCompliant(false)] + public static unsafe bool UnsafeQueueNativeOverlapped(NativeOverlapped* overlapped) + { + // OS doesn't signal handle, so do it here (CoreCLR does this assignment in ThreadPoolNative::CorPostQueuedCompletionStatus) + overlapped->InternalLow = (IntPtr)0; + // Both types of callbacks are executed on the same thread pool + return UnsafeQueueUserWorkItem(NativeOverlappedCallback, (IntPtr)overlapped); + } + + [Obsolete("ThreadPool.BindHandle(IntPtr) has been deprecated. Please use ThreadPool.BindHandle(SafeHandle) instead.", false)] + public static bool BindHandle(IntPtr osHandle) + { + throw new PlatformNotSupportedException(SR.Arg_PlatformNotSupported); // Replaced by ThreadPoolBoundHandle.BindHandle + } + + public static bool BindHandle(SafeHandle osHandle) + { + throw new PlatformNotSupportedException(SR.Arg_PlatformNotSupported); // Replaced by ThreadPoolBoundHandle.BindHandle + } + + private static long PendingUnmanagedWorkItemCount => 0; + } } \ No newline at end of file diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/WaitHandle.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/WaitHandle.Mono.cs index fb11248a40215..b9ae29c95b2eb 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Threading/WaitHandle.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Threading/WaitHandle.Mono.cs @@ -7,45 +7,48 @@ namespace System.Threading { - partial class WaitHandle - { - [MethodImplAttribute(MethodImplOptions.InternalCall)] - unsafe static extern int Wait_internal(IntPtr* handles, int numHandles, bool waitAll, int ms); - - static int WaitOneCore (IntPtr waitHandle, int millisecondsTimeout) - { - unsafe { - return Wait_internal (&waitHandle, 1, false, millisecondsTimeout); - } - } - - [MethodImpl (MethodImplOptions.InternalCall)] - static extern int SignalAndWait_Internal (IntPtr waitHandleToSignal, IntPtr waitHandleToWaitOn, int millisecondsTimeout); - - const int ERROR_TOO_MANY_POSTS = 0x12A; - const int ERROR_NOT_OWNED_BY_CALLER = 0x12B; - - static int SignalAndWaitCore (IntPtr waitHandleToSignal, IntPtr waitHandleToWaitOn, int millisecondsTimeout) - { - int ret = SignalAndWait_Internal (waitHandleToSignal, waitHandleToWaitOn, millisecondsTimeout); - if (ret == ERROR_TOO_MANY_POSTS) - throw new InvalidOperationException (SR.Threading_WaitHandleTooManyPosts); - if (ret == ERROR_NOT_OWNED_BY_CALLER) - throw new ApplicationException("Attempt to release mutex not owned by caller"); - return ret; - } - - internal static int WaitMultipleIgnoringSyncContext (Span waitHandles, bool waitAll, int millisecondsTimeout) - { - unsafe { - fixed (IntPtr* handles = &MemoryMarshal.GetReference (waitHandles)) { - return Wait_internal (handles, waitHandles.Length, waitAll, millisecondsTimeout); - } - } - } - - // FIXME: Move to shared - internal static int WaitAny (ReadOnlySpan waitHandles, int millisecondsTimeout) => - WaitMultiple (waitHandles, false, millisecondsTimeout); - } + public partial class WaitHandle + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static unsafe extern int Wait_internal(IntPtr* handles, int numHandles, bool waitAll, int ms); + + private static int WaitOneCore(IntPtr waitHandle, int millisecondsTimeout) + { + unsafe + { + return Wait_internal(&waitHandle, 1, false, millisecondsTimeout); + } + } + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern int SignalAndWait_Internal(IntPtr waitHandleToSignal, IntPtr waitHandleToWaitOn, int millisecondsTimeout); + + private const int ERROR_TOO_MANY_POSTS = 0x12A; + private const int ERROR_NOT_OWNED_BY_CALLER = 0x12B; + + private static int SignalAndWaitCore(IntPtr waitHandleToSignal, IntPtr waitHandleToWaitOn, int millisecondsTimeout) + { + int ret = SignalAndWait_Internal(waitHandleToSignal, waitHandleToWaitOn, millisecondsTimeout); + if (ret == ERROR_TOO_MANY_POSTS) + throw new InvalidOperationException(SR.Threading_WaitHandleTooManyPosts); + if (ret == ERROR_NOT_OWNED_BY_CALLER) + throw new ApplicationException("Attempt to release mutex not owned by caller"); + return ret; + } + + internal static int WaitMultipleIgnoringSyncContext(Span waitHandles, bool waitAll, int millisecondsTimeout) + { + unsafe + { + fixed (IntPtr* handles = &MemoryMarshal.GetReference(waitHandles)) + { + return Wait_internal(handles, waitHandles.Length, waitAll, millisecondsTimeout); + } + } + } + + // FIXME: Move to shared + internal static int WaitAny(ReadOnlySpan waitHandles, int millisecondsTimeout) => + WaitMultiple(waitHandles, false, millisecondsTimeout); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/Type.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/Type.Mono.cs index 50a94f14a19c3..67a34d1522660 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/Type.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/Type.Mono.cs @@ -12,124 +12,129 @@ namespace System { - partial class Type - { - #region keep in sync with object-internals.h - internal RuntimeTypeHandle _impl; - #endregion - - internal bool IsRuntimeImplemented () => this.UnderlyingSystemType is RuntimeType; - - internal virtual bool IsTypeBuilder () => false; - - public bool IsInterface { - get { - if (this is RuntimeType rt) - return RuntimeTypeHandle.IsInterface (rt); - - return (GetAttributeFlagsImpl () & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface; - } - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Type? GetType (string typeName, bool throwOnError, bool ignoreCase) - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeType.GetType (typeName, throwOnError, ignoreCase, false, ref stackMark); - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Type? GetType (string typeName, bool throwOnError) - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeType.GetType (typeName, throwOnError, false, false, ref stackMark); - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Type? GetType (string typeName) - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeType.GetType (typeName, false, false, false, ref stackMark); - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Type? GetType (string typeName, Func? assemblyResolver, Func? typeResolver) - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeType.GetType (typeName, assemblyResolver, typeResolver, false, false, ref stackMark); - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Type? GetType (string typeName, Func? assemblyResolver, Func? typeResolver, bool throwOnError) - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeType.GetType (typeName, assemblyResolver, typeResolver, throwOnError, false, ref stackMark); - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Type? GetType (string typeName, Func? assemblyResolver, Func? typeResolver, bool throwOnError, bool ignoreCase) - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeType.GetType (typeName, assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark); - } - - static Type? GetType (string typeName, Func? assemblyResolver, Func? typeResolver, bool throwOnError, bool ignoreCase, ref StackCrawlMark stackMark) { - return TypeNameParser.GetType (typeName, assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark); - } - - public static Type? GetTypeFromHandle (RuntimeTypeHandle handle) - { - if (handle.Value == IntPtr.Zero) - return null; - - return internal_from_handle (handle.Value); - } - - public static Type GetTypeFromCLSID (Guid clsid, string? server, bool throwOnError) => throw new PlatformNotSupportedException (); - - public static Type GetTypeFromProgID (string progID, string? server, bool throwOnError) => throw new PlatformNotSupportedException (); - - internal virtual Type InternalResolve () - { - return UnderlyingSystemType; - } - - // Called from the runtime to return the corresponding finished Type object - internal virtual Type RuntimeResolve () - { - throw new NotImplementedException (); - } - - internal virtual bool IsUserType { - get { - return true; - } - } - - internal virtual MethodInfo GetMethod (MethodInfo fromNoninstanciated) - { - throw new InvalidOperationException ("can only be called in generic type"); - } - - internal virtual ConstructorInfo GetConstructor (ConstructorInfo fromNoninstanciated) - { - throw new InvalidOperationException ("can only be called in generic type"); - } - - internal virtual FieldInfo GetField (FieldInfo fromNoninstanciated) - { - throw new InvalidOperationException ("can only be called in generic type"); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern Type internal_from_handle (IntPtr handle); - - [Intrinsic] - public static bool operator == (Type? left, Type? right) => left == right; - - public static bool operator != (Type? left, Type? right) - { - return !(left == right); - } - } + public partial class Type + { + #region keep in sync with object-internals.h + internal RuntimeTypeHandle _impl; + #endregion + + internal bool IsRuntimeImplemented() => this.UnderlyingSystemType is RuntimeType; + + internal virtual bool IsTypeBuilder() => false; + + public bool IsInterface + { + get + { + if (this is RuntimeType rt) + return RuntimeTypeHandle.IsInterface(rt); + + return (GetAttributeFlagsImpl() & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface; + } + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Type? GetType(string typeName, bool throwOnError, bool ignoreCase) + { + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return RuntimeType.GetType(typeName, throwOnError, ignoreCase, false, ref stackMark); + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Type? GetType(string typeName, bool throwOnError) + { + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return RuntimeType.GetType(typeName, throwOnError, false, false, ref stackMark); + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Type? GetType(string typeName) + { + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return RuntimeType.GetType(typeName, false, false, false, ref stackMark); + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Type? GetType(string typeName, Func? assemblyResolver, Func? typeResolver) + { + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return GetType(typeName, assemblyResolver, typeResolver, false, false, ref stackMark); + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Type? GetType(string typeName, Func? assemblyResolver, Func? typeResolver, bool throwOnError) + { + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return GetType(typeName, assemblyResolver, typeResolver, throwOnError, false, ref stackMark); + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Type? GetType(string typeName, Func? assemblyResolver, Func? typeResolver, bool throwOnError, bool ignoreCase) + { + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return GetType(typeName, assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark); + } + + private static Type? GetType(string typeName, Func? assemblyResolver, Func? typeResolver, bool throwOnError, bool ignoreCase, ref StackCrawlMark stackMark) + { + return TypeNameParser.GetType(typeName, assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark); + } + + public static Type? GetTypeFromHandle(RuntimeTypeHandle handle) + { + if (handle.Value == IntPtr.Zero) + return null; + + return internal_from_handle(handle.Value); + } + + public static Type GetTypeFromCLSID(Guid clsid, string? server, bool throwOnError) => throw new PlatformNotSupportedException(); + + public static Type GetTypeFromProgID(string progID, string? server, bool throwOnError) => throw new PlatformNotSupportedException(); + + internal virtual Type InternalResolve() + { + return UnderlyingSystemType; + } + + // Called from the runtime to return the corresponding finished Type object + internal virtual Type RuntimeResolve() + { + throw new NotImplementedException(); + } + + internal virtual bool IsUserType + { + get + { + return true; + } + } + + internal virtual MethodInfo GetMethod(MethodInfo fromNoninstanciated) + { + throw new InvalidOperationException("can only be called in generic type"); + } + + internal virtual ConstructorInfo GetConstructor(ConstructorInfo fromNoninstanciated) + { + throw new InvalidOperationException("can only be called in generic type"); + } + + internal virtual FieldInfo GetField(FieldInfo fromNoninstanciated) + { + throw new InvalidOperationException("can only be called in generic type"); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern Type internal_from_handle(IntPtr handle); + + [Intrinsic] + public static bool operator ==(Type? left, Type? right) => left == right; + + public static bool operator !=(Type? left, Type? right) + { + return !(left == right); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/TypeIdentifier.cs b/src/mono/netcore/System.Private.CoreLib/src/System/TypeIdentifier.cs index 24e07936bebda..8448b0d82eb11 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/TypeIdentifier.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/TypeIdentifier.cs @@ -25,199 +25,207 @@ namespace System { - // A TypeName is wrapper around type names in display form - // (that is, with special characters escaped). - // - // Note that in general if you unescape a type name, you will - // lose information: If the type name's DisplayName is - // Foo\+Bar+Baz (outer class ``Foo+Bar``, inner class Baz) - // unescaping the first plus will give you (outer class Foo, - // inner class Bar, innermost class Baz). - // - // The correct way to take a TypeName apart is to feed its - // DisplayName to TypeSpec.Parse() - // - interface TypeName : IEquatable - { - string DisplayName { - get; - } - - // add a nested name under this one. - TypeName NestedName (TypeIdentifier innerName); - } - - // A type identifier is a single component of a type name. - // Unlike a general typename, a type identifier can be be - // converted to internal form without loss of information. - interface TypeIdentifier : TypeName - { - string InternalName { - get; - } - } - - static class TypeNames - { - internal static TypeName FromDisplay (string displayName) - { - return new Display (displayName); - } - - internal abstract class ATypeName : TypeName - { - public abstract string DisplayName { get; } - - public abstract TypeName NestedName (TypeIdentifier innerName); - - public bool Equals ([AllowNull] TypeName other) - { - return other != null && DisplayName == other.DisplayName; - } - - public override int GetHashCode () - { - return DisplayName.GetHashCode (); - } - - public override bool Equals (object? other) - { - return Equals (other as TypeName); - } - } - - private class Display : ATypeName - { - string displayName; - - internal Display (string displayName) - { - this.displayName = displayName; - } - - public override string DisplayName { get { return displayName; } } - - public override TypeName NestedName (TypeIdentifier innerName) - { - return new Display (DisplayName + "+" + innerName.DisplayName); - } - - } - } - - static class TypeIdentifiers - { - internal static TypeIdentifier FromDisplay (string displayName) - { - return new Display (displayName); - } - - internal static TypeIdentifier FromInternal (string internalName) - { - return new Internal (internalName); - } - - internal static TypeIdentifier FromInternal (string internalNameSpace, TypeIdentifier typeName) - { - return new Internal (internalNameSpace, typeName); - } - - // Only use if simpleName is certain not to contain - // unexpected characters that ordinarily require - // escaping: ,+*&[]\ - internal static TypeIdentifier WithoutEscape (string simpleName) - { - return new NoEscape (simpleName); - } - - private class Display : TypeNames.ATypeName, TypeIdentifier - { - string displayName; - string internal_name; //cached - - internal Display (string displayName) - { - this.displayName = displayName; - } - - public override string DisplayName { - get { return displayName; } - } - - public string InternalName { - get { - if (internal_name == null) - internal_name = GetInternalName (); - return internal_name; - } - } - - private string GetInternalName () - { - return TypeSpec.UnescapeInternalName (displayName); - } - - public override TypeName NestedName (TypeIdentifier innerName) - { - return TypeNames.FromDisplay (DisplayName + "+" + innerName.DisplayName); - } - } - - - private class Internal : TypeNames.ATypeName, TypeIdentifier - { - string internalName; - string display_name; //cached - - internal Internal (string internalName) - { - this.internalName = internalName; - } - - internal Internal (string nameSpaceInternal, TypeIdentifier typeName) - { - this.internalName = nameSpaceInternal + "." + typeName.InternalName; - } - - public override string DisplayName { - get { - if (display_name == null) - display_name = GetDisplayName (); - return display_name; - } - } - - public string InternalName { - get { return internalName; } - } - - private string GetDisplayName () - { - return TypeSpec.EscapeDisplayName (internalName); - } - - public override TypeName NestedName (TypeIdentifier innerName) - { - return TypeNames.FromDisplay (DisplayName + "+" + innerName.DisplayName); - } - - } - - private class NoEscape : TypeNames.ATypeName, TypeIdentifier - { - string simpleName; - internal NoEscape (string simpleName) - { - this.simpleName = simpleName; - } - - public override string DisplayName { get { return simpleName; } } - public string InternalName { get { return simpleName; } } - - public override TypeName NestedName (TypeIdentifier innerName) - { - return TypeNames.FromDisplay (DisplayName + "+" + innerName.DisplayName); - } - } - } + // A TypeName is wrapper around type names in display form + // (that is, with special characters escaped). + // + // Note that in general if you unescape a type name, you will + // lose information: If the type name's DisplayName is + // Foo\+Bar+Baz (outer class ``Foo+Bar``, inner class Baz) + // unescaping the first plus will give you (outer class Foo, + // inner class Bar, innermost class Baz). + // + // The correct way to take a TypeName apart is to feed its + // DisplayName to TypeSpec.Parse() + // + internal interface ITypeName : IEquatable + { + string DisplayName + { + get; + } + + // add a nested name under this one. + ITypeName NestedName(ITypeIdentifier innerName); + } + + // A type identifier is a single component of a type name. + // Unlike a general typename, a type identifier can be be + // converted to internal form without loss of information. + internal interface ITypeIdentifier : ITypeName + { + string InternalName + { + get; + } + } + + internal static class TypeNames + { + internal static ITypeName FromDisplay(string displayName) + { + return new Display(displayName); + } + + internal abstract class ATypeName : ITypeName + { + public abstract string DisplayName { get; } + + public abstract ITypeName NestedName(ITypeIdentifier innerName); + + public bool Equals([AllowNull] ITypeName other) + { + return other != null && DisplayName == other.DisplayName; + } + + public override int GetHashCode() + { + return DisplayName.GetHashCode(); + } + + public override bool Equals(object? other) + { + return Equals(other as ITypeName); + } + } + + private class Display : ATypeName + { + private string displayName; + + internal Display(string displayName) + { + this.displayName = displayName; + } + + public override string DisplayName { get { return displayName; } } + + public override ITypeName NestedName(ITypeIdentifier innerName) + { + return new Display(DisplayName + "+" + innerName.DisplayName); + } + + } + } + + internal static class TypeIdentifiers + { + internal static ITypeIdentifier FromDisplay(string displayName) + { + return new Display(displayName); + } + + internal static ITypeIdentifier FromInternal(string internalName) + { + return new Internal(internalName); + } + + internal static ITypeIdentifier FromInternal(string internalNameSpace, ITypeIdentifier typeName) + { + return new Internal(internalNameSpace, typeName); + } + + // Only use if simpleName is certain not to contain + // unexpected characters that ordinarily require + // escaping: ,+*&[]\ + internal static ITypeIdentifier WithoutEscape(string simpleName) + { + return new NoEscape(simpleName); + } + + private class Display : TypeNames.ATypeName, ITypeIdentifier + { + private string displayName; + private string internal_name; //cached + + internal Display(string displayName) + { + this.displayName = displayName; + } + + public override string DisplayName + { + get { return displayName; } + } + + public string InternalName + { + get + { + if (internal_name == null) + internal_name = GetInternalName(); + return internal_name; + } + } + + private string GetInternalName() + { + return TypeSpec.UnescapeInternalName(displayName); + } + + public override ITypeName NestedName(ITypeIdentifier innerName) + { + return TypeNames.FromDisplay(DisplayName + "+" + innerName.DisplayName); + } + } + + + private class Internal : TypeNames.ATypeName, ITypeIdentifier + { + private string internalName; + private string display_name; //cached + + internal Internal(string internalName) + { + this.internalName = internalName; + } + + internal Internal(string nameSpaceInternal, ITypeIdentifier typeName) + { + this.internalName = nameSpaceInternal + "." + typeName.InternalName; + } + + public override string DisplayName + { + get + { + if (display_name == null) + display_name = GetDisplayName(); + return display_name; + } + } + + public string InternalName + { + get { return internalName; } + } + + private string GetDisplayName() + { + return TypeSpec.EscapeDisplayName(internalName); + } + + public override ITypeName NestedName(ITypeIdentifier innerName) + { + return TypeNames.FromDisplay(DisplayName + "+" + innerName.DisplayName); + } + + } + + private class NoEscape : TypeNames.ATypeName, ITypeIdentifier + { + private string simpleName; + internal NoEscape(string simpleName) + { + this.simpleName = simpleName; + } + + public override string DisplayName { get { return simpleName; } } + public string InternalName { get { return simpleName; } } + + public override ITypeName NestedName(ITypeIdentifier innerName) + { + return TypeNames.FromDisplay(DisplayName + "+" + innerName.DisplayName); + } + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/TypeLoadException.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/TypeLoadException.Mono.cs index e8f8f13c72981..c4cf1c8b39572 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/TypeLoadException.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/TypeLoadException.Mono.cs @@ -4,27 +4,28 @@ namespace System { - partial class TypeLoadException - { - // Called by runtime - internal TypeLoadException (string className, string assemblyName) - : this (null) - { - _className = className; - _assemblyName = assemblyName; - } + public partial class TypeLoadException + { + // Called by runtime + internal TypeLoadException(string className, string assemblyName) + : this(null) + { + _className = className; + _assemblyName = assemblyName; + } - void SetMessageField () - { - if (_message != null) - return; + private void SetMessageField() + { + if (_message != null) + return; - if (_className == null) { - _message = SR.Arg_TypeLoadException; - return; - } + if (_className == null) + { + _message = SR.Arg_TypeLoadException; + return; + } - _message = SR.Format ("Could not load type '{0}' from assembly '{1}'.", _className, _assemblyName ?? SR.IO_UnknownFileName); - } - } + _message = SR.Format("Could not load type '{0}' from assembly '{1}'.", _className, _assemblyName ?? SR.IO_UnknownFileName); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/TypeNameParser.cs b/src/mono/netcore/System.Private.CoreLib/src/System/TypeNameParser.cs index a4f01a7624dd8..ee37ec8b3ee7e 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/TypeNameParser.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/TypeNameParser.cs @@ -10,400 +10,442 @@ namespace System { - internal static class TypeNameParser - { - static readonly char[] SPECIAL_CHARS = {',', '[', ']', '&', '*', '+', '\\'}; - - internal static Type GetType ( - string typeName, - Func assemblyResolver, - Func typeResolver, - bool throwOnError, - bool ignoreCase, - ref StackCrawlMark stackMark) - { - if (typeName == null) - throw new ArgumentNullException (nameof (typeName)); - - ParsedName pname = ParseName (typeName, false, 0, out int end_pos); - if (pname == null) { - if (throwOnError) - throw new ArgumentException (); - return null; - } - - return ConstructType (pname, assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark); - } - - static Type ConstructType ( - ParsedName pname, - Func assemblyResolver, - Func typeResolver, - bool throwOnError, - bool ignoreCase, - ref StackCrawlMark stackMark) - { - // Resolve assembly - Assembly assembly = null; - if (pname.AssemblyName != null) { - assembly = ResolveAssembly (pname.AssemblyName, assemblyResolver, throwOnError, ref stackMark); - if (assembly == null) - // If throwOnError is true, an exception was already thrown - return null; - } - - // Resolve base type - var type = ResolveType (assembly, pname.Names, typeResolver, throwOnError, ignoreCase, ref stackMark); - if (type == null) - return null; - - // Resolve type arguments - if (pname.TypeArguments != null) { - var args = new Type [pname.TypeArguments.Count]; - for (int i = 0; i < pname.TypeArguments.Count; ++i) { - args [i] = ConstructType (pname.TypeArguments [i], assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark); - if (args [i] == null) - return null; - } - type = type.MakeGenericType (args); - } - - // Resolve modifiers - if (pname.Modifiers != null) { - bool bounded = false; - foreach (var mod in pname.Modifiers) { - switch (mod) { - case 0: - type = type.MakeByRefType (); - break; - case -1: - type = type.MakePointerType (); - break; - case -2: - bounded = true; - break; - case 1: - if (bounded) - type = type.MakeArrayType (1); - else - type = type.MakeArrayType (); - break; - default: - type = type.MakeArrayType (mod); - break; - } - } - } - - return type; - } - - static Assembly ResolveAssembly (string name, Func assemblyResolver, bool throwOnError, - ref StackCrawlMark stackMark) - { - var aname = new AssemblyName (name); - - if (assemblyResolver == null) { - if (throwOnError) { - return Assembly.Load (aname, ref stackMark, null); - } else { - try { - return Assembly.Load (aname, ref stackMark, null); - } catch (FileNotFoundException) { - return null; - } - } - } else { - var assembly = assemblyResolver (aname); - if (assembly == null && throwOnError) - throw new FileNotFoundException (SR.FileNotFound_ResolveAssembly, name); - return assembly; - } - } - - static Type ResolveType (Assembly assembly, List names, Func typeResolver, bool throwOnError, bool ignoreCase, ref StackCrawlMark stackMark) - { - Type type = null; - - string name = EscapeTypeName (names [0]); - // Resolve the top level type. - if (typeResolver != null) { - type = typeResolver (assembly, name, ignoreCase); - if (type == null && throwOnError) { - if (assembly == null) - throw new TypeLoadException (SR.Format (SR.TypeLoad_ResolveType, name)); - else - throw new TypeLoadException (SR.Format (SR.TypeLoad_ResolveTypeFromAssembly, name, assembly.FullName)); - } - } else { - if (assembly == null) - type = RuntimeType.GetType (name, throwOnError, ignoreCase, false, ref stackMark); - else - type = assembly.GetType (name, throwOnError, ignoreCase); - } - - if (type == null) - return null; - - // Resolve nested types. - BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Public; - if (ignoreCase) - bindingFlags |= BindingFlags.IgnoreCase; - - for (int i = 1; i < names.Count; ++i) { - type = type.GetNestedType (names[i], bindingFlags); - if (type == null) { - if (throwOnError) - throw new TypeLoadException (SR.Format (SR.TypeLoad_ResolveNestedType, names[i], names[i-1])); - else - break; - } - } - return type; - } - - static string EscapeTypeName (string name) - { - if (name.IndexOfAny (SPECIAL_CHARS) < 0) - return name; - - var sb = new StringBuilder (name.Length); - foreach (char c in name) { - if (Array.IndexOf (SPECIAL_CHARS, c) >= 0) - sb.Append ('\\'); - sb.Append (c); - } - - return sb.ToString (); - } - - static string UnescapeTypeName (string name) - { - if (name.IndexOfAny (SPECIAL_CHARS) < 0) - return name; - - var sb = new StringBuilder (name.Length - 1); - for (int i = 0; i < name.Length; ++i) { - if (name [i] == '\\' && i + 1 < name.Length) - i++; - sb.Append (name [i]); - } - - return sb.ToString (); - } - - class ParsedName { - public List Names; - public List TypeArguments; - public List Modifiers; - public string AssemblyName; - - /* For debugging - public override string ToString () { - var sb = new StringBuilder (); - sb.Append (Names [0]); - if (TypeArguments != null) { - sb.Append ("["); - for (int i = 0; i < TypeArguments.Count; ++i) { - if (TypeArguments [i].AssemblyName != null) - sb.Append ('['); - sb.Append (TypeArguments [i].ToString ()); - if (TypeArguments [i].AssemblyName != null) - sb.Append (']'); - if (i < TypeArguments.Count - 1) - sb.Append (", "); - } - sb.Append ("]"); - } - if (AssemblyName != null) - sb.Append ($", {AssemblyName}"); - return sb.ToString (); - } - */ - } - - // Ported from the C version in mono_reflection_parse_type_checked () - // Entries to the Names list are unescaped to internal form while AssemblyName is not, in an effort to maintain - // consistency with our native parser. Since this function is just called recursively, that should also be true - // for ParsedNames in TypeArguments. - static ParsedName ParseName (string name, bool recursed, int pos, out int end_pos) - { - end_pos = 0; - - while (pos < name.Length && name [pos] == ' ') - pos ++; - - var res = new ParsedName () { Names = new List () }; - - int start = pos; - int name_start = pos; - bool in_modifiers = false; - while (pos < name.Length) { - switch (name [pos]) { - case '+': - res.Names.Add (UnescapeTypeName (name.Substring (name_start, pos - name_start))); - name_start = pos + 1; - break; - case '\\': - pos ++; - break; - case '&': - case '*': - case '[': - case ',': - case ']': - in_modifiers = true; - break; - default: - break; - } - if (in_modifiers) - break; - pos ++; - } - - res.Names.Add (UnescapeTypeName (name.Substring (name_start, pos - name_start))); - - bool isbyref = false; - bool isptr = false; - int rank = -1; - - bool end = false; - while (pos < name.Length && !end) { - switch (name [pos]) { - case '&': - if (isbyref) - return null; - pos ++; - isbyref = true; - isptr = false; - if (res.Modifiers == null) - res.Modifiers = new List (); - res.Modifiers.Add (0); - break; - case '*': - if (isbyref) - return null; - pos ++; - if (res.Modifiers == null) - res.Modifiers = new List (); - res.Modifiers.Add (-1); - isptr = true; - break; - case '[': - // An array or generic arguments - if (isbyref) - return null; - pos ++; - if (pos == name.Length) - return null; - - if (name [pos] == ',' || name [pos] == '*' || name [pos] == ']') { - // Array - bool bounded = false; - isptr = false; - rank = 1; - while (pos < name.Length) { - if (name [pos] == ']') - break; - if (name [pos] == ',') - rank ++; - else if (name [pos] == '*') /* '*' means unknown lower bound */ - bounded = true; - else - return null; - pos ++; - } - if (pos == name.Length) - return null; - if (name [pos] != ']') - return null; - pos ++; - /* bounded only allowed when rank == 1 */ - if (bounded && rank > 1) - return null; - /* n.b. bounded needs both modifiers: -2 == bounded, 1 == rank 1 array */ - if (res.Modifiers == null) - res.Modifiers = new List (); - if (bounded) - res.Modifiers.Add (-2); - res.Modifiers.Add (rank); - } else { - // Generic args - if (rank > 0 || isptr) - return null; - isptr = false; - res.TypeArguments = new List (); - while (pos < name.Length) { - while (pos < name.Length && name [pos] == ' ') - pos ++; - bool fqname = false; - if (pos < name.Length && name [pos] == '[') { - pos ++; - fqname = true; - } - - var arg = ParseName (name, true, pos, out pos); - if (arg == null) - return null; - res.TypeArguments.Add (arg); - - /*MS is lenient on [] delimited parameters that aren't fqn - and F# uses them.*/ - if (fqname && pos < name.Length && name [pos] != ']') { - if (name [pos] != ',') - return null; - pos ++; - int aname_start = pos; - while (pos < name.Length && name [pos] != ']') - pos ++; - if (pos == name.Length) - return null; - while (Char.IsWhiteSpace (name [aname_start])) - aname_start ++; - if (aname_start == pos) - return null; - arg.AssemblyName = name.Substring (aname_start, pos - aname_start); - pos ++; - } else if (fqname && pos < name.Length && name [pos] == ']') { - pos ++; - } - if (pos < name.Length && name [pos] == ']') { - pos ++; - break; - } else if (pos == name.Length) - return null; - pos ++; - } - } - break; - case ']': - if (recursed) { - end = true; - break; - } - return null; - case ',': - if (recursed) { - end = true; - break; - } - pos ++; - while (pos < name.Length && Char.IsWhiteSpace (name [pos])) - pos ++; - if (pos == name.Length) - return null; - res.AssemblyName = name.Substring (pos); - end = true; - break; - default: - return null; - } - if (end) - break; - } - - end_pos = pos; - return res; - } - } + internal static class TypeNameParser + { + private static readonly char[] SPECIAL_CHARS = { ',', '[', ']', '&', '*', '+', '\\' }; + + internal static Type GetType( + string typeName, + Func assemblyResolver, + Func typeResolver, + bool throwOnError, + bool ignoreCase, + ref StackCrawlMark stackMark) + { + if (typeName == null) + throw new ArgumentNullException(nameof(typeName)); + + ParsedName pname = ParseName(typeName, false, 0, out int end_pos); + if (pname == null) + { + if (throwOnError) + throw new ArgumentException(); + return null; + } + + return ConstructType(pname, assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark); + } + + private static Type ConstructType( + ParsedName pname, + Func assemblyResolver, + Func typeResolver, + bool throwOnError, + bool ignoreCase, + ref StackCrawlMark stackMark) + { + // Resolve assembly + Assembly assembly = null; + if (pname.AssemblyName != null) + { + assembly = ResolveAssembly(pname.AssemblyName, assemblyResolver, throwOnError, ref stackMark); + if (assembly == null) + // If throwOnError is true, an exception was already thrown + return null; + } + + // Resolve base type + var type = ResolveType(assembly, pname.Names, typeResolver, throwOnError, ignoreCase, ref stackMark); + if (type == null) + return null; + + // Resolve type arguments + if (pname.TypeArguments != null) + { + var args = new Type[pname.TypeArguments.Count]; + for (int i = 0; i < pname.TypeArguments.Count; ++i) + { + args[i] = ConstructType(pname.TypeArguments[i], assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark); + if (args[i] == null) + return null; + } + type = type.MakeGenericType(args); + } + + // Resolve modifiers + if (pname.Modifiers != null) + { + bool bounded = false; + foreach (var mod in pname.Modifiers) + { + switch (mod) + { + case 0: + type = type.MakeByRefType(); + break; + case -1: + type = type.MakePointerType(); + break; + case -2: + bounded = true; + break; + case 1: + if (bounded) + type = type.MakeArrayType(1); + else + type = type.MakeArrayType(); + break; + default: + type = type.MakeArrayType(mod); + break; + } + } + } + + return type; + } + + private static Assembly ResolveAssembly(string name, Func assemblyResolver, bool throwOnError, + ref StackCrawlMark stackMark) + { + var aname = new AssemblyName(name); + + if (assemblyResolver == null) + { + if (throwOnError) + { + return Assembly.Load(aname, ref stackMark, null); + } + else + { + try + { + return Assembly.Load(aname, ref stackMark, null); + } + catch (FileNotFoundException) + { + return null; + } + } + } + else + { + var assembly = assemblyResolver(aname); + if (assembly == null && throwOnError) + throw new FileNotFoundException(SR.FileNotFound_ResolveAssembly, name); + return assembly; + } + } + + private static Type ResolveType(Assembly assembly, List names, Func typeResolver, bool throwOnError, bool ignoreCase, ref StackCrawlMark stackMark) + { + Type type = null; + + string name = EscapeTypeName(names[0]); + // Resolve the top level type. + if (typeResolver != null) + { + type = typeResolver(assembly, name, ignoreCase); + if (type == null && throwOnError) + { + if (assembly == null) + throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveType, name)); + else + throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, name, assembly.FullName)); + } + } + else + { + if (assembly == null) + type = RuntimeType.GetType(name, throwOnError, ignoreCase, false, ref stackMark); + else + type = assembly.GetType(name, throwOnError, ignoreCase); + } + + if (type == null) + return null; + + // Resolve nested types. + BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Public; + if (ignoreCase) + bindingFlags |= BindingFlags.IgnoreCase; + + for (int i = 1; i < names.Count; ++i) + { + type = type.GetNestedType(names[i], bindingFlags); + if (type == null) + { + if (throwOnError) + throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveNestedType, names[i], names[i - 1])); + else + break; + } + } + return type; + } + + private static string EscapeTypeName(string name) + { + if (name.IndexOfAny(SPECIAL_CHARS) < 0) + return name; + + var sb = new StringBuilder(name.Length); + foreach (char c in name) + { + if (Array.IndexOf(SPECIAL_CHARS, c) >= 0) + sb.Append('\\'); + sb.Append(c); + } + + return sb.ToString(); + } + + private static string UnescapeTypeName(string name) + { + if (name.IndexOfAny(SPECIAL_CHARS) < 0) + return name; + + var sb = new StringBuilder(name.Length - 1); + for (int i = 0; i < name.Length; ++i) + { + if (name[i] == '\\' && i + 1 < name.Length) + i++; + sb.Append(name[i]); + } + + return sb.ToString(); + } + + private class ParsedName + { + public List Names; + public List TypeArguments; + public List Modifiers; + public string AssemblyName; + + /* For debugging + public override string ToString () { + var sb = new StringBuilder (); + sb.Append (Names [0]); + if (TypeArguments != null) { + sb.Append ("["); + for (int i = 0; i < TypeArguments.Count; ++i) { + if (TypeArguments [i].AssemblyName != null) + sb.Append ('['); + sb.Append (TypeArguments [i].ToString ()); + if (TypeArguments [i].AssemblyName != null) + sb.Append (']'); + if (i < TypeArguments.Count - 1) + sb.Append (", "); + } + sb.Append ("]"); + } + if (AssemblyName != null) + sb.Append ($", {AssemblyName}"); + return sb.ToString (); + } + */ + } + + // Ported from the C version in mono_reflection_parse_type_checked () + // Entries to the Names list are unescaped to internal form while AssemblyName is not, in an effort to maintain + // consistency with our native parser. Since this function is just called recursively, that should also be true + // for ParsedNames in TypeArguments. + private static ParsedName ParseName(string name, bool recursed, int pos, out int end_pos) + { + end_pos = 0; + + while (pos < name.Length && name[pos] == ' ') + pos++; + + var res = new ParsedName() { Names = new List() }; + + int start = pos; + int name_start = pos; + bool in_modifiers = false; + while (pos < name.Length) + { + switch (name[pos]) + { + case '+': + res.Names.Add(UnescapeTypeName(name.Substring(name_start, pos - name_start))); + name_start = pos + 1; + break; + case '\\': + pos++; + break; + case '&': + case '*': + case '[': + case ',': + case ']': + in_modifiers = true; + break; + default: + break; + } + if (in_modifiers) + break; + pos++; + } + + res.Names.Add(UnescapeTypeName(name.Substring(name_start, pos - name_start))); + + bool isbyref = false; + bool isptr = false; + int rank = -1; + + bool end = false; + while (pos < name.Length && !end) + { + switch (name[pos]) + { + case '&': + if (isbyref) + return null; + pos++; + isbyref = true; + isptr = false; + if (res.Modifiers == null) + res.Modifiers = new List(); + res.Modifiers.Add(0); + break; + case '*': + if (isbyref) + return null; + pos++; + if (res.Modifiers == null) + res.Modifiers = new List(); + res.Modifiers.Add(-1); + isptr = true; + break; + case '[': + // An array or generic arguments + if (isbyref) + return null; + pos++; + if (pos == name.Length) + return null; + + if (name[pos] == ',' || name[pos] == '*' || name[pos] == ']') + { + // Array + bool bounded = false; + isptr = false; + rank = 1; + while (pos < name.Length) + { + if (name[pos] == ']') + break; + if (name[pos] == ',') + rank++; + else if (name[pos] == '*') /* '*' means unknown lower bound */ + bounded = true; + else + return null; + pos++; + } + if (pos == name.Length) + return null; + if (name[pos] != ']') + return null; + pos++; + /* bounded only allowed when rank == 1 */ + if (bounded && rank > 1) + return null; + /* n.b. bounded needs both modifiers: -2 == bounded, 1 == rank 1 array */ + if (res.Modifiers == null) + res.Modifiers = new List(); + if (bounded) + res.Modifiers.Add(-2); + res.Modifiers.Add(rank); + } + else + { + // Generic args + if (rank > 0 || isptr) + return null; + isptr = false; + res.TypeArguments = new List(); + while (pos < name.Length) + { + while (pos < name.Length && name[pos] == ' ') + pos++; + bool fqname = false; + if (pos < name.Length && name[pos] == '[') + { + pos++; + fqname = true; + } + + var arg = ParseName(name, true, pos, out pos); + if (arg == null) + return null; + res.TypeArguments.Add(arg); + + /*MS is lenient on [] delimited parameters that aren't fqn - and F# uses them.*/ + if (fqname && pos < name.Length && name[pos] != ']') + { + if (name[pos] != ',') + return null; + pos++; + int aname_start = pos; + while (pos < name.Length && name[pos] != ']') + pos++; + if (pos == name.Length) + return null; + while (char.IsWhiteSpace(name[aname_start])) + aname_start++; + if (aname_start == pos) + return null; + arg.AssemblyName = name.Substring(aname_start, pos - aname_start); + pos++; + } + else if (fqname && pos < name.Length && name[pos] == ']') + { + pos++; + } + if (pos < name.Length && name[pos] == ']') + { + pos++; + break; + } + else if (pos == name.Length) + return null; + pos++; + } + } + break; + case ']': + if (recursed) + { + end = true; + break; + } + return null; + case ',': + if (recursed) + { + end = true; + break; + } + pos++; + while (pos < name.Length && char.IsWhiteSpace(name[pos])) + pos++; + if (pos == name.Length) + return null; + res.AssemblyName = name.Substring(pos); + end = true; + break; + default: + return null; + } + if (end) + break; + } + + end_pos = pos; + return res; + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/TypeSpec.cs b/src/mono/netcore/System.Private.CoreLib/src/System/TypeSpec.cs index 3391c1fd34347..15741baae22a4 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/TypeSpec.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/TypeSpec.cs @@ -14,10 +14,10 @@ // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -32,589 +32,650 @@ using System.Reflection; using System.Threading; -namespace System { - internal interface ModifierSpec { - Type Resolve (Type type); - Text.StringBuilder Append (Text.StringBuilder sb); - } - internal class ArraySpec : ModifierSpec - { - // dimensions == 1 and bound, or dimensions > 1 and !bound - int dimensions; - bool bound; - - internal ArraySpec (int dimensions, bool bound) - { - this.dimensions = dimensions; - this.bound = bound; - } - - public Type Resolve (Type type) - { - if (bound) - return type.MakeArrayType (1); - else if (dimensions == 1) - return type.MakeArrayType (); - return type.MakeArrayType (dimensions); - } - - public Text.StringBuilder Append (Text.StringBuilder sb) - { - if (bound) - return sb.Append ("[*]"); - return sb.Append ('[') - .Append (',', dimensions - 1) - .Append (']'); - - } - public override string ToString () - { - return Append (new Text.StringBuilder ()).ToString (); - } - - public int Rank { - get { - return dimensions; - } - } - - public bool IsBound { - get { - return bound; - } - } - } - - internal class PointerSpec : ModifierSpec - { - int pointer_level; - - internal PointerSpec (int pointer_level) { - this.pointer_level = pointer_level; - } - - public Type Resolve (Type type) { - for (int i = 0; i < pointer_level; ++i) - type = type.MakePointerType (); - return type; - } - - public Text.StringBuilder Append (Text.StringBuilder sb) - { - return sb.Append ('*', pointer_level); - } - - public override string ToString () { - return Append (new Text.StringBuilder ()).ToString (); - } - - } - - internal class TypeSpec - { - TypeIdentifier name; - string assembly_name; - List nested; - List generic_params; - List modifier_spec; - bool is_byref; - - string display_fullname; // cache - - internal bool HasModifiers { - get { return modifier_spec != null; } - } - - internal bool IsNested { - get { return nested != null && nested.Count > 0; } - } - - internal bool IsByRef { - get { return is_byref; } - } - - internal TypeName Name { - get { return name; } - } - - internal IEnumerable Nested { - get { - if (nested != null) - return nested; - else - return Array.Empty (); - } - } - - internal IEnumerable Modifiers { - get { - if (modifier_spec != null) - return modifier_spec; - else - return Array.Empty (); - } - } - - [Flags] - internal enum DisplayNameFormat { - Default = 0x0, - WANT_ASSEMBLY = 0x1, - NO_MODIFIERS = 0x2, - } +namespace System +{ + internal interface IModifierSpec + { + Type Resolve(Type type); + Text.StringBuilder Append(Text.StringBuilder sb); + } + internal class IArraySpec : IModifierSpec + { + // dimensions == 1 and bound, or dimensions > 1 and !bound + private int dimensions; + private bool bound; + + internal IArraySpec(int dimensions, bool bound) + { + this.dimensions = dimensions; + this.bound = bound; + } + + public Type Resolve(Type type) + { + if (bound) + return type.MakeArrayType(1); + else if (dimensions == 1) + return type.MakeArrayType(); + return type.MakeArrayType(dimensions); + } + + public Text.StringBuilder Append(Text.StringBuilder sb) + { + if (bound) + return sb.Append("[*]"); + return sb.Append('[') + .Append(',', dimensions - 1) + .Append(']'); + + } + public override string ToString() + { + return Append(new Text.StringBuilder()).ToString(); + } + + public int Rank + { + get + { + return dimensions; + } + } + + public bool IsBound + { + get + { + return bound; + } + } + } + + internal class PointerSpec : IModifierSpec + { + private int pointer_level; + + internal PointerSpec(int pointer_level) + { + this.pointer_level = pointer_level; + } + + public Type Resolve(Type type) + { + for (int i = 0; i < pointer_level; ++i) + type = type.MakePointerType(); + return type; + } + + public Text.StringBuilder Append(Text.StringBuilder sb) + { + return sb.Append('*', pointer_level); + } + + public override string ToString() + { + return Append(new Text.StringBuilder()).ToString(); + } + + } + + internal class TypeSpec + { + private ITypeIdentifier name; + private string assembly_name; + private List nested; + private List generic_params; + private List modifier_spec; + private bool is_byref; + + private string display_fullname; // cache + + internal bool HasModifiers + { + get { return modifier_spec != null; } + } + + internal bool IsNested + { + get { return nested != null && nested.Count > 0; } + } + + internal bool IsByRef + { + get { return is_byref; } + } + + internal ITypeName Name + { + get { return name; } + } + + internal IEnumerable Nested + { + get + { + if (nested != null) + return nested; + else + return Array.Empty(); + } + } + + internal IEnumerable Modifiers + { + get + { + if (modifier_spec != null) + return modifier_spec; + else + return Array.Empty(); + } + } + + [Flags] + internal enum DisplayNameFormat + { + Default = 0x0, + WANT_ASSEMBLY = 0x1, + NO_MODIFIERS = 0x2, + } #if DEBUG - public override string ToString () { - return GetDisplayFullName (DisplayNameFormat.WANT_ASSEMBLY); - } + public override string ToString() + { + return GetDisplayFullName(DisplayNameFormat.WANT_ASSEMBLY); + } #endif - string GetDisplayFullName (DisplayNameFormat flags) - { - bool wantAssembly = (flags & DisplayNameFormat.WANT_ASSEMBLY) != 0; - bool wantModifiers = (flags & DisplayNameFormat.NO_MODIFIERS) == 0; - var sb = new Text.StringBuilder(name.DisplayName); - if (nested != null) { - foreach (var n in nested) - sb.Append ('+').Append (n.DisplayName); - } - - if (generic_params != null) { - sb.Append ('['); - for (int i = 0; i < generic_params.Count; ++i) { - if (i > 0) - sb.Append (", "); - if (generic_params [i].assembly_name != null) - sb.Append ('[').Append (generic_params [i].DisplayFullName).Append (']'); - else - sb.Append (generic_params [i].DisplayFullName); - } - sb.Append (']'); - } - - if (wantModifiers) - GetModifierString (sb); - - if (assembly_name != null && wantAssembly) - sb.Append (", ").Append (assembly_name); - - return sb.ToString(); - } - - internal string ModifierString () - { - return GetModifierString (new Text.StringBuilder ()).ToString (); - } - - private Text.StringBuilder GetModifierString (Text.StringBuilder sb) - { - if (modifier_spec != null) { - foreach (var md in modifier_spec) - md.Append (sb); - } - - if (is_byref) - sb.Append ('&'); - - return sb; - } - - internal string DisplayFullName { - get { - if (display_fullname == null) - display_fullname = GetDisplayFullName (DisplayNameFormat.Default); - return display_fullname; - } - } - - internal static TypeSpec Parse (string typeName) - { - int pos = 0; - if (typeName == null) - throw new ArgumentNullException ("typeName"); - - TypeSpec res = Parse (typeName, ref pos, false, true); - if (pos < typeName.Length) - throw new ArgumentException ("Count not parse the whole type name", "typeName"); - return res; - } - - internal static string EscapeDisplayName(string internalName) - { - // initial capacity = length of internalName. - // Maybe we won't have to escape anything. - var res = new Text.StringBuilder (internalName.Length); - foreach (char c in internalName) - { - switch (c) { - case '+': - case ',': - case '[': - case ']': - case '*': - case '&': - case '\\': - res.Append ('\\').Append (c); - break; - default: - res.Append (c); - break; - } - } - return res.ToString (); - } - - internal static string UnescapeInternalName(string displayName) - { - var res = new Text.StringBuilder (displayName.Length); - for (int i = 0; i < displayName.Length; ++i) - { - char c = displayName[i]; - if (c == '\\') - if (++i < displayName.Length) - c = displayName[i]; - res.Append (c); - } - return res.ToString (); - } - - internal static bool NeedsEscaping (string internalName) - { - foreach (char c in internalName) - { - switch (c) { - case ',': - case '+': - case '*': - case '&': - case '[': - case ']': - case '\\': - return true; - default: - break; - } - } - return false; - } - - internal Type Resolve (Func assemblyResolver, Func typeResolver, bool throwOnError, bool ignoreCase, ref StackCrawlMark stackMark) - { - Assembly asm = null; - if (assemblyResolver == null && typeResolver == null) - return RuntimeType.GetType (DisplayFullName, throwOnError, ignoreCase, false, ref stackMark); - - if (assembly_name != null) { - if (assemblyResolver != null) - asm = assemblyResolver (new AssemblyName (assembly_name)); - else - asm = Assembly.Load (assembly_name); - - if (asm == null) { - if (throwOnError) - throw new FileNotFoundException ("Could not resolve assembly '" + assembly_name + "'"); - return null; - } - } - - Type type = null; - if (typeResolver != null) - type = typeResolver (asm, name.DisplayName, ignoreCase); - else - type = asm.GetType (name.DisplayName, false, ignoreCase); - if (type == null) { - if (throwOnError) - throw new TypeLoadException ("Could not resolve type '" + name + "'"); - return null; - } - - if (nested != null) { - foreach (var n in nested) { - var tmp = type.GetNestedType (n.DisplayName, BindingFlags.Public | BindingFlags.NonPublic); - if (tmp == null) { - if (throwOnError) - throw new TypeLoadException ("Could not resolve type '" + n + "'"); - return null; - } - type = tmp; - } - } - - if (generic_params != null) { - Type[] args = new Type [generic_params.Count]; - for (int i = 0; i < args.Length; ++i) { - var tmp = generic_params [i].Resolve (assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark); - if (tmp == null) { - if (throwOnError) - throw new TypeLoadException ("Could not resolve type '" + generic_params [i].name + "'"); - return null; - } - args [i] = tmp; - } - type = type.MakeGenericType (args); - } - - if (modifier_spec != null) { - foreach (var md in modifier_spec) - type = md.Resolve (type); - } - - if (is_byref) - type = type.MakeByRefType (); - - return type; - } - - void AddName (string type_name) - { - if (name == null) { - name = ParsedTypeIdentifier(type_name); - } else { - if (nested == null) - nested = new List (); - nested.Add (ParsedTypeIdentifier(type_name)); - } - } - - void AddModifier (ModifierSpec md) - { - if (modifier_spec == null) - modifier_spec = new List (); - modifier_spec.Add (md); - } - - static void SkipSpace (string name, ref int pos) - { - int p = pos; - while (p < name.Length && Char.IsWhiteSpace (name [p])) - ++p; - pos = p; - } - - static void BoundCheck (int idx, string s) - { - if (idx >= s.Length) - throw new ArgumentException ("Invalid generic arguments spec", "typeName"); - } - - static TypeIdentifier ParsedTypeIdentifier (string displayName) - { - return TypeIdentifiers.FromDisplay(displayName); - } - - static TypeSpec Parse (string name, ref int p, bool is_recurse, bool allow_aqn) - { - // Invariants: - // - On exit p, is updated to pos the current unconsumed character. - // - // - The callee peeks at but does not consume delimiters following - // recurisve parse (so for a recursive call like the args of "Foo[P,Q]" - // we'll return with p either on ',' or on ']'. If the name was aqn'd - // "Foo[[P,assmblystuff],Q]" on return p with be on the ']' just - // after the "assmblystuff") - // - // - If allow_aqn is True, assembly qualification is optional. - // If allow_aqn is False, assembly qualification is prohibited. - int pos = p; - int name_start; - bool in_modifiers = false; - TypeSpec data = new TypeSpec (); - - SkipSpace (name, ref pos); - - name_start = pos; - - for (; pos < name.Length; ++pos) { - switch (name [pos]) { - case '+': - data.AddName (name.Substring (name_start, pos - name_start)); - name_start = pos + 1; - break; - case ',': - case ']': - data.AddName (name.Substring (name_start, pos - name_start)); - name_start = pos + 1; - in_modifiers = true; - if (is_recurse && !allow_aqn) { - p = pos; - return data; - } - break; - case '&': - case '*': - case '[': - if (name [pos] != '[' && is_recurse) - throw new ArgumentException ("Generic argument can't be byref or pointer type", "typeName"); - data.AddName (name.Substring (name_start, pos - name_start)); - name_start = pos + 1; - in_modifiers = true; - break; - case '\\': - pos++; - break; - } - if (in_modifiers) - break; - } - - if (name_start < pos) - data.AddName (name.Substring (name_start, pos - name_start)); - else if (name_start == pos) - data.AddName (String.Empty); - - if (in_modifiers) { - for (; pos < name.Length; ++pos) { - - switch (name [pos]) { - case '&': - if (data.is_byref) - throw new ArgumentException ("Can't have a byref of a byref", "typeName"); - - data.is_byref = true; - break; - case '*': - if (data.is_byref) - throw new ArgumentException ("Can't have a pointer to a byref type", "typeName"); - // take subsequent '*'s too - int pointer_level = 1; - while (pos+1 < name.Length && name[pos+1] == '*') { - ++pos; - ++pointer_level; - } - data.AddModifier (new PointerSpec(pointer_level)); - break; - case ',': - if (is_recurse && allow_aqn) { - int end = pos; - while (end < name.Length && name [end] != ']') - ++end; - if (end >= name.Length) - throw new ArgumentException ("Unmatched ']' while parsing generic argument assembly name"); - data.assembly_name = name.Substring (pos + 1, end - pos - 1).Trim (); - p = end; - return data; - } - if (is_recurse) { - p = pos; - return data; - } - if (allow_aqn) { - data.assembly_name = name.Substring (pos + 1).Trim (); - pos = name.Length; - } - break; - case '[': - if (data.is_byref) - throw new ArgumentException ("Byref qualifier must be the last one of a type", "typeName"); - ++pos; - if (pos >= name.Length) - throw new ArgumentException ("Invalid array/generic spec", "typeName"); - SkipSpace (name, ref pos); - - if (name [pos] != ',' && name [pos] != '*' && name [pos] != ']') {//generic args - List args = new List (); - if (data.HasModifiers) - throw new ArgumentException ("generic args after array spec or pointer type", "typeName"); - - while (pos < name.Length) { - SkipSpace (name, ref pos); - bool aqn = name [pos] == '['; - if (aqn) - ++pos; //skip '[' to the start of the type - args.Add (Parse (name, ref pos, true, aqn)); - BoundCheck (pos, name); - if (aqn) { - if (name [pos] == ']') - ++pos; - else - throw new ArgumentException ("Unclosed assembly-qualified type name at " + name[pos], "typeName"); - BoundCheck (pos, name); + private string GetDisplayFullName(DisplayNameFormat flags) + { + bool wantAssembly = (flags & DisplayNameFormat.WANT_ASSEMBLY) != 0; + bool wantModifiers = (flags & DisplayNameFormat.NO_MODIFIERS) == 0; + var sb = new Text.StringBuilder(name.DisplayName); + if (nested != null) + { + foreach (var n in nested) + sb.Append('+').Append(n.DisplayName); + } + + if (generic_params != null) + { + sb.Append('['); + for (int i = 0; i < generic_params.Count; ++i) + { + if (i > 0) + sb.Append(", "); + if (generic_params[i].assembly_name != null) + sb.Append('[').Append(generic_params[i].DisplayFullName).Append(']'); + else + sb.Append(generic_params[i].DisplayFullName); + } + sb.Append(']'); + } + + if (wantModifiers) + GetModifierString(sb); + + if (assembly_name != null && wantAssembly) + sb.Append(", ").Append(assembly_name); + + return sb.ToString(); + } + + internal string ModifierString() + { + return GetModifierString(new Text.StringBuilder()).ToString(); + } + + private Text.StringBuilder GetModifierString(Text.StringBuilder sb) + { + if (modifier_spec != null) + { + foreach (var md in modifier_spec) + md.Append(sb); + } + + if (is_byref) + sb.Append('&'); + + return sb; + } + + internal string DisplayFullName + { + get + { + if (display_fullname == null) + display_fullname = GetDisplayFullName(DisplayNameFormat.Default); + return display_fullname; + } + } + + internal static TypeSpec Parse(string typeName) + { + int pos = 0; + if (typeName == null) + throw new ArgumentNullException(nameof(typeName)); + + TypeSpec res = Parse(typeName, ref pos, false, true); + if (pos < typeName.Length) + throw new ArgumentException("Count not parse the whole type name", nameof(typeName)); + return res; + } + + internal static string EscapeDisplayName(string internalName) + { + // initial capacity = length of internalName. + // Maybe we won't have to escape anything. + var res = new Text.StringBuilder(internalName.Length); + foreach (char c in internalName) + { + switch (c) + { + case '+': + case ',': + case '[': + case ']': + case '*': + case '&': + case '\\': + res.Append('\\').Append(c); + break; + default: + res.Append(c); + break; + } + } + return res.ToString(); + } + + internal static string UnescapeInternalName(string displayName) + { + var res = new Text.StringBuilder(displayName.Length); + for (int i = 0; i < displayName.Length; ++i) + { + char c = displayName[i]; + if (c == '\\') + if (++i < displayName.Length) + c = displayName[i]; + res.Append(c); + } + return res.ToString(); + } + + internal static bool NeedsEscaping(string internalName) + { + foreach (char c in internalName) + { + switch (c) + { + case ',': + case '+': + case '*': + case '&': + case '[': + case ']': + case '\\': + return true; + default: + break; + } + } + return false; + } + + internal Type Resolve(Func assemblyResolver, Func typeResolver, bool throwOnError, bool ignoreCase, ref StackCrawlMark stackMark) + { + Assembly asm = null; + if (assemblyResolver == null && typeResolver == null) + return RuntimeType.GetType(DisplayFullName, throwOnError, ignoreCase, false, ref stackMark); + + if (assembly_name != null) + { + if (assemblyResolver != null) + asm = assemblyResolver(new AssemblyName(assembly_name)); + else + asm = Assembly.Load(assembly_name); + + if (asm == null) + { + if (throwOnError) + throw new FileNotFoundException("Could not resolve assembly '" + assembly_name + "'"); + return null; + } + } + + Type type = null; + if (typeResolver != null) + type = typeResolver(asm, name.DisplayName, ignoreCase); + else + type = asm.GetType(name.DisplayName, false, ignoreCase); + if (type == null) + { + if (throwOnError) + throw new TypeLoadException("Could not resolve type '" + name + "'"); + return null; + } + + if (nested != null) + { + foreach (var n in nested) + { + var tmp = type.GetNestedType(n.DisplayName, BindingFlags.Public | BindingFlags.NonPublic); + if (tmp == null) + { + if (throwOnError) + throw new TypeLoadException("Could not resolve type '" + n + "'"); + return null; + } + type = tmp; + } + } + + if (generic_params != null) + { + Type[] args = new Type[generic_params.Count]; + for (int i = 0; i < args.Length; ++i) + { + var tmp = generic_params[i].Resolve(assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark); + if (tmp == null) + { + if (throwOnError) + throw new TypeLoadException("Could not resolve type '" + generic_params[i].name + "'"); + return null; + } + args[i] = tmp; + } + type = type.MakeGenericType(args); + } + + if (modifier_spec != null) + { + foreach (var md in modifier_spec) + type = md.Resolve(type); + } + + if (is_byref) + type = type.MakeByRefType(); + + return type; + } + + private void AddName(string type_name) + { + if (name == null) + { + name = ParsedTypeIdentifier(type_name); + } + else + { + if (nested == null) + nested = new List(); + nested.Add(ParsedTypeIdentifier(type_name)); + } + } + + private void AddModifier(IModifierSpec md) + { + if (modifier_spec == null) + modifier_spec = new List(); + modifier_spec.Add(md); + } + + private static void SkipSpace(string name, ref int pos) + { + int p = pos; + while (p < name.Length && char.IsWhiteSpace(name[p])) + ++p; + pos = p; + } + + private static void BoundCheck(int idx, string s) + { + if (idx >= s.Length) + throw new ArgumentException("Invalid generic arguments spec", "typeName"); + } + + private static ITypeIdentifier ParsedTypeIdentifier(string displayName) + { + return TypeIdentifiers.FromDisplay(displayName); + } + + private static TypeSpec Parse(string name, ref int p, bool is_recurse, bool allow_aqn) + { + // Invariants: + // - On exit p, is updated to pos the current unconsumed character. + // + // - The callee peeks at but does not consume delimiters following + // recurisve parse (so for a recursive call like the args of "Foo[P,Q]" + // we'll return with p either on ',' or on ']'. If the name was aqn'd + // "Foo[[P,assmblystuff],Q]" on return p with be on the ']' just + // after the "assmblystuff") + // + // - If allow_aqn is True, assembly qualification is optional. + // If allow_aqn is False, assembly qualification is prohibited. + int pos = p; + int name_start; + bool in_modifiers = false; + TypeSpec data = new TypeSpec(); + + SkipSpace(name, ref pos); + + name_start = pos; + + for (; pos < name.Length; ++pos) + { + switch (name[pos]) + { + case '+': + data.AddName(name.Substring(name_start, pos - name_start)); + name_start = pos + 1; + break; + case ',': + case ']': + data.AddName(name.Substring(name_start, pos - name_start)); + name_start = pos + 1; + in_modifiers = true; + if (is_recurse && !allow_aqn) + { + p = pos; + return data; + } + break; + case '&': + case '*': + case '[': + if (name[pos] != '[' && is_recurse) + throw new ArgumentException("Generic argument can't be byref or pointer type", "typeName"); + data.AddName(name.Substring(name_start, pos - name_start)); + name_start = pos + 1; + in_modifiers = true; + break; + case '\\': + pos++; + break; + } + if (in_modifiers) + break; + } + + if (name_start < pos) + data.AddName(name.Substring(name_start, pos - name_start)); + else if (name_start == pos) + data.AddName(string.Empty); + + if (in_modifiers) + { + for (; pos < name.Length; ++pos) + { + + switch (name[pos]) + { + case '&': + if (data.is_byref) + throw new ArgumentException("Can't have a byref of a byref", "typeName"); + + data.is_byref = true; + break; + case '*': + if (data.is_byref) + throw new ArgumentException("Can't have a pointer to a byref type", "typeName"); + // take subsequent '*'s too + int pointer_level = 1; + while (pos + 1 < name.Length && name[pos + 1] == '*') + { + ++pos; + ++pointer_level; + } + data.AddModifier(new PointerSpec(pointer_level)); + break; + case ',': + if (is_recurse && allow_aqn) + { + int end = pos; + while (end < name.Length && name[end] != ']') + ++end; + if (end >= name.Length) + throw new ArgumentException("Unmatched ']' while parsing generic argument assembly name"); + data.assembly_name = name.Substring(pos + 1, end - pos - 1).Trim(); + p = end; + return data; + } + if (is_recurse) + { + p = pos; + return data; + } + if (allow_aqn) + { + data.assembly_name = name.Substring(pos + 1).Trim(); + pos = name.Length; + } + break; + case '[': + if (data.is_byref) + throw new ArgumentException("Byref qualifier must be the last one of a type", "typeName"); + ++pos; + if (pos >= name.Length) + throw new ArgumentException("Invalid array/generic spec", "typeName"); + SkipSpace(name, ref pos); + + if (name[pos] != ',' && name[pos] != '*' && name[pos] != ']') + {//generic args + List args = new List(); + if (data.HasModifiers) + throw new ArgumentException("generic args after array spec or pointer type", "typeName"); + + while (pos < name.Length) + { + SkipSpace(name, ref pos); + bool aqn = name[pos] == '['; + if (aqn) + ++pos; //skip '[' to the start of the type + args.Add(Parse(name, ref pos, true, aqn)); + BoundCheck(pos, name); + if (aqn) + { + if (name[pos] == ']') + ++pos; + else + throw new ArgumentException("Unclosed assembly-qualified type name at " + name[pos], "typeName"); + BoundCheck(pos, name); + } + + if (name[pos] == ']') + break; + if (name[pos] == ',') + ++pos; // skip ',' to the start of the next arg + else + throw new ArgumentException("Invalid generic arguments separator " + name[pos], "typeName"); + + } + if (pos >= name.Length || name[pos] != ']') + throw new ArgumentException("Error parsing generic params spec", "typeName"); + data.generic_params = args; + } + else + { //array spec + int dimensions = 1; + bool bound = false; + while (pos < name.Length && name[pos] != ']') + { + if (name[pos] == '*') + { + if (bound) + throw new ArgumentException("Array spec cannot have 2 bound dimensions", "typeName"); + bound = true; + } + else if (name[pos] != ',') + throw new ArgumentException("Invalid character in array spec " + name[pos], "typeName"); + else + ++dimensions; + + ++pos; + SkipSpace(name, ref pos); + } + if (pos >= name.Length || name[pos] != ']') + throw new ArgumentException("Error parsing array spec", "typeName"); + if (dimensions > 1 && bound) + throw new ArgumentException("Invalid array spec, multi-dimensional array cannot be bound", "typeName"); + data.AddModifier(new IArraySpec(dimensions, bound)); + } + + break; + case ']': + if (is_recurse) + { + p = pos; + return data; + } + throw new ArgumentException("Unmatched ']'", "typeName"); + default: + throw new ArgumentException("Bad type def, can't handle '" + name[pos] + "'" + " at " + pos, "typeName"); + } + } + } + + p = pos; + return data; + } + + internal ITypeName TypeNameWithoutModifiers() + { + return new TypeSpecTypeName(this, false); + } + + internal ITypeName TypeName + { + get { return new TypeSpecTypeName(this, true); } + } + + private class TypeSpecTypeName : TypeNames.ATypeName, ITypeName + { + private TypeSpec ts; + private bool want_modifiers; + + internal TypeSpecTypeName(TypeSpec ts, bool wantModifiers) + { + this.ts = ts; + this.want_modifiers = wantModifiers; + } + + public override string DisplayName + { + get + { + if (want_modifiers) + return ts.DisplayFullName; + else + return ts.GetDisplayFullName(DisplayNameFormat.NO_MODIFIERS); + } + } + + public override ITypeName NestedName(ITypeIdentifier innerName) + { + return TypeNames.FromDisplay(DisplayName + "+" + innerName.DisplayName); + } + } + + } } - - if (name [pos] == ']') - break; - if (name [pos] == ',') - ++pos; // skip ',' to the start of the next arg - else - throw new ArgumentException ("Invalid generic arguments separator " + name [pos], "typeName"); - - } - if (pos >= name.Length || name [pos] != ']') - throw new ArgumentException ("Error parsing generic params spec", "typeName"); - data.generic_params = args; - } else { //array spec - int dimensions = 1; - bool bound = false; - while (pos < name.Length && name [pos] != ']') { - if (name [pos] == '*') { - if (bound) - throw new ArgumentException ("Array spec cannot have 2 bound dimensions", "typeName"); - bound = true; - } - else if (name [pos] != ',') - throw new ArgumentException ("Invalid character in array spec " + name [pos], "typeName"); - else - ++dimensions; - - ++pos; - SkipSpace (name, ref pos); - } - if (pos >= name.Length || name [pos] != ']') - throw new ArgumentException ("Error parsing array spec", "typeName"); - if (dimensions > 1 && bound) - throw new ArgumentException ("Invalid array spec, multi-dimensional array cannot be bound", "typeName"); - data.AddModifier (new ArraySpec (dimensions, bound)); - } - - break; - case ']': - if (is_recurse) { - p = pos; - return data; - } - throw new ArgumentException ("Unmatched ']'", "typeName"); - default: - throw new ArgumentException ("Bad type def, can't handle '" + name [pos]+"'" + " at " + pos, "typeName"); - } - } - } - - p = pos; - return data; - } - - internal TypeName TypeNameWithoutModifiers () - { - return new TypeSpecTypeName (this, false); - } - - internal TypeName TypeName { - get { return new TypeSpecTypeName (this, true); } - } - - private class TypeSpecTypeName : TypeNames.ATypeName, TypeName { - TypeSpec ts; - bool want_modifiers; - - internal TypeSpecTypeName (TypeSpec ts, bool wantModifiers) - { - this.ts = ts; - this.want_modifiers = wantModifiers; - } - - public override string DisplayName { - get { - if (want_modifiers) - return ts.DisplayFullName; - else - return ts.GetDisplayFullName (DisplayNameFormat.NO_MODIFIERS); - } - } - - public override TypeName NestedName (TypeIdentifier innerName) - { - return TypeNames.FromDisplay(DisplayName + "+" + innerName.DisplayName); - } - } - - } -} - diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/TypedReference.cs b/src/mono/netcore/System.Private.CoreLib/src/System/TypedReference.cs index feee2c67e4224..07dc8103b3fab 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/TypedReference.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/TypedReference.cs @@ -7,97 +7,103 @@ namespace System { - [CLSCompliantAttribute (false)] - public ref struct TypedReference - { - #region sync with object-internals.h - RuntimeTypeHandle type; - IntPtr Value; - IntPtr Type; - #endregion - - public static TypedReference MakeTypedReference (object target, FieldInfo[] flds) - { - if (target == null) - throw new ArgumentNullException (nameof (target)); - if (flds == null) - throw new ArgumentNullException (nameof (flds)); - if (flds.Length == 0) - throw new ArgumentException (SR.Arg_ArrayZeroError, nameof (flds)); - - var fields = new IntPtr [flds.Length]; - var targetType = (RuntimeType)target.GetType (); - for (int i = 0; i < flds.Length; i++) { - var field = flds [i] as RuntimeFieldInfo; - if (field == null) - throw new ArgumentException (SR.Argument_MustBeRuntimeFieldInfo); - if (field.IsStatic) - throw new ArgumentException (SR.Argument_TypedReferenceInvalidField); - - if (targetType != field.GetDeclaringTypeInternal () && !targetType.IsSubclassOf (field.GetDeclaringTypeInternal ())) - throw new MissingMemberException (SR.MissingMemberTypeRef); - - var fieldType = (RuntimeType)field.FieldType; - if (fieldType.IsPrimitive) - throw new ArgumentException (SR.Arg_TypeRefPrimitve); - if (i < (flds.Length - 1) && !fieldType.IsValueType) - throw new MissingMemberException (SR.MissingMemberNestErr); - - fields[i] = field.FieldHandle.Value; - targetType = fieldType; - } - - var result = new TypedReference (); - - unsafe { - InternalMakeTypedReference (&result, target, fields, targetType); - } - return result; - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - unsafe static extern void InternalMakeTypedReference (void* result, Object target, IntPtr[] flds, RuntimeType lastFieldType); - - public override int GetHashCode () - { - if (Type == IntPtr.Zero) - return 0; - else - return __reftype (this).GetHashCode (); - } - - public override bool Equals (object? o) - { - throw new NotSupportedException (SR.NotSupported_NYI); - } - - public unsafe static object ToObject (TypedReference value) - { - return InternalToObject (&value); - } - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - unsafe extern static object InternalToObject (void * value); - - internal bool IsNull { - get { - return Value == IntPtr.Zero && Type == IntPtr.Zero; - } - } - - public static Type GetTargetType (TypedReference value) - { - return __reftype (value); - } - - public static RuntimeTypeHandle TargetTypeToken (TypedReference value) - { - return __reftype (value).TypeHandle; - } - - public unsafe static void SetTypedReference (TypedReference target, object? value) - { - throw new NotSupportedException (); - } - } + [CLSCompliantAttribute(false)] + public ref struct TypedReference + { + #region sync with object-internals.h + #pragma warning disable CA1823 // used by runtime + private RuntimeTypeHandle type; + private IntPtr Value; + private IntPtr Type; + #pragma warning restore CA1823 + #endregion + + public static TypedReference MakeTypedReference(object target, FieldInfo[] flds) + { + if (target == null) + throw new ArgumentNullException(nameof(target)); + if (flds == null) + throw new ArgumentNullException(nameof(flds)); + if (flds.Length == 0) + throw new ArgumentException(SR.Arg_ArrayZeroError, nameof(flds)); + + var fields = new IntPtr[flds.Length]; + var targetType = (RuntimeType)target.GetType(); + for (int i = 0; i < flds.Length; i++) + { + var field = flds[i] as RuntimeFieldInfo; + if (field == null) + throw new ArgumentException(SR.Argument_MustBeRuntimeFieldInfo); + if (field.IsStatic) + throw new ArgumentException(SR.Argument_TypedReferenceInvalidField); + + if (targetType != field.GetDeclaringTypeInternal() && !targetType.IsSubclassOf(field.GetDeclaringTypeInternal())) + throw new MissingMemberException(SR.MissingMemberTypeRef); + + var fieldType = (RuntimeType)field.FieldType; + if (fieldType.IsPrimitive) + throw new ArgumentException(SR.Arg_TypeRefPrimitve); + if (i < (flds.Length - 1) && !fieldType.IsValueType) + throw new MissingMemberException(SR.MissingMemberNestErr); + + fields[i] = field.FieldHandle.Value; + targetType = fieldType; + } + + var result = default(TypedReference); + + unsafe + { + InternalMakeTypedReference(&result, target, fields, targetType); + } + return result; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static unsafe extern void InternalMakeTypedReference(void* result, object target, IntPtr[] flds, RuntimeType lastFieldType); + + public override int GetHashCode() + { + if (Type == IntPtr.Zero) + return 0; + else + return __reftype(this).GetHashCode(); + } + + public override bool Equals(object? o) + { + throw new NotSupportedException(SR.NotSupported_NYI); + } + + public static unsafe object ToObject(TypedReference value) + { + return InternalToObject(&value); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static unsafe extern object InternalToObject(void* value); + + internal bool IsNull + { + get + { + return Value == IntPtr.Zero && Type == IntPtr.Zero; + } + } + + public static Type GetTargetType(TypedReference value) + { + return __reftype(value); + } + + public static RuntimeTypeHandle TargetTypeToken(TypedReference value) + { + return __reftype(value).TypeHandle; + } + + public static unsafe void SetTypedReference(TypedReference target, object? value) + { + throw new NotSupportedException(); + } + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/ValueType.cs b/src/mono/netcore/System.Private.CoreLib/src/System/ValueType.cs index 86c86625a6e5d..549c03048fb0b 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/ValueType.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/ValueType.cs @@ -7,71 +7,73 @@ namespace System { - [Serializable] - [System.Runtime.CompilerServices.TypeForwardedFrom ("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] - public abstract class ValueType - { - // This is also used by RuntimeHelpers - internal static bool DefaultEquals (object o1, object o2) - { - RuntimeType o1_type = (RuntimeType) o1.GetType (); - RuntimeType o2_type = (RuntimeType) o2.GetType (); - - if (o1_type != o2_type) - return false; - - object[] fields; - bool res = InternalEquals (o1, o2, out fields); - if (fields == null) - return res; - - for (int i = 0; i < fields.Length; i += 2) { - object meVal = fields [i]; - object youVal = fields [i + 1]; - if (meVal == null) { - if (youVal == null) - continue; - - return false; - } - - if (!meVal.Equals (youVal)) - return false; - } - - return true; - } - - public override bool Equals (object? obj) - { - if (obj == null) - return false; - - return DefaultEquals (this, obj); - } - - public override int GetHashCode () - { - int result = InternalGetHashCode (this, out var fields); - - if (fields != null) - for (int i = 0; i < fields.Length; ++i) - if (fields [i] != null) - result ^= fields [i].GetHashCode (); - - return result; - } - - public override string ToString () - { - return GetType ().ToString (); - } - - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static int InternalGetHashCode (object o, out object[]? fields); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static bool InternalEquals (object o1, object o2, out object[] fields); - } + [Serializable] + [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] + public abstract class ValueType + { + // This is also used by RuntimeHelpers + internal static bool DefaultEquals(object o1, object o2) + { + RuntimeType o1_type = (RuntimeType)o1.GetType(); + RuntimeType o2_type = (RuntimeType)o2.GetType(); + + if (o1_type != o2_type) + return false; + + object[] fields; + bool res = InternalEquals(o1, o2, out fields); + if (fields == null) + return res; + + for (int i = 0; i < fields.Length; i += 2) + { + object meVal = fields[i]; + object youVal = fields[i + 1]; + if (meVal == null) + { + if (youVal == null) + continue; + + return false; + } + + if (!meVal.Equals(youVal)) + return false; + } + + return true; + } + + public override bool Equals(object? obj) + { + if (obj == null) + return false; + + return DefaultEquals(this, obj); + } + + public override int GetHashCode() + { + int result = InternalGetHashCode(this, out var fields); + + if (fields != null) + for (int i = 0; i < fields.Length; ++i) + if (fields[i] != null) + result ^= fields[i].GetHashCode(); + + return result; + } + + public override string ToString() + { + return GetType().ToString(); + } + + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern int InternalGetHashCode(object o, out object[]? fields); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern bool InternalEquals(object o1, object o2, out object[] fields); + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/WeakReference.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/WeakReference.Mono.cs index 8f25c35596c64..fac90a936c646 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/WeakReference.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/WeakReference.Mono.cs @@ -6,41 +6,47 @@ namespace System { - partial class WeakReference - { - bool trackResurrection; - GCHandle handle; - - public virtual bool IsAlive => Target != null; - - public virtual object Target { - get { - if (!handle.IsAllocated) - return null; - return handle.Target; - } - set { - handle.Target = value; - } - } - - public virtual bool TrackResurrection => IsTrackResurrection (); - - ~WeakReference () - { - handle.Free (); - } - - void Create (object target, bool trackResurrection) - { - if (trackResurrection) { - this.trackResurrection = true; - handle = GCHandle.Alloc (target, GCHandleType.WeakTrackResurrection); - } else { - handle = GCHandle.Alloc (target, GCHandleType.Weak); - } - } - - bool IsTrackResurrection () => trackResurrection; - } + public partial class WeakReference + { + private bool trackResurrection; + private GCHandle handle; + + public virtual bool IsAlive => Target != null; + + public virtual object Target + { + get + { + if (!handle.IsAllocated) + return null; + return handle.Target; + } + set + { + handle.Target = value; + } + } + + public virtual bool TrackResurrection => IsTrackResurrection(); + + ~WeakReference() + { + handle.Free(); + } + + private void Create(object target, bool trackResurrection) + { + if (trackResurrection) + { + this.trackResurrection = true; + handle = GCHandle.Alloc(target, GCHandleType.WeakTrackResurrection); + } + else + { + handle = GCHandle.Alloc(target, GCHandleType.Weak); + } + } + + private bool IsTrackResurrection() => trackResurrection; + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/WeakReference.T.Mono.cs b/src/mono/netcore/System.Private.CoreLib/src/System/WeakReference.T.Mono.cs index a108f52769aa4..0c9332baa1f25 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/WeakReference.T.Mono.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/WeakReference.T.Mono.cs @@ -6,38 +6,43 @@ namespace System { - partial class WeakReference - { - GCHandle handle; - bool trackResurrection; + public partial class WeakReference + { + private GCHandle handle; + private bool trackResurrection; - T Target { - get { - GCHandle h = handle; - return h.IsAllocated ? (T) h.Target : null; - } - } + private T Target + { + get + { + GCHandle h = handle; + return h.IsAllocated ? (T)h.Target : null; + } + } - ~WeakReference () - { - handle.Free (); - } + ~WeakReference() + { + handle.Free(); + } - void Create (T target, bool trackResurrection) - { - if (trackResurrection) { - trackResurrection = true; - handle = GCHandle.Alloc (target, GCHandleType.WeakTrackResurrection); - } else { - handle = GCHandle.Alloc (target, GCHandleType.Weak); - } - } + private void Create(T target, bool trackResurrection) + { + if (trackResurrection) + { + trackResurrection = true; + handle = GCHandle.Alloc(target, GCHandleType.WeakTrackResurrection); + } + else + { + handle = GCHandle.Alloc(target, GCHandleType.Weak); + } + } - public void SetTarget (T target) - { - handle.Target = target; - } + public void SetTarget(T target) + { + handle.Target = target; + } - bool IsTrackResurrection () => trackResurrection; - } + private bool IsTrackResurrection() => trackResurrection; + } } diff --git a/src/mono/netcore/System.Private.CoreLib/src/System/__ComObject.cs b/src/mono/netcore/System.Private.CoreLib/src/System/__ComObject.cs index 3676d0905ef55..dc25fbb872b4a 100644 --- a/src/mono/netcore/System.Private.CoreLib/src/System/__ComObject.cs +++ b/src/mono/netcore/System.Private.CoreLib/src/System/__ComObject.cs @@ -4,11 +4,11 @@ namespace System { - internal class __ComObject - { - __ComObject () - { - throw new NotSupportedException (); - } - } + internal class __ComObject + { + private __ComObject() + { + throw new NotSupportedException(); + } + } }