Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
void PyObject_FreeTYPEDESC(TYPEDESC *pDesc)
{
	FreeMoreBuffer(pDesc);
}
Ejemplo n.º 5
0
void PyObject_FreeFUNCDESC(FUNCDESC *pFuncDesc)
{
	FreeMoreBuffer(pFuncDesc);
}
Ejemplo n.º 6
0
void PyObject_FreeVARDESC(VARDESC *p)
{
	FreeMoreBuffer(p);
}