From 2d76c25f596538727ac409114d0ebae0279ac716 Mon Sep 17 00:00:00 2001 From: Jack Jansen Date: Sun, 12 Dec 1999 22:57:29 +0000 Subject: [PATCH] In places where a ResObj is expected for PyArg_Parse and the object passed in isn't but it does have an as_Resource method use that. This makes life a lot easier for appearance portability (and was needed anyway). --- Mac/Modules/res/Resmodule.c | 30 +++++++++++++++++++++++++----- Mac/Modules/res/ressupport.py | 33 ++++++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/Mac/Modules/res/Resmodule.c b/Mac/Modules/res/Resmodule.c index b5857e725b..4f0f3c8017 100644 --- a/Mac/Modules/res/Resmodule.c +++ b/Mac/Modules/res/Resmodule.c @@ -74,6 +74,17 @@ ResObj_Convert(v, p_itself) PyObject *v; Handle *p_itself; { + if (!ResObj_Check(v)) + { + PyObject *tmp; + if ( (tmp=PyObject_CallMethod(v, "as_Resource", "")) ) + { + *p_itself = ((ResourceObject *)tmp)->ob_itself; + Py_DECREF(tmp); + return 1; + } + PyErr_Clear(); + } if (!ResObj_Check(v)) { PyErr_SetString(PyExc_TypeError, "Resource required"); @@ -1388,17 +1399,26 @@ OptResObj_Convert(v, p_itself) PyObject *v; Handle *p_itself; { + PyObject *tmp; + if ( v == Py_None ) { *p_itself = NULL; return 1; } - if (!ResObj_Check(v)) + if (ResObj_Check(v)) { - PyErr_SetString(PyExc_TypeError, "Resource required"); - return 0; + *p_itself = ((ResourceObject *)v)->ob_itself; + return 1; } - *p_itself = ((ResourceObject *)v)->ob_itself; - return 1; + /* If it isn't a resource yet see whether it is convertible */ + if ( (tmp=PyObject_CallMethod(v, "as_Resource", "")) ) { + *p_itself = ((ResourceObject *)tmp)->ob_itself; + Py_DECREF(tmp); + return 1; + } + PyErr_Clear(); + PyErr_SetString(PyExc_TypeError, "Resource required"); + return 0; } diff --git a/Mac/Modules/res/ressupport.py b/Mac/Modules/res/ressupport.py index 5d45f2ebd0..c0466a7eb4 100644 --- a/Mac/Modules/res/ressupport.py +++ b/Mac/Modules/res/ressupport.py @@ -44,17 +44,26 @@ OptResObj_Convert(v, p_itself) PyObject *v; Handle *p_itself; { + PyObject *tmp; + if ( v == Py_None ) { *p_itself = NULL; return 1; } - if (!ResObj_Check(v)) + if (ResObj_Check(v)) { - PyErr_SetString(PyExc_TypeError, "Resource required"); - return 0; + *p_itself = ((ResourceObject *)v)->ob_itself; + return 1; } - *p_itself = ((ResourceObject *)v)->ob_itself; - return 1; + /* If it isn't a resource yet see whether it is convertible */ + if ( (tmp=PyObject_CallMethod(v, "as_Resource", "")) ) { + *p_itself = ((ResourceObject *)tmp)->ob_itself; + Py_DECREF(tmp); + return 1; + } + PyErr_Clear(); + PyErr_SetString(PyExc_TypeError, "Resource required"); + return 0; } """ @@ -115,6 +124,20 @@ class ResDefiniton(GlobalObjectDefinition): def outputCheckNewArg(self): Output("if (itself == NULL) return PyMac_Error(resNotFound);") + + def outputCheckConvertArg(self): + # if it isn't a resource we may be able to coerce it + Output("if (!%s_Check(v))", self.prefix) + OutLbrace() + Output("PyObject *tmp;") + Output('if ( (tmp=PyObject_CallMethod(v, "as_Resource", "")) )') + OutLbrace() + Output("*p_itself = ((ResourceObject *)tmp)->ob_itself;") + Output("Py_DECREF(tmp);") + Output("return 1;") + OutRbrace() + Output("PyErr_Clear();") + OutRbrace() def outputGetattrHook(self): Output(getattrHookCode) -- 2.40.0