[Scummvm-cvs-logs] scummvm master -> 1aa12ddb967832e196ae694d34a4ba49802cab2c

lordhoto lordhoto at gmail.com
Fri Sep 21 02:42:23 CEST 2012


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
8aceef9711 PEGASUS: Replace FunctionPtr by our Functor code in Common.
1aa12ddb96 PEGASUS: "Fix" segmentation fault for DC toolchain when compiling shuttlehud.cpp.


Commit: 8aceef971106ba35ab234b165dbe6e19c842f336
    https://github.com/scummvm/scummvm/commit/8aceef971106ba35ab234b165dbe6e19c842f336
Author: Johannes Schickel (lordhoto at scummvm.org)
Date: 2012-09-20T17:35:50-07:00

Commit Message:
PEGASUS: Replace FunctionPtr by our Functor code in Common.

This "fixes" a segmentation fault in our buildbot's toolchain for DC.
The segmentation fault occured while compiling
engines/pegasus/ai/ai_condition.cpp.

Thanks to clone2727 for looking over this and testing it.

Changed paths:
    engines/pegasus/ai/ai_condition.cpp
    engines/pegasus/ai/ai_condition.h
    engines/pegasus/items/inventory/airmask.cpp
    engines/pegasus/items/inventory/airmask.h
    engines/pegasus/neighborhood/caldoria/caldoria.cpp
    engines/pegasus/neighborhood/caldoria/caldoria.h
    engines/pegasus/neighborhood/mars/mars.cpp
    engines/pegasus/neighborhood/mars/mars.h
    engines/pegasus/neighborhood/mars/robotship.cpp
    engines/pegasus/neighborhood/mars/robotship.h
    engines/pegasus/neighborhood/neighborhood.cpp
    engines/pegasus/neighborhood/neighborhood.h
    engines/pegasus/neighborhood/tsa/fulltsa.cpp
    engines/pegasus/neighborhood/tsa/fulltsa.h
    engines/pegasus/pegasus.cpp
    engines/pegasus/timers.h
    engines/pegasus/util.cpp
    engines/pegasus/util.h



