Index: lib/generated_message.dart |
diff --git a/lib/generated_message.dart b/lib/generated_message.dart |
index 45c4ef968114c86c0c98f0e5d75b6074ca7b9889..2e36bcb042d5a01a6ea67da341652c0923736380 100644 |
--- a/lib/generated_message.dart |
+++ b/lib/generated_message.dart |
@@ -12,8 +12,8 @@ _inRange(min, value, max) => (min <= value) && (value <= max); |
_isSigned32(int value) => _inRange(-2147483648, value, 2147483647); |
_isUnsigned32(int value) => _inRange(0, value, 4294967295); |
-_isSigned64(ByteData value) => _isUnsigned64(value); |
-_isUnsigned64(ByteData value) => value is ByteData && value.lengthInBytes == 8; |
+_isSigned64(Int64 value) => _isUnsigned64(value); |
+_isUnsigned64(Int64 value) => value is Int64; |
_isFloat32(double value) => value.isNaN || value.isInfinite || |
_inRange(-3.4028234663852886E38, value, 3.4028234663852886E38); |
@@ -193,6 +193,10 @@ class GeneratedMessage { |
static const int KSF3 = _PACKED_SFIXED32; |
static const int KSF6 = _PACKED_SFIXED64; |
+ // Range of integers in JSON (53-bit integers). |
+ static Int64 MAX_JSON_INT = new Int64.fromInts(0x200000, 0); |
+ static Int64 MIN_JSON_INT = -MAX_JSON_INT; |
+ |
// Closures commonly used by initializers. |
static String _STRING_EMPTY() => ''; |
static List<int> _BYTES_EMPTY() => new PbList<int>(); |
@@ -621,11 +625,12 @@ class GeneratedMessage { |
case _UINT64_BIT: |
case _FIXED64_BIT: |
case _SFIXED64_BIT: |
- // TODO(antonm): fix for longs. |
- final asInt = scalarType == _UINT64_BIT ? |
- fieldValue.getUint64(0, Endianness.LITTLE_ENDIAN) : |
- fieldValue.getInt64(0, Endianness.LITTLE_ENDIAN); |
- return "$asInt"; |
+ // Use strings for 64-bit integers which cannot fit in doubles. |
+ if (MIN_JSON_INT <= fieldValue && fieldValue <= MAX_JSON_INT) { |
+ return fieldValue.toInt(); |
+ } else { |
+ return fieldValue.toString(); |
+ } |
case _GROUP_BIT: |
case _MESSAGE_BIT: |
return fieldValue._toMap(); |
@@ -737,13 +742,10 @@ class GeneratedMessage { |
case _SFIXED64_BIT: |
// Allow quoted values, although we don't emit them. |
if (value is String) { |
- value = int.parse(value); |
+ return Int64.parseRadix(value, 10); |
} |
if (value is int) { |
- const lowPart = ((1 << 31) * 2); // 2^32 which works in dart2js. |
- return new ByteData(8) |
- ..setUint32(0, value % lowPart, Endianness.LITTLE_ENDIAN) |
- ..setUint32(4, value ~/ lowPart, Endianness.LITTLE_ENDIAN); |
+ return new Int64.fromInt(value); |
} |
expectedType = 'int or stringified int'; |
break; |
@@ -1085,9 +1087,9 @@ class GeneratedMessage { |
} |
break; |
case _INT64_BIT: |
- if (value is !ByteData) { |
+ if (value is !Int64) { |
throw new ArgumentError( |
- _generateMessage(tagNumber, value, 'not ByteData')); |
+ _generateMessage(tagNumber, value, 'not Int64')); |
} |
if (!_isSigned64(value)) { |
throw new ArgumentError(_generateMessage(tagNumber, value, |
@@ -1105,9 +1107,9 @@ class GeneratedMessage { |
} |
break; |
case _SINT64_BIT: |
- if (value is !ByteData) { |
+ if (value is !Int64) { |
throw new ArgumentError( |
- _generateMessage(tagNumber, value, 'not ByteData')); |
+ _generateMessage(tagNumber, value, 'not Int64')); |
} |
if (!_isSigned64(value)) { |
throw new ArgumentError(_generateMessage(tagNumber, value, |
@@ -1125,9 +1127,9 @@ class GeneratedMessage { |
} |
break; |
case _UINT64_BIT: |
- if (value is !ByteData) { |
+ if (value is !Int64) { |
throw new ArgumentError( |
- _generateMessage(tagNumber, value, 'not ByteData')); |
+ _generateMessage(tagNumber, value, 'not Int64')); |
} |
if (!_isUnsigned64(value)) { |
throw new ArgumentError(_generateMessage(tagNumber, value, |
@@ -1145,9 +1147,9 @@ class GeneratedMessage { |
} |
break; |
case _FIXED64_BIT: |
- if (value is !ByteData) { |
+ if (value is !Int64) { |
throw new ArgumentError( |
- _generateMessage(tagNumber, value, 'not ByteData')); |
+ _generateMessage(tagNumber, value, 'not Int64')); |
} |
if (!_isUnsigned64(value)) { |
throw new ArgumentError(_generateMessage(tagNumber, value, |
@@ -1165,9 +1167,9 @@ class GeneratedMessage { |
} |
break; |
case _SFIXED64_BIT: |
- if (value is !ByteData) { |
+ if (value is !Int64) { |
throw new ArgumentError( |
- _generateMessage(tagNumber, value, 'not ByteData')); |
+ _generateMessage(tagNumber, value, 'not Int64')); |
} |
if (!_isSigned64(value)) { |
throw new ArgumentError(_generateMessage(tagNumber, value, |