Sometimes you write a blog post that you wish you wouldn’t. Maybe you don’t, but I certainly did. Yesterday I wrote about TStreamAdapter.Seek Broken For Large Files I completely incorrectly stated that “the bug was not fixed in XE4/XE5”.
The reason for my mistake was that although I verified the problem in the XE2, I didn’t write any test code for it (we already had a failing application so I didn’t have to – or so I thought) and I only checked the RTL for changes. I found out that the TStreamAdapter.Seek didn’t change from XE2 to XE4/5 and assumed the worst.
Well, the good guys at Embarcadero did fix the problem in the meantime – but in a different place. They have added a new Seek overload to the TStream class and this new Seek (which is implemented as an inline function) acts as an intermediary between the TStreamAdapter and the correct TStream.Seek method. This solution is much better than our quick fix as it also fixes all other code in the world which mistakenly calls the wrong Seek overload.
function Seek(Offset: Longint; Origin: Word): Longint; overload; virtual;
function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; overload; virtual;
function Seek(const Offset: Int64; Origin: Word): Int64; overload; deprecated; inline;
function TStream.Seek(const Offset: Int64; Origin: Word): Int64;
Result := Seek(Offset, TSeekOrigin(Origin));
Thanks to the Arioch’s prompt in the original post I did write a test code today and when I finally tested it on the XE5, it run just fine! Imagine my shame. :(
What have I learned today? That looking at the source code is not enough, especially if you want to complain. Always write a test case (and then run it!).
I deeply apology to Embarcadero programmers (especially to the guy who fixed the original error) and to you, my readers.
And now, if you’ll excuse me, I’ll pull a cover over my head and gently weep.