diff options
Diffstat (limited to 'src/mscorlib/src/System/Reflection/ConstructorInfo.cs')
-rw-r--r-- | src/mscorlib/src/System/Reflection/ConstructorInfo.cs | 614 |
1 files changed, 0 insertions, 614 deletions
diff --git a/src/mscorlib/src/System/Reflection/ConstructorInfo.cs b/src/mscorlib/src/System/Reflection/ConstructorInfo.cs deleted file mode 100644 index c8d71bc1f9..0000000000 --- a/src/mscorlib/src/System/Reflection/ConstructorInfo.cs +++ /dev/null @@ -1,614 +0,0 @@ -// 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. - -// - -namespace System.Reflection -{ - using System; - using System.Collections.Generic; - using System.Diagnostics; - using System.Diagnostics.Contracts; - using System.Globalization; - using System.Runtime; - using System.Runtime.ConstrainedExecution; - using System.Runtime.InteropServices; - using System.Runtime.Serialization; - using System.Security; - using System.Threading; - using MemberListType = System.RuntimeType.MemberListType; - using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache; - using System.Runtime.CompilerServices; - - [Serializable] - public abstract class ConstructorInfo : MethodBase - { - #region Static Members - public readonly static String ConstructorName = ".ctor"; - - public readonly static String TypeConstructorName = ".cctor"; - #endregion - - #region Constructor - protected ConstructorInfo() { } - #endregion - - public static bool operator ==(ConstructorInfo left, ConstructorInfo right) - { - if (ReferenceEquals(left, right)) - return true; - - if ((object)left == null || (object)right == null || - left is RuntimeConstructorInfo || right is RuntimeConstructorInfo) - { - return false; - } - return left.Equals(right); - } - - public static bool operator !=(ConstructorInfo left, ConstructorInfo right) - { - return !(left == right); - } - - public override bool Equals(object obj) - { - return base.Equals(obj); - } - - public override int GetHashCode() - { - return base.GetHashCode(); - } - - #region Internal Members - internal virtual Type GetReturnType() { throw new NotImplementedException(); } - #endregion - - #region MemberInfo Overrides - public override MemberTypes MemberType { get { return System.Reflection.MemberTypes.Constructor; } } - #endregion - - #region Public Abstract\Virtual Members - public abstract Object Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture); - #endregion - - #region Public Members - [DebuggerStepThroughAttribute] - [Diagnostics.DebuggerHidden] - public Object Invoke(Object[] parameters) - { - // Theoretically we should set up a LookForMyCaller stack mark here and pass that along. - // But to maintain backward compatibility we can't switch to calling an - // internal overload that takes a stack mark. - // Fortunately the stack walker skips all the reflection invocation frames including this one. - // So this method will never be returned by the stack walker as the caller. - // See SystemDomain::CallersMethodCallbackWithStackMark in AppDomain.cpp. - return Invoke(BindingFlags.Default, null, parameters, null); - } - #endregion - } - - [Serializable] - internal sealed class RuntimeConstructorInfo : ConstructorInfo, ISerializable, IRuntimeMethodInfo - { - #region Private Data Members - private volatile RuntimeType m_declaringType; - private RuntimeTypeCache m_reflectedTypeCache; - private string m_toString; - private ParameterInfo[] m_parameters = null; // Created lazily when GetParameters() is called. -#pragma warning disable 169 - private object _empty1; // These empties are used to ensure that RuntimeConstructorInfo and RuntimeMethodInfo are have a layout which is sufficiently similar - private object _empty2; - private object _empty3; -#pragma warning restore 169 - private IntPtr m_handle; - private MethodAttributes m_methodAttributes; - private BindingFlags m_bindingFlags; - private volatile Signature m_signature; - private INVOCATION_FLAGS m_invocationFlags; - -#if FEATURE_APPX - private bool IsNonW8PFrameworkAPI() - { - if (DeclaringType.IsArray && IsPublic && !IsStatic) - return false; - - RuntimeAssembly rtAssembly = GetRuntimeAssembly(); - if (rtAssembly.IsFrameworkAssembly()) - { - int ctorToken = rtAssembly.InvocableAttributeCtorToken; - if (System.Reflection.MetadataToken.IsNullToken(ctorToken) || - !CustomAttribute.IsAttributeDefined(GetRuntimeModule(), MetadataToken, ctorToken)) - return true; - } - - if (GetRuntimeType().IsNonW8PFrameworkAPI()) - return true; - - return false; - } -#endif // FEATURE_APPX - - internal INVOCATION_FLAGS InvocationFlags - { - get - { - if ((m_invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED) == 0) - { - INVOCATION_FLAGS invocationFlags = INVOCATION_FLAGS.INVOCATION_FLAGS_IS_CTOR; // this is a given - - Type declaringType = DeclaringType; - - // - // first take care of all the NO_INVOKE cases. - if ( declaringType == typeof(void) || - (declaringType != null && declaringType.ContainsGenericParameters) || - ((CallingConvention & CallingConventions.VarArgs) == CallingConventions.VarArgs) || - ((Attributes & MethodAttributes.RequireSecObject) == MethodAttributes.RequireSecObject)) - { - // We don't need other flags if this method cannot be invoked - invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE; - } - else if (IsStatic || declaringType != null && declaringType.IsAbstract) - { - invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NO_CTOR_INVOKE; - } - else - { - // this should be an invocable method, determine the other flags that participate in invocation - invocationFlags |= RuntimeMethodHandle.GetSecurityFlags(this); - - if ( (invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY) == 0 && - ((Attributes & MethodAttributes.MemberAccessMask) != MethodAttributes.Public || - (declaringType != null && declaringType.NeedsReflectionSecurityCheck)) ) - { - // If method is non-public, or declaring type is not visible - invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY; - } - - // Check for attempt to create a delegate class, we demand unmanaged - // code permission for this since it's hard to validate the target address. - if (typeof(Delegate).IsAssignableFrom(DeclaringType)) - invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_IS_DELEGATE_CTOR; - } - -#if FEATURE_APPX - if (AppDomain.ProfileAPICheck && IsNonW8PFrameworkAPI()) - invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NON_W8P_FX_API; -#endif // FEATURE_APPX - - m_invocationFlags = invocationFlags | INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED; - } - - return m_invocationFlags; - } - } - #endregion - - #region Constructor - internal RuntimeConstructorInfo( - RuntimeMethodHandleInternal handle, RuntimeType declaringType, RuntimeTypeCache reflectedTypeCache, - MethodAttributes methodAttributes, BindingFlags bindingFlags) - { - Contract.Ensures(methodAttributes == RuntimeMethodHandle.GetAttributes(handle)); - - m_bindingFlags = bindingFlags; - m_reflectedTypeCache = reflectedTypeCache; - m_declaringType = declaringType; - m_handle = handle.Value; - m_methodAttributes = methodAttributes; - } - #endregion - - #region NonPublic Methods - RuntimeMethodHandleInternal IRuntimeMethodInfo.Value - { - get - { - return new RuntimeMethodHandleInternal(m_handle); - } - } - - internal override bool CacheEquals(object o) - { - RuntimeConstructorInfo m = o as RuntimeConstructorInfo; - - if ((object)m == null) - return false; - - return m.m_handle == m_handle; - } - - private Signature Signature - { - get - { - if (m_signature == null) - m_signature = new Signature(this, m_declaringType); - - return m_signature; - } - } - - private RuntimeType ReflectedTypeInternal - { - get - { - return m_reflectedTypeCache.GetRuntimeType(); - } - } - - private void CheckConsistency(Object target) - { - if (target == null && IsStatic) - return; - - if (!m_declaringType.IsInstanceOfType(target)) - { - if (target == null) - throw new TargetException(Environment.GetResourceString("RFLCT.Targ_StatMethReqTarg")); - - throw new TargetException(Environment.GetResourceString("RFLCT.Targ_ITargMismatch")); - } - } - - internal BindingFlags BindingFlags { get { return m_bindingFlags; } } - #endregion - - #region Object Overrides - public override String ToString() - { - // "Void" really doesn't make sense here. But we'll keep it for compat reasons. - if (m_toString == null) - m_toString = "Void " + FormatNameAndSig(); - - return m_toString; - } - #endregion - - #region ICustomAttributeProvider - public override Object[] GetCustomAttributes(bool inherit) - { - return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType); - } - - public override Object[] GetCustomAttributes(Type attributeType, bool inherit) - { - if (attributeType == null) - throw new ArgumentNullException(nameof(attributeType)); - Contract.EndContractBlock(); - - RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType; - - if (attributeRuntimeType == null) - throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"),nameof(attributeType)); - - return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType); - } - - public override bool IsDefined(Type attributeType, bool inherit) - { - if (attributeType == null) - throw new ArgumentNullException(nameof(attributeType)); - Contract.EndContractBlock(); - - RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType; - - if (attributeRuntimeType == null) - throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"),nameof(attributeType)); - - return CustomAttribute.IsDefined(this, attributeRuntimeType); - } - - public override IList<CustomAttributeData> GetCustomAttributesData() - { - return CustomAttributeData.GetCustomAttributesInternal(this); - } - #endregion - - - #region MemberInfo Overrides - public override String Name - { - get { return RuntimeMethodHandle.GetName(this); } - } - public override MemberTypes MemberType { get { return MemberTypes.Constructor; } } - - public override Type DeclaringType - { - get - { - return m_reflectedTypeCache.IsGlobal ? null : m_declaringType; - } - } - - public override Type ReflectedType - { - get - { - return m_reflectedTypeCache.IsGlobal ? null : ReflectedTypeInternal; - } - } - - public override int MetadataToken - { - get { return RuntimeMethodHandle.GetMethodDef(this); } - } - public override Module Module - { - get { return GetRuntimeModule(); } - } - - internal RuntimeType GetRuntimeType() { return m_declaringType; } - internal RuntimeModule GetRuntimeModule() { return RuntimeTypeHandle.GetModule(m_declaringType); } - internal RuntimeAssembly GetRuntimeAssembly() { return GetRuntimeModule().GetRuntimeAssembly(); } - #endregion - - #region MethodBase Overrides - - // This seems to always returns System.Void. - internal override Type GetReturnType() { return Signature.ReturnType; } - - internal override ParameterInfo[] GetParametersNoCopy() - { - if (m_parameters == null) - m_parameters = RuntimeParameterInfo.GetParameters(this, this, Signature); - - return m_parameters; - } - - [Pure] - public override ParameterInfo[] GetParameters() - { - ParameterInfo[] parameters = GetParametersNoCopy(); - - if (parameters.Length == 0) - return parameters; - - ParameterInfo[] ret = new ParameterInfo[parameters.Length]; - Array.Copy(parameters, ret, parameters.Length); - return ret; - } - - public override MethodImplAttributes GetMethodImplementationFlags() - { - return RuntimeMethodHandle.GetImplAttributes(this); - } - - public override RuntimeMethodHandle MethodHandle - { - get - { - Type declaringType = DeclaringType; - if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType) - throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotAllowedInReflectionOnly")); - return new RuntimeMethodHandle(this); - } - } - - public override MethodAttributes Attributes - { - get - { - return m_methodAttributes; - } - } - - public override CallingConventions CallingConvention - { - get - { - return Signature.CallingConvention; - } - } - - internal static void CheckCanCreateInstance(Type declaringType, bool isVarArg) - { - if (declaringType == null) - throw new ArgumentNullException(nameof(declaringType)); - Contract.EndContractBlock(); - - // ctor is ReflectOnly - if (declaringType is ReflectionOnlyType) - throw new InvalidOperationException(Environment.GetResourceString("Arg_ReflectionOnlyInvoke")); - - // ctor is declared on interface class - else if (declaringType.IsInterface) - throw new MemberAccessException( - String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Acc_CreateInterfaceEx"), declaringType)); - - // ctor is on an abstract class - else if (declaringType.IsAbstract) - throw new MemberAccessException( - String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Acc_CreateAbstEx"), declaringType)); - - // ctor is on a class that contains stack pointers - else if (declaringType.GetRootElementType() == typeof(ArgIterator)) - throw new NotSupportedException(); - - // ctor is vararg - else if (isVarArg) - throw new NotSupportedException(); - - // ctor is generic or on a generic class - else if (declaringType.ContainsGenericParameters) - { - throw new MemberAccessException( - String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Acc_CreateGenericEx"), declaringType)); - } - - // ctor is declared on System.Void - else if (declaringType == typeof(void)) - throw new MemberAccessException(Environment.GetResourceString("Access_Void")); - } - - internal void ThrowNoInvokeException() - { - CheckCanCreateInstance(DeclaringType, (CallingConvention & CallingConventions.VarArgs) == CallingConventions.VarArgs); - - // ctor is .cctor - if ((Attributes & MethodAttributes.Static) == MethodAttributes.Static) - throw new MemberAccessException(Environment.GetResourceString("Acc_NotClassInit")); - - throw new TargetException(); - } - - [DebuggerStepThroughAttribute] - [Diagnostics.DebuggerHidden] - [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable - public override Object Invoke( - Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - { - INVOCATION_FLAGS invocationFlags = InvocationFlags; - - if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE) != 0) - ThrowNoInvokeException(); - - // check basic method consistency. This call will throw if there are problems in the target/method relationship - CheckConsistency(obj); - -#if FEATURE_APPX - if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NON_W8P_FX_API) != 0) - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - RuntimeAssembly caller = RuntimeAssembly.GetExecutingAssembly(ref stackMark); - if (caller != null && !caller.IsSafeForReflection()) - throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_APIInvalidForCurrentContext", FullName)); - } -#endif - - if (obj != null) - { - // For unverifiable code, we require the caller to be critical. - // Adding the INVOCATION_FLAGS_NEED_SECURITY flag makes that check happen - invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY; - } - - Signature sig = Signature; - - // get the signature - int formalCount = sig.Arguments.Length; - int actualCount =(parameters != null) ? parameters.Length : 0; - if (formalCount != actualCount) - throw new TargetParameterCountException(Environment.GetResourceString("Arg_ParmCnt")); - - // if we are here we passed all the previous checks. Time to look at the arguments - if (actualCount > 0) - { - Object[] arguments = CheckArguments(parameters, binder, invokeAttr, culture, sig); - Object retValue = RuntimeMethodHandle.InvokeMethod(obj, arguments, sig, false); - // copy out. This should be made only if ByRef are present. - for (int index = 0; index < arguments.Length; index++) - parameters[index] = arguments[index]; - return retValue; - } - return RuntimeMethodHandle.InvokeMethod(obj, null, sig, false); - } - - public override MethodBody GetMethodBody() - { - MethodBody mb = RuntimeMethodHandle.GetMethodBody(this, ReflectedTypeInternal); - if (mb != null) - mb.m_methodBase = this; - return mb; - } - - public override bool IsSecurityCritical - { - get { return true; } - } - - public override bool IsSecuritySafeCritical - { - get { return false; } - } - - public override bool IsSecurityTransparent - { - get { return false; } - } - - public override bool ContainsGenericParameters - { - get - { - return (DeclaringType != null && DeclaringType.ContainsGenericParameters); - } - } - #endregion - - #region ConstructorInfo Overrides - [DebuggerStepThroughAttribute] - [Diagnostics.DebuggerHidden] - [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable - public override Object Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - { - INVOCATION_FLAGS invocationFlags = InvocationFlags; - - // get the declaring TypeHandle early for consistent exceptions in IntrospectionOnly context - RuntimeTypeHandle declaringTypeHandle = m_declaringType.TypeHandle; - - if ((invocationFlags & (INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE | INVOCATION_FLAGS.INVOCATION_FLAGS_CONTAINS_STACK_POINTERS | INVOCATION_FLAGS.INVOCATION_FLAGS_NO_CTOR_INVOKE)) != 0) - ThrowNoInvokeException(); - -#if FEATURE_APPX - if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NON_W8P_FX_API) != 0) - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - RuntimeAssembly caller = RuntimeAssembly.GetExecutingAssembly(ref stackMark); - if (caller != null && !caller.IsSafeForReflection()) - throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_APIInvalidForCurrentContext", FullName)); - } -#endif - - // get the signature - Signature sig = Signature; - - int formalCount = sig.Arguments.Length; - int actualCount =(parameters != null) ? parameters.Length : 0; - if (formalCount != actualCount) - throw new TargetParameterCountException(Environment.GetResourceString("Arg_ParmCnt")); - - // We don't need to explicitly invoke the class constructor here, - // JIT/NGen will insert the call to .cctor in the instance ctor. - - // if we are here we passed all the previous checks. Time to look at the arguments - if (actualCount > 0) - { - Object[] arguments = CheckArguments(parameters, binder, invokeAttr, culture, sig); - Object retValue = RuntimeMethodHandle.InvokeMethod(null, arguments, sig, true); - // copy out. This should be made only if ByRef are present. - for (int index = 0; index < arguments.Length; index++) - parameters[index] = arguments[index]; - return retValue; - } - return RuntimeMethodHandle.InvokeMethod(null, null, sig, true); - } - #endregion - - #region ISerializable Implementation - public void GetObjectData(SerializationInfo info, StreamingContext context) - { - if (info == null) - throw new ArgumentNullException(nameof(info)); - Contract.EndContractBlock(); - MemberInfoSerializationHolder.GetSerializationInfo( - info, - Name, - ReflectedTypeInternal, - ToString(), - SerializationToString(), - MemberTypes.Constructor, - null); - } - - internal string SerializationToString() - { - // We don't need the return type for constructors. - return FormatNameAndSig(true); - } - #endregion - } -} |