Merge pull request #1081 from haberman/fix-py3

Fixes for Python 3.
pull/1085/head
Joshua Haberman 9 years ago
commit 77831c076d
  1. 229
      python/google/protobuf/pyext/map_container.cc
  2. 12
      python/google/protobuf/pyext/map_container.h
  3. 2
      python/setup.py

@ -395,7 +395,12 @@ PyObject *NewScalarMapContainer(
return NULL; return NULL;
} }
#if PY_MAJOR_VERSION >= 3
ScopedPyObjectPtr obj(PyType_GenericAlloc(
reinterpret_cast<PyTypeObject *>(ScalarMapContainer_Type), 0));
#else
ScopedPyObjectPtr obj(PyType_GenericAlloc(&ScalarMapContainer_Type, 0)); ScopedPyObjectPtr obj(PyType_GenericAlloc(&ScalarMapContainer_Type, 0));
#endif
if (obj.get() == NULL) { if (obj.get() == NULL) {
return PyErr_Format(PyExc_RuntimeError, return PyErr_Format(PyExc_RuntimeError,
"Could not allocate new container."); "Could not allocate new container.");
@ -510,12 +515,6 @@ static void ScalarMapDealloc(PyObject* _self) {
Py_TYPE(_self)->tp_free(_self); Py_TYPE(_self)->tp_free(_self);
} }
static PyMappingMethods ScalarMapMappingMethods = {
MapReflectionFriend::Length, // mp_length
MapReflectionFriend::ScalarMapGetItem, // mp_subscript
MapReflectionFriend::ScalarMapSetItem, // mp_ass_subscript
};
static PyMethodDef ScalarMapMethods[] = { static PyMethodDef ScalarMapMethods[] = {
{ "__contains__", MapReflectionFriend::Contains, METH_O, { "__contains__", MapReflectionFriend::Contains, METH_O,
"Tests whether a key is a member of the map." }, "Tests whether a key is a member of the map." },
@ -532,44 +531,71 @@ static PyMethodDef ScalarMapMethods[] = {
{NULL, NULL}, {NULL, NULL},
}; };
PyTypeObject ScalarMapContainer_Type = { #if PY_MAJOR_VERSION >= 3
PyVarObject_HEAD_INIT(&PyType_Type, 0) static PyType_Slot ScalarMapContainer_Type_slots[] = {
FULL_MODULE_NAME ".ScalarMapContainer", // tp_name {Py_tp_dealloc, (void *)ScalarMapDealloc},
sizeof(MapContainer), // tp_basicsize {Py_mp_length, (void *)MapReflectionFriend::Length},
0, // tp_itemsize {Py_mp_subscript, (void *)MapReflectionFriend::ScalarMapGetItem},
ScalarMapDealloc, // tp_dealloc {Py_mp_ass_subscript, (void *)MapReflectionFriend::ScalarMapSetItem},
0, // tp_print {Py_tp_methods, (void *)ScalarMapMethods},
0, // tp_getattr {Py_tp_iter, (void *)MapReflectionFriend::GetIterator},
0, // tp_setattr {0, 0},
0, // tp_compare };
0, // tp_repr
0, // tp_as_number PyType_Spec ScalarMapContainer_Type_spec = {
0, // tp_as_sequence FULL_MODULE_NAME ".ScalarMapContainer",
&ScalarMapMappingMethods, // tp_as_mapping sizeof(MapContainer),
0, // tp_hash 0,
0, // tp_call Py_TPFLAGS_DEFAULT,
0, // tp_str ScalarMapContainer_Type_slots
0, // tp_getattro };
0, // tp_setattro PyObject *ScalarMapContainer_Type;
0, // tp_as_buffer #else
Py_TPFLAGS_DEFAULT, // tp_flags static PyMappingMethods ScalarMapMappingMethods = {
"A scalar map container", // tp_doc MapReflectionFriend::Length, // mp_length
0, // tp_traverse MapReflectionFriend::ScalarMapGetItem, // mp_subscript
0, // tp_clear MapReflectionFriend::ScalarMapSetItem, // mp_ass_subscript
0, // tp_richcompare };
0, // tp_weaklistoffset
MapReflectionFriend::GetIterator, // tp_iter PyTypeObject ScalarMapContainer_Type = {
0, // tp_iternext PyVarObject_HEAD_INIT(&PyType_Type, 0)
ScalarMapMethods, // tp_methods FULL_MODULE_NAME ".ScalarMapContainer", // tp_name
0, // tp_members sizeof(MapContainer), // tp_basicsize
0, // tp_getset 0, // tp_itemsize
0, // tp_base ScalarMapDealloc, // tp_dealloc
0, // tp_dict 0, // tp_print
0, // tp_descr_get 0, // tp_getattr
0, // tp_descr_set 0, // tp_setattr
0, // tp_dictoffset 0, // tp_compare
0, // tp_init 0, // tp_repr
}; 0, // tp_as_number
0, // tp_as_sequence
&ScalarMapMappingMethods, // tp_as_mapping
0, // tp_hash
0, // tp_call
0, // tp_str
0, // tp_getattro
0, // tp_setattro
0, // tp_as_buffer
Py_TPFLAGS_DEFAULT, // tp_flags
"A scalar map container", // tp_doc
0, // tp_traverse
0, // tp_clear
0, // tp_richcompare
0, // tp_weaklistoffset
MapReflectionFriend::GetIterator, // tp_iter
0, // tp_iternext
ScalarMapMethods, // tp_methods
0, // tp_members
0, // tp_getset
0, // tp_base
0, // tp_dict
0, // tp_descr_get
0, // tp_descr_set
0, // tp_dictoffset
0, // tp_init
};
#endif
// MessageMap ////////////////////////////////////////////////////////////////// // MessageMap //////////////////////////////////////////////////////////////////
@ -613,7 +639,12 @@ PyObject* NewMessageMapContainer(
return NULL; return NULL;
} }
#if PY_MAJOR_VERSION >= 3
PyObject* obj = PyType_GenericAlloc(
reinterpret_cast<PyTypeObject *>(MessageMapContainer_Type), 0);
#else
PyObject* obj = PyType_GenericAlloc(&MessageMapContainer_Type, 0); PyObject* obj = PyType_GenericAlloc(&MessageMapContainer_Type, 0);
#endif
if (obj == NULL) { if (obj == NULL) {
return PyErr_Format(PyExc_RuntimeError, return PyErr_Format(PyExc_RuntimeError,
"Could not allocate new container."); "Could not allocate new container.");
@ -735,12 +766,6 @@ static void MessageMapDealloc(PyObject* _self) {
Py_TYPE(_self)->tp_free(_self); Py_TYPE(_self)->tp_free(_self);
} }
static PyMappingMethods MessageMapMappingMethods = {
MapReflectionFriend::Length, // mp_length
MapReflectionFriend::MessageMapGetItem, // mp_subscript
MapReflectionFriend::MessageMapSetItem, // mp_ass_subscript
};
static PyMethodDef MessageMapMethods[] = { static PyMethodDef MessageMapMethods[] = {
{ "__contains__", (PyCFunction)MapReflectionFriend::Contains, METH_O, { "__contains__", (PyCFunction)MapReflectionFriend::Contains, METH_O,
"Tests whether the map contains this element."}, "Tests whether the map contains this element."},
@ -759,44 +784,72 @@ static PyMethodDef MessageMapMethods[] = {
{NULL, NULL}, {NULL, NULL},
}; };
PyTypeObject MessageMapContainer_Type = { #if PY_MAJOR_VERSION >= 3
PyVarObject_HEAD_INIT(&PyType_Type, 0) static PyType_Slot MessageMapContainer_Type_slots[] = {
FULL_MODULE_NAME ".MessageMapContainer", // tp_name {Py_tp_dealloc, (void *)MessageMapDealloc},
sizeof(MessageMapContainer), // tp_basicsize {Py_mp_length, (void *)MapReflectionFriend::Length},
0, // tp_itemsize {Py_mp_subscript, (void *)MapReflectionFriend::MessageMapGetItem},
MessageMapDealloc, // tp_dealloc {Py_mp_ass_subscript, (void *)MapReflectionFriend::MessageMapSetItem},
0, // tp_print {Py_tp_methods, (void *)MessageMapMethods},
0, // tp_getattr {Py_tp_iter, (void *)MapReflectionFriend::GetIterator},
0, // tp_setattr {0, 0}
0, // tp_compare };
0, // tp_repr
0, // tp_as_number PyType_Spec MessageMapContainer_Type_spec = {
0, // tp_as_sequence FULL_MODULE_NAME ".MessageMapContainer",
&MessageMapMappingMethods, // tp_as_mapping sizeof(MapContainer),
0, // tp_hash 0,
0, // tp_call Py_TPFLAGS_DEFAULT,
0, // tp_str MessageMapContainer_Type_slots
0, // tp_getattro };
0, // tp_setattro
0, // tp_as_buffer PyObject *MessageMapContainer_Type;
Py_TPFLAGS_DEFAULT, // tp_flags #else
"A map container for message", // tp_doc static PyMappingMethods MessageMapMappingMethods = {
0, // tp_traverse MapReflectionFriend::Length, // mp_length
0, // tp_clear MapReflectionFriend::MessageMapGetItem, // mp_subscript
0, // tp_richcompare MapReflectionFriend::MessageMapSetItem, // mp_ass_subscript
0, // tp_weaklistoffset };
MapReflectionFriend::GetIterator, // tp_iter
0, // tp_iternext PyTypeObject MessageMapContainer_Type = {
MessageMapMethods, // tp_methods PyVarObject_HEAD_INIT(&PyType_Type, 0)
0, // tp_members FULL_MODULE_NAME ".MessageMapContainer", // tp_name
0, // tp_getset sizeof(MessageMapContainer), // tp_basicsize
0, // tp_base 0, // tp_itemsize
0, // tp_dict MessageMapDealloc, // tp_dealloc
0, // tp_descr_get 0, // tp_print
0, // tp_descr_set 0, // tp_getattr
0, // tp_dictoffset 0, // tp_setattr
0, // tp_init 0, // tp_compare
}; 0, // tp_repr
0, // tp_as_number
0, // tp_as_sequence
&MessageMapMappingMethods, // tp_as_mapping
0, // tp_hash
0, // tp_call
0, // tp_str
0, // tp_getattro
0, // tp_setattro
0, // tp_as_buffer
Py_TPFLAGS_DEFAULT, // tp_flags
"A map container for message", // tp_doc
0, // tp_traverse
0, // tp_clear
0, // tp_richcompare
0, // tp_weaklistoffset
MapReflectionFriend::GetIterator, // tp_iter
0, // tp_iternext
MessageMapMethods, // tp_methods
0, // tp_members
0, // tp_getset
0, // tp_base
0, // tp_dict
0, // tp_descr_get
0, // tp_descr_set
0, // tp_dictoffset
0, // tp_init
};
#endif
// MapIterator ///////////////////////////////////////////////////////////////// // MapIterator /////////////////////////////////////////////////////////////////

@ -111,8 +111,16 @@ struct MessageMapContainer : public MapContainer {
PyObject* message_dict; PyObject* message_dict;
}; };
extern PyTypeObject ScalarMapContainer_Type; #if PY_MAJOR_VERSION >= 3
extern PyTypeObject MessageMapContainer_Type; extern PyObject *MessageMapContainer_Type;
extern PyType_Spec MessageMapContainer_Type_spec;
extern PyObject *ScalarMapContainer_Type;
extern PyType_Spec ScalarMapContainer_Type_spec;
#else
extern PyTypeObject MessageMapContainer_Type;
extern PyTypeObject ScalarMapContainer_Type;
#endif
extern PyTypeObject MapIterator_Type; // Both map types use the same iterator. extern PyTypeObject MapIterator_Type; // Both map types use the same iterator.
// Builds a MapContainer object, from a parent message and a // Builds a MapContainer object, from a parent message and a

@ -162,7 +162,7 @@ if __name__ == '__main__':
extra_compile_args = ['-Wno-write-strings', '-Wno-invalid-offsetof'] extra_compile_args = ['-Wno-write-strings', '-Wno-invalid-offsetof']
test_conformance.target = 'test_python_cpp' test_conformance.target = 'test_python_cpp'
if "clang" in os.popen('$CC --version').read(): if "clang" in os.popen('$CC --version 2> /dev/null').read():
extra_compile_args.append('-Wno-shorten-64-to-32') extra_compile_args.append('-Wno-shorten-64-to-32')
if warnings_as_errors in sys.argv: if warnings_as_errors in sys.argv:

Loading…
Cancel
Save