static PyObject *Proxy_dir( ProxyObject *self, PyObject *args) { Proxy__ENSURE_WRAPPED_OR_RETURN_NULL(self); return PyObject_Dir(self->wrapped); }
static PyObject * udn_resolve_udn(PyObject *self, PyObject *args, PyObject *kargs) { PyObject *obj, *name, *return_value, *error_args; int raise_exception = 0; static char *karg_list[] = {"obj", "name", "raise_exception", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kargs, "OO|i", karg_list, &obj, &name, &raise_exception)) { return NULL; } if (!(PyUnicode_Check(name) || PyString_Check(name))) { PyErr_SetString(PyExc_ValueError, "name must be string"); return NULL; } return_value = _resolve_udn(obj, name); /* return_value is NULL if the lookup failed */ if (return_value == NULL) { if (raise_exception) { set_udn_resolve_error(name, obj); } else { error_args = Py_BuildValue("ON", name, PyObject_Dir(obj)); return_value = PyObject_CallObject(UndefinedAttribute, error_args); Py_XDECREF(error_args); } } return return_value; }
void PythonTools::inspect_object( PyObject *o ) { gravUtil::logMessage( "PythonTools::Inspecting Random Object!\n" ); PyObject *item, *value, *value_s; std::string attr, value_stl; PyObject* l = PyObject_Dir( o ); for ( int i = 0; i < PyList_Size( l ); i++ ) { item = PyList_GetItem( l, i ); attr = std::string( PyString_AsString( item ) ); value = PyObject_GetAttr( o, item ); value_s = PyObject_Str( value ); value_stl = std::string( PyString_AsString( value_s ) ); gravUtil::logMessage( "\t(o)%s -> %s\n", attr.c_str(), value_stl.c_str() ); Py_DECREF( value_s ); Py_DECREF( value ); } Py_DECREF( l ); gravUtil::logMessage( "PythonTools::Done Inspecting Random Object\n" ); }
/** * Extends __dir__ with the extra attributes accessible through * resulttuple_getattro() */ static PyObject * resulttuple_dir(PyObject *self) { PyObject *mapping_attr; PyObject *items = NULL; PyObject *mapping = NULL; PyObject *mapping_values = NULL; PyObject *result = NULL; mapping_attr = PYGLIB_PyUnicode_FromString (tuple_indices_key); mapping = PyTuple_Type.tp_getattro (self, mapping_attr); Py_DECREF (mapping_attr); if (mapping == NULL) goto error; items = PyObject_Dir ((PyObject*)self->ob_type); if (items == NULL) goto error; mapping_values = PyDict_Keys (mapping); if (mapping_values == NULL) goto error; result = PySequence_InPlaceConcat (items, mapping_values); error: Py_XDECREF (items); Py_XDECREF (mapping); Py_XDECREF (mapping_values); return result; }
/** * Finds the first python class that extends tiled.Plugin */ PyObject *PythonPlugin::findPluginSubclass(PyObject *module) { PyObject *dir = PyObject_Dir(module); PyObject *result = nullptr; for (int i = 0; i < PyList_Size(dir); i++) { PyObject *value = PyObject_GetAttr(module, PyList_GetItem(dir, i)); if (!value) { handleError(); break; } if (value != mPluginClass && PyCallable_Check(value) && PyObject_IsSubclass(value, mPluginClass) == 1) { result = value; handleError(); break; } Py_DECREF(value); } Py_DECREF(dir); return result; }
//============================================================================= // Dir iteration functions // itemName ref is borrowed from PyObject_Dir (attrList). No refcount // itemValue ref is from PyObject_GetAttr. Ref counted //============================================================================= void Dir_iterBegin(JSOBJ obj, JSONTypeContext *tc) { GET_TC(tc)->attrList = PyObject_Dir(obj); GET_TC(tc)->index = 0; GET_TC(tc)->size = PyList_GET_SIZE(GET_TC(tc)->attrList); PRINTMARK(); }
static PyObject* __Pyx_Globals(void) { Py_ssize_t i; //PyObject *d; PyObject *names = NULL; PyObject *globals = PyObject_GetAttrString($module_cname, "__dict__"); if (!globals) { PyErr_SetString(PyExc_TypeError, "current module must have __dict__ attribute"); goto bad; } names = PyObject_Dir($module_cname); if (!names) goto bad; for (i = PyList_GET_SIZE(names)-1; i >= 0; i--) { #if CYTHON_COMPILING_IN_PYPY PyObject* name = PySequence_GetItem(names, i); if (!name) goto bad; #else PyObject* name = PyList_GET_ITEM(names, i); #endif if (!PyDict_Contains(globals, name)) { PyObject* value = PyObject_GetAttr($module_cname, name); if (!value) { #if CYTHON_COMPILING_IN_PYPY Py_DECREF(name); #endif goto bad; } if (PyDict_SetItem(globals, name, value) < 0) { #if CYTHON_COMPILING_IN_PYPY Py_DECREF(name); #endif Py_DECREF(value); goto bad; } } #if CYTHON_COMPILING_IN_PYPY Py_DECREF(name); #endif } Py_DECREF(names); return globals; // d = PyDictProxy_New(globals); // Py_DECREF(globals); // return d; bad: Py_XDECREF(names); Py_XDECREF(globals); return NULL; }
static foreign_t python_dir(term_t tobj, term_t tf) { PyObject *dir; PyObject *o; o = term_to_python(tobj, true); if (o == NULL) { return false; } dir = PyObject_Dir(o); { foreign_t rc = python_to_ptr(dir, tf); ; return rc; } }
void pybase::GetDir(PyObject *obj,AtomList &lst) { if(obj) { ThrLock lock; PyObject *pvar = PyObject_Dir(obj); if(!pvar) PyErr_Print(); // no method found else { const t_symbol *sym = GetPyArgs(lst,pvar); if(!sym) post("py/pyext - Argument list could not be created"); else FLEXT_ASSERT(sym == sym_list); Py_DECREF(pvar); } } }
static PyObject* __Pyx_Globals(void) { Py_ssize_t i; PyObject *names; PyObject *globals = $moddict_cname; Py_INCREF(globals); names = PyObject_Dir($module_cname); if (!names) goto bad; for (i = PyList_GET_SIZE(names)-1; i >= 0; i--) { #if CYTHON_COMPILING_IN_PYPY PyObject* name = PySequence_GetItem(names, i); if (!name) goto bad; #else PyObject* name = PyList_GET_ITEM(names, i); #endif if (!PyDict_Contains(globals, name)) { PyObject* value = __Pyx_GetAttr($module_cname, name); if (!value) { #if CYTHON_COMPILING_IN_PYPY Py_DECREF(name); #endif goto bad; } if (PyDict_SetItem(globals, name, value) < 0) { #if CYTHON_COMPILING_IN_PYPY Py_DECREF(name); #endif Py_DECREF(value); goto bad; } } #if CYTHON_COMPILING_IN_PYPY Py_DECREF(name); #endif } Py_DECREF(names); return globals; bad: Py_XDECREF(names); Py_XDECREF(globals); return NULL; }
SharedStringList KPythonObject::GetPropertyNames() { PyLockGIL lock; SharedStringList property_names = new StringList(); PyObject *props = PyObject_Dir(this->object); if (props == NULL) return property_names; PyObject *iterator = PyObject_GetIter(props); if (iterator == NULL) return property_names; PyObject *item; while ((item = PyIter_Next(iterator))) { property_names->push_back(new std::string(PythonUtils::ToString(item))); Py_DECREF(item); } Py_DECREF(iterator); Py_DECREF(props); return property_names; }
std::vector<mitk::PythonVariable> mitk::PythonService::GetVariableStack() const { std::vector<mitk::PythonVariable> list; PyObject* dict = PyImport_GetModuleDict(); PyObject* object = PyDict_GetItemString(dict, "__main__"); PyObject* dirMain = PyObject_Dir(object); PyObject* tempObject = 0; //PyObject* strTempObject = 0; if(dirMain) { std::string name, attrValue, attrType; for(int i = 0; i<PyList_Size(dirMain); i++) { tempObject = PyList_GetItem(dirMain, i); name = PyString_AsString(tempObject); tempObject = PyObject_GetAttrString( object, name.c_str() ); attrType = tempObject->ob_type->tp_name; //disabled due to strange errors, see T24085 //strTempObject = PyObject_Repr(tempObject); //if(strTempObject && ( PyUnicode_Check(strTempObject) || PyString_Check(strTempObject) ) ) // attrValue = PyString_AsString(strTempObject); //else // attrValue = ""; mitk::PythonVariable var; var.m_Name = name; //var.m_Value = attrValue; var.m_Type = attrType; list.push_back(var); } } return list; }
extern "C" Box* dir(Box* obj) { Box* r = PyObject_Dir(obj); if (!r) throwCAPIException(); return r; }
void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc) { PyObject *obj, *exc, *toDictFunc, *iter; TypeContext *pc; PRINTMARK(); if (!_obj) { tc->type = JT_INVALID; return; } obj = (PyObject*) _obj; pc = (TypeContext *) tc->prv; if (!pc) { tc->type = JT_INVALID; PyErr_NoMemory(); return; } pc->newObj = NULL; pc->dictObj = NULL; pc->itemValue = NULL; pc->itemName = NULL; pc->iterator = NULL; pc->attrList = NULL; pc->index = 0; pc->size = 0; pc->longValue = 0; if (PyIter_Check(obj)) { PRINTMARK(); goto ISITERABLE; } if (PyBool_Check(obj)) { PRINTMARK(); tc->type = (obj == Py_True) ? JT_TRUE : JT_FALSE; return; } else if (PyLong_Check(obj)) { PRINTMARK(); pc->PyTypeToJSON = PyLongToINT64; tc->type = JT_LONG; GET_TC(tc)->longValue = PyLong_AsLongLong(obj); exc = PyErr_Occurred(); if (exc && PyErr_ExceptionMatches(PyExc_OverflowError)) { PRINTMARK(); goto INVALID; } return; } else if (PyInt_Check(obj)) { PRINTMARK(); #ifdef _LP64 pc->PyTypeToJSON = PyIntToINT64; tc->type = JT_LONG; #else pc->PyTypeToJSON = PyIntToINT32; tc->type = JT_INT; #endif return; } else if (PyString_Check(obj)) { PRINTMARK(); pc->PyTypeToJSON = PyStringToUTF8; tc->type = JT_UTF8; return; } else if (PyUnicode_Check(obj)) { PRINTMARK(); pc->PyTypeToJSON = PyUnicodeToUTF8; tc->type = JT_UTF8; return; } else if (PyFloat_Check(obj) || (type_decimal && PyObject_IsInstance(obj, type_decimal))) { PRINTMARK(); pc->PyTypeToJSON = PyFloatToDOUBLE; tc->type = JT_DOUBLE; return; } else if (PyDateTime_Check(obj)) { PRINTMARK(); pc->PyTypeToJSON = PyDateTimeToINT64; tc->type = JT_LONG; return; } else if (PyDate_Check(obj)) { PRINTMARK(); pc->PyTypeToJSON = PyDateToINT64; tc->type = JT_LONG; return; } else if (obj == Py_None) { PRINTMARK(); tc->type = JT_NULL; return; } ISITERABLE: if (PyDict_Check(obj)) { PRINTMARK(); tc->type = JT_OBJECT; SetupDictIter(obj, pc); Py_INCREF(obj); return; } else if (PyList_Check(obj)) { PRINTMARK(); tc->type = JT_ARRAY; pc->iterEnd = List_iterEnd; pc->iterNext = List_iterNext; pc->iterGetValue = List_iterGetValue; pc->iterGetName = List_iterGetName; GET_TC(tc)->index = 0; GET_TC(tc)->size = PyList_GET_SIZE( (PyObject *) obj); return; } else if (PyTuple_Check(obj)) { PRINTMARK(); tc->type = JT_ARRAY; pc->iterEnd = Tuple_iterEnd; pc->iterNext = Tuple_iterNext; pc->iterGetValue = Tuple_iterGetValue; pc->iterGetName = Tuple_iterGetName; GET_TC(tc)->index = 0; GET_TC(tc)->size = PyTuple_GET_SIZE( (PyObject *) obj); GET_TC(tc)->itemValue = NULL; return; } /* else if (PyAnySet_Check(obj)) { PRINTMARK(); tc->type = JT_ARRAY; pc->iterBegin = NULL; pc->iterEnd = Iter_iterEnd; pc->iterNext = Iter_iterNext; pc->iterGetValue = Iter_iterGetValue; pc->iterGetName = Iter_iterGetName; return; } */ toDictFunc = PyObject_GetAttrString(obj, "toDict"); if (toDictFunc) { PyObject* tuple = PyTuple_New(0); PyObject* toDictResult = PyObject_Call(toDictFunc, tuple, NULL); Py_DECREF(tuple); Py_DECREF(toDictFunc); if (toDictResult == NULL) { PyErr_Clear(); tc->type = JT_NULL; return; } if (!PyDict_Check(toDictResult)) { Py_DECREF(toDictResult); tc->type = JT_NULL; return; } PRINTMARK(); tc->type = JT_OBJECT; SetupDictIter(toDictResult, pc); return; } PRINTMARK(); PyErr_Clear(); iter = PyObject_GetIter(obj); if (iter != NULL) { PRINTMARK(); tc->type = JT_ARRAY; pc->iterator = iter; pc->iterEnd = Iter_iterEnd; pc->iterNext = Iter_iterNext; pc->iterGetValue = Iter_iterGetValue; pc->iterGetName = Iter_iterGetName; return; } PRINTMARK(); PyErr_Clear(); PRINTMARK(); tc->type = JT_OBJECT; GET_TC(tc)->attrList = PyObject_Dir(obj); if (GET_TC(tc)->attrList == NULL) { PyErr_Clear(); goto INVALID; } GET_TC(tc)->index = 0; GET_TC(tc)->size = PyList_GET_SIZE(GET_TC(tc)->attrList); PRINTMARK(); pc->iterEnd = Dir_iterEnd; pc->iterNext = Dir_iterNext; pc->iterGetValue = Dir_iterGetValue; pc->iterGetName = Dir_iterGetName; return; INVALID: PRINTMARK(); tc->type = JT_INVALID; PyObject_Free(tc->prv); tc->prv = NULL; return; }
static int dialect_init(DialectObj * self, PyObject * args, PyObject * kwargs) { PyObject *dialect = NULL, *name_obj, *value_obj; self->quotechar = '"'; self->delimiter = ','; self->escapechar = '\0'; self->skipinitialspace = 0; Py_XDECREF(self->lineterminator); self->lineterminator = PyString_FromString("\r\n"); if (self->lineterminator == NULL) return -1; self->quoting = QUOTE_MINIMAL; self->doublequote = 1; self->strict = 0; if (!PyArg_UnpackTuple(args, "", 0, 1, &dialect)) return -1; Py_XINCREF(dialect); if (kwargs != NULL) { PyObject * key = PyString_FromString("dialect"); PyObject * d; d = PyDict_GetItem(kwargs, key); if (d) { Py_INCREF(d); Py_XDECREF(dialect); PyDict_DelItem(kwargs, key); dialect = d; } Py_DECREF(key); } if (dialect != NULL) { int i; PyObject * dir_list; /* If dialect is a string, look it up in our registry */ if (PyString_Check(dialect) #ifdef Py_USING_UNICODE || PyUnicode_Check(dialect) #endif ) { PyObject * new_dia; new_dia = get_dialect_from_registry(dialect); Py_DECREF(dialect); if (new_dia == NULL) return -1; dialect = new_dia; } /* A class rather than an instance? Instantiate */ if (PyObject_TypeCheck(dialect, &PyClass_Type)) { PyObject * new_dia; new_dia = PyObject_CallFunction(dialect, ""); Py_DECREF(dialect); if (new_dia == NULL) return -1; dialect = new_dia; } /* Make sure we finally have an instance */ if (!PyInstance_Check(dialect) || (dir_list = PyObject_Dir(dialect)) == NULL) { PyErr_SetString(PyExc_TypeError, "dialect must be an instance"); Py_DECREF(dialect); return -1; } /* And extract the attributes */ for (i = 0; i < PyList_GET_SIZE(dir_list); ++i) { char *s; name_obj = PyList_GET_ITEM(dir_list, i); s = PyString_AsString(name_obj); if (s == NULL) return -1; if (s[0] == '_') continue; value_obj = PyObject_GetAttr(dialect, name_obj); if (value_obj) { if (PyObject_SetAttr((PyObject *)self, name_obj, value_obj)) { Py_DECREF(value_obj); Py_DECREF(dir_list); Py_DECREF(dialect); return -1; } Py_DECREF(value_obj); } } Py_DECREF(dir_list); Py_DECREF(dialect); } if (kwargs != NULL) { int pos = 0; while (PyDict_Next(kwargs, &pos, &name_obj, &value_obj)) { if (PyObject_SetAttr((PyObject *)self, name_obj, value_obj)) return -1; } } return 0; }
Model buildModel(const std::string & filename, const std::string & model_name, bool verbose) throw (bp::error_already_set) { Py_Initialize(); bp::object main_module = bp::import("__main__"); // Get a dict for the global namespace to exec further python code with bp::dict globals = bp::extract<bp::dict>(main_module.attr("__dict__")); // We need to link to the pinocchio PyWrap. We delegate the dynamic loading to the python interpreter. bp::object cpp_module( (bp::handle<>(bp::borrowed(PyImport_AddModule("libpinocchio_pywrap")))) ); // That's it, you can exec your python script, starting with a model you // can update as you want. try { // Boost 1.58 #if BOOST_VERSION / 100 % 1000 == 58 // Avoid a segv with exec_file // See: https://github.com/boostorg/python/pull/15 std::ifstream t(filename.c_str()); std::stringstream buffer; buffer << t.rdbuf(); bp::exec(buffer.str().c_str(), globals); #else // default implementation bp::exec_file((bp::str)filename, globals); #endif } catch (bp::error_already_set & e) { PyErr_PrintEx(0); } Model model; try { bp::object obj_model = globals[model_name]; model = bp::extract<Model>(obj_model); } catch (bp::error_already_set & e) { PyErr_PrintEx(0); } if (verbose) { std::cout << "Your model has been built. It has " << model.nv; std::cout << " degrees of freedom." << std::endl; } // close the interpreter // cf. https://github.com/numpy/numpy/issues/8097 #if PY_MAJOR_VERSION < 3 Py_Finalize(); #else PyObject * poMainModule = PyImport_AddModule("__main__"); PyObject * poAttrList = PyObject_Dir(poMainModule); PyObject * poAttrIter = PyObject_GetIter(poAttrList); PyObject * poAttrName; while ((poAttrName = PyIter_Next(poAttrIter)) != NULL) { std::string oAttrName = PyUnicode_AS_DATA(poAttrName); // Make sure we don't delete any private objects. if (!boost::starts_with(oAttrName, "__") || !boost::ends_with(oAttrName, "__")) { PyObject * poAttr = PyObject_GetAttr(poMainModule, poAttrName); // Make sure we don't delete any module objects. if (poAttr && poAttr->ob_type != poMainModule->ob_type) PyObject_SetAttr(poMainModule, poAttrName, NULL); Py_DecRef(poAttr); } Py_DecRef(poAttrName); } Py_DecRef(poAttrIter); Py_DecRef(poAttrList); #endif return model; }
void qpycore_qmetaobject_connectslotsbyname(QObject *qobj, PyObject *qobj_wrapper) { // Get the class attributes. PyObject *dir = PyObject_Dir((PyObject *)Py_TYPE(qobj_wrapper)); if (!dir) return; PyObject *slot_obj = 0; for (SIP_SSIZE_T li = 0; li < PyList_GET_SIZE(dir); ++li) { PyObject *name_obj = PyList_GET_ITEM(dir, li); // Get the slot object. Py_XDECREF(slot_obj); slot_obj = PyObject_GetAttr(qobj_wrapper, name_obj); if (!slot_obj) continue; // Ignore it if it is not a callable. if (!PyCallable_Check(slot_obj)) continue; // Use the signature attribute instead of the name if there is one. PyObject *sigattr = PyObject_GetAttr(slot_obj, qpycore_dunder_pyqtsignature); if (sigattr) { for (SIP_SSIZE_T i = 0; i < PyList_GET_SIZE(sigattr); ++i) { PyObject *decoration = PyList_GET_ITEM(sigattr, i); Chimera::Signature *sig = Chimera::Signature::fromPyObject(decoration); QByteArray args = sig->arguments(); if (!args.isEmpty()) connect(qobj, slot_obj, sig->name(), args); } Py_DECREF(sigattr); } else { const char *ascii_name = sipString_AsASCIIString(&name_obj); if (!ascii_name) continue; PyErr_Clear(); connect(qobj, slot_obj, QByteArray(ascii_name), QByteArray()); Py_DECREF(name_obj); } } Py_XDECREF(slot_obj); Py_DECREF(dir); }
//------------------------------------------------------------------------- // Converts a Python variable into an IDC variable // This function returns on one CIP_XXXX int pyvar_to_idcvar( const ref_t &py_var, idc_value_t *idc_var, int *gvar_sn) { PYW_GIL_CHECK_LOCKED_SCOPE(); // None / NULL if ( py_var == NULL || py_var.o == Py_None ) { idc_var->set_long(0); } // Numbers? else if ( PyW_GetNumberAsIDC(py_var.o, idc_var) ) { return CIP_OK; } // String else if ( PyString_Check(py_var.o) ) { idc_var->_set_string(PyString_AsString(py_var.o), PyString_Size(py_var.o)); } // Boolean else if ( PyBool_Check(py_var.o) ) { idc_var->set_long(py_var.o == Py_True ? 1 : 0); } // Float else if ( PyFloat_Check(py_var.o) ) { double dresult = PyFloat_AsDouble(py_var.o); ieee_realcvt((void *)&dresult, idc_var->e, 3); idc_var->vtype = VT_FLOAT; } // void* else if ( PyCObject_Check(py_var.o) ) { idc_var->set_pvoid(PyCObject_AsVoidPtr(py_var.o)); } // Python list? else if ( PyList_CheckExact(py_var.o) || PyW_IsSequenceType(py_var.o) ) { // Create the object VarObject(idc_var); // Determine list size and type bool is_seq = !PyList_CheckExact(py_var.o); Py_ssize_t size = is_seq ? PySequence_Size(py_var.o) : PyList_Size(py_var.o); bool ok = true; qstring attr_name; // Convert each item for ( Py_ssize_t i=0; i<size; i++ ) { // Get the item ref_t py_item; if ( is_seq ) py_item = newref_t(PySequence_GetItem(py_var.o, i)); else py_item = borref_t(PyList_GetItem(py_var.o, i)); // Convert the item into an IDC variable idc_value_t v; ok = pyvar_to_idcvar(py_item, &v, gvar_sn) >= CIP_OK; if ( ok ) { // Form the attribute name newref_t py_int(PyInt_FromSsize_t(i)); ok = PyW_ObjectToString(py_int.o, &attr_name); if ( !ok ) break; // Store the attribute VarSetAttr(idc_var, attr_name.c_str(), &v); } if ( !ok ) break; } return ok ? CIP_OK : CIP_FAILED; } // Dictionary: we convert to an IDC object else if ( PyDict_Check(py_var.o) ) { // Create an empty IDC object VarObject(idc_var); // Get the dict.items() list newref_t py_items(PyDict_Items(py_var.o)); // Get the size of the list qstring key_name; bool ok = true; Py_ssize_t size = PySequence_Size(py_items.o); for ( Py_ssize_t i=0; i<size; i++ ) { // Get item[i] -> (key, value) PyObject *py_item = PyList_GetItem(py_items.o, i); // Extract key/value newref_t key(PySequence_GetItem(py_item, 0)); newref_t val(PySequence_GetItem(py_item, 1)); // Get key's string representation PyW_ObjectToString(key.o, &key_name); // Convert the attribute into an IDC value idc_value_t v; ok = pyvar_to_idcvar(val, &v, gvar_sn) >= CIP_OK; if ( ok ) { // Store the attribute VarSetAttr(idc_var, key_name.c_str(), &v); } if ( !ok ) break; } return ok ? CIP_OK : CIP_FAILED; } // Possible function? else if ( PyCallable_Check(py_var.o) ) { idc_var->clear(); idc_var->vtype = VT_FUNC; idc_var->funcidx = -1; // Does not apply return CIP_OK; } // Objects: // - pyidc_cvt objects: int64, byref, opaque // - other python objects else { // Get the type int cvt_id = get_pyidc_cvt_type(py_var.o); switch ( cvt_id ) { // // INT64 // case PY_ICID_INT64: { // Get the value attribute ref_t attr(PyW_TryGetAttrString(py_var.o, S_PY_IDCCVT_VALUE_ATTR)); if ( attr == NULL ) return false; idc_var->set_int64(PyLong_AsLongLong(attr.o)); return CIP_OK; } // // BYREF // case PY_ICID_BYREF: { // BYREF always require this parameter if ( gvar_sn == NULL ) return CIP_FAILED; // Get the value attribute ref_t attr(PyW_TryGetAttrString(py_var.o, S_PY_IDCCVT_VALUE_ATTR)); if ( attr == NULL ) return CIP_FAILED; // Create a global variable char buf[MAXSTR]; qsnprintf(buf, sizeof(buf), S_PY_IDC_GLOBAL_VAR_FMT, *gvar_sn); idc_value_t *gvar = add_idc_gvar(buf); // Convert the python value into the IDC global variable bool ok = pyvar_to_idcvar(attr, gvar, gvar_sn) >= CIP_OK; if ( ok ) { (*gvar_sn)++; // Create a reference to this global variable VarRef(idc_var, gvar); } return ok ? CIP_OK : CIP_FAILED; } // // OPAQUE // case PY_ICID_OPAQUE: { if ( !wrap_PyObject_ptr(py_var, idc_var) ) return CIP_FAILED; return CIP_OK_OPAQUE; } // // Other objects // default: // A normal object? newref_t py_dir(PyObject_Dir(py_var.o)); Py_ssize_t size = PyList_Size(py_dir.o); if ( py_dir == NULL || !PyList_Check(py_dir.o) || size == 0 ) return CIP_FAILED; // Create the IDC object VarObject(idc_var); for ( Py_ssize_t i=0; i<size; i++ ) { borref_t item(PyList_GetItem(py_dir.o, i)); const char *field_name = PyString_AsString(item.o); if ( field_name == NULL ) continue; size_t len = strlen(field_name); // Skip private attributes if ( (len > 2 ) && (strncmp(field_name, "__", 2) == 0 ) && (strncmp(field_name+len-2, "__", 2) == 0) ) { continue; } idc_value_t v; // Get the non-private attribute from the object newref_t attr(PyObject_GetAttrString(py_var.o, field_name)); if (attr == NULL // Convert the attribute into an IDC value || pyvar_to_idcvar(attr, &v, gvar_sn) < CIP_OK) { return CIP_FAILED; } // Store the attribute VarSetAttr(idc_var, field_name, &v); } } } return CIP_OK; }