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
a test to ensure it is possible to override argument conversion for i…
…nherited methods using an attribute on a derived class
  • Loading branch information
lostmsu committed Jan 31, 2020
commit 56ca4c995a0018ca48123bebfe4485b144a6f9de
39 changes: 34 additions & 5 deletions src/embed_tests/TestCustomArgMarshal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,27 @@ public void CustomArgMarshaller()
}
Assert.AreEqual(expected: 42, actual: obj.LastArgument);
}

[Test]
public void MarshallerOverride() {
var obj = new DerivedMarshaling();
using (Py.GIL()) {
dynamic callWithInt = PythonEngine.Eval("lambda o: o.CallWithInt({ 'value': 42 })");
callWithInt(obj.ToPython());
}
Assert.AreEqual(expected: 42, actual: obj.LastArgument);
}
}

[PyArgConverter(typeof(CustomArgConverter))]
class CustomArgMarshaling {
public object LastArgument { get; private set; }
public void CallWithInt(int value) => this.LastArgument = value;
}
[PyArgConverter(typeof(CustomArgConverter))]
class CustomArgMarshaling {
public object LastArgument { get; protected set; }
public virtual void CallWithInt(int value) => this.LastArgument = value;
}

// this should override original custom marshaling behavior
[PyArgConverter(typeof(CustomArgConverter2))]
class DerivedMarshaling: CustomArgMarshaling { }

class CustomArgConverter : DefaultPyArgumentConverter {
public override bool TryConvertArgument(IntPtr pyarg, Type parameterType, bool needsResolution,
Expand All @@ -52,4 +66,19 @@ public override bool TryConvertArgument(IntPtr pyarg, Type parameterType, bool n
return true;
}
}

class CustomArgConverter2 : DefaultPyArgumentConverter {
public override bool TryConvertArgument(IntPtr pyarg, Type parameterType, bool needsResolution,
out object arg, out bool isOut) {
if (parameterType != typeof(int))
return base.TryConvertArgument(pyarg, parameterType, needsResolution, out arg, out isOut);
bool isPyObject = base.TryConvertArgument(pyarg, typeof(PyObject), needsResolution,
out arg, out isOut);
if (!isPyObject) return false;
var dict = new PyDict((PyObject)arg);
int number = (dynamic)dict["value"];
arg = number;
return true;
}
}
}