BOOL PyObject_AsVARDESC(PyObject *ob, VARDESC *v, void *pMore) { if (ob->ob_type != &PyVARDESC::Type) { PyErr_SetString(PyExc_TypeError, "Object is not a VARDESC."); return FALSE; } PyVARDESC *pyv = (PyVARDESC *)ob; v->memid = pyv->memid; v->wVarFlags = pyv->wVarFlags; v->varkind = (VARKIND)pyv->varkind; if (!PyObject_AsELEMDESC(pyv->elemdescVar, &v->elemdescVar, pMore)) return FALSE; if (v->varkind == VAR_PERINSTANCE) { if (!PyInt_Check(pyv->value)) { PyErr_SetString(PyExc_TypeError, "If varkind==VAR_PERINSTANCE, value attribute must be an integer"); return FALSE; } v->oInst = PyInt_AsLong(pyv->value); } else if (v->varkind == VAR_CONST) { VARIANT *pVar = (VARIANT *)AllocMore(pMore, sizeof(VARIANT), TRUE); if (pVar==NULL) return NULL; VariantInit(pVar); if (!PyCom_VariantFromPyObject(pyv->value, pVar)) return NULL; v->lpvarValue = pVar; } else if (v->varkind == VAR_DISPATCH) { // nothing to do - memid is all that is needed by the caller. ; } else { PyCom_LoggerWarning(NULL, "PyObject_AsVARDESC has unknown varkind (%d) - None will be used", v->varkind); } // else ignore value. return TRUE; }
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_AsELEMDESCArray( PyObject *ob, ELEMDESC **ppDesc, short *pNum, void *pMore ) { if (!PySequence_Check(ob)) { PyErr_SetString(PyExc_TypeError, "ELEMDESCArray must be a sequence of ELEMDESCs"); return FALSE; } *pNum = PySequence_Length(ob); *ppDesc = (ELEMDESC *)AllocMore(pMore, sizeof(ELEMDESC) * *pNum); if (*ppDesc==NULL) return NULL; for (int i=0;i<*pNum;i++) { PyObject *sub = PySequence_GetItem(ob, i); if (sub==NULL) return FALSE; BOOL ok = PyObject_AsELEMDESC(sub, (*ppDesc)+i, pMore); Py_DECREF(sub); if (!ok) return FALSE; } return TRUE; }