diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fa0acf2118..ca4b79c45e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -999,6 +999,10 @@ jobs: run: | cd dart/packages/fory-test dart test + - name: Run tests (Chrome) + run: | + cd dart/packages/fory + dart test -p chrome - name: Run code analysis run: | cd dart/packages/fory-test diff --git a/dart/packages/fory/lib/src/buffer.dart b/dart/packages/fory/lib/src/buffer.dart index ee1cdb49a7..03a33433de 100644 --- a/dart/packages/fory/lib/src/buffer.dart +++ b/dart/packages/fory/lib/src/buffer.dart @@ -370,7 +370,7 @@ final class Buffer { return; } final signed = BigInt.from(value); - final zigZag = ((signed << 1) ^ BigInt.from(value >> 63)) & _mask64Big; + final zigZag = ((signed << 1) ^ (signed >> 63)) & _mask64Big; _writeVarUint64BigInt(zigZag); } diff --git a/dart/packages/fory/lib/src/codegen/generated_support.dart b/dart/packages/fory/lib/src/codegen/generated_support.dart index 7fbc1de1bb..b1988ccb41 100644 --- a/dart/packages/fory/lib/src/codegen/generated_support.dart +++ b/dart/packages/fory/lib/src/codegen/generated_support.dart @@ -178,7 +178,7 @@ final class GeneratedWriteCursor { } final signed = BigInt.from(value); final zigZag = - ((signed << 1) ^ BigInt.from(value >> 63)) & _generatedCursorMask64Big; + ((signed << 1) ^ (signed >> 63)) & _generatedCursorMask64Big; _writeVarUint64BigInt(zigZag); } diff --git a/dart/packages/fory/test/buffer_test.dart b/dart/packages/fory/test/buffer_test.dart index 4c972e5a9b..0927c333d5 100644 --- a/dart/packages/fory/test/buffer_test.dart +++ b/dart/packages/fory/test/buffer_test.dart @@ -263,6 +263,31 @@ void main() { } }); + test('varint64 round-trips positive values >= 2^31 (web zig-zag regression)', () { + const cases = [ + 2147483648, // 2^31 — first value that triggers 32-bit sign confusion + 3000000000, + 4294967295, // 2^32 - 1 + 0x200000000, // 2^33 + 1 << 34, + 1 << 42, + 1 << 50, + 0x7fffffffffffffff, // i64::MAX + ]; + for (final value in cases) { + final buffer = Buffer(); + buffer.writeVarInt64(value); + final readBuffer = Buffer.wrap(buffer.toBytes()); + final decoded = readBuffer.readVarInt64(); + expect( + decoded, + equals(value), + reason: 'writeVarInt64($value) round-tripped to $decoded', + ); + } + }, + ); + test('round-trips tagged int64 boundary values with Java-aligned lengths', () { const cases = <({int bytes, int value})>[