Commit e1abdf2c authored by Josh Haberman's avatar Josh Haberman

Fixed compile for Python 3. There are still some crashes though.

parent d5fb408d
......@@ -395,7 +395,12 @@ PyObject *NewScalarMapContainer(
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));
#endif
if (obj.get() == NULL) {
return PyErr_Format(PyExc_RuntimeError,
"Could not allocate new container.");
......@@ -510,12 +515,6 @@ static void ScalarMapDealloc(PyObject* _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[] = {
{ "__contains__", MapReflectionFriend::Contains, METH_O,
"Tests whether a key is a member of the map." },
......@@ -532,7 +531,33 @@ static PyMethodDef ScalarMapMethods[] = {
{NULL, NULL},
};
PyTypeObject ScalarMapContainer_Type = {
#if PY_MAJOR_VERSION >= 3
static PyType_Slot ScalarMapContainer_Type_slots[] = {
{Py_tp_dealloc, (void *)ScalarMapDealloc},
{Py_mp_length, (void *)MapReflectionFriend::Length},
{Py_mp_subscript, (void *)MapReflectionFriend::ScalarMapGetItem},
{Py_mp_ass_subscript, (void *)MapReflectionFriend::ScalarMapSetItem},
{Py_tp_methods, (void *)ScalarMapMethods},
{Py_tp_iter, (void *)MapReflectionFriend::GetIterator},
{0, 0},
};
PyType_Spec ScalarMapContainer_Type_spec = {
FULL_MODULE_NAME ".ScalarMapContainer",
sizeof(MapContainer),
0,
Py_TPFLAGS_DEFAULT,
ScalarMapContainer_Type_slots
};
PyObject *ScalarMapContainer_Type;
#else
static PyMappingMethods ScalarMapMappingMethods = {
MapReflectionFriend::Length, // mp_length
MapReflectionFriend::ScalarMapGetItem, // mp_subscript
MapReflectionFriend::ScalarMapSetItem, // mp_ass_subscript
};
PyTypeObject ScalarMapContainer_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
FULL_MODULE_NAME ".ScalarMapContainer", // tp_name
sizeof(MapContainer), // tp_basicsize
......@@ -569,7 +594,8 @@ PyTypeObject ScalarMapContainer_Type = {
0, // tp_descr_set
0, // tp_dictoffset
0, // tp_init
};
};
#endif
// MessageMap //////////////////////////////////////////////////////////////////
......@@ -613,7 +639,12 @@ PyObject* NewMessageMapContainer(
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);
#endif
if (obj == NULL) {
return PyErr_Format(PyExc_RuntimeError,
"Could not allocate new container.");
......@@ -735,12 +766,6 @@ static void MessageMapDealloc(PyObject* _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[] = {
{ "__contains__", (PyCFunction)MapReflectionFriend::Contains, METH_O,
"Tests whether the map contains this element."},
......@@ -759,7 +784,34 @@ static PyMethodDef MessageMapMethods[] = {
{NULL, NULL},
};
PyTypeObject MessageMapContainer_Type = {
#if PY_MAJOR_VERSION >= 3
static PyType_Slot MessageMapContainer_Type_slots[] = {
{Py_tp_dealloc, (void *)MessageMapDealloc},
{Py_mp_length, (void *)MapReflectionFriend::Length},
{Py_mp_subscript, (void *)MapReflectionFriend::MessageMapGetItem},
{Py_mp_ass_subscript, (void *)MapReflectionFriend::MessageMapSetItem},
{Py_tp_methods, (void *)MessageMapMethods},
{Py_tp_iter, (void *)MapReflectionFriend::GetIterator},
{0, 0}
};
PyType_Spec MessageMapContainer_Type_spec = {
FULL_MODULE_NAME ".MessageMapContainer",
sizeof(MapContainer),
0,
Py_TPFLAGS_DEFAULT,
MessageMapContainer_Type_slots
};
PyObject *MessageMapContainer_Type;
#else
static PyMappingMethods MessageMapMappingMethods = {
MapReflectionFriend::Length, // mp_length
MapReflectionFriend::MessageMapGetItem, // mp_subscript
MapReflectionFriend::MessageMapSetItem, // mp_ass_subscript
};
PyTypeObject MessageMapContainer_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
FULL_MODULE_NAME ".MessageMapContainer", // tp_name
sizeof(MessageMapContainer), // tp_basicsize
......@@ -796,7 +848,8 @@ PyTypeObject MessageMapContainer_Type = {
0, // tp_descr_set
0, // tp_dictoffset
0, // tp_init
};
};
#endif
// MapIterator /////////////////////////////////////////////////////////////////
......
......@@ -111,8 +111,16 @@ struct MessageMapContainer : public MapContainer {
PyObject* message_dict;
};
extern PyTypeObject ScalarMapContainer_Type;
extern PyTypeObject MessageMapContainer_Type;
#if PY_MAJOR_VERSION >= 3
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.
// 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']
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')
if warnings_as_errors in sys.argv:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment