mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-16 00:11:28 +00:00
Fix increment/decrement not wrapping small ints in simplified case, see #26
This commit is contained in:
@ -1,47 +1,130 @@
|
||||
// see also: https://github.com/AssemblyScript/assemblyscript/issues/26
|
||||
// becomes simplified: val++
|
||||
// uses a temp. local: ctx = val++
|
||||
|
||||
var badByte: u8 = 0xFF;
|
||||
badByte += 1;
|
||||
assert(badByte == 0);
|
||||
// i8
|
||||
{
|
||||
let val: i8 = 127;
|
||||
let ctx: i8;
|
||||
|
||||
var anotherBadByte: u8 = 0xFF;
|
||||
var badIncrementer: u8 = 1;
|
||||
anotherBadByte += badIncrementer;
|
||||
assert(anotherBadByte == 0);
|
||||
val++;
|
||||
assert(val == -128);
|
||||
|
||||
function local(): void {
|
||||
var badByte: u8 = 0xFF;
|
||||
badByte += 1;
|
||||
assert(badByte == 0);
|
||||
val--;
|
||||
assert(val == 127);
|
||||
|
||||
var anotherBadByte: u8 = 0xFF;
|
||||
var badIncrementer: u8 = 1;
|
||||
anotherBadByte += badIncrementer;
|
||||
assert(anotherBadByte == 0);
|
||||
ctx = val++;
|
||||
assert(val == -128);
|
||||
|
||||
ctx = val--;
|
||||
assert(val == 127);
|
||||
|
||||
++val;
|
||||
assert(val == -128);
|
||||
|
||||
--val;
|
||||
assert(val == 127);
|
||||
|
||||
ctx = ++val;
|
||||
assert(val == -128);
|
||||
|
||||
ctx = --val;
|
||||
assert(val == 127);
|
||||
|
||||
assert(val + 1 == -128);
|
||||
}
|
||||
|
||||
local();
|
||||
// i16
|
||||
{
|
||||
let val: i16 = 32767;
|
||||
let ctx: i16;
|
||||
|
||||
function loadU8FF(): u8 {
|
||||
store<u8>(0, 0xff);
|
||||
return load<u8>(0);
|
||||
val++;
|
||||
assert(val == -32768);
|
||||
|
||||
val--;
|
||||
assert(val == 32767);
|
||||
|
||||
ctx = val++;
|
||||
assert(val == -32768);
|
||||
|
||||
ctx = val--;
|
||||
assert(val == 32767);
|
||||
|
||||
++val;
|
||||
assert(val == -32768);
|
||||
|
||||
--val;
|
||||
assert(val == 32767);
|
||||
|
||||
ctx = ++val;
|
||||
assert(val == -32768);
|
||||
|
||||
ctx = --val;
|
||||
assert(val == 32767);
|
||||
|
||||
assert(val + 1 == -32768);
|
||||
}
|
||||
|
||||
var valueU8: u8 = loadU8FF();
|
||||
valueU8 += 1;
|
||||
assert(valueU8 == 0);
|
||||
// u8
|
||||
{
|
||||
let val: u8 = 0;
|
||||
let ctx: u8;
|
||||
|
||||
function storeU8FFadd1(val: u8): void {
|
||||
store<u8>(0, val);
|
||||
assert(load<u8>(0) == 0);
|
||||
val--;
|
||||
assert(val == 0xff);
|
||||
|
||||
val++;
|
||||
assert(val == 0);
|
||||
|
||||
ctx = val--;
|
||||
assert(val == 0xff);
|
||||
|
||||
ctx = val++;
|
||||
assert(val == 0);
|
||||
|
||||
--val;
|
||||
assert(val == 0xff);
|
||||
|
||||
++val;
|
||||
assert(val == 0);
|
||||
|
||||
ctx = --val;
|
||||
assert(val == 0xff);
|
||||
|
||||
ctx = ++val;
|
||||
assert(val == 0);
|
||||
|
||||
assert(val - 1 == 0xff);
|
||||
}
|
||||
|
||||
valueU8 = 0xFF;
|
||||
storeU8FFadd1(valueU8 + 1);
|
||||
// u16
|
||||
{
|
||||
let val: u16 = 0;
|
||||
let ctx: u16;
|
||||
|
||||
store<u8>(0, valueU8 + 1);
|
||||
assert(load<u8>(0) == 0);
|
||||
val--;
|
||||
assert(val == 0xffff);
|
||||
|
||||
store<u8>(0, ++valueU8);
|
||||
assert(load<u8>(0) == 0);
|
||||
assert(valueU8 == 0);
|
||||
val++;
|
||||
assert(val == 0);
|
||||
|
||||
ctx = val--;
|
||||
assert(val == 0xffff);
|
||||
|
||||
ctx = val++;
|
||||
assert(val == 0);
|
||||
|
||||
--val;
|
||||
assert(val == 0xffff);
|
||||
|
||||
++val;
|
||||
assert(val == 0);
|
||||
|
||||
ctx = --val;
|
||||
assert(val == 0xffff);
|
||||
|
||||
ctx = ++val;
|
||||
assert(val == 0);
|
||||
|
||||
assert(val - 1 == 0xffff);
|
||||
}
|
||||
|
Reference in New Issue
Block a user