static PyObject *Triton_getModels(PyObject *self, PyObject *args) { PyObject *node = nullptr; PyObject *limit; PyObject *modelsList; std::vector<std::list<Smodel>> models; uint64 limit_c = 0; uint64 modelsSize = 0; /* Extract arguments */ PyArg_ParseTuple(args, "O|O", &node, &limit); if (node == nullptr || !PySmtAstNode_Check(node)) return PyErr_Format(PyExc_TypeError, "getModels(): expected a SmtAstNode as first argument"); if (!PyLong_Check(limit) && !PyInt_Check(limit)) return PyErr_Format(PyExc_TypeError, "getModels(): expected a limit (integer) as second argument"); limit_c = PyLong_AsLong(limit); if (limit_c == 0) return PyErr_Format(PyExc_TypeError, "getModels(): The limit must be greater than 0"); /* Get models */ models = ap.getModels(PySmtAstNode_AsSmtAstNode(node), limit_c); modelsSize = models.size(); modelsList = xPyList_New(modelsSize); for (uint64 index = 0; index < modelsSize; index++){ std::list<Smodel> model = models[index]; std::list<Smodel>::iterator it; /* Craft the model dictionary */ PyObject *modelDict = xPyDict_New(); for (it = model.begin() ; it != model.end(); it++) PyDict_SetItemString(modelDict, it->getName().c_str(), Py_BuildValue("k", it->getValue())); PyList_SetItem(modelsList, index, modelDict); } return modelsList; }