PyObject *PyObject_FromELEMDESCArray(ELEMDESC *ed, int len) { PyObject *ret = PyTuple_New(len); for (int i = 0; i < len; i++) PyTuple_SetItem(ret, i, PyObject_FromELEMDESC(ed + i)); return ret; }
PyVARDESC::PyVARDESC(const VARDESC *pVD) { ob_type = &PyVARDESC::Type; _Py_NewReference(this); memid = pVD->memid; wVarFlags = pVD->wVarFlags; varkind = pVD->varkind; if (varkind == VAR_PERINSTANCE) value = PyInt_FromLong(pVD->oInst); else if (varkind == VAR_CONST) { VARIANT varValue; // Cast the variant type here to the correct value for this constant // so that the correct Python type will be created below. // The problem seems to exist for unsigned types (the variant has // a signed type, but the typelib has an unsigned one). However, // doing this unconditionally has side-effects, as the typelib // has VT_LPWSTR for the type of strings - and VariantChangeType // returns a VT_EMPTY variant in that case. // So we only perform this conversion for types known to be a problem: switch (pVD->elemdescVar.tdesc.vt) { case VT_UI1: case VT_UI2: case VT_UI4: case VT_UI8: case VT_UINT: case VT_UINT_PTR: VariantInit(&varValue); VariantChangeType(&varValue, pVD->lpvarValue, 0, pVD->elemdescVar.tdesc.vt); value = PyCom_PyObjectFromVariant(&varValue); VariantClear(&varValue); break; default: value = PyCom_PyObjectFromVariant(pVD->lpvarValue); break; } } else if (varkind == VAR_DISPATCH) { // all caller needs is memid, which is already setup. value = Py_None; Py_INCREF(Py_None); } else { PyCom_LoggerWarning(NULL, "PyVARDESC ctor has unknown varkind (%d) - returning None", varkind); value = Py_None; Py_INCREF(Py_None); } elemdescVar = PyObject_FromELEMDESC(&pVD->elemdescVar); }
PyFUNCDESC::PyFUNCDESC(const FUNCDESC *desc) { ob_type = &PyFUNCDESC::Type; _Py_NewReference(this); scodeArray = MakeSCODEArray(desc->lprgscode, desc->cScodes); args = PyObject_FromELEMDESCArray(desc->lprgelemdescParam, desc->cParams); rettype = PyObject_FromELEMDESC(&desc->elemdescFunc); memid = desc->memid; funckind = desc->funckind; invkind = desc->invkind; callconv = desc->callconv; cParamsOpt = desc->cParamsOpt; oVft = desc->oVft; wFuncFlags = desc->wFuncFlags; }