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; } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy