Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
0
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;
}