Fix gcc2 build on Mac OS X Lion.

The gcc2 cross-compiler built on Mac OS X Lion has a bug in it
where it is erroring with 'cast specifies signature type' when
assigning 0 or NULL to a pointer to a member fuction. NULL in this
instance is correctly converted to 0 since it is illegal to assign
((void*)0) to a pointer to a member function. However, it should
be legal to assign 0 to a pointer to a member function. Thus, there
is a bug.  Since I can't fix the gcc2 compiler I am working around
this bug by assigning the pointer to a do nothing function instead.

My host compiler version is
i686-apple-darwin11-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)

The same error occurs using the default gcc-llvm compiler and
a standard gcc 4.61 built from source. This bug does not occur on
Mac OS X 10.6 gcc2 or gcc4, nor does it occur on Mac OS X 10.7 with
the gcc4 cross-compiler.

If and when we decide to finally leave gcc2 behind we can revert this
change.
This commit is contained in:
John Scipione
2012-04-07 06:21:26 -04:00
parent 7d0f6bd08c
commit 7c369a4b3f
4 changed files with 32 additions and 16 deletions
+8
View File
@@ -102,6 +102,14 @@ protected:
void SetupErrorBuffer(int x, int y, int width); void SetupErrorBuffer(int x, int y, int width);
void DitherFloydSteinberg(uchar* destination, void DitherFloydSteinberg(uchar* destination,
const uchar* source, int x, int y, int width); const uchar* source, int x, int y, int width);
// Do nothing method to get around a bug in
// the gcc2 cross-compiler built on Mac OS X
// Lion where a compiler error occurs when
// assigning a member function pointer to NULL
// or 0: cast specifies signature type.
// However, this should be legal according to
// the C++03 standard.
void DitherNone(uchar*, const uchar*, int, int, int) {};
private: private:
enum { enum {
@@ -21,7 +21,7 @@
Resampler::Resampler(uint32 src_format, uint32 dst_format) Resampler::Resampler(uint32 src_format, uint32 dst_format)
: :
fFunc(0) fFunc(&Resampler::no_conversion)
{ {
if (dst_format == media_raw_audio_format::B_AUDIO_FLOAT) { if (dst_format == media_raw_audio_format::B_AUDIO_FLOAT) {
switch (src_format) { switch (src_format) {
@@ -81,7 +81,7 @@ Resampler::~Resampler()
status_t status_t
Resampler::InitCheck() const Resampler::InitCheck() const
{ {
return fFunc != 0 ? B_OK : B_ERROR; return fFunc != &Resampler::no_conversion ? B_OK : B_ERROR;
} }
@@ -65,6 +65,15 @@ private:
int32 srcSampleOffset, int32 srcSampleCount, int32 srcSampleOffset, int32 srcSampleCount,
void* dest, int32 destSampleOffset, void* dest, int32 destSampleOffset,
int32 destSampleCount, float gain); int32 destSampleCount, float gain);
// Do nothing method to get around a bug in
// the gcc2 cross-compiler built on Mac OS X
// Lion where a compiler error occurs when
// assigning a member function pointer to NULL
// or 0: cast specifies signature type.
// However, this should be legal according to
// the C++03 standard.
void no_conversion(const void*, int32, int32, void*,
int32, int32, float) {};
}; };
+13 -14
View File
@@ -31,21 +31,21 @@ ToGray(ColorRGB32 c)
static uint static uint
GetRedValue(ColorRGB32 c) GetRedValue(ColorRGB32 c)
{ {
return c.little.red; return c.little.red;
} }
static uint static uint
GetGreenValue(ColorRGB32 c) GetGreenValue(ColorRGB32 c)
{ {
return c.little.green; return c.little.green;
} }
static uint static uint
GetBlueValue(ColorRGB32 c) GetBlueValue(ColorRGB32 c)
{ {
return c.little.blue; return c.little.blue;
} }
@@ -56,11 +56,11 @@ Halftone::Halftone(color_space colorSpace, double gamma, double min,
fGray = ToGray; fGray = ToGray;
SetPlanes(kPlaneMonochrome1); SetPlanes(kPlaneMonochrome1);
SetBlackValue(kHighValueMeansBlack); SetBlackValue(kHighValueMeansBlack);
InitFloydSteinberg(); InitFloydSteinberg();
CreateGammaTable(gamma, min); CreateGammaTable(gamma, min);
if (ditherType == kTypeFloydSteinberg) { if (ditherType == kTypeFloydSteinberg) {
fDither = &Halftone::DitherFloydSteinberg; fDither = &Halftone::DitherFloydSteinberg;
return; return;
@@ -79,13 +79,13 @@ Halftone::Halftone(color_space colorSpace, double gamma, double min,
} }
switch (colorSpace) { switch (colorSpace) {
case B_RGB32: case B_RGB32:
case B_RGB32_BIG: case B_RGB32_BIG:
fDither = &Halftone::DitherRGB32; fDither = &Halftone::DitherRGB32;
break; break;
default: default:
fDither = NULL; fDither = &Halftone::DitherNone;
break; break;
} }
} }
@@ -364,4 +364,3 @@ Halftone::DitherFloydSteinberg(uchar *destination, const uchar* source0,
*destination = ConvertUsingBlackValue(cur); *destination = ConvertUsingBlackValue(cur);
} }
} }