// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
+#if !FULL_AOT_RUNTIME
using System;
using System.Globalization;
using System.Reflection;
using System.Text;
+using System.Runtime.InteropServices;
+
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;
- internal MethodBuilder base_method; /*This is the base method definition, it must be non-inflated and belong to a non-inflated type.*/
+ MethodInfo base_method; /*This is the base method definition, it must be non-inflated and belong to a non-inflated type.*/
Type[] method_arguments;
- MethodOnTypeBuilderInst generic_method_definition;
#endregion
+ MethodInfo generic_method_definition;
- public MethodOnTypeBuilderInst (MonoGenericClass instantiation, MethodBuilder base_method)
+ public MethodOnTypeBuilderInst (MonoGenericClass instantiation, MethodInfo base_method)
{
this.instantiation = instantiation;
this.base_method = base_method;
}
- internal MethodOnTypeBuilderInst (MethodBuilder base_method, Type[] typeArguments)
+ internal MethodOnTypeBuilderInst (MethodOnTypeBuilderInst gmd, Type[] typeArguments)
{
- this.instantiation = base_method.TypeBuilder;
- this.base_method = base_method;
+ 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 (MethodOnTypeBuilderInst gmd, Type[] typeArguments)
+ internal MethodOnTypeBuilderInst (MethodInfo method, Type[] typeArguments)
{
- this.instantiation = gmd.instantiation;
- this.base_method = gmd.base_method;
+ this.instantiation = method.DeclaringType;
+ this.base_method = ExtractBaseMethod (method);
this.method_arguments = new Type [typeArguments.Length];
typeArguments.CopyTo (this.method_arguments, 0);
- this.generic_method_definition = gmd;
+ 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 ()
return instantiation.GetGenericArguments ();
}
- internal bool IsCompilerContext {
- get { return instantiation.IsCompilerContext; }
- }
-
//
// MemberInfo members
//
public override Type ReturnType {
get {
- if (!IsCompilerContext)
- return base_method.ReturnType;
- return MonoGenericClass.InflateType (base_method.ReturnType, GetTypeArgs (), method_arguments);
+ return base_method.ReturnType;
+ }
+ }
+
+ public override Module Module {
+ get {
+ return base_method.Module;
}
}
sb.Append (" ");
sb.Append (base_method.Name);
sb.Append ("(");
- if (IsCompilerContext) {
- ParameterInfo [] par = GetParameters ();
- for (int i = 0; i < par.Length; ++i) {
- if (i > 0)
- sb.Append (", ");
- sb.Append (par [i].ParameterType);
- }
- }
sb.Append (")");
return sb.ToString ();
}
public override ParameterInfo [] GetParameters ()
{
- if (!IsCompilerContext)
- throw new NotSupportedException ();
+ return GetParametersInternal ();
+ }
- ParameterInfo [] res = new ParameterInfo [base_method.parameters.Length];
- for (int i = 0; i < base_method.parameters.Length; i++) {
- Type type = MonoGenericClass.InflateType (base_method.parameters [i], GetTypeArgs (), method_arguments);
- res [i] = new ParameterInfo (base_method.pinfo == null ? null : base_method.pinfo [i + 1], type, this, i + 1);
- }
- return res;
+ internal override ParameterInfo [] GetParametersInternal ()
+ {
+ throw new NotSupportedException ();
}
public override int MetadataToken {
get {
- if (!IsCompilerContext)
- return base.MetadataToken;
- return base_method.MetadataToken;
+ return base.MetadataToken;
}
}
- internal override int GetParameterCount ()
+ internal override int GetParametersCount ()
{
- return base_method.GetParameterCount ();
+ return base_method.GetParametersCount ();
}
public override Object Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
public override MethodInfo MakeGenericMethod (params Type [] methodInstantiation)
{
- if (base_method.generic_params == null || (method_arguments != null && !IsCompilerContext))
+ 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.generic_params.Length != methodInstantiation.Length)
+ if (base_method.GetGenericArguments ().Length != methodInstantiation.Length)
throw new ArgumentException ("Incorrect length", "methodInstantiation");
foreach (Type type in methodInstantiation) {
throw new ArgumentNullException ("methodInstantiation");
}
- if (base_method.generic_params.Length != methodInstantiation.Length)
- throw new ArgumentException ("Invalid argument array length");
-
return new MethodOnTypeBuilderInst (this, methodInstantiation);
}
public override Type [] GetGenericArguments ()
{
- if (base_method.generic_params == null)
+ if (!base_method.IsGenericMethodDefinition)
return null;
- Type[] source = method_arguments ?? base_method.generic_params;
+ Type[] source = method_arguments ?? base_method.GetGenericArguments ();
Type[] result = new Type [source.Length];
source.CopyTo (result, 0);
return result;
public override MethodInfo GetGenericMethodDefinition ()
{
- return (MethodInfo)generic_method_definition ?? base_method;
+ return generic_method_definition ?? base_method;
}
public override bool ContainsGenericParameters {
get {
- if (base_method.generic_params == null)
+ if (base_method.ContainsGenericParameters)
+ return true;
+ if (!base_method.IsGenericMethodDefinition)
throw new NotSupportedException ();
if (method_arguments == null)
return true;
public override bool IsGenericMethodDefinition {
get {
- return base_method.generic_params != null && method_arguments == null;
+ return base_method.IsGenericMethodDefinition && method_arguments == null;
}
}
public override bool IsGenericMethod {
get {
- return base_method.generic_params != null;
+ return base_method.IsGenericMethodDefinition;
}
}
}
}
+#endif