diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index cd9477a62..6b2e0f648 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -814,9 +814,14 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo private static void SetConversionError(IntPtr value, Type target) { + // PyObject_Repr might clear the error + Runtime.PyErr_Fetch(out var causeType, out var causeVal, out var causeTrace); + IntPtr ob = Runtime.PyObject_Repr(value); string src = Runtime.GetManagedString(ob); Runtime.XDecref(ob); + + Runtime.PyErr_Restore(causeType, causeVal, causeTrace); Exceptions.RaiseTypeError($"Cannot convert {src} to {target}"); } diff --git a/src/runtime/finalizer.cs b/src/runtime/finalizer.cs index fe2e46aac..be4466791 100644 --- a/src/runtime/finalizer.cs +++ b/src/runtime/finalizer.cs @@ -54,7 +54,7 @@ public class IncorrectRefCountException : Exception public IncorrectRefCountException(IntPtr ptr) { PyPtr = ptr; - IntPtr pyname = Runtime.PyObject_Unicode(PyPtr); + IntPtr pyname = Runtime.PyObject_Str(PyPtr); string name = Runtime.GetManagedString(pyname); Runtime.XDecref(pyname); _message = $"<{name}> may has a incorrect ref count"; diff --git a/src/runtime/methodbinder.cs b/src/runtime/methodbinder.cs index 8f74e0052..d9572051c 100644 --- a/src/runtime/methodbinder.cs +++ b/src/runtime/methodbinder.cs @@ -876,7 +876,7 @@ protected static void AppendArgumentTypes(StringBuilder to, IntPtr args) { try { - var description = Runtime.PyObject_Unicode(type); + var description = Runtime.PyObject_Str(type); if (description != IntPtr.Zero) { to.Append(Runtime.GetManagedString(description)); @@ -926,7 +926,9 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase i } value.Append(": "); + Runtime.PyErr_Fetch(out var errType, out var errVal, out var errTrace); AppendArgumentTypes(to: value, args); + Runtime.PyErr_Restore(errType, errVal, errTrace); Exceptions.RaiseTypeError(value.ToString()); return IntPtr.Zero; } diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 81578a7a8..7a1517102 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -1040,7 +1040,7 @@ public string Repr() /// public override string ToString() { - IntPtr strval = Runtime.PyObject_Unicode(obj); + IntPtr strval = Runtime.PyObject_Str(obj); string result = Runtime.GetManagedString(strval); Runtime.XDecref(strval); return result; diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 263b4473e..4a8d01dd8 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1,8 +1,7 @@ -using System.Reflection.Emit; using System; +using System.Diagnostics; using System.Diagnostics.Contracts; using System.Runtime.InteropServices; -using System.Security; using System.Text; using System.Threading; using System.Collections.Generic; @@ -1127,13 +1126,18 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) internal static nint PyObject_Hash(IntPtr op) => Delegates.PyObject_Hash(op); - internal static IntPtr PyObject_Repr(IntPtr pointer) => Delegates.PyObject_Repr(pointer); - - - internal static IntPtr PyObject_Str(IntPtr pointer) => Delegates.PyObject_Str(pointer); + internal static IntPtr PyObject_Repr(IntPtr pointer) + { + Debug.Assert(PyErr_Occurred() == IntPtr.Zero); + return Delegates.PyObject_Repr(pointer); + } - internal static IntPtr PyObject_Unicode(IntPtr pointer) => Delegates.PyObject_Unicode(pointer); + internal static IntPtr PyObject_Str(IntPtr pointer) + { + Debug.Assert(PyErr_Occurred() == IntPtr.Zero); + return Delegates.PyObject_Str(pointer); + } internal static IntPtr PyObject_Dir(IntPtr pointer) => Delegates.PyObject_Dir(pointer); @@ -2322,7 +2326,6 @@ static Delegates() PyObject_Hash = (delegate* unmanaged[Cdecl])GetFunctionByName(nameof(PyObject_Hash), GetUnmanagedDll(_PythonDll)); PyObject_Repr = (delegate* unmanaged[Cdecl])GetFunctionByName(nameof(PyObject_Repr), GetUnmanagedDll(_PythonDll)); PyObject_Str = (delegate* unmanaged[Cdecl])GetFunctionByName(nameof(PyObject_Str), GetUnmanagedDll(_PythonDll)); - PyObject_Unicode = (delegate* unmanaged[Cdecl])GetFunctionByName("PyObject_Str", GetUnmanagedDll(_PythonDll)); PyObject_Dir = (delegate* unmanaged[Cdecl])GetFunctionByName(nameof(PyObject_Dir), GetUnmanagedDll(_PythonDll)); PyObject_GetBuffer = (delegate* unmanaged[Cdecl])GetFunctionByName(nameof(PyObject_GetBuffer), GetUnmanagedDll(_PythonDll)); PyBuffer_Release = (delegate* unmanaged[Cdecl])GetFunctionByName(nameof(PyBuffer_Release), GetUnmanagedDll(_PythonDll)); @@ -2607,7 +2610,6 @@ static Delegates() internal static delegate* unmanaged[Cdecl] PyObject_Hash { get; } internal static delegate* unmanaged[Cdecl] PyObject_Repr { get; } internal static delegate* unmanaged[Cdecl] PyObject_Str { get; } - internal static delegate* unmanaged[Cdecl] PyObject_Unicode { get; } internal static delegate* unmanaged[Cdecl] PyObject_Dir { get; } internal static delegate* unmanaged[Cdecl] PyObject_GetBuffer { get; } internal static delegate* unmanaged[Cdecl] PyBuffer_Release { get; }