[Coco] A bug in Basic09/RunB
Lothan
lothan at newsguy.com
Mon Dec 7 01:16:59 EST 2009
From: "Wayne Campbell" <asa.rand at yahoo.com>
> The wrong byte is being retrieved. All BYTE variables are expanded into
> INTEGERs before being processed. In this case,
> the first byte of the integer is being read, not the second. I can never
> remember which order they are in, so I'm not
> certain which one is LSB and which one is MSB. To be clear:
>
> +---+---+
> | 1 | 2 |
> +---+---+
>
> Byte 1 is being read, when byte 2 should be being read.
Can you look at that again to confirm whether Basic09 is really passing a
byte as a one-byte value (e.g. $01), a two-byte integer (e.g. $0001), or a
byte padded to a two-byte parameter slot (e.g. $0100)? The reason I ask is
because it's quite common for languages to return an integer result of a
mathematical expression involving byte values so it seems more likely the
code is mistakenly passing an integer instead of a byte and so the parameter
slots are filled incorrectly.
As further confirmation, use this quick 'n dirty test program to confirm my
suspicions:
PROCEDURE Program
DIM b:BYTE
b := 9
b := b + 1
RUN Test(b)
b := 9
RUN Test(b + 1)
END
PROCEDURE Test
PARAM b:BYTE
PRINT b
END
If you run Program, you'll see that the output is 10 and 0, This seems to
confirm that the addition in the first half is likely an integer downcast
back to a byte, but the addition in the second half is not downcast to a
byte because Basic09 doesn't have a clue what parameter types are expected
by the procedure.
> The second bug occurs when you pass multiple variables into a single
> variable. Based on the fact that it works correctly, under the following
> conditions, on the first 2 elements of the receiving array, it should be
> working correctly for all of the parameters needed to equal its size. The
> test procedure passed 3 INTEGER variables into 1 3-element INTEGER array.
>
> PROCEDURE testParams
> DIM a,b,c:INTEGER
> a:=1 \b:=2 \c:=3
> RUN recPars(a,b,c)
> END
>
> PROCEDURE recPars
> DIM cntr:INTEGER
> PARAM d(3):INTEGER
>
> FOR cntr:=1 TO 3
> PRINT d(cntr)
> NEXT cntr
> END
>
> Results:
>
> 1
> 2
> 56 (Parameter Error)
>
> In addition, I added a fourth parameter, a second reference to a, and a
> 4th element to d. The error occurred in the same position in the array as
> before. Therefore, the accumulator that is supposed to count the parameter
> sizes is exiting before the final parameters are being processed.
Verify the differences between passing three integer values (e.g. a, b, and
c) versus passing an integer array containing three elements. I suspect
you'll find a difference there as well.
More information about the Coco
mailing list