diff --git a/dart/packages/fory/lib/src/buffer.dart b/dart/packages/fory/lib/src/buffer.dart index 94f92ca912..dc7af67cc7 100644 --- a/dart/packages/fory/lib/src/buffer.dart +++ b/dart/packages/fory/lib/src/buffer.dart @@ -421,7 +421,7 @@ final class Buffer { /// Reads an unsigned 64-bit integer written by [writeTaggedUint64]. int readTaggedUint64() { final readIndex = _readerIndex; - final first = _view.getInt32(readIndex, Endian.little); + final first = _view.getUint32(readIndex, Endian.little); if ((first & 1) == 0) { _readerIndex = readIndex + 4; return first >>> 1; diff --git a/dart/packages/fory/lib/src/codegen/generated_support.dart b/dart/packages/fory/lib/src/codegen/generated_support.dart index 838b63c3c0..d1b0f405fc 100644 --- a/dart/packages/fory/lib/src/codegen/generated_support.dart +++ b/dart/packages/fory/lib/src/codegen/generated_support.dart @@ -364,7 +364,7 @@ final class GeneratedReadCursor { int readTaggedUint64() { final readIndex = _offset; - final first = _view.getInt32(readIndex, Endian.little); + final first = _view.getUint32(readIndex, Endian.little); if ((first & 1) == 0) { _offset = readIndex + 4; return first >>> 1; diff --git a/dart/packages/fory/test/buffer_test.dart b/dart/packages/fory/test/buffer_test.dart index a371d72325..762b3a9059 100644 --- a/dart/packages/fory/test/buffer_test.dart +++ b/dart/packages/fory/test/buffer_test.dart @@ -18,6 +18,7 @@ */ import 'package:fory/fory.dart'; +import 'package:fory/src/codegen/generated_support.dart'; import 'package:test/test.dart'; void main() { @@ -46,5 +47,30 @@ void main() { expect(buffer.readVarInt64(), equals(-17)); expect(buffer.readVarUint64(), equals(9000)); }); + + test('tagged uint64 sign extension regression', () { + final buffer = Buffer(); + final testValue = 0x7FFFFFFF; + + buffer.writeTaggedUint64(testValue); + buffer.wrap(buffer.toBytes()); + + final result = buffer.readTaggedUint64(); + + expect(result, equals(testValue)); + }); + + test('GeneratedReadCursor tagged uint64 sign extension regression', () { + final buffer = Buffer(); + final testValue = 0x7FFFFFFF; + + buffer.writeTaggedUint64(testValue); + buffer.wrap(buffer.toBytes()); + + final cursor = GeneratedReadCursor.start(buffer); + final result = cursor.readTaggedUint64(); + + expect(result, equals(testValue)); + }); }); }