mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 16:58:40 -04:00
Fix static MAKE_SEQs (eg WebcamVideo.get_options(), MicrophoneAudio.get_options())
This commit is contained in:
parent
7fa407a118
commit
d3885b665e
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user