Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fixed crash in MethodBinder.Bind when MethodInfo to invoke is passed …
…explicitly
  • Loading branch information
lostmsu committed Jan 31, 2020
commit aaafea82a0af6107a009544ec91c69eeec14bdf1
18 changes: 12 additions & 6 deletions src/runtime/methodbinder.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
Expand Down Expand Up @@ -169,16 +170,16 @@ internal MethodBase[] GetMethods()
// I'm sure this could be made more efficient.
list.Sort(new MethodSorter());
methods = (MethodBase[])list.ToArray(typeof(MethodBase));
pyArgumentConverter = this.GetArgumentConverter();
pyArgumentConverter = GetArgumentConverter(this.methods);
init = true;
}
return methods;
}

IPyArgumentConverter GetArgumentConverter() {
static IPyArgumentConverter GetArgumentConverter(IEnumerable<MethodBase> methods) {
IPyArgumentConverter converter = null;
Type converterType = null;
foreach (MethodBase method in this.methods)
foreach (MethodBase method in methods)
{
PyArgConverterAttribute attribute = TryGetArgConverter(method.DeclaringType);
if (converterType == null)
Expand Down Expand Up @@ -344,14 +345,17 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth

var pynargs = (int)Runtime.PyTuple_Size(args);
var isGeneric = false;
IPyArgumentConverter argumentConverter;
if (info != null)
{
_methods = new MethodBase[1];
_methods.SetValue(info, 0);
argumentConverter = GetArgumentConverter(_methods);
}
else
{
_methods = GetMethods();
argumentConverter = this.pyArgumentConverter;
}

// TODO: Clean up
Expand All @@ -370,7 +374,8 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
continue;
}
var outs = 0;
var margs = this.TryConvertArguments(pi, paramsArray, args, pynargs, kwargDict, defaultArgList,
var margs = TryConvertArguments(pi, paramsArray, argumentConverter,
args, pynargs, kwargDict, defaultArgList,
needsResolution: _methods.Length > 1,
outs: out outs);

Expand Down Expand Up @@ -426,7 +431,8 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
/// <param name="needsResolution"><c>true</c>, if overloading resolution is required</param>
/// <param name="outs">Returns number of output parameters</param>
/// <returns>An array of .NET arguments, that can be passed to a method.</returns>
object[] TryConvertArguments(ParameterInfo[] pi, bool paramsArray,
static object[] TryConvertArguments(ParameterInfo[] pi, bool paramsArray,
IPyArgumentConverter argumentConverter,
IntPtr args, int pyArgCount,
Dictionary<string, IntPtr> kwargDict,
ArrayList defaultArgList,
Expand Down Expand Up @@ -467,7 +473,7 @@ object[] TryConvertArguments(ParameterInfo[] pi, bool paramsArray,
}

bool isOut;
if (!this.pyArgumentConverter.TryConvertArgument(
if (!argumentConverter.TryConvertArgument(
op, parameter.ParameterType, needsResolution,
out margs[paramIndex], out isOut))
{
Expand Down