From: Gingko <no...@te...> - 2005-07-23 11:18:34
|
----- Original Message ----- From: "Sebastian Biallas" <sb...@bi...> To: <pea...@li...> Sent: Saturday, July 23, 2005 12:22 PM Subject: Re: [Pearpc-devel] Bugfix for GCC 4 > Ah, ok, but how can we fix this? I guess we have to change the code a > little bit (you patch accesses "ptr" multiple times in the macro which > can cause bad side effects) > > Sebastian My patch just separates the incrementation of ptr from the reading of the data pointed by it. The result is mostly the same as replacing : char ch, *ptr; ch = *ptr++; by : char ch, *ptr; ptr = ptr+1; ch = ptr[-1]; .. actually putting the incrementation and the reading in parenthesis in order to keep all into a unique expression like in the previous macro : ch = (ptr = ptr+1, ptr[-1]); What kind of bad side effects do you expect to find inside this ? In spite of its syntax complexity, the actual operation is in fact very simple, and it compiles normally into about 12 assembly instructions (including the call to the very unefficient function "createHostInt") ! I know that it is not very elegant to read backward (with subscript -1) after incrementing the pointer, but as it is no longer possible to post-increment this pointer, this is the less bad solution that I found (and if you look at the generated assembly code, it is no so unefficient). When I compile this at my home (under different compilers and different operating systems), it works perfectly. Now you can also modify all 245 macros calls that are in the code, you just have to keep the original macro definitions and remove the "++" inside, and then add after each macro call another instruction for incrementing the pointer by the correct offset. Note that this will access the pointer exactly the same number of times. Gingko |