diff --git a/engines/pegasus/ai/ai_condition.cpp b/engines/pegasus/ai/ai_condition.cpp
index df6d322..09ecbfe 100644
--- a/engines/pegasus/ai/ai_condition.cpp
+++ b/engines/pegasus/ai/ai_condition.cpp
@@ -102,7 +102,7 @@ bool AIOrCondition::fireCondition() {
 
 AITimerCondition::AITimerCondition(const TimeValue time, const TimeScale scale, const bool shouldStartTimer) {
 	_timerFuse.primeFuse(time, scale);
-	_timerFuse.setFunctionPtr((tFunctionPtr)&AITimerFunction, (void *)this);
+	_timerFuse.setFunctor(new Common::Functor0Mem<void, AITimerCondition>(this, &AITimerCondition::fire));
 	_fired = false;
 
 	if (shouldStartTimer)
@@ -138,14 +138,14 @@ void AITimerCondition::readAICondition(Common::ReadStream *stream) {
 		_timerFuse.lightFuse();
 }
 
-void AITimerCondition::AITimerFunction(FunctionPtr *, AITimerCondition *condition) {
-	condition->_fired = true;
-}
-
 bool AITimerCondition::fireCondition() {
 	return _fired;
 }
 
+void AITimerCondition::fire() {
+	_fired = true;
+}
+
 AILocationCondition::AILocationCondition(uint32 maxLocations) {
 	_numLocations = 0;
 	_maxLocations = maxLocations;
diff --git a/engines/pegasus/ai/ai_condition.h b/engines/pegasus/ai/ai_condition.h
index 2d93a52..f7fa1f3 100644
--- a/engines/pegasus/ai/ai_condition.h
+++ b/engines/pegasus/ai/ai_condition.h
@@ -136,7 +136,7 @@ public:
 	virtual void readAICondition(Common::ReadStream *);
 
 protected:
-	static void AITimerFunction(FunctionPtr *, AITimerCondition *);
+	void fire();
 
 	FuseFunction _timerFuse;
 	bool _fired;
diff --git a/engines/pegasus/items/inventory/airmask.cpp b/engines/pegasus/items/inventory/airmask.cpp
index 559410f..85d4449 100644
--- a/engines/pegasus/items/inventory/airmask.cpp
+++ b/engines/pegasus/items/inventory/airmask.cpp
@@ -36,7 +36,7 @@ AirMask *g_airMask = 0;
 //	Based on full == 100, which is scale used by GetAirLeft().
 static const TimeValue kOxygenLowThreshold = 25;
 
-void AirMask::airMaskTimerExpired(FunctionPtr *, void *) {
+void AirMask::airMaskTimerExpired() {
 	if (g_neighborhood)
 		g_neighborhood->checkAirMask();
 }
@@ -49,7 +49,7 @@ AirMask::AirMask(const ItemID id, const NeighborhoodID neighborhood, const RoomI
 	g_allHotspots.push_back(&_toggleSpot);
 	setItemState(kAirMaskEmptyOff);
 	_oxygenTimer.primeFuse(0);
-	_oxygenTimer.setFunctionPtr(&airMaskTimerExpired, 0);
+	_oxygenTimer.setFunctor(new Common::Functor0Mem<void, AirMask>(this, &AirMask::airMaskTimerExpired));
 }
 
 AirMask::~AirMask() {
diff --git a/engines/pegasus/items/inventory/airmask.h b/engines/pegasus/items/inventory/airmask.h
index f207f3b..6a2d708 100644
--- a/engines/pegasus/items/inventory/airmask.h
+++ b/engines/pegasus/items/inventory/airmask.h
@@ -59,7 +59,7 @@ public:
 	void clickInAirMaskHotspot();
 
 protected:
-	static void airMaskTimerExpired(FunctionPtr *, void *);
+	void airMaskTimerExpired();
 
 	virtual void removedFromInventory();
 	virtual void addedToInventory();
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria.cpp b/engines/pegasus/neighborhood/caldoria/caldoria.cpp
index 8c31deb..8d46300 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoria.cpp
+++ b/engines/pegasus/neighborhood/caldoria/caldoria.cpp
@@ -150,14 +150,6 @@ static const TimeValue k5To3Time = 41280;
 
 const NotificationFlags kSinclairLoopDoneFlag = kLastNeighborhoodNotificationFlag << 1;
 
-void doorBombTimerExpiredFunction(FunctionPtr *, void *caldoria) {
-	((Caldoria *)caldoria)->doorBombTimerExpired();
-}
-
-void sinclairTimerExpiredFunction(FunctionPtr *, void *caldoria) {
-	((Caldoria *)caldoria)->sinclairTimerExpired();
-}
-
 SinclairCallBack::SinclairCallBack(Caldoria *caldoria) {
 	_caldoria = caldoria;
 }
@@ -941,7 +933,7 @@ void Caldoria::setUpRoofTop() {
 			} else if (GameState.getCaldoriaDoorBombed()) {
 				// Long enough for AI hints...?
 				_utilityFuse.primeFuse(kCardBombCountDownTime);
-				_utilityFuse.setFunctionPtr(&doorBombTimerExpiredFunction, (void *)this);
+				_utilityFuse.setFunctor(new Common::Functor0Mem<void, Caldoria>(this, &Caldoria::doorBombTimerExpired));
 				_utilityFuse.lightFuse();
 
 				loopCroppedMovie("Images/Caldoria/A48 Bomb Loop", kCaldoria48CardBombLoopLeft, kCaldoria48CardBombLoopTop);
@@ -965,7 +957,7 @@ void Caldoria::setUpRoofTop() {
 		if (!GameState.getCaldoriaSinclairShot()) {
 			if (GameState.getCaldoriaSawVoiceAnalysis() && !_utilityFuse.isFuseLit()) {
 				_utilityFuse.primeFuse(GameState.getCaldoriaFuseTimeLimit());
-				_utilityFuse.setFunctionPtr(&sinclairTimerExpiredFunction, (void *)this);
+				_utilityFuse.setFunctor(new Common::Functor0Mem<void, Caldoria>(this, &Caldoria::sinclairTimerExpired));
 				_utilityFuse.lightFuse();
 			}
 		} else {
@@ -1198,7 +1190,7 @@ void Caldoria::receiveNotification(Notification *notification, const Notificatio
 			break;
 		case kCa49NorthVoiceAnalysis:
 			_utilityFuse.primeFuse(kSinclairShootsTimeLimit);
-			_utilityFuse.setFunctionPtr(&sinclairTimerExpiredFunction, (void*) this);
+			_utilityFuse.setFunctor(new Common::Functor0Mem<void, Caldoria>(this, &Caldoria::sinclairTimerExpired));
 			_utilityFuse.lightFuse();
 			GameState.setCaldoriaSawVoiceAnalysis(true);
 			break;
@@ -1614,7 +1606,7 @@ void Caldoria::dropItemIntoRoom(Item *item, Hotspot *dropSpot) {
 		Neighborhood::dropItemIntoRoom(item, dropSpot);
 		// Long enough for AI hints...?
 		_utilityFuse.primeFuse(kCardBombCountDownTime);
-		_utilityFuse.setFunctionPtr(&doorBombTimerExpiredFunction, (void *)this);
+		_utilityFuse.setFunctor(new Common::Functor0Mem<void, Caldoria>(this, &Caldoria::doorBombTimerExpired));
 		_utilityFuse.lightFuse();
 		GameState.setCaldoriaFuseTimeLimit(kCardBombCountDownTime);
 		loopCroppedMovie("Images/Caldoria/A48 Bomb Loop", kCaldoria48CardBombLoopLeft, kCaldoria48CardBombLoopTop);
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria.h b/engines/pegasus/neighborhood/caldoria/caldoria.h
index f02101e..c9243e0 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoria.h
+++ b/engines/pegasus/neighborhood/caldoria/caldoria.h
@@ -401,8 +401,6 @@ protected:
 
 class Caldoria : public Neighborhood {
 friend class SinclairCallBack;
-friend void doorBombTimerExpiredFunction(FunctionPtr *, void *);
-friend void sinclairTimerExpiredFunction(FunctionPtr *, void *);
 
 public:
 	Caldoria(InputHandler *, PegasusEngine *);
diff --git a/engines/pegasus/neighborhood/mars/mars.cpp b/engines/pegasus/neighborhood/mars/mars.cpp
index 9cc8ab6..e5a4b61 100644
--- a/engines/pegasus/neighborhood/mars/mars.cpp
+++ b/engines/pegasus/neighborhood/mars/mars.cpp
@@ -85,28 +85,8 @@ enum {
 #define kShuttleTractorBounds Common::Rect(24, 103, 24 + 112, 103 + 30)
 #define kShuttleTransportBounds Common::Rect(484, 353, 89 + 484, 79 + 353)
 
-void robotTimerExpiredFunction(FunctionPtr *, void *mars) {
-	((Mars *)mars)->robotTiredOfWaiting();
-}
-
-void lockThawTimerExpiredFunction(FunctionPtr *, void *mars) {
-	((Mars *)mars)->lockThawed();
-}
-
-void bombTimerExpiredFunction(FunctionPtr *, void *mars) {
-	((Mars *)mars)->didntFindBomb();
-}
-
-void bombTimerExpiredInGameFunction(FunctionPtr *, void *mars) {
-	((Mars *)mars)->bombExplodesInGame();
-}
-
-void airStageExpiredFunction(FunctionPtr *, void *mars) {
-	((Mars *)mars)->airStageExpired();
-}
-
-void marsTimerFunction(FunctionPtr *, void *event) {
-	((MarsTimerEvent *)event)->mars->marsTimerExpired(*(MarsTimerEvent *)event);
+void MarsTimerEvent::fire() {
+	mars->marsTimerExpired(*this);
 }
 
 Mars::Mars(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHandler, owner, "Mars", kMarsID),
@@ -120,7 +100,7 @@ Mars::Mars(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextH
 		_planetMovie(kNoDisplayElement), _junk(kNoDisplayElement), _energyChoiceSpot(kShuttleEnergySpotID),
 		_gravitonChoiceSpot(kShuttleGravitonSpotID), _tractorChoiceSpot(kShuttleTractorSpotID),
 		_shuttleViewSpot(kShuttleViewSpotID), _shuttleTransportSpot(kShuttleTransportSpotID) {
-	_noAirFuse.setFunctionPtr(&airStageExpiredFunction, this);
+	_noAirFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::airStageExpired));
 	setIsItemTaken(kMarsCard);
 	setIsItemTaken(kAirMask);
 	setIsItemTaken(kCrowbar);
@@ -1341,7 +1321,7 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 			loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0x100, 0, 0);
 			loopExtraSequence(kMars48RobotLoops);
 			_utilityFuse.primeFuse(kMarsRobotPatienceLimit);
-			_utilityFuse.setFunctionPtr(&robotTimerExpiredFunction, (void *)this);
+			_utilityFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::robotTiredOfWaiting));
 			_utilityFuse.lightFuse();
 		}
 		break;
@@ -1349,7 +1329,7 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 		if (GameState.getMarsSeenRobotAtReactor() && !GameState.getMarsAvoidedReactorRobot()) {
 			loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0x100, 0, 0);
 			_utilityFuse.primeFuse(kMarsRobotPatienceLimit);
-			_utilityFuse.setFunctionPtr(&robotTimerExpiredFunction, (void *)this);
+			_utilityFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::robotTiredOfWaiting));
 			_utilityFuse.lightFuse();
 		}
 		break;
@@ -1402,7 +1382,7 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
 			setCurrentActivation(kActivateReactorReadyForCrowBar);
 			_privateFlags.setFlag(kMarsPrivatePlatformZoomedInFlag, true);
 			_utilityFuse.primeFuse(kLockFreezeTimeLmit);
-			_utilityFuse.setFunctionPtr(&lockThawTimerExpiredFunction, (void *)this);
+			_utilityFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::lockThawed));
 			_utilityFuse.lightFuse();
 		} else {
 			setCurrentActivation(kActivateReactorPlatformOut);
@@ -2184,7 +2164,7 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 			GameState.setMarsSeenRobotAtReactor(true);
 			loopExtraSequence(kMars48RobotLoops);
 			_utilityFuse.primeFuse(kMarsRobotPatienceLimit);
-			_utilityFuse.setFunctionPtr(&robotTimerExpiredFunction, (void *)this);
+			_utilityFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::robotTiredOfWaiting));
 			_utilityFuse.lightFuse();
 			break;
 		case kMars48RobotDefends:
@@ -2267,7 +2247,7 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
 			GameState.setMarsLockFrozen(true);
 			showExtraView(kMars57LockFrozenView);
 			_utilityFuse.primeFuse(kLockFreezeTimeLmit);
-			_utilityFuse.setFunctionPtr(&lockThawTimerExpiredFunction, (void *)this);
+			_utilityFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::lockThawed));
 			_utilityFuse.lightFuse();
 			break;
 		case kMars57BreakLock:
@@ -2800,7 +2780,7 @@ void Mars::startMarsTimer(TimeValue time, TimeScale scale, MarsTimerCode code) {
 	_utilityFuse.primeFuse(time, scale);
 	_marsEvent.mars = this;
 	_marsEvent.event = code;
-	_utilityFuse.setFunctionPtr(&marsTimerFunction, (void *)&_marsEvent);
+	_utilityFuse.setFunctor(new Common::Functor0Mem<void, MarsTimerEvent>(&_marsEvent, &MarsTimerEvent::fire));
 	_utilityFuse.lightFuse();
 }
 
@@ -3398,7 +3378,7 @@ void Mars::setUpReactorLevel1() {
 	_choiceHighlight.initReactorChoiceHighlight();
 	setCurrentActivation(kActivateReactorInGame);
 	_bombFuse.primeFuse(kColorMatchingTimeLimit);
-	_bombFuse.setFunctionPtr(&bombTimerExpiredInGameFunction, (void *)this);
+	_bombFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::bombExplodesInGame));
 	_bombFuse.lightFuse();
 }
 
diff --git a/engines/pegasus/neighborhood/mars/mars.h b/engines/pegasus/neighborhood/mars/mars.h
index 9aca10a..3ddbf39 100644
--- a/engines/pegasus/neighborhood/mars/mars.h
+++ b/engines/pegasus/neighborhood/mars/mars.h
@@ -52,6 +52,8 @@ enum MarsTimerCode {
 struct MarsTimerEvent {
 	Mars *mars;
 	MarsTimerCode event;
+
+	void fire();
 };
 
 enum ShuttleWeaponSelection {
@@ -62,13 +64,7 @@ enum ShuttleWeaponSelection {
 };
 
 class Mars : public Neighborhood {
-friend void robotTimerExpiredFunction(FunctionPtr *, void *);
-friend void lockThawTimerExpiredFunction(FunctionPtr *, void *);
-friend void bombTimerExpiredFunction(FunctionPtr *, void *);
-friend void bombTimerExpiredInGameFunction(FunctionPtr *, void *);
-friend void airStageExpiredFunction(FunctionPtr *, void *);
-friend void marsTimerFunction(FunctionPtr *, void *);
-
+friend class MarsTimerEvent;
 public:
 	Mars(InputHandler *, PegasusEngine *);
 	virtual ~Mars();
diff --git a/engines/pegasus/neighborhood/mars/robotship.cpp b/engines/pegasus/neighborhood/mars/robotship.cpp
index a0ff749..43a7e55 100644
--- a/engines/pegasus/neighborhood/mars/robotship.cpp
+++ b/engines/pegasus/neighborhood/mars/robotship.cpp
@@ -55,10 +55,6 @@ static const CoordType kRovingHeight = kShuttleWindowMidV - kRovingTop;
 
 RobotShip* g_robotShip = 0;
 
-void timeToDropJunkFunction(FunctionPtr *, void *robotShip) {
-	((RobotShip *)robotShip)->timeToDropJunk();
-}
-
 RobotShip::RobotShip() : _spritesMovie(kNoDisplayElement) {
 	g_robotShip = this;
 	_shipRange = Common::Rect(kShuttleWindowLeft, kShuttleWindowTop, kShuttleWindowLeft + kShuttleWindowWidth,
@@ -67,7 +63,7 @@ RobotShip::RobotShip() : _spritesMovie(kNoDisplayElement) {
 	_currentLocation.x = 0;
 	_currentLocation.y = 0;
 	_snaring = false;
-	_dropJunkFuse.setFunctionPtr(&timeToDropJunkFunction, (void *)this);
+	_dropJunkFuse.setFunctor(new Common::Functor0Mem<void, RobotShip>(this, &RobotShip::timeToDropJunk));
 }
 
 RobotShip::~RobotShip() {
diff --git a/engines/pegasus/neighborhood/mars/robotship.h b/engines/pegasus/neighborhood/mars/robotship.h
index b668e8f..04be3ea 100644
--- a/engines/pegasus/neighborhood/mars/robotship.h
+++ b/engines/pegasus/neighborhood/mars/robotship.h
@@ -34,8 +34,6 @@ static const CoordType kShuttleMovieWidth = 114;
 static const CoordType kShuttleMovieHeight = 42;
 
 class RobotShip : IdlerTimeBase {
-friend void timeToDropJunkFunction(FunctionPtr *, void *);
-
 public:
 	RobotShip();
 	virtual ~RobotShip();
diff --git a/engines/pegasus/neighborhood/neighborhood.cpp b/engines/pegasus/neighborhood/neighborhood.cpp
index bb2c648..ae383a6 100644
--- a/engines/pegasus/neighborhood/neighborhood.cpp
+++ b/engines/pegasus/neighborhood/neighborhood.cpp
@@ -1740,15 +1740,15 @@ void Neighborhood::useIdleTime() {
 	}
 }
 
-void timerFunction(FunctionPtr *, void *neighborhood) {
-	((Neighborhood *)neighborhood)->timerExpired(((Neighborhood *)neighborhood)->getTimerEvent());
+void Neighborhood::timerFunction() {
+	timerExpired(getTimerEvent());
 }
 
 void Neighborhood::scheduleEvent(const TimeValue time, const TimeScale scale, const uint32 eventType) {
 	_eventTimer.stopFuse();
 	_eventTimer.primeFuse(time, scale);
 	_timerEvent = eventType;
-	_eventTimer.setFunctionPtr(&timerFunction, this);
+	_eventTimer.setFunctor(new Common::Functor0Mem<void, Neighborhood>(this, &Neighborhood::timerFunction));
 	_eventTimer.lightFuse();
 }
 
diff --git a/engines/pegasus/neighborhood/neighborhood.h b/engines/pegasus/neighborhood/neighborhood.h
index 8a38eb3..1fef066 100644
--- a/engines/pegasus/neighborhood/neighborhood.h
+++ b/engines/pegasus/neighborhood/neighborhood.h
@@ -110,7 +110,6 @@ typedef Common::Queue<QueueRequest> NeighborhoodActionQueue;
 
 class Neighborhood : public IDObject, public NotificationReceiver, public InputHandler, public Idler {
 friend class StriderCallBack;
-friend void timerFunction(FunctionPtr *, void *);
 
 public:
 	Neighborhood(InputHandler *nextHandler, PegasusEngine *vm, const Common::String &resName, NeighborhoodID id);
@@ -335,6 +334,7 @@ protected:
 	virtual void timerExpired(const uint32) {}
 	bool isEventTimerRunning() { return _eventTimer.isFuseLit(); }
 	uint32 getTimerEvent() { return _timerEvent; }
+	void timerFunction();
 
 	void pauseTimer();
 	void resumeTimer();
diff --git a/engines/pegasus/neighborhood/tsa/fulltsa.cpp b/engines/pegasus/neighborhood/tsa/fulltsa.cpp
index 2269ea7..98c70aa 100644
--- a/engines/pegasus/neighborhood/tsa/fulltsa.cpp
+++ b/engines/pegasus/neighborhood/tsa/fulltsa.cpp
@@ -663,8 +663,8 @@ void FullTSA::init() {
 	entry->hotspotItem = kPegasusBiochip;
 }
 
-void uncreatedInTSAFunction(FunctionPtr *, void *tsa) {
-	((FullTSA *)tsa)->die(kDeathUncreatedInTSA);
+void FullTSA::dieUncreatedInTSA() {
+	die(kDeathUncreatedInTSA);
 }
 
 void FullTSA::start() {
@@ -672,7 +672,7 @@ void FullTSA::start() {
 
 	if (!GameState.getScoringEnterTSA()) {
 		_utilityFuse.primeFuse(GameState.getTSAFuseTimeLimit());
-		_utilityFuse.setFunctionPtr(&uncreatedInTSAFunction, (void *)this);
+		_utilityFuse.setFunctor(new Common::Functor0Mem<void, FullTSA>(this, &FullTSA::dieUncreatedInTSA));
 		_utilityFuse.lightFuse();
 	} else if (GameState.getTSAState() == kTSAPlayerDetectedRip || GameState.getTSAState() == kTSAPlayerNeedsHistoricalLog) {
 		_ripTimer.initImage();
diff --git a/engines/pegasus/neighborhood/tsa/fulltsa.h b/engines/pegasus/neighborhood/tsa/fulltsa.h
index 4260a83..7dd11a7 100644
--- a/engines/pegasus/neighborhood/tsa/fulltsa.h
+++ b/engines/pegasus/neighborhood/tsa/fulltsa.h
@@ -54,8 +54,6 @@ static const RoomID kTSA22Red = 28;
 static const RoomID kTSA37 = 42;
 
 class FullTSA : public Neighborhood {
-friend void uncreatedInTSAFunction(FunctionPtr *, void *tsa);
-
 public:
 	FullTSA(InputHandler *, PegasusEngine *);
 	virtual ~FullTSA() {}
@@ -152,6 +150,8 @@ protected:
 
 	Common::String getNavMovieName();
 	Common::String getSoundSpotsName();
+
+	void dieUncreatedInTSA();
 };
 
 } // End of namespace Pegasus
diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp
index cbe2222..dbd9ec2 100644
--- a/engines/pegasus/pegasus.cpp
+++ b/engines/pegasus/pegasus.cpp
@@ -115,10 +115,6 @@ PegasusEngine::~PegasusEngine() {
 	delete _gfx;
 }
 
-void introTimerExpiredFunction(FunctionPtr *, void *) {
-	((PegasusEngine *)g_engine)->introTimerExpired();
-}
-
 Common::Error PegasusEngine::run() {
 	_console = new PegasusConsole(this);
 	_gfx = new GraphicsManager(this);
@@ -186,7 +182,7 @@ Common::Error PegasusEngine::run() {
 
 	if (!isDemo()) {
 		_introTimer = new FuseFunction();
-		_introTimer->setFunctionPtr(&introTimerExpiredFunction, 0);
+		_introTimer->setFunctor(new Common::Functor0Mem<void, PegasusEngine>(this, &PegasusEngine::introTimerExpired));
 	}
 
 	while (!shouldQuit()) {
diff --git a/engines/pegasus/timers.h b/engines/pegasus/timers.h
index 1dd32de..5a269c2 100644
--- a/engines/pegasus/timers.h
+++ b/engines/pegasus/timers.h
@@ -28,6 +28,7 @@
 
 #include "common/list.h"
 #include "common/rational.h"
+#include "common/func.h"
 
 #include "pegasus/constants.h"
 #include "pegasus/notification.h"
@@ -242,13 +243,16 @@ protected:
 	Notification _fuseNotification;
 };
 
-class FuseFunction : public Fuse, public FunctionPtr {
+class FuseFunction : public Fuse {
 public:
-	FuseFunction() {}
-	virtual ~FuseFunction() {}
+	FuseFunction() : _functor(0) {}
+	virtual ~FuseFunction() { delete _functor; }
 
+	void setFunctor(Common::Functor0<void> *functor) { delete _functor; _functor = functor; }
 protected:
-	virtual void invokeAction() { callFunction(); }
+	virtual void invokeAction() { if (_functor && _functor->isValid()) (*_functor)(); }
+
+	Common::Functor0<void> *_functor;
 };
 
 } // End of namespace Pegasus
diff --git a/engines/pegasus/util.cpp b/engines/pegasus/util.cpp
index 03bc572..59df610 100644
--- a/engines/pegasus/util.cpp
+++ b/engines/pegasus/util.cpp
@@ -50,24 +50,6 @@ int operator!=(const IDObject &arg1, const IDObject &arg2) {
 	return arg1.getObjectID() != arg2.getObjectID();
 }
 
-FunctionPtr::FunctionPtr() {
-	_function = 0;
-	_functionArg = 0;
-}
-
-FunctionPtr::~FunctionPtr() {
-}
-
-void FunctionPtr::setFunctionPtr(tFunctionPtr function, void *functionArg) {
-	_function = function;
-	_functionArg = functionArg;
-}
-
-void FunctionPtr::callFunction() {
-	if (_function != 0)
-		(*_function)(this, _functionArg);
-}
-
 int32 pegasusRound(const int32 a, const int32 b) {
 	if (b < 0)
 		if (a < 0)
diff --git a/engines/pegasus/util.h b/engines/pegasus/util.h
index 57839fc..1642534 100644
--- a/engines/pegasus/util.h
+++ b/engines/pegasus/util.h
@@ -47,24 +47,6 @@ private:
 	int32 _objectID;
 };
 
-class FunctionPtr;
-
-typedef void (*tFunctionPtr)(FunctionPtr *theFunction, void *functionArg);
-
-class FunctionPtr {
-public:
-	FunctionPtr();
-	virtual ~FunctionPtr();
-	
-	void setFunctionPtr(tFunctionPtr function, void *functionArg);
-
-protected:
-	void callFunction();
-	
-	tFunctionPtr _function;
-	void *_functionArg;
-};
-
 #define NUM_FLAGS (sizeof(Unit) * 8)
 #define BIT_INDEX_SHIFT (sizeof(Unit) + 2 - (sizeof(Unit)) / 3)
 #define BIT_INDEX_MASK (NUM_FLAGS - 1)


Commit: 1aa12ddb967832e196ae694d34a4ba49802cab2c
    https://github.com/scummvm/scummvm/commit/1aa12ddb967832e196ae694d34a4ba49802cab2c
Author: Johannes Schickel (lordhoto at scummvm.org)
Date: 2012-09-20T17:36:37-07:00

Commit Message:
PEGASUS: "Fix" segmentation fault for DC toolchain when compiling shuttlehud.cpp.

It seems the explicit destructor of ShuttleHUD is problematic. When I move
it's implementation to shuttlehud.cpp it does not segfault. Removing it on
the other hand also does not cause it to segfault. So I chose the latter,
since it has no special implementation anyway.

Changed paths:
    engines/pegasus/neighborhood/mars/shuttlehud.h



diff --git a/engines/pegasus/neighborhood/mars/shuttlehud.h b/engines/pegasus/neighborhood/mars/shuttlehud.h
index dc1c759..f7dbbae 100644
--- a/engines/pegasus/neighborhood/mars/shuttlehud.h
+++ b/engines/pegasus/neighborhood/mars/shuttlehud.h
@@ -34,7 +34,6 @@ namespace Pegasus {
 class ShuttleHUD : public DisplayElement, public Idler {
 public:
 	ShuttleHUD();
-	virtual ~ShuttleHUD() {}
 
 	void showTargetGrid();
 	void hideTargetGrid();






More information about the Scummvm-git-logs mailing list