// An empty array of types
//
static public Type [] NoTypes;
+ static public TypeExpr [] NoTypeExprs;
//
// Expressions representing the internal types. Used during declaration
// definition.
//
- static public Expression system_object_expr, system_string_expr;
- static public Expression system_boolean_expr, system_decimal_expr;
- static public Expression system_single_expr, system_double_expr;
- static public Expression system_sbyte_expr, system_byte_expr;
- static public Expression system_int16_expr, system_uint16_expr;
- static public Expression system_int32_expr, system_uint32_expr;
- static public Expression system_int64_expr, system_uint64_expr;
- static public Expression system_char_expr, system_void_expr;
- static public Expression system_asynccallback_expr;
- static public Expression system_iasyncresult_expr;
+ static public TypeExpr system_object_expr, system_string_expr;
+ static public TypeExpr system_boolean_expr, system_decimal_expr;
+ static public TypeExpr system_single_expr, system_double_expr;
+ static public TypeExpr system_sbyte_expr, system_byte_expr;
+ static public TypeExpr system_int16_expr, system_uint16_expr;
+ static public TypeExpr system_int32_expr, system_uint32_expr;
+ static public TypeExpr system_int64_expr, system_uint64_expr;
+ static public TypeExpr system_char_expr, system_void_expr;
+ static public TypeExpr system_asynccallback_expr;
+ static public TypeExpr system_iasyncresult_expr;
+ static public TypeExpr system_valuetype_expr;
//
// This is only used when compiling corlib
static Assembly [] assemblies;
// <remarks>
- // Keeps a list of module builders. We used this to do lookups
- // on the modulebuilder using GetType -- needed for arrays
+ // Keeps a list of modules. We used this to do lookups
+ // on the module using GetType -- needed for arrays
// </remarks>
- static ModuleBuilder [] modules;
+ static Module [] modules;
// <remarks>
// This is the type_cache from the assemblies to avoid
public Type [] args;
}
+ public static void CleanUp ()
+ {
+ // Lets get everything clean so that we can collect before generating code
+ assemblies = null;
+ modules = null;
+ types = null;
+ typecontainers = null;
+ user_types = null;
+ builder_to_declspace = null;
+ builder_to_ifaces = null;
+ method_arguments = null;
+ indexer_arguments = null;
+ method_internal_params = null;
+ builder_to_attr = null;
+ builder_to_method = null;
+
+ fields = null;
+ references = null;
+ negative_hits = null;
+ attr_to_allowmult = null;
+ builder_to_constant = null;
+ fieldbuilders_to_fields = null;
+ events = null;
+ priv_fields_events = null;
+ properties = null;
+
+ TypeHandle.CleanUp ();
+ }
+
/// <summary>
/// A filter for Findmembers that uses the Signature object to
/// extract objects
system_void_expr = new TypeLookupExpression ("System.Void");
system_asynccallback_expr = new TypeLookupExpression ("System.AsyncCallback");
system_iasyncresult_expr = new TypeLookupExpression ("System.IAsyncResult");
+ system_valuetype_expr = new TypeLookupExpression ("System.ValueType");
}
-
+
static TypeManager ()
{
assemblies = new Assembly [0];
builder_to_ifaces = new PtrHashtable ();
NoTypes = new Type [0];
+ NoTypeExprs = new TypeExpr [0];
signature_filter = new MemberFilter (SignatureFilter);
InitExpressionTypes ();
return;
}
- Location l;
tc = builder_to_declspace [t] as TypeContainer;
if (tc != null){
Report.Warning (
types.Add (name, t);
}
- public static void AddUserType (string name, TypeBuilder t, Type [] ifaces)
+ public static void AddUserType (string name, TypeBuilder t, TypeExpr[] ifaces)
{
try {
types.Add (name, t);
//
// This entry point is used by types that we define under the covers
//
- public static void RegisterBuilder (TypeBuilder tb, Type [] ifaces)
+ public static void RegisterBuilder (TypeBuilder tb, TypeExpr [] ifaces)
{
if (ifaces != null)
builder_to_ifaces [tb] = ifaces;
}
- public static void AddUserType (string name, TypeBuilder t, TypeContainer tc, Type [] ifaces)
+ public static void AddUserType (string name, TypeBuilder t, TypeContainer tc, TypeExpr [] ifaces)
{
builder_to_declspace.Add (t, tc);
typecontainers.Add (name, tc);
builder_to_declspace.Add (t, en);
}
- public static void AddUserInterface (string name, TypeBuilder t, Interface i, Type [] ifaces)
+ public static void AddUserInterface (string name, TypeBuilder t, Interface i, TypeExpr [] ifaces)
{
AddUserType (name, t, ifaces);
builder_to_declspace.Add (t, i);
/// </summary>
public static void AddAssembly (Assembly a)
{
+ foreach (Assembly assembly in assemblies) {
+ if (a == assembly)
+ return;
+ }
+
int top = assemblies.Length;
Assembly [] n = new Assembly [top + 1];
/// <summary>
/// Registers a module builder to lookup types from
/// </summary>
- public static void AddModule (ModuleBuilder mb)
+ public static void AddModule (Module mb)
{
int top = modules != null ? modules.Length : 0;
- ModuleBuilder [] n = new ModuleBuilder [top + 1];
+ Module [] n = new Module [top + 1];
if (modules != null)
modules.CopyTo (n, 0);
//
public static Type GetReferenceType (Type t)
{
- string tname = t.FullName + "&";
-
- Type ret = t.Assembly.GetType (tname);
-
- //
- // If the type comes from the assembly we are building
- // We need the Hashtable, because .NET 1.1 will return different instance types
- // every time we call ModuleBuilder.GetType.
- //
- if (ret == null){
- if (references [t] == null)
- references [t] = CodeGen.ModuleBuilder.GetType (tname);
- ret = (Type) references [t];
- }
-
- return ret;
+ return t.MakeByRefType ();
}
static Hashtable pointers = new Hashtable ();
//
if (ret == null){
if (pointers [t] == null)
- pointers [t] = CodeGen.ModuleBuilder.GetType (tname);
+ pointers [t] = CodeGen.Module.Builder.GetType (tname);
ret = (Type) pointers [t];
}
if (t == null)
continue;
- TypeAttributes ta = t.Attributes & TypeAttributes.VisibilityMask;
- if (ta == TypeAttributes.NotPublic ||
- ta == TypeAttributes.NestedPrivate ||
- ta == TypeAttributes.NestedAssembly ||
- ta == TypeAttributes.NestedFamANDAssem)
- continue;
- return t;
+ do {
+ TypeAttributes ta = t.Attributes & TypeAttributes.VisibilityMask;
+ if (ta == TypeAttributes.NotPublic ||
+ ta == TypeAttributes.NestedPrivate ||
+ ta == TypeAttributes.NestedAssembly ||
+ ta == TypeAttributes.NestedFamANDAssem){
+
+ //
+ // In .NET pointers turn out to be private, even if their
+ // element type is not
+ //
+ if (t.IsPointer){
+ t = t.GetElementType ();
+ continue;
+ } else
+ t = null;
+ } else {
+ return t;
+ }
+ } while (t != null);
}
- foreach (ModuleBuilder mb in modules) {
+ foreach (Module mb in modules) {
t = mb.GetType (name);
if (t != null)
return t;
return t;
}
+ static readonly char [] dot_array = { '.' };
+
/// <summary>
/// Returns the Type associated with @name, takes care of the fact that
/// reflection expects nested types to be separated from the main type
if (negative_hits.Contains (name))
return null;
- string [] elements = name.Split ('.');
+ // Sadly, split takes a param array, so this ends up allocating *EVERY TIME*
+ string [] elements = name.Split (dot_array);
int count = elements.Length;
for (int n = 1; n <= count; n++){
if (t == null){
t = LookupTypeReflection (top_level_type);
if (t == null){
- negative_hits [top_level_type] = true;
+ negative_hits [top_level_type] = null;
continue;
}
}
//Console.WriteLine ("Looking up: " + newt + " " + name);
t = LookupTypeReflection (newt);
if (t == null)
- negative_hits [name] = true;
+ negative_hits [name] = null;
else
types [name] = t;
return t;
}
- negative_hits [name] = true;
+ negative_hits [name] = null;
return null;
}
/// </summary>
public static void ComputeNamespaces ()
{
- MethodInfo assembly_get_namespaces = typeof (Assembly).GetMethod ("GetNamespaces");
+ MethodInfo assembly_get_namespaces = typeof (Assembly).GetMethod ("GetNamespaces", BindingFlags.Instance|BindingFlags.NonPublic);
//
// First add the assembly namespaces
//
if (assembly_get_namespaces != null){
int count = assemblies.Length;
- int total;
for (int i = 0; i < count; i++){
Assembly a = assemblies [i];
+ match.Groups [2].Captures [0].Value;
}
+ /// <summary>
+ /// Returns the signature of the method with full namespace classification
+ /// </summary>
+ static public string GetFullNameSignature (MemberInfo mi)
+ {
+ return mi.DeclaringType.FullName.Replace ('+', '.') + '.' + mi.Name;
+ }
+
+ /// <summary>
+ /// Returns the signature of the property and indexer
+ /// </summary>
+ static public string CSharpSignature (PropertyBuilder pb, bool is_indexer)
+ {
+ if (!is_indexer) {
+ return GetFullNameSignature (pb);
+ }
+
+ MethodBase mb = pb.GetSetMethod (true) != null ? pb.GetSetMethod (true) : pb.GetGetMethod (true);
+ string signature = GetFullNameSignature (mb);
+ string arg = TypeManager.LookupParametersByBuilder (mb).ParameterDesc (0);
+ return String.Format ("{0}.this[{1}]", signature.Substring (0, signature.LastIndexOf ('.')), arg);
+ }
+
/// <summary>
/// Returns the signature of the method
/// </summary>
}
sig += ")";
- return mb.DeclaringType.Name + "." + mb.Name + sig;
+ return GetFullNameSignature (mb) + sig;
}
/// <summary>
/// Returns the MethodInfo for a method named `name' defined
/// in type `t' which takes arguments of types `args'
/// </summary>
- static MethodInfo GetMethod (Type t, string name, Type [] args, bool report_errors)
+ static MethodInfo GetMethod (Type t, string name, Type [] args, bool is_private, bool report_errors)
{
MemberList list;
Signature sig;
+ BindingFlags flags = instance_and_static | BindingFlags.Public;
sig.name = name;
sig.args = args;
- list = FindMembers (t, MemberTypes.Method, instance_and_static | BindingFlags.Public,
- signature_filter, sig);
+ if (is_private)
+ flags |= BindingFlags.NonPublic;
+
+ list = FindMembers (t, MemberTypes.Method, flags, signature_filter, sig);
if (list.Count == 0) {
if (report_errors)
Report.Error (-19, "Can not find the core function `" + name + "'");
return mi;
}
+ static MethodInfo GetMethod (Type t, string name, Type [] args, bool report_errors)
+ {
+ return GetMethod (t, name, args, false, report_errors);
+ }
+
static MethodInfo GetMethod (Type t, string name, Type [] args)
{
return GetMethod (t, name, args, true);
MethodInfo set_corlib_type_builders = GetMethod (
system_assemblybuilder_type, "SetCorlibTypeBuilders",
- system_4_type_arg, false);
+ system_4_type_arg, true, false);
if (set_corlib_type_builders != null) {
object[] args = new object [4];
args [2] = enum_type;
args [3] = void_type;
- set_corlib_type_builders.Invoke (CodeGen.AssemblyBuilder, args);
+ set_corlib_type_builders.Invoke (CodeGen.Assembly.Builder, args);
} else {
// Compatibility for an older version of the class libs.
set_corlib_type_builders = GetMethod (
system_assemblybuilder_type, "SetCorlibTypeBuilders",
- system_3_type_arg, true);
+ system_3_type_arg, true, true);
if (set_corlib_type_builders == null) {
Report.Error (-26, "Corlib compilation is not supported in Microsoft.NET due to bugs in it");
args [1] = value_type;
args [2] = enum_type;
- set_corlib_type_builders.Invoke (CodeGen.AssemblyBuilder, args);
+ set_corlib_type_builders.Invoke (CodeGen.Assembly.Builder, args);
}
}
+
+ system_object_expr.Type = object_type;
+ system_string_expr.Type = string_type;
+ system_boolean_expr.Type = bool_type;
+ system_decimal_expr.Type = decimal_type;
+ system_single_expr.Type = float_type;
+ system_double_expr.Type = double_type;
+ system_sbyte_expr.Type = sbyte_type;
+ system_byte_expr.Type = byte_type;
+ system_int16_expr.Type = short_type;
+ system_uint16_expr.Type = ushort_type;
+ system_int32_expr.Type = int32_type;
+ system_uint32_expr.Type = uint32_type;
+ system_int64_expr.Type = int64_type;
+ system_uint64_expr.Type = uint64_type;
+ system_char_expr.Type = char_type;
+ system_void_expr.Type = void_type;
+ system_asynccallback_expr.Type = asynccallback_type;
+ system_iasyncresult_expr.Type = iasyncresult_type;
+ system_valuetype_expr.Type = value_type;
}
//
const BindingFlags instance_and_static = BindingFlags.Static | BindingFlags.Instance;
- static Hashtable type_hash = new Hashtable ();
-
/// <remarks>
/// This is the "old", non-cache based FindMembers() function. We cannot use
/// the cache here because there is no member name argument.
private static MemberList MemberLookup_FindMembers (Type t, MemberTypes mt, BindingFlags bf,
string name, out bool used_cache)
{
- bool not_loaded_corlib = (t.Assembly == CodeGen.AssemblyBuilder);
-
//
// We have to take care of arrays specially, because GetType on
// a TypeBuilder array will return a Type, not a TypeBuilder,
else
return false;
}
+ public static bool IsBuiltinOrEnum (Type t)
+ {
+ if (IsBuiltinType (t))
+ return true;
+
+ if (IsEnumType (t))
+ return true;
+
+ return false;
+ }
+
+ //
+ // Only a quick hack to get things moving, while real runtime support appears
+ //
+ public static bool IsGeneric (Type t)
+ {
+ DeclSpace ds = (DeclSpace) builder_to_declspace [t];
+ return ds.IsGeneric;
+ }
+
//
// Whether a type is unmanaged. This is used by the unsafe code (25.2)
//
public static bool IsValueType (Type t)
{
- if (t.IsSubclassOf (TypeManager.value_type) && (t != TypeManager.enum_type))
- return true;
- else
- return false;
+ return t.IsGenericParameter || t.IsValueType;
}
public static bool IsInterfaceType (Type t)
return false;
}
+ public static bool IsEqualGenericType (Type a, Type b)
+ {
+ if ((a is TypeBuilder) && a.IsGenericTypeDefinition && b.IsGenericInstance) {
+ //
+ // `a' is a generic type definition's TypeBuilder and `b' is a
+ // generic instance of the same type.
+ //
+ // Example:
+ //
+ // class Stack<T>
+ // {
+ // void Test (Stack<T> stack) { }
+ // }
+ //
+ // The first argument of `Test' will be the generic instance
+ // "Stack<!0>" - which is the same type than the "Stack" TypeBuilder.
+ //
+ if (a != b.GetGenericTypeDefinition ())
+ return false;
+
+ Type[] aparams = a.GetGenericArguments ();
+ Type[] bparams = b.GetGenericArguments ();
+
+ if (aparams.Length != bparams.Length)
+ return false;
+
+ for (int i = 0; i < aparams.Length; i++)
+ if (!aparams [i].Equals (bparams [i]))
+ return false;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public static bool IsEqual (Type a, Type b)
+ {
+ if (a.Equals (b))
+ return true;
+ else
+ return IsEqualGenericType (a, b);
+ }
+
//
// Checks whether `type' is a subclass or nested child of `parent'.
//
public static bool IsSubclassOrNestedChildOf (Type type, Type parent)
{
do {
- if ((type == parent) || type.IsSubclassOf (parent))
+ if ((type == parent) || type.IsSubclassOf (parent) ||
+ IsEqualGenericType (type, parent))
return true;
// Handle nested types.
}
//
- // Do the right thing when returning the element type of
- // an array type based on whether we
+ // Do the right thing when returning the element type of an
+ // array type based on whether we are compiling corlib or not
//
public static Type GetElementType (Type t)
{
return true;
}
+ //
+ // The return value can be null; This will be the case for
+ // auxiliary FieldBuilders created by the compiler that have no
+ // real field being declared on the source code
+ //
static public FieldBase GetField (FieldInfo fb)
{
return (FieldBase) fieldbuilders_to_fields [fb];
/// This expands in context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
/// be IA, IB, IC.
/// </remarks>
- public static Type [] ExpandInterfaces (Type [] base_interfaces)
+ public static TypeExpr[] ExpandInterfaces (TypeExpr [] base_interfaces)
{
ArrayList new_ifaces = new ArrayList ();
- foreach (Type iface in base_interfaces){
+ foreach (TypeExpr iface in base_interfaces){
if (!new_ifaces.Contains (iface))
new_ifaces.Add (iface);
- Type [] implementing = TypeManager.GetInterfaces (iface);
+ TypeExpr [] implementing = iface.GetInterfaces ();
- foreach (Type imp in implementing){
+ foreach (TypeExpr imp in implementing){
if (!new_ifaces.Contains (imp))
new_ifaces.Add (imp);
}
}
- Type [] ret = new Type [new_ifaces.Count];
+ TypeExpr [] ret = new TypeExpr [new_ifaces.Count];
new_ifaces.CopyTo (ret, 0);
return ret;
}
+ static PtrHashtable iface_cache = new PtrHashtable ();
+
/// <summary>
/// This function returns the interfaces in the type `t'. Works with
/// both types and TypeBuilders.
/// </summary>
- public static Type [] GetInterfaces (Type t)
+ public static TypeExpr [] GetInterfaces (Type t)
{
+
+ TypeExpr [] cached = iface_cache [t] as TypeExpr [];
+ if (cached != null)
+ return cached;
+
//
// The reason for catching the Array case is that Reflection.Emit
// will not return a TypeBuilder for Array types of TypeBuilder types,
t = TypeManager.array_type;
if (t is TypeBuilder){
- Type [] parent_ifaces;
+ TypeExpr [] parent_ifaces;
if (t.BaseType == null)
- parent_ifaces = NoTypes;
+ parent_ifaces = NoTypeExprs;
else
parent_ifaces = GetInterfaces (t.BaseType);
- Type [] type_ifaces = (Type []) builder_to_ifaces [t];
+ TypeExpr [] type_ifaces = (TypeExpr []) builder_to_ifaces [t];
if (type_ifaces == null)
- type_ifaces = NoTypes;
+ type_ifaces = NoTypeExprs;
int parent_count = parent_ifaces.Length;
- Type [] result = new Type [parent_count + type_ifaces.Length];
+ TypeExpr [] result = new TypeExpr [parent_count + type_ifaces.Length];
parent_ifaces.CopyTo (result, 0);
type_ifaces.CopyTo (result, parent_count);
+ iface_cache [t] = result;
return result;
- } else
- return t.GetInterfaces ();
+ } else {
+ Type [] ifaces = t.GetInterfaces ();
+ if (ifaces.Length == 0)
+ return NoTypeExprs;
+
+ TypeExpr [] result = new TypeExpr [ifaces.Length];
+ for (int i = 0; i < ifaces.Length; i++)
+ result [i] = new TypeExpression (ifaces [i], Location.Null);
+
+ iface_cache [t] = result;
+ return result;
+ }
+ }
+
+ //
+ // gets the interfaces that are declared explicitly on t
+ //
+ public static TypeExpr [] GetExplicitInterfaces (TypeBuilder t)
+ {
+ return (TypeExpr []) builder_to_ifaces [t];
}
/// <remarks>
/// </remarks>
public static bool ImplementsInterface (Type t, Type iface)
{
- Type [] interfaces;
+ TypeExpr [] interfaces;
//
// FIXME OPTIMIZATION:
interfaces = GetInterfaces (t);
if (interfaces != null){
- foreach (Type i in interfaces){
- if (i == iface)
+ foreach (TypeExpr i in interfaces){
+ if (i.Type == iface)
return true;
}
}
return false;
}
+ static NumberFormatInfo nf_provider = CultureInfo.CurrentCulture.NumberFormat;
+
// This is a custom version of Convert.ChangeType() which works
// with the TypeBuilder defined types when compiling corlib.
public static object ChangeType (object value, Type conversionType, out bool error)
{
- if (!(value is IConvertible)){
+ IConvertible convert_value = value as IConvertible;
+
+ if (convert_value == null){
error = true;
return null;
}
- IConvertible convertValue = (IConvertible) value;
- CultureInfo ci = CultureInfo.CurrentCulture;
- NumberFormatInfo provider = ci.NumberFormat;
-
//
// We must use Type.Equals() here since `conversionType' is
// the TypeBuilder created version of a system type and not
error = false;
try {
if (conversionType.Equals (typeof (Boolean)))
- return (object)(convertValue.ToBoolean (provider));
+ return (object)(convert_value.ToBoolean (nf_provider));
else if (conversionType.Equals (typeof (Byte)))
- return (object)(convertValue.ToByte (provider));
+ return (object)(convert_value.ToByte (nf_provider));
else if (conversionType.Equals (typeof (Char)))
- return (object)(convertValue.ToChar (provider));
+ return (object)(convert_value.ToChar (nf_provider));
else if (conversionType.Equals (typeof (DateTime)))
- return (object)(convertValue.ToDateTime (provider));
+ return (object)(convert_value.ToDateTime (nf_provider));
else if (conversionType.Equals (typeof (Decimal)))
- return (object)(convertValue.ToDecimal (provider));
+ return (object)(convert_value.ToDecimal (nf_provider));
else if (conversionType.Equals (typeof (Double)))
- return (object)(convertValue.ToDouble (provider));
+ return (object)(convert_value.ToDouble (nf_provider));
else if (conversionType.Equals (typeof (Int16)))
- return (object)(convertValue.ToInt16 (provider));
+ return (object)(convert_value.ToInt16 (nf_provider));
else if (conversionType.Equals (typeof (Int32)))
- return (object)(convertValue.ToInt32 (provider));
+ return (object)(convert_value.ToInt32 (nf_provider));
else if (conversionType.Equals (typeof (Int64)))
- return (object)(convertValue.ToInt64 (provider));
+ return (object)(convert_value.ToInt64 (nf_provider));
else if (conversionType.Equals (typeof (SByte)))
- return (object)(convertValue.ToSByte (provider));
+ return (object)(convert_value.ToSByte (nf_provider));
else if (conversionType.Equals (typeof (Single)))
- return (object)(convertValue.ToSingle (provider));
+ return (object)(convert_value.ToSingle (nf_provider));
else if (conversionType.Equals (typeof (String)))
- return (object)(convertValue.ToString (provider));
+ return (object)(convert_value.ToString (nf_provider));
else if (conversionType.Equals (typeof (UInt16)))
- return (object)(convertValue.ToUInt16 (provider));
+ return (object)(convert_value.ToUInt16 (nf_provider));
else if (conversionType.Equals (typeof (UInt32)))
- return (object)(convertValue.ToUInt32 (provider));
+ return (object)(convert_value.ToUInt32 (nf_provider));
else if (conversionType.Equals (typeof (UInt64)))
- return (object)(convertValue.ToUInt64 (provider));
+ return (object)(convert_value.ToUInt64 (nf_provider));
else if (conversionType.Equals (typeof (Object)))
return (object)(value);
else
return TypeManager.int64_type;
case TypeCode.UInt64:
return TypeManager.uint64_type;
+ case TypeCode.Single:
+ return TypeManager.float_type;
+ case TypeCode.Double:
+ return TypeManager.double_type;
case TypeCode.String:
return TypeManager.string_type;
default:
//
// Returns whether the array of memberinfos contains the given method
//
- static bool ArrayContainsMethod (MemberInfo [] array, MethodBase new_method)
+ public static bool ArrayContainsMethod (MemberInfo [] array, MethodBase new_method)
{
Type [] new_args = TypeManager.GetArgumentTypes (new_method);
- foreach (MethodBase method in array){
+ foreach (MethodBase method in array) {
if (method.Name != new_method.Name)
continue;
-
+
+ if (method is MethodInfo && new_method is MethodInfo)
+ if (((MethodInfo) method).ReturnType != ((MethodInfo) new_method).ReturnType)
+ continue;
+
+
Type [] old_args = TypeManager.GetArgumentTypes (method);
int old_count = old_args.Length;
int i;
return true;
}
+
return false;
}
[Flags]
public enum MethodFlags {
IsObsolete = 1,
- IsObsoleteError = 2,
- ShouldIgnore = 3
+ IsObsoleteError = 1 << 1,
+ ShouldIgnore = 1 << 2
}
//
return method.GetMethodFlags (loc);
}
+#if FIXME
+ if (mb.IsInflatedGeneric) {
+ MethodBase generic = mb.GetGenericMethodDefinition ();
+
+ return GetMethodFlags (generic, loc);
+ }
+#endif
+
object [] attrs = mb.GetCustomAttributes (true);
foreach (object ta in attrs){
if (!(ta is System.Attribute)){
#region MemberLookup implementation
- //
- // Name of the member
- //
- static string closure_name;
-
//
// Whether we allow private members in the result (since FindMembers
// uses NonPublic for both protected and private), we need to distinguish.
// Who is invoking us and which type is being queried currently.
//
static Type closure_invocation_type;
- static Type closure_queried_type;
static Type closure_qualifier_type;
//
return false;
if (((closure_qualifier_type == null) || (closure_qualifier_type == closure_invocation_type)) &&
- (m.DeclaringType == closure_invocation_type))
+ (closure_invocation_type != null) && IsEqual (m.DeclaringType, closure_invocation_type))
return true;
//
MethodAttributes ma = mb.Attributes & MethodAttributes.MemberAccessMask;
if (ma == MethodAttributes.Private)
- return closure_private_ok || (closure_invocation_type == m.DeclaringType) ||
+ return closure_private_ok ||
+ IsEqual (closure_invocation_type, m.DeclaringType) ||
IsNestedChildOf (closure_invocation_type, m.DeclaringType);
//
FieldAttributes fa = fi.Attributes & FieldAttributes.FieldAccessMask;
if (fa == FieldAttributes.Private)
- return closure_private_ok || (closure_invocation_type == m.DeclaringType) ||
+ return closure_private_ok ||
+ IsEqual (closure_invocation_type, m.DeclaringType) ||
IsNestedChildOf (closure_invocation_type, m.DeclaringType);
//
bool skip_iface_check = true, used_cache = false;
bool always_ok_flag = false;
- closure_name = name;
closure_invocation_type = invocation_type;
closure_invocation_assembly = invocation_type != null ? invocation_type.Assembly : null;
closure_qualifier_type = qualifier_type;
bf = original_bf;
closure_private_ok = (original_bf & BindingFlags.NonPublic) != 0;
- closure_queried_type = current_type;
Timer.StopTimer (TimerType.MemberLookup);
if (queried_type.IsArray)
queried_type = TypeManager.array_type;
- Type [] ifaces = GetInterfaces (queried_type);
+ TypeExpr [] ifaces = GetInterfaces (queried_type);
if (ifaces == null)
return null;
- foreach (Type itype in ifaces){
+ foreach (TypeExpr itype in ifaces){
MemberInfo [] x;
- x = MemberLookup (null, null, itype, mt, bf, name);
+ x = MemberLookup (null, null, itype.Type, mt, bf, name);
if (x != null)
return x;
}
type_hash.Add (t, handle);
return handle;
}
+
+ public static void CleanUp ()
+ {
+ type_hash = null;
+ }
/// <summary>
/// Returns the TypeHandle for TypeManager.object_type.
this.type = type;
if (type.BaseType != null)
BaseType = GetTypeHandle (type.BaseType);
- else if ((type != TypeManager.object_type) && (type != typeof (object)))
- is_interface = true;
+ this.is_interface = type.IsInterface;
this.member_cache = new MemberCache (this);
}
public MemberList GetMembers (MemberTypes mt, BindingFlags bf)
{
+ MemberInfo [] members;
if (mt == MemberTypes.Event)
- return new MemberList (type.GetEvents (bf | BindingFlags.DeclaredOnly));
- else
- return new MemberList (type.FindMembers (mt, bf | BindingFlags.DeclaredOnly,
- null, null));
+ members = type.GetEvents (bf | BindingFlags.DeclaredOnly);
+ else
+ members = type.FindMembers (mt, bf | BindingFlags.DeclaredOnly,
+ null, null);
+ Array.Reverse (members);
+
+ return new MemberList (members);
}
// IMemberFinder methods