Archeology: Endianness need a little cleanup

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Archeology: Endianness need a little cleanup

Nicolas Cellier-3
Endianness reversing is implemented too many times in 3.9a7029.
It is like a collection of successive independant coding accumulated.

We must reverse bytes in wordArray at startup if we transfer image on another
machine, or for binary I/O.
There are only four cases:
 we have long 1234, we want 4321
  at startup, the VM does that for us... nothing to do
  for Binary I/O, Bitmap class>>swapBytesIn:from:to: does swap long (32 bits)
 we have short 12,34 we want 21,43
  at startup, VM does scramble 4321, we have two implementations:
      ArrayedCollection>>swapHalves and ShortIntegerObject>>swapShortObjects
  for binary I/O, this is re-implemented a lot of times!

My proposition is to have three generic BitBlt tricks
 Bitmap class>>swapLongIn:from:to:
 Bitmap class>>swapShortIn:from:to:
 Bitmap class>>swapHalvesIn:from:to:
Maybe a  swapLongLong would be usefull too...

Then to define reverseEndianness everywhere, with default:
 pointers | bytes => do nothing
 word => Bitmap swapLongIn: self from: 1 to: self basicSize

Redefined reverseEndianness  in ShortIntegerArray SoundBuffer & co
 Bitmap swapShortIn: self from: 1 to: self basicSize

Then to define restoreEndianness generic:
     SmalltalkImage current isLittleEndian ifTrue: [self reverseEndianness]

Then to call uniformely swapHalves at startup for short things...

I can proceed with theses changes, but cannot test bigEndian...
Any objection to these changes ?
Note that this should speed up ShortIntegerArray streaming on x86...

Note that a service like swapShortAt: swapLongAt: swapLongLongAt: is missing
in ByteArray, though usefull to store/retrieve information in native format
(especially for FFI). And BitBlt trick should not work for ByteArray... Or
should it ?

Nicolas