# HG changeset patch # User glx # Date 2007-12-13 02:04:09 # Node ID 92e4ea58eb0f31b22e6e30ed68b9798f1f7c233e # Parent 08d9e587fcb9e478175f843d91c0e1dc3881513e (svn r11627) -Fix [FS#1532] (r11145): poping from text reference stack must be done in a precise order. But some compiler (MSVC) over optimised it and inverted this order. diff --git a/src/newgrf_text.cpp b/src/newgrf_text.cpp --- a/src/newgrf_text.cpp +++ b/src/newgrf_text.cpp @@ -505,13 +505,25 @@ struct TextRefStack { uint8 PopUnsignedByte() { assert(this->position < lengthof(this->stack)); return this->stack[this->position++]; } int8 PopSignedByte() { return (int8)this->PopUnsignedByte(); } - uint16 PopUnsignedWord() { return this->PopUnsignedByte() | (((uint16)this->PopUnsignedByte()) << 8); } + uint16 PopUnsignedWord() + { + uint16 val = this->PopUnsignedByte(); + return val | (this->PopUnsignedByte() << 8); + } int16 PopSignedWord() { return (int32)this->PopUnsignedWord(); } - uint32 PopUnsignedDWord() { return this->PopUnsignedWord() | (((uint32)this->PopUnsignedWord()) << 16); } + uint32 PopUnsignedDWord() + { + uint32 val = this->PopUnsignedWord(); + return val | (this->PopUnsignedWord() << 16); + } int32 PopSignedDWord() { return (int32)this->PopUnsignedDWord(); } - uint64 PopUnsignedQWord() { return this->PopUnsignedDWord() | (((uint64)this->PopUnsignedDWord()) << 32); } + uint64 PopUnsignedQWord() + { + uint64 val = this->PopUnsignedDWord(); + return val | (((uint64)this->PopUnsignedDWord()) << 32); + } int64 PopSignedQWord() { return (int64)this->PopUnsignedQWord(); } /** Rotate the top four words down: W1, W2, W3, W4 -> W4, W1, W2, W3 */