BOOL PyObject_AsFUNCDESC(PyObject *ob, FUNCDESC **ppfd) { BOOL rc = FALSE; if (ob->ob_type != &PyFUNCDESC::Type) { PyErr_SetString(PyExc_TypeError, "The object is not a PyFUNCDESC"); return FALSE; } PyFUNCDESC *pyfd = (PyFUNCDESC *)ob; FUNCDESC *fd = (FUNCDESC *)AllocateMoreBuffer(sizeof(FUNCDESC)); if (fd==NULL) { PyErr_SetString(PyExc_MemoryError, "FUNCDESC"); return FALSE; } fd->memid = pyfd->memid; fd->funckind = (FUNCKIND)pyfd->funckind; fd->invkind = (INVOKEKIND)pyfd->invkind; fd->callconv = (CALLCONV)pyfd->callconv; fd->cParamsOpt = pyfd->cParamsOpt; fd->oVft = pyfd->oVft; fd->wFuncFlags = pyfd->wFuncFlags; // Convert the args and rettype if (pyfd->rettype) { if (!PyObject_AsELEMDESC(pyfd->rettype, &fd->elemdescFunc, fd )) goto done; } if (pyfd->args) { if (!PyObject_AsELEMDESCArray(pyfd->args, &fd->lprgelemdescParam, &fd->cParams, fd)) goto done; } if (pyfd->scodeArray) { // Convert the scode array. if (!PySequence_Check(pyfd->scodeArray)) { PyErr_SetString(PyExc_TypeError, "SCODE array must be a sequence of integers!"); goto done; } fd->cScodes = (short)PySequence_Length(pyfd->scodeArray); fd->lprgscode = (SCODE *)AllocMore(fd, sizeof(SCODE)*fd->cScodes); for (Py_ssize_t i=0;i<fd->cScodes;i++) { PyObject *sub=PySequence_GetItem(ob, i); if (sub==NULL) goto done; BOOL ok = PyInt_Check(sub); if (ok) fd->lprgscode[i] = PyInt_AsLong(sub); else PyErr_SetString(PyExc_TypeError, "SCODE array must be a sequence of integers!"); Py_DECREF(sub); if (!ok) goto done; } } rc = TRUE; done: if (!rc && fd) FreeMoreBuffer(fd); else *ppfd = fd; return rc; }
BOOL PyObject_AsTYPEDESC( PyObject *ob, TYPEDESC **ppDesc) { *ppDesc = (TYPEDESC *)AllocateMoreBuffer(sizeof(TYPEDESC)); if (*ppDesc==NULL) return FALSE; BOOL rc = PyObject_AsTYPEDESC(ob, *ppDesc, *ppDesc); if (!rc) FreeMoreBuffer(*ppDesc); return rc; }
BOOL PyObject_AsVARDESC(PyObject *ob, VARDESC **pp) { *pp = (VARDESC *)AllocateMoreBuffer(sizeof(VARDESC)); if (*pp==NULL) return FALSE; BOOL rc = PyObject_AsVARDESC(ob, *pp, *pp); if (!rc) FreeMoreBuffer(*pp); return rc; }
void PyObject_FreeTYPEDESC(TYPEDESC *pDesc) { FreeMoreBuffer(pDesc); }
void PyObject_FreeFUNCDESC(FUNCDESC *pFuncDesc) { FreeMoreBuffer(pFuncDesc); }
void PyObject_FreeVARDESC(VARDESC *p) { FreeMoreBuffer(p); }