OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of protobuf; | 5 part of protobuf; |
6 | 6 |
7 typedef GeneratedMessage CreateBuilderFunc(); | 7 typedef GeneratedMessage CreateBuilderFunc(); |
8 typedef Object MakeDefaultFunc(); | 8 typedef Object MakeDefaultFunc(); |
9 typedef ProtobufEnum ValueOfFunc(int value); | 9 typedef ProtobufEnum ValueOfFunc(int value); |
10 | 10 |
11 _inRange(min, value, max) => (min <= value) && (value <= max); | 11 _inRange(min, value, max) => (min <= value) && (value <= max); |
12 | 12 |
13 _isSigned32(int value) => _inRange(-2147483648, value, 2147483647); | 13 _isSigned32(int value) => _inRange(-2147483648, value, 2147483647); |
14 _isUnsigned32(int value) => _inRange(0, value, 4294967295); | 14 _isUnsigned32(int value) => _inRange(0, value, 4294967295); |
15 _isSigned64(ByteData value) => _isUnsigned64(value); | 15 _isSigned64(Int64 value) => _isUnsigned64(value); |
16 _isUnsigned64(ByteData value) => value is ByteData && value.lengthInBytes == 8; | 16 _isUnsigned64(Int64 value) => value is Int64; |
17 _isFloat32(double value) => value.isNaN || value.isInfinite || | 17 _isFloat32(double value) => value.isNaN || value.isInfinite || |
18 _inRange(-3.4028234663852886E38, value, 3.4028234663852886E38); | 18 _inRange(-3.4028234663852886E38, value, 3.4028234663852886E38); |
19 | 19 |
20 class GeneratedMessage { | 20 class GeneratedMessage { |
21 static const int _REQUIRED_BIT = 0x1; | 21 static const int _REQUIRED_BIT = 0x1; |
22 static const int _REPEATED_BIT = 0x2; | 22 static const int _REPEATED_BIT = 0x2; |
23 static const int _PACKED_BIT = 0x4; | 23 static const int _PACKED_BIT = 0x4; |
24 | 24 |
25 static const int _BOOL_BIT = 0x10; | 25 static const int _BOOL_BIT = 0x10; |
26 static const int _BYTES_BIT = 0x20; | 26 static const int _BYTES_BIT = 0x20; |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 static const int K6 = _PACKED_INT64; | 186 static const int K6 = _PACKED_INT64; |
187 static const int KS3 = _PACKED_SINT32; | 187 static const int KS3 = _PACKED_SINT32; |
188 static const int KS6 = _PACKED_SINT64; | 188 static const int KS6 = _PACKED_SINT64; |
189 static const int KU3 = _PACKED_UINT32; | 189 static const int KU3 = _PACKED_UINT32; |
190 static const int KU6 = _PACKED_UINT64; | 190 static const int KU6 = _PACKED_UINT64; |
191 static const int KF3 = _PACKED_FIXED32; | 191 static const int KF3 = _PACKED_FIXED32; |
192 static const int KF6 = _PACKED_FIXED64; | 192 static const int KF6 = _PACKED_FIXED64; |
193 static const int KSF3 = _PACKED_SFIXED32; | 193 static const int KSF3 = _PACKED_SFIXED32; |
194 static const int KSF6 = _PACKED_SFIXED64; | 194 static const int KSF6 = _PACKED_SFIXED64; |
195 | 195 |
| 196 // Range of integers in JSON (53-bit integers). |
| 197 static Int64 MAX_JSON_INT = new Int64.fromInts(0x200000, 0); |
| 198 static Int64 MIN_JSON_INT = -MAX_JSON_INT; |
| 199 |
196 // Closures commonly used by initializers. | 200 // Closures commonly used by initializers. |
197 static String _STRING_EMPTY() => ''; | 201 static String _STRING_EMPTY() => ''; |
198 static List<int> _BYTES_EMPTY() => new PbList<int>(); | 202 static List<int> _BYTES_EMPTY() => new PbList<int>(); |
199 static bool _BOOL_FALSE() => false; | 203 static bool _BOOL_FALSE() => false; |
200 static int _INT_ZERO() => 0; | 204 static int _INT_ZERO() => 0; |
201 static double _DOUBLE_ZERO() => 0.0; | 205 static double _DOUBLE_ZERO() => 0.0; |
202 | 206 |
203 static MakeDefaultFunc _defaultForType(int type) { | 207 static MakeDefaultFunc _defaultForType(int type) { |
204 switch (type) { | 208 switch (type) { |
205 case _OPTIONAL_BOOL: case _REQUIRED_BOOL: | 209 case _OPTIONAL_BOOL: case _REQUIRED_BOOL: |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 case _BYTES_BIT: | 618 case _BYTES_BIT: |
615 // Encode 'bytes' as a base64-encoded string. | 619 // Encode 'bytes' as a base64-encoded string. |
616 return CryptoUtils.bytesToBase64(fieldValue); | 620 return CryptoUtils.bytesToBase64(fieldValue); |
617 case _ENUM_BIT: | 621 case _ENUM_BIT: |
618 return fieldValue.value; // assume |value| < 2^52 | 622 return fieldValue.value; // assume |value| < 2^52 |
619 case _INT64_BIT: | 623 case _INT64_BIT: |
620 case _SINT64_BIT: | 624 case _SINT64_BIT: |
621 case _UINT64_BIT: | 625 case _UINT64_BIT: |
622 case _FIXED64_BIT: | 626 case _FIXED64_BIT: |
623 case _SFIXED64_BIT: | 627 case _SFIXED64_BIT: |
624 // TODO(antonm): fix for longs. | 628 // Use strings for 64-bit integers which cannot fit in doubles. |
625 final asInt = scalarType == _UINT64_BIT ? | 629 if (MIN_JSON_INT <= fieldValue && fieldValue <= MAX_JSON_INT) { |
626 fieldValue.getUint64(0, Endianness.LITTLE_ENDIAN) : | 630 return fieldValue.toInt(); |
627 fieldValue.getInt64(0, Endianness.LITTLE_ENDIAN); | 631 } else { |
628 return "$asInt"; | 632 return fieldValue.toString(); |
| 633 } |
629 case _GROUP_BIT: | 634 case _GROUP_BIT: |
630 case _MESSAGE_BIT: | 635 case _MESSAGE_BIT: |
631 return fieldValue._toMap(); | 636 return fieldValue._toMap(); |
632 default: | 637 default: |
633 throw 'Unknown type $fieldType'; | 638 throw 'Unknown type $fieldType'; |
634 } | 639 } |
635 } | 640 } |
636 | 641 |
637 var result = <String, dynamic>{}; | 642 var result = <String, dynamic>{}; |
638 for (int tagNumber in sorted(_fieldValues.keys)) { | 643 for (int tagNumber in sorted(_fieldValues.keys)) { |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 } | 735 } |
731 expectedType = 'int or stringified int'; | 736 expectedType = 'int or stringified int'; |
732 break; | 737 break; |
733 case _INT64_BIT: | 738 case _INT64_BIT: |
734 case _SINT64_BIT: | 739 case _SINT64_BIT: |
735 case _UINT64_BIT: | 740 case _UINT64_BIT: |
736 case _FIXED64_BIT: | 741 case _FIXED64_BIT: |
737 case _SFIXED64_BIT: | 742 case _SFIXED64_BIT: |
738 // Allow quoted values, although we don't emit them. | 743 // Allow quoted values, although we don't emit them. |
739 if (value is String) { | 744 if (value is String) { |
740 value = int.parse(value); | 745 return Int64.parseRadix(value, 10); |
741 } | 746 } |
742 if (value is int) { | 747 if (value is int) { |
743 const lowPart = ((1 << 31) * 2); // 2^32 which works in dart2js. | 748 return new Int64.fromInt(value); |
744 return new ByteData(8) | |
745 ..setUint32(0, value % lowPart, Endianness.LITTLE_ENDIAN) | |
746 ..setUint32(4, value ~/ lowPart, Endianness.LITTLE_ENDIAN); | |
747 } | 749 } |
748 expectedType = 'int or stringified int'; | 750 expectedType = 'int or stringified int'; |
749 break; | 751 break; |
750 case _GROUP_BIT: | 752 case _GROUP_BIT: |
751 case _MESSAGE_BIT: | 753 case _MESSAGE_BIT: |
752 if (value is Map<String, Object>) { | 754 if (value is Map<String, Object>) { |
753 GeneratedMessage subMessage = | 755 GeneratedMessage subMessage = |
754 _getEmptyMessage(tagNumber, extensionRegistry); | 756 _getEmptyMessage(tagNumber, extensionRegistry); |
755 subMessage._mergeFromJson(value, extensionRegistry); | 757 subMessage._mergeFromJson(value, extensionRegistry); |
756 return subMessage; | 758 return subMessage; |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 if (value is !int) { | 1080 if (value is !int) { |
1079 throw new ArgumentError( | 1081 throw new ArgumentError( |
1080 _generateMessage(tagNumber, value, 'not type int')); | 1082 _generateMessage(tagNumber, value, 'not type int')); |
1081 } | 1083 } |
1082 if (!_isSigned32(value)) { | 1084 if (!_isSigned32(value)) { |
1083 throw new ArgumentError(_generateMessage(tagNumber, value, | 1085 throw new ArgumentError(_generateMessage(tagNumber, value, |
1084 'out of range for int32')); | 1086 'out of range for int32')); |
1085 } | 1087 } |
1086 break; | 1088 break; |
1087 case _INT64_BIT: | 1089 case _INT64_BIT: |
1088 if (value is !ByteData) { | 1090 if (value is !Int64) { |
1089 throw new ArgumentError( | 1091 throw new ArgumentError( |
1090 _generateMessage(tagNumber, value, 'not ByteData')); | 1092 _generateMessage(tagNumber, value, 'not Int64')); |
1091 } | 1093 } |
1092 if (!_isSigned64(value)) { | 1094 if (!_isSigned64(value)) { |
1093 throw new ArgumentError(_generateMessage(tagNumber, value, | 1095 throw new ArgumentError(_generateMessage(tagNumber, value, |
1094 'out of range for int64')); | 1096 'out of range for int64')); |
1095 } | 1097 } |
1096 break; | 1098 break; |
1097 case _SINT32_BIT: | 1099 case _SINT32_BIT: |
1098 if (value is !int) { | 1100 if (value is !int) { |
1099 throw new ArgumentError( | 1101 throw new ArgumentError( |
1100 _generateMessage(tagNumber, value, 'not type int')); | 1102 _generateMessage(tagNumber, value, 'not type int')); |
1101 } | 1103 } |
1102 if (!_isSigned32(value)) { | 1104 if (!_isSigned32(value)) { |
1103 throw new ArgumentError(_generateMessage(tagNumber, value, | 1105 throw new ArgumentError(_generateMessage(tagNumber, value, |
1104 'out of range for sint32')); | 1106 'out of range for sint32')); |
1105 } | 1107 } |
1106 break; | 1108 break; |
1107 case _SINT64_BIT: | 1109 case _SINT64_BIT: |
1108 if (value is !ByteData) { | 1110 if (value is !Int64) { |
1109 throw new ArgumentError( | 1111 throw new ArgumentError( |
1110 _generateMessage(tagNumber, value, 'not ByteData')); | 1112 _generateMessage(tagNumber, value, 'not Int64')); |
1111 } | 1113 } |
1112 if (!_isSigned64(value)) { | 1114 if (!_isSigned64(value)) { |
1113 throw new ArgumentError(_generateMessage(tagNumber, value, | 1115 throw new ArgumentError(_generateMessage(tagNumber, value, |
1114 'out of range for sint64')); | 1116 'out of range for sint64')); |
1115 } | 1117 } |
1116 break; | 1118 break; |
1117 case _UINT32_BIT: | 1119 case _UINT32_BIT: |
1118 if (value is !int) { | 1120 if (value is !int) { |
1119 throw new ArgumentError( | 1121 throw new ArgumentError( |
1120 _generateMessage(tagNumber, value, 'not type int')); | 1122 _generateMessage(tagNumber, value, 'not type int')); |
1121 } | 1123 } |
1122 if (!_isUnsigned32(value)) { | 1124 if (!_isUnsigned32(value)) { |
1123 throw new ArgumentError(_generateMessage(tagNumber, value, | 1125 throw new ArgumentError(_generateMessage(tagNumber, value, |
1124 'out of range for uint32')); | 1126 'out of range for uint32')); |
1125 } | 1127 } |
1126 break; | 1128 break; |
1127 case _UINT64_BIT: | 1129 case _UINT64_BIT: |
1128 if (value is !ByteData) { | 1130 if (value is !Int64) { |
1129 throw new ArgumentError( | 1131 throw new ArgumentError( |
1130 _generateMessage(tagNumber, value, 'not ByteData')); | 1132 _generateMessage(tagNumber, value, 'not Int64')); |
1131 } | 1133 } |
1132 if (!_isUnsigned64(value)) { | 1134 if (!_isUnsigned64(value)) { |
1133 throw new ArgumentError(_generateMessage(tagNumber, value, | 1135 throw new ArgumentError(_generateMessage(tagNumber, value, |
1134 'out of range for uint64')); | 1136 'out of range for uint64')); |
1135 } | 1137 } |
1136 break; | 1138 break; |
1137 case _FIXED32_BIT: | 1139 case _FIXED32_BIT: |
1138 if (value is !int) { | 1140 if (value is !int) { |
1139 throw new ArgumentError( | 1141 throw new ArgumentError( |
1140 _generateMessage(tagNumber, value, 'not type int')); | 1142 _generateMessage(tagNumber, value, 'not type int')); |
1141 } | 1143 } |
1142 if (!_isUnsigned32(value)) { | 1144 if (!_isUnsigned32(value)) { |
1143 throw new ArgumentError(_generateMessage(tagNumber, value, | 1145 throw new ArgumentError(_generateMessage(tagNumber, value, |
1144 'out of range for fixed32')); | 1146 'out of range for fixed32')); |
1145 } | 1147 } |
1146 break; | 1148 break; |
1147 case _FIXED64_BIT: | 1149 case _FIXED64_BIT: |
1148 if (value is !ByteData) { | 1150 if (value is !Int64) { |
1149 throw new ArgumentError( | 1151 throw new ArgumentError( |
1150 _generateMessage(tagNumber, value, 'not ByteData')); | 1152 _generateMessage(tagNumber, value, 'not Int64')); |
1151 } | 1153 } |
1152 if (!_isUnsigned64(value)) { | 1154 if (!_isUnsigned64(value)) { |
1153 throw new ArgumentError(_generateMessage(tagNumber, value, | 1155 throw new ArgumentError(_generateMessage(tagNumber, value, |
1154 'out of range for fixed64')); | 1156 'out of range for fixed64')); |
1155 } | 1157 } |
1156 break; | 1158 break; |
1157 case _SFIXED32_BIT: | 1159 case _SFIXED32_BIT: |
1158 if (value is !int) { | 1160 if (value is !int) { |
1159 throw new ArgumentError( | 1161 throw new ArgumentError( |
1160 _generateMessage(tagNumber, value, 'not type int')); | 1162 _generateMessage(tagNumber, value, 'not type int')); |
1161 } | 1163 } |
1162 if (!_isSigned32(value)) { | 1164 if (!_isSigned32(value)) { |
1163 throw new ArgumentError(_generateMessage(tagNumber, value, | 1165 throw new ArgumentError(_generateMessage(tagNumber, value, |
1164 'out of range for sfixed32')); | 1166 'out of range for sfixed32')); |
1165 } | 1167 } |
1166 break; | 1168 break; |
1167 case _SFIXED64_BIT: | 1169 case _SFIXED64_BIT: |
1168 if (value is !ByteData) { | 1170 if (value is !Int64) { |
1169 throw new ArgumentError( | 1171 throw new ArgumentError( |
1170 _generateMessage(tagNumber, value, 'not ByteData')); | 1172 _generateMessage(tagNumber, value, 'not Int64')); |
1171 } | 1173 } |
1172 if (!_isSigned64(value)) { | 1174 if (!_isSigned64(value)) { |
1173 throw new ArgumentError(_generateMessage(tagNumber, value, | 1175 throw new ArgumentError(_generateMessage(tagNumber, value, |
1174 'out of range for sfixed64')); | 1176 'out of range for sfixed64')); |
1175 } | 1177 } |
1176 break; | 1178 break; |
1177 case _GROUP_BIT: | 1179 case _GROUP_BIT: |
1178 case _MESSAGE_BIT: | 1180 case _MESSAGE_BIT: |
1179 if (value is !GeneratedMessage) { | 1181 if (value is !GeneratedMessage) { |
1180 throw new ArgumentError( | 1182 throw new ArgumentError( |
1181 _generateMessage(tagNumber, value, 'not a GeneratedMessage')); | 1183 _generateMessage(tagNumber, value, 'not a GeneratedMessage')); |
1182 } | 1184 } |
1183 break; | 1185 break; |
1184 default: | 1186 default: |
1185 throw new ArgumentError( | 1187 throw new ArgumentError( |
1186 _generateMessage(tagNumber, value, 'field has unknown type ' | 1188 _generateMessage(tagNumber, value, 'field has unknown type ' |
1187 '$fieldType')); | 1189 '$fieldType')); |
1188 } | 1190 } |
1189 } | 1191 } |
1190 } | 1192 } |
OLD | NEW |