[M3commit] [modula3/cm3] 640946: Fix bug compiling 16_8000000000000000 on 32-bit co...

GitHub noreply at github.com
Thu May 26 23:16:02 CEST 2016

  Branch: refs/heads/master
  Home:   https://github.com/modula3/cm3
  Commit: 64094695f6ece0914026729f93b9085297db1fa9
  Author: Rodney Bates <rodney.m.bates at acm.org>
  Date:   2016-05-26 (Thu, 26 May 2016)

  Changed paths:
    M m3-sys/m3front/src/misc/TipeDesc.m3
    M m3-sys/m3middle/src/M3CG_BinWr.m3
    M m3-sys/m3middle/src/TInt.i3
    M m3-sys/m3middle/src/TInt.m3

  Log Message:
  Fix bug compiling 16_8000000000000000 on 32-bit compile machine.

There was a mismatch in assumptions between TInt.ToBytes and its
callers.  ToBytes treated its parameter as a TInt.T, a twos-complement
number stored in 9 bytes, so it can represent the overlap of 64-bit
signed and 64-bit unsigned values.  It also treated its result
byte area as twos complement.  Its callers are converting to
a sign-magnitude representation, and have already converted negative
values to absolute value.  For this one value, this would require
9 bytes in twos-complement, but M3CG_BINWr.AddBigX only provides
8, which ToBytes, rightly, according to its assumptions, considers
insufficient to hold this number and returns zero.

Fixed by rewriting ToBytes with preconditioins that the value is
nonnegative and fits in the given number of result bytes, but does
not need a sign bit, since it is implicitly positive.  Rename this
ToUnsignedBytes, to be less likely to fool future potential callers.

More information about the M3commit mailing list