From 80b1655ba02b9ec0f1c9a29d429d1c33a9529b42 Mon Sep 17 00:00:00 2001 From: Victor Milovanov Date: Thu, 11 Jun 2020 19:30:09 -0700 Subject: [PATCH] fixed dynamic unary and binary operations not raising Python exception on failure Instead, they crashed with ArgumentNullException due to null pointer passed to PyObject constructor. Fixed by adding a check for None. --- src/embed_tests/TestPyObject.cs | 8 ++++++++ src/runtime/pyobject.cs | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/embed_tests/TestPyObject.cs b/src/embed_tests/TestPyObject.cs index d0d8eab45..f7f07e6a4 100644 --- a/src/embed_tests/TestPyObject.cs +++ b/src/embed_tests/TestPyObject.cs @@ -71,5 +71,13 @@ public void AsManagedObjectInvalidCast() var list = PythonEngine.Eval("list"); Assert.Throws(() => list.AsManagedObject(typeof(int))); } + + [Test] + public void UnaryMinus_ThrowsOnBadType() + { + dynamic list = new PyList(); + var error = Assert.Throws(() => list = -list); + Assert.AreEqual("TypeError", error.Type.Name); + } } } diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 55e76019b..4a61e65e8 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -1398,6 +1398,7 @@ public override bool TryBinaryOperation(BinaryOperationBinder binder, object arg result = null; return false; } + Exceptions.ErrorCheck(res); result = CheckNone(new PyObject(res)); return true; } @@ -1450,6 +1451,7 @@ public override bool TryUnaryOperation(UnaryOperationBinder binder, out object r result = null; return false; } + Exceptions.ErrorCheck(res); result = CheckNone(new PyObject(res)); return true; }