diff options
-rw-r--r-- | Mac/Modules/res/Resmodule.c | 30 | ||||
-rw-r--r-- | 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 b5857e7..4f0f3c8 100644 --- a/Mac/Modules/res/Resmodule.c +++ b/Mac/Modules/res/Resmodule.c @@ -76,6 +76,17 @@ ResObj_Convert(v, 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"); return 0; } @@ -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 5d45f2e..c0466a7 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) |