// Author:
// Miguel de Icaza (miguel@gnu.org)
//
-// Licensed under the terms of the GNU GPL
-//
-// (C) 2001, 2002 Ximian, Inc (http://www.ximian.com)
+// Dual licensed under the terms of the MIT X11 or GNU GPL
//
+// Copyright 2001, 2002 Ximian, Inc (http://www.ximian.com)
+// Copyright 2003-2008 Novell, Inc.
//
using System;
} else if ((need_proxy == null) && (name != mname))
continue;
- if (!TypeManager.IsEqual (ret_type, m.ReturnType) &&
- !(ret_type == null && m.ReturnType == TypeManager.void_type) &&
- !(m.ReturnType == null && ret_type == TypeManager.void_type))
+ Type rt = TypeManager.TypeToCoreType (m.ReturnType);
+ if (!TypeManager.IsEqual (ret_type, rt) &&
+ !(ret_type == null && rt == TypeManager.void_type) &&
+ !(rt == null && ret_type == TypeManager.void_type))
continue;
//
bool name_matches = false;
if (name == mname || mname == tm.get_indexer_name || mname == tm.set_indexer_name)
name_matches = true;
-
+
if ((t == null) && (need_proxy != null) && !name_matches)
tm.need_proxy [i] = need_proxy;
else
MethodSignature ms;
Type [] args = TypeManager.GetParameterData (mi).Types;
- ms = new MethodSignature (mi.Name, mi.ReturnType, args);
+ ms = new MethodSignature (mi.Name, TypeManager.TypeToCoreType (mi.ReturnType), args);
MemberList list = TypeContainer.FindMembers (
container.TypeBuilder.BaseType, MemberTypes.Method | MemberTypes.Property,
BindingFlags.Public | BindingFlags.Instance,
if (TypeManager.ImplementsInterface (container.TypeBuilder.BaseType, iface_type))
return true;
- //
- // FIXME: We should be creating fewer proxies. The runtime can handle most cases.
- // At worst, if we can't avoid creating the proxy, we may need to make the
- // proxy use Callvirt.
- //
MethodInfo base_method = (MethodInfo) list [0];
if (base_method.DeclaringType.IsInterface)
return false;
if (!base_method.IsAbstract && !base_method.IsVirtual)
+ // FIXME: We can avoid creating a proxy if base_method can be marked 'final virtual' instead.
+ // However, it's too late now, the MethodBuilder has already been created (see bug 377519)
DefineProxy (iface_type, base_method, mi, args);
return true;