Skip to content

Commit 5806f58

Browse files
committed
drop legacy collections from MethodBinder implementation
1 parent d0c588b commit 5806f58

File tree

5 files changed

+26
-52
lines changed

5 files changed

+26
-52
lines changed

src/runtime/classobject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ internal ClassObject(Type tp) : base(tp)
3232
/// </summary>
3333
internal IntPtr GetDocString()
3434
{
35-
MethodBase[] methods = binder.GetMethods();
35+
var methods = binder.GetMethods();
3636
var str = "";
3737
foreach (MethodBase t in methods)
3838
{

src/runtime/constructorbinding.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public static IntPtr tp_repr(IntPtr ob)
121121
Runtime.XIncref(self.repr);
122122
return self.repr;
123123
}
124-
MethodBase[] methods = self.ctorBinder.GetMethods();
124+
var methods = self.ctorBinder.GetMethods();
125125
string name = self.type.FullName;
126126
var doc = "";
127127
foreach (MethodBase t in methods)

src/runtime/indexer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ internal void SetItem(IntPtr inst, IntPtr args)
5858
internal bool NeedsDefaultArgs(IntPtr args)
5959
{
6060
var pynargs = Runtime.PyTuple_Size(args);
61-
MethodBase[] methods = SetterBinder.GetMethods();
62-
if (methods.Length == 0)
61+
var methods = SetterBinder.GetMethods();
62+
if (methods.Count == 0)
6363
{
6464
return false;
6565
}
@@ -99,7 +99,7 @@ internal IntPtr GetDefaultArgs(IntPtr args)
9999
var pynargs = Runtime.PyTuple_Size(args);
100100

101101
// Get the default arg tuple
102-
MethodBase[] methods = SetterBinder.GetMethods();
102+
var methods = SetterBinder.GetMethods();
103103
MethodBase mi = methods[0];
104104
ParameterInfo[] pi = mi.GetParameters();
105105
int clrnargs = pi.Length - 1;

src/runtime/methodbinder.cs

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections;
32
using System.Reflection;
43
using System.Text;
54
using System.Collections.Generic;
@@ -16,29 +15,25 @@ namespace Python.Runtime
1615
[Serializable]
1716
internal class MethodBinder
1817
{
19-
public ArrayList list;
20-
public MethodBase[] methods;
18+
readonly List<MethodBase> methods = new List<MethodBase>();
2119
public bool init = false;
2220
public bool allow_threads = true;
2321

24-
internal MethodBinder()
25-
{
26-
list = new ArrayList();
27-
}
22+
internal MethodBinder(){}
2823

2924
internal MethodBinder(MethodInfo mi)
3025
{
31-
list = new ArrayList { mi };
26+
this.methods.Add(mi);
3227
}
3328

3429
public int Count
3530
{
36-
get { return list.Count; }
31+
get { return this.methods.Count; }
3732
}
3833

3934
internal void AddMethod(MethodBase m)
4035
{
41-
list.Add(m);
36+
this.methods.Add(m);
4237
}
4338

4439
/// <summary>
@@ -158,13 +153,12 @@ internal static MethodInfo MatchSignatureAndParameters(MethodInfo[] mi, Type[] g
158153
/// is arranged in order of precedence (done lazily to avoid doing it
159154
/// at all for methods that are never called).
160155
/// </summary>
161-
internal MethodBase[] GetMethods()
156+
internal List<MethodBase> GetMethods()
162157
{
163158
if (!init)
164159
{
165160
// I'm sure this could be made more efficient.
166-
list.Sort(new MethodSorter());
167-
methods = (MethodBase[])list.ToArray(typeof(MethodBase));
161+
this.methods.Sort(new MethodSorter());
168162
init = true;
169163
}
170164
return methods;
@@ -281,9 +275,6 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info)
281275

282276
internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, MethodInfo[] methodinfo)
283277
{
284-
// loop to find match, return invoker w/ or /wo error
285-
MethodBase[] _methods = null;
286-
287278
var kwargDict = new Dictionary<string, IntPtr>();
288279
if (kw != IntPtr.Zero)
289280
{
@@ -301,15 +292,9 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
301292

302293
var pynargs = (int)Runtime.PyTuple_Size(args);
303294
var isGeneric = false;
304-
if (info != null)
305-
{
306-
_methods = new MethodBase[1];
307-
_methods.SetValue(info, 0);
308-
}
309-
else
310-
{
311-
_methods = GetMethods();
312-
}
295+
296+
// loop to find match, return invoker w/ or /wo error
297+
List<MethodBase> _methods = info != null ? new List<MethodBase> { info } : GetMethods();
313298

314299
// TODO: Clean up
315300
foreach (MethodBase mi in _methods)
@@ -319,16 +304,15 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
319304
isGeneric = true;
320305
}
321306
ParameterInfo[] pi = mi.GetParameters();
322-
ArrayList defaultArgList;
323307
bool paramsArray;
324308

325-
if (!MatchesArgumentCount(pynargs, pi, kwargDict, out paramsArray, out defaultArgList))
309+
if (!MatchesArgumentCount(pynargs, pi, kwargDict, out paramsArray, out var defaultArgList))
326310
{
327311
continue;
328312
}
329313
var outs = 0;
330314
var margs = TryConvertArguments(pi, paramsArray, args, pynargs, kwargDict, defaultArgList,
331-
needsResolution: _methods.Length > 1,
315+
needsResolution: _methods.Count > 1,
332316
outs: out outs);
333317

334318
if (margs == null)
@@ -417,7 +401,7 @@ static IntPtr HandleParamsArray(IntPtr args, int arrayStart, int pyArgCount, out
417401
static object[] TryConvertArguments(ParameterInfo[] pi, bool paramsArray,
418402
IntPtr args, int pyArgCount,
419403
Dictionary<string, IntPtr> kwargDict,
420-
ArrayList defaultArgList,
404+
List<object> defaultArgList,
421405
bool needsResolution,
422406
out int outs)
423407
{
@@ -575,7 +559,7 @@ static Type TryComputeClrArgumentType(Type parameterType, IntPtr argument, bool
575559
static bool MatchesArgumentCount(int positionalArgumentCount, ParameterInfo[] parameters,
576560
Dictionary<string, IntPtr> kwargDict,
577561
out bool paramsArray,
578-
out ArrayList defaultArgList)
562+
out List<object> defaultArgList)
579563
{
580564
defaultArgList = null;
581565
var match = false;
@@ -590,7 +574,7 @@ static bool MatchesArgumentCount(int positionalArgumentCount, ParameterInfo[] pa
590574
// every parameter past 'positionalArgumentCount' must have either
591575
// a corresponding keyword argument or a default parameter
592576
match = true;
593-
defaultArgList = new ArrayList();
577+
defaultArgList = new List<object>();
594578
for (var v = positionalArgumentCount; v < parameters.Length; v++)
595579
{
596580
if (kwargDict.ContainsKey(parameters[v].Name))
@@ -770,12 +754,10 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase i
770754
/// <summary>
771755
/// Utility class to sort method info by parameter type precedence.
772756
/// </summary>
773-
internal class MethodSorter : IComparer
757+
internal class MethodSorter : IComparer<MethodBase>
774758
{
775-
int IComparer.Compare(object m1, object m2)
759+
int IComparer<MethodBase>.Compare(MethodBase me1, MethodBase me2)
776760
{
777-
var me1 = (MethodBase)m1;
778-
var me2 = (MethodBase)m2;
779761
if (me1.DeclaringType != me2.DeclaringType)
780762
{
781763
// m2's type derives from m1's type, favor m2
@@ -787,17 +769,9 @@ int IComparer.Compare(object m1, object m2)
787769
return -1;
788770
}
789771

790-
int p1 = MethodBinder.GetPrecedence((MethodBase)m1);
791-
int p2 = MethodBinder.GetPrecedence((MethodBase)m2);
792-
if (p1 < p2)
793-
{
794-
return -1;
795-
}
796-
if (p1 > p2)
797-
{
798-
return 1;
799-
}
800-
return 0;
772+
int p1 = MethodBinder.GetPrecedence(me1);
773+
int p2 = MethodBinder.GetPrecedence(me2);
774+
return p1.CompareTo(p2);
801775
}
802776
}
803777

src/runtime/methodobject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ internal IntPtr GetDocString()
7070
}
7171
var str = "";
7272
Type marker = typeof(DocStringAttribute);
73-
MethodBase[] methods = binder.GetMethods();
73+
var methods = binder.GetMethods();
7474
foreach (MethodBase method in methods)
7575
{
7676
if (str.Length > 0)

0 commit comments

Comments
 (0)