Skip to content

Commit

Permalink
Fix build of Python bindings with GCC 8 (AcademySoftwareFoundation#518)
Browse files Browse the repository at this point in the history
GCC 8 appears to be rather stricter about various issues to do
with type conversions and casts than GCC 7 was. This affects
OpenColorIO's Python bindings quite heavily, producing a large
number of warnings (which are converted to errors by `-Werror`)
and outright errors.

The changes here are almost all one of three basic types:

1. Many functions that become Python methods with no arguments
(using the METH_NOARGS flag) did not include the expected second
parameter in their signatures at all. METH_NOARGS does not
prevent this second parameter being passed *at all*, it only
ensures that it will always be NULL. It's still not technically
correct to leave it out of the function signature; as a comment
from 'yak' on  https://stackoverflow.com/questions/10256315
points out, there are situations where this could cause a crash.
I've added the second parameter (with no name, per convention)
to every one of these cases.

2. In several cases, classes specified a custom destructor, with
a cast to the `destructor` type, which only takes a single
parameter. However, the signatures for these destructor functions
included two parameters, assuming that they'd get an 'args'
parameter (they do not). I've corrected all these cases.

3. In several cases, classes specified custom str or repr
methods. However, in the `PyTypeObject` structures for these
classes, these methods were not cast to the `reprfunc` type, as
they ought to be. I've added these casts.

There are two warnings I just can't get rid of with my limited
C++ knowledge. The `Config` class (in PyConfig.cpp) defines a
couple of methods that take kwargs as well as args. This is
done by setting the `METH_KEYWORDS` flag, which ultimately seems
to result in a cast from type `PyCFunctionWithKeywords` to
`PyCFunction` happening somewhere behind the scenes. There's some
discussion of this at https://stackoverflow.com/questions/9496753

GCC 8 does not like this cast - it causes a 'cast-function-type'
warning. I've messed around a bit with `reinterpret_cast` and
stuff, but didn't really understand precisely what I was doing
and didn't manage to find anything that got rid of the warnings.
So I just suppressed these warnings with GCC pragmas instead
(using `-Wno-error=cast-function-type` causes older GCC versions
to choke, so we can't do that).

I've tested at least that the compilation succeeds, and I can
import the Python module and instantiate a few classes and
examine their docstrings and stuff with no apparent errors.

Many thanks to Kevin Kofler for his help with these fixes.

Signed-off-by: Adam Williamson <awilliam@redhat.com>
  • Loading branch information
AdamWill authored and fnordware committed Oct 8, 2019
1 parent df92811 commit 9c81dda
Show file tree
Hide file tree
Showing 20 changed files with 272 additions and 263 deletions.
14 changes: 7 additions & 7 deletions src/pyglue/PyAllocationTransform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,10 @@ OCIO_NAMESPACE_ENTER
///

int PyOCIO_AllocationTransform_init(PyOCIO_Transform * self, PyObject * args, PyObject * kwds);
PyObject * PyOCIO_AllocationTransform_getAllocation(PyObject * self);
PyObject * PyOCIO_AllocationTransform_getAllocation(PyObject * self, PyObject *);
PyObject * PyOCIO_AllocationTransform_setAllocation(PyObject * self, PyObject * args);
PyObject * PyOCIO_AllocationTransform_getNumVars(PyObject * self);
PyObject * PyOCIO_AllocationTransform_getVars(PyObject * self);
PyObject * PyOCIO_AllocationTransform_getNumVars(PyObject * self, PyObject *);
PyObject * PyOCIO_AllocationTransform_getVars(PyObject * self, PyObject *);
PyObject * PyOCIO_AllocationTransform_setVars(PyObject * self, PyObject * args);

///////////////////////////////////////////////////////////////////////
Expand All @@ -68,7 +68,7 @@ OCIO_NAMESPACE_ENTER
{ "setAllocation",
PyOCIO_AllocationTransform_setAllocation, METH_VARARGS, ALLOCATIONTRANSFORM_SETALLOCATION__DOC__ },
{ "getNumVars",
(PyCFunction) PyOCIO_AllocationTransform_getNumVars, METH_VARARGS, ALLOCATIONTRANSFORM_GETNUMVARS__DOC__ },
(PyCFunction) PyOCIO_AllocationTransform_getNumVars, METH_NOARGS, ALLOCATIONTRANSFORM_GETNUMVARS__DOC__ },
{ "getVars",
(PyCFunction) PyOCIO_AllocationTransform_getVars, METH_NOARGS, ALLOCATIONTRANSFORM_GETVARS__DOC__ },
{ "setVars",
Expand Down Expand Up @@ -160,7 +160,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(-1)
}

PyObject * PyOCIO_AllocationTransform_getAllocation(PyObject * self)
PyObject * PyOCIO_AllocationTransform_getAllocation(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstAllocationTransformRcPtr transform = GetConstAllocationTransform(self);
Expand All @@ -180,15 +180,15 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_AllocationTransform_getNumVars(PyObject * self)
PyObject * PyOCIO_AllocationTransform_getNumVars(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstAllocationTransformRcPtr transform = GetConstAllocationTransform(self);
return PyInt_FromLong(transform->getNumVars());
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_AllocationTransform_getVars(PyObject * self)
PyObject * PyOCIO_AllocationTransform_getVars(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstAllocationTransformRcPtr transform = GetConstAllocationTransform(self);
Expand Down
56 changes: 28 additions & 28 deletions src/pyglue/PyBaker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,31 +60,31 @@ OCIO_NAMESPACE_ENTER
///

int PyOCIO_Baker_init(PyOCIO_Baker * self, PyObject * args, PyObject * kwds);
void PyOCIO_Baker_delete(PyOCIO_Baker * self, PyObject * args);
PyObject * PyOCIO_Baker_isEditable(PyObject * self);
PyObject * PyOCIO_Baker_createEditableCopy(PyObject * self);
void PyOCIO_Baker_delete(PyOCIO_Baker * self);
PyObject * PyOCIO_Baker_isEditable(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_createEditableCopy(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_setConfig(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getConfig(PyObject * self);
PyObject * PyOCIO_Baker_getConfig(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_setFormat(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getFormat(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_setType(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getType(PyObject * self);
PyObject * PyOCIO_Baker_getType(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_setMetadata(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getMetadata(PyObject * self);
PyObject * PyOCIO_Baker_getMetadata(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_setInputSpace(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getInputSpace(PyObject * self);
PyObject * PyOCIO_Baker_getInputSpace(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_setShaperSpace(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getShaperSpace(PyObject * self);
PyObject * PyOCIO_Baker_getShaperSpace(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_setLooks(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getLooks(PyObject * self);
PyObject * PyOCIO_Baker_getLooks(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_setTargetSpace(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getTargetSpace(PyObject * self);
PyObject * PyOCIO_Baker_getTargetSpace(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_setShaperSize(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getShaperSize(PyObject * self);
PyObject * PyOCIO_Baker_getShaperSize(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_setCubeSize(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getCubeSize(PyObject * self);
PyObject * PyOCIO_Baker_bake(PyObject * self);
PyObject * PyOCIO_Baker_getNumFormats(PyObject * self);
PyObject * PyOCIO_Baker_getCubeSize(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_bake(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_getNumFormats(PyObject * self, PyObject *);
PyObject * PyOCIO_Baker_getFormatNameByIndex(PyObject * self, PyObject * args);
PyObject * PyOCIO_Baker_getFormatExtensionByIndex(PyObject * self, PyObject * args);

Expand Down Expand Up @@ -208,17 +208,17 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(-1)
}

void PyOCIO_Baker_delete(PyOCIO_Baker *self, PyObject * /*args*/)
void PyOCIO_Baker_delete(PyOCIO_Baker *self)
{
DeletePyObject<PyOCIO_Baker>(self);
}

PyObject * PyOCIO_Baker_isEditable(PyObject * self)
PyObject * PyOCIO_Baker_isEditable(PyObject * self, PyObject *)
{
return PyBool_FromLong(IsPyConfigEditable(self));
}

PyObject * PyOCIO_Baker_createEditableCopy(PyObject * self)
PyObject * PyOCIO_Baker_createEditableCopy(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand All @@ -240,7 +240,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_getConfig(PyObject * self)
PyObject * PyOCIO_Baker_getConfig(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand Down Expand Up @@ -280,7 +280,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_getType(PyObject * self)
PyObject * PyOCIO_Baker_getType(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand All @@ -300,7 +300,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_getMetadata(PyObject * self)
PyObject * PyOCIO_Baker_getMetadata(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand All @@ -320,7 +320,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_getInputSpace(PyObject * self)
PyObject * PyOCIO_Baker_getInputSpace(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand All @@ -340,7 +340,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_getShaperSpace(PyObject * self)
PyObject * PyOCIO_Baker_getShaperSpace(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand All @@ -360,7 +360,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_getLooks(PyObject * self)
PyObject * PyOCIO_Baker_getLooks(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand All @@ -380,7 +380,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_getTargetSpace(PyObject * self)
PyObject * PyOCIO_Baker_getTargetSpace(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand All @@ -400,7 +400,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_getShaperSize(PyObject * self)
PyObject * PyOCIO_Baker_getShaperSize(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand All @@ -420,15 +420,15 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_getCubeSize(PyObject * self)
PyObject * PyOCIO_Baker_getCubeSize(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
return PyInt_FromLong(baker->getCubeSize());
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_bake(PyObject * self)
PyObject * PyOCIO_Baker_bake(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand All @@ -438,7 +438,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_Baker_getNumFormats(PyObject * self)
PyObject * PyOCIO_Baker_getNumFormats(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstBakerRcPtr baker = GetConstBaker(self);
Expand Down
36 changes: 18 additions & 18 deletions src/pyglue/PyCDLTransform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,22 +50,22 @@ OCIO_NAMESPACE_ENTER
int PyOCIO_CDLTransform_init(PyOCIO_Transform * self, PyObject * args, PyObject * kwds);
PyObject * PyOCIO_CDLTransform_CreateFromFile(PyObject * self, PyObject * args);
PyObject * PyOCIO_CDLTransform_equals(PyObject * self, PyObject * args);
PyObject * PyOCIO_CDLTransform_getXML(PyObject * self);
PyObject * PyOCIO_CDLTransform_getXML(PyObject * self, PyObject *);
PyObject * PyOCIO_CDLTransform_setXML(PyObject * self, PyObject * args);
PyObject * PyOCIO_CDLTransform_getSlope(PyObject * self);
PyObject * PyOCIO_CDLTransform_getOffset(PyObject * self);
PyObject * PyOCIO_CDLTransform_getPower(PyObject * self);
PyObject * PyOCIO_CDLTransform_getSOP(PyObject * self);
PyObject * PyOCIO_CDLTransform_getSat(PyObject * self);
PyObject * PyOCIO_CDLTransform_getSlope(PyObject * self, PyObject *);
PyObject * PyOCIO_CDLTransform_getOffset(PyObject * self, PyObject *);
PyObject * PyOCIO_CDLTransform_getPower(PyObject * self, PyObject *);
PyObject * PyOCIO_CDLTransform_getSOP(PyObject * self, PyObject *);
PyObject * PyOCIO_CDLTransform_getSat(PyObject * self, PyObject *);
PyObject * PyOCIO_CDLTransform_setSlope(PyObject * self, PyObject * args);
PyObject * PyOCIO_CDLTransform_setOffset(PyObject * self, PyObject * args);
PyObject * PyOCIO_CDLTransform_setPower(PyObject * self, PyObject * args);
PyObject * PyOCIO_CDLTransform_setSOP(PyObject * self, PyObject * args);
PyObject * PyOCIO_CDLTransform_setSat(PyObject * self, PyObject * args);
PyObject * PyOCIO_CDLTransform_getSatLumaCoefs(PyObject * self);
PyObject * PyOCIO_CDLTransform_getID(PyObject * self);
PyObject * PyOCIO_CDLTransform_getSatLumaCoefs(PyObject * self, PyObject *);
PyObject * PyOCIO_CDLTransform_getID(PyObject * self, PyObject *);
PyObject * PyOCIO_CDLTransform_setID(PyObject * self, PyObject * args);
PyObject * PyOCIO_CDLTransform_getDescription(PyObject * self);
PyObject * PyOCIO_CDLTransform_getDescription(PyObject * self, PyObject *);
PyObject * PyOCIO_CDLTransform_setDescription(PyObject * self, PyObject * args);

///////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -252,7 +252,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_CDLTransform_getXML(PyObject * self)
PyObject * PyOCIO_CDLTransform_getXML(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstCDLTransformRcPtr transform = GetConstCDLTransform(self);
Expand All @@ -271,7 +271,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_CDLTransform_getSlope(PyObject * self)
PyObject * PyOCIO_CDLTransform_getSlope(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstCDLTransformRcPtr transform = GetConstCDLTransform(self);
Expand All @@ -281,7 +281,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_CDLTransform_getOffset(PyObject * self)
PyObject * PyOCIO_CDLTransform_getOffset(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstCDLTransformRcPtr transform = GetConstCDLTransform(self);
Expand All @@ -291,7 +291,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_CDLTransform_getPower(PyObject * self)
PyObject * PyOCIO_CDLTransform_getPower(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstCDLTransformRcPtr transform = GetConstCDLTransform(self);
Expand All @@ -301,7 +301,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_CDLTransform_getSOP(PyObject * self)
PyObject * PyOCIO_CDLTransform_getSOP(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstCDLTransformRcPtr transform = GetConstCDLTransform(self);
Expand All @@ -311,7 +311,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_CDLTransform_getSat(PyObject * self)
PyObject * PyOCIO_CDLTransform_getSat(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstCDLTransformRcPtr transform = GetConstCDLTransform(self);
Expand Down Expand Up @@ -398,7 +398,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_CDLTransform_getSatLumaCoefs(PyObject * self)
PyObject * PyOCIO_CDLTransform_getSatLumaCoefs(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstCDLTransformRcPtr transform = GetConstCDLTransform(self);
Expand All @@ -408,7 +408,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_CDLTransform_getID(PyObject * self)
PyObject * PyOCIO_CDLTransform_getID(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstCDLTransformRcPtr transform = GetConstCDLTransform(self);
Expand All @@ -427,7 +427,7 @@ OCIO_NAMESPACE_ENTER
OCIO_PYTRY_EXIT(NULL)
}

PyObject * PyOCIO_CDLTransform_getDescription(PyObject * self)
PyObject * PyOCIO_CDLTransform_getDescription(PyObject * self, PyObject *)
{
OCIO_PYTRY_ENTER()
ConstCDLTransformRcPtr transform = GetConstCDLTransform(self);
Expand Down
Loading

0 comments on commit 9c81dda

Please sign in to comment.