Fix static MAKE_SEQs (eg WebcamVideo.get_options(), MicrophoneAudio.get_options())

This commit is contained in:
rdb 2015-11-20 02:05:44 +01:00
parent 7fa407a118
commit d3885b665e

View File

@ -6114,27 +6114,46 @@ write_make_seq(ostream &out, Object *obj, const std::string &ClassName,
// because it probably makes more sense for it to be immutable (as
// changes to it won't be visible on the C++ side anyway).
out << " " << cClassName << " *local_this = NULL;\n"
<< " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"
<< " return NULL;\n"
<< " }\n"
<< "\n"
<< " PyObject *getter = PyDict_GetItemString(Dtool_" << ClassName << "._PyType.tp_dict, \"" << element_name << "\");\n"
<< " if (getter == (PyObject *)NULL) {\n"
if (!obj->is_static_method(make_seq->_num_name)) {
out << " " << cClassName << " *local_this = NULL;\n"
<< " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"
<< " return NULL;\n"
<< " }\n\n";
}
if (obj->is_static_method(make_seq->_element_name)) {
out << " PyObject *getter = PyObject_GetAttrString((PyObject *)&Dtool_" << ClassName << ", \"" << element_name << "\");\n";
} else {
out << " PyObject *getter = PyDict_GetItemString(Dtool_" << ClassName << "._PyType.tp_dict, \"" << element_name << "\");\n";
}
out << " if (getter == (PyObject *)NULL) {\n"
<< " return Dtool_Raise_AttributeError(self, \"" << element_name << "\");\n"
<< " }\n"
<< "\n"
<< " Py_ssize_t count = (Py_ssize_t)local_this->" << make_seq->_num_name << "();\n"
<< " PyObject *tuple = PyTuple_New(count);\n"
<< "\n";
if (obj->is_static_method(make_seq->_num_name)) {
out << " Py_ssize_t count = (Py_ssize_t)" << obj->_itype.get_scoped_name() << "::" << make_seq->_num_name << "();\n";
} else {
out << " Py_ssize_t count = (Py_ssize_t)local_this->" << make_seq->_num_name << "();\n";
}
out << " PyObject *tuple = PyTuple_New(count);\n"
<< "\n"
<< " for (Py_ssize_t i = 0; i < count; ++i) {\n"
<< "#if PY_MAJOR_VERSION >= 3\n"
<< " PyObject *index = PyLong_FromSsize_t(i);\n"
<< "#else\n"
<< " PyObject *index = PyInt_FromSsize_t(i);\n"
<< "#endif\n"
<< " PyObject *value = PyObject_CallFunctionObjArgs(getter, self, index, NULL);\n"
<< " PyTuple_SET_ITEM(tuple, i, value);\n"
<< "#endif\n";
if (obj->is_static_method(make_seq->_element_name)) {
out << " PyObject *value = PyObject_CallFunctionObjArgs(getter, index, NULL);\n";
} else {
out << " PyObject *value = PyObject_CallFunctionObjArgs(getter, self, index, NULL);\n";
}
out << " PyTuple_SET_ITEM(tuple, i, value);\n"
<< " Py_DECREF(index);\n"
<< " }\n"
<< "\n"