Skip to content

Commit 4717017

Browse files
committed
refactor dart int64 write/read
1 parent 2301028 commit 4717017

28 files changed

Lines changed: 1491 additions & 752 deletions

dart/packages/fory/lib/fory.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export 'src/annotation/fory_struct.dart';
3030
export 'src/annotation/fory_union.dart';
3131
export 'src/annotation/type_spec.dart';
3232
export 'src/annotation/numeric_types.dart';
33-
export 'src/buffer.dart'
33+
export 'src/memory/buffer.dart'
3434
hide
3535
bufferByteData,
3636
bufferBytes,

dart/packages/fory/lib/src/codegen/fory_generator.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,10 +1234,19 @@ GeneratedFieldType(
12341234
case TypeIds.varInt32:
12351235
return 'buffer.writeVarInt32(${_directGeneratedScalarExpression(field, valueExpression)})';
12361236
case TypeIds.int64:
1237+
if (field.type.isDartCoreInt) {
1238+
return 'buffer.writeInt64FromInt($valueExpression)';
1239+
}
12371240
return 'buffer.writeInt64(${_directGeneratedScalarExpression(field, valueExpression)})';
12381241
case TypeIds.varInt64:
1242+
if (field.type.isDartCoreInt) {
1243+
return 'buffer.writeVarInt64FromInt($valueExpression)';
1244+
}
12391245
return 'buffer.writeVarInt64(${_directGeneratedScalarExpression(field, valueExpression)})';
12401246
case TypeIds.taggedInt64:
1247+
if (field.type.isDartCoreInt) {
1248+
return 'buffer.writeTaggedInt64FromInt($valueExpression)';
1249+
}
12411250
return 'buffer.writeTaggedInt64(${_directGeneratedScalarExpression(field, valueExpression)})';
12421251
case TypeIds.uint8:
12431252
return 'buffer.writeUint8(${_directGeneratedScalarExpression(field, valueExpression)})';
@@ -1400,15 +1409,15 @@ GeneratedFieldType(
14001409
: 'Int32(buffer.readVarInt32())';
14011410
case TypeIds.int64:
14021411
return field.type.isDartCoreInt
1403-
? 'buffer.readInt64().toInt()'
1412+
? 'buffer.readInt64AsInt()'
14041413
: 'buffer.readInt64()';
14051414
case TypeIds.varInt64:
14061415
return field.type.isDartCoreInt
1407-
? 'buffer.readVarInt64().toInt()'
1416+
? 'buffer.readVarInt64AsInt()'
14081417
: 'buffer.readVarInt64()';
14091418
case TypeIds.taggedInt64:
14101419
return field.type.isDartCoreInt
1411-
? 'buffer.readTaggedInt64().toInt()'
1420+
? 'buffer.readTaggedInt64AsInt()'
14121421
: 'buffer.readTaggedInt64()';
14131422
case TypeIds.uint8:
14141423
return field.type.isDartCoreInt

dart/packages/fory/lib/src/util/int64_platform.dart renamed to dart/packages/fory/lib/src/codegen/generated_cursor.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@
1717
* under the License.
1818
*/
1919

20-
export 'int64_platform_native.dart'
21-
if (dart.library.js_interop) 'int64_platform_web.dart';
20+
export 'generated_cursor_native.dart'
21+
if (dart.library.js_interop) 'generated_cursor_web.dart';
Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
// ignore_for_file: use_string_in_part_of_directives
21+
22+
part of fory.src.codegen.generated_cursor;
23+
24+
mixin _GeneratedWriteCursorMixin {
25+
late final Buffer _buffer;
26+
late final Uint8List _bytes;
27+
late final ByteData _view;
28+
int _offset = 0;
29+
30+
void _initWriteCursor(Buffer buffer, int maxBytes) {
31+
final start = bufferReserveBytes(buffer, maxBytes);
32+
_buffer = buffer;
33+
_bytes = bufferBytes(buffer);
34+
_view = bufferByteData(buffer);
35+
_offset = start;
36+
}
37+
38+
void finish() {
39+
bufferSetWriterIndex(_buffer, _offset);
40+
}
41+
42+
@pragma('vm:prefer-inline')
43+
void writeBool(bool value) {
44+
_bytes[_offset] = value ? 1 : 0;
45+
_offset += 1;
46+
}
47+
48+
@pragma('vm:prefer-inline')
49+
void writeByte(int value) {
50+
_view.setInt8(_offset, value);
51+
_offset += 1;
52+
}
53+
54+
@pragma('vm:prefer-inline')
55+
void writeUint8(int value) {
56+
_view.setUint8(_offset, value);
57+
_offset += 1;
58+
}
59+
60+
@pragma('vm:prefer-inline')
61+
void writeInt16(int value) {
62+
_view.setInt16(_offset, value, Endian.little);
63+
_offset += 2;
64+
}
65+
66+
@pragma('vm:prefer-inline')
67+
void writeUint16(int value) {
68+
_view.setUint16(_offset, value, Endian.little);
69+
_offset += 2;
70+
}
71+
72+
@pragma('vm:prefer-inline')
73+
void writeInt32(int value) {
74+
_view.setInt32(_offset, value, Endian.little);
75+
_offset += 4;
76+
}
77+
78+
@pragma('vm:prefer-inline')
79+
void writeUint32(int value) {
80+
_view.setUint32(_offset, value, Endian.little);
81+
_offset += 4;
82+
}
83+
84+
@pragma('vm:prefer-inline')
85+
void writeFloat16(Float16 value) {
86+
writeUint16(value.toBits());
87+
}
88+
89+
@pragma('vm:prefer-inline')
90+
void writeBfloat16(Bfloat16 value) {
91+
writeUint16(value.toBits());
92+
}
93+
94+
@pragma('vm:prefer-inline')
95+
void writeFloat32(double value) {
96+
_view.setFloat32(_offset, value, Endian.little);
97+
_offset += 4;
98+
}
99+
100+
@pragma('vm:prefer-inline')
101+
void writeFloat64(double value) {
102+
_view.setFloat64(_offset, value, Endian.little);
103+
_offset += 8;
104+
}
105+
106+
@pragma('vm:prefer-inline')
107+
void writeVarUint32(int value) {
108+
var remaining = value;
109+
while (remaining >= 0x80) {
110+
_bytes[_offset] = (remaining & 0x7f) | 0x80;
111+
_offset += 1;
112+
remaining >>>= 7;
113+
}
114+
_bytes[_offset] = remaining;
115+
_offset += 1;
116+
}
117+
118+
@pragma('vm:prefer-inline')
119+
void writeVarInt32(int value) {
120+
writeVarUint32(((value << 1) ^ (value >> 31)).toUnsigned(32));
121+
}
122+
123+
void writeVarUint64(Uint64 value);
124+
}
125+
126+
mixin _GeneratedReadCursorMixin {
127+
late final Buffer _buffer;
128+
late final ByteData _view;
129+
int _offset = 0;
130+
131+
void _initReadCursor(Buffer buffer) {
132+
_buffer = buffer;
133+
_view = bufferByteData(buffer);
134+
_offset = bufferReaderIndex(buffer);
135+
}
136+
137+
void finish() {
138+
bufferSetReaderIndex(_buffer, _offset);
139+
}
140+
141+
@pragma('vm:prefer-inline')
142+
bool readBool() => readUint8() != 0;
143+
144+
@pragma('vm:prefer-inline')
145+
int readByte() {
146+
final value = _view.getInt8(_offset);
147+
_offset += 1;
148+
return value;
149+
}
150+
151+
@pragma('vm:prefer-inline')
152+
int readUint8() {
153+
final value = _view.getUint8(_offset);
154+
_offset += 1;
155+
return value;
156+
}
157+
158+
@pragma('vm:prefer-inline')
159+
int readInt16() {
160+
final value = _view.getInt16(_offset, Endian.little);
161+
_offset += 2;
162+
return value;
163+
}
164+
165+
@pragma('vm:prefer-inline')
166+
int readUint16() {
167+
final value = _view.getUint16(_offset, Endian.little);
168+
_offset += 2;
169+
return value;
170+
}
171+
172+
@pragma('vm:prefer-inline')
173+
int readInt32() {
174+
final value = _view.getInt32(_offset, Endian.little);
175+
_offset += 4;
176+
return value;
177+
}
178+
179+
@pragma('vm:prefer-inline')
180+
int readUint32() {
181+
final value = _view.getUint32(_offset, Endian.little);
182+
_offset += 4;
183+
return value;
184+
}
185+
186+
@pragma('vm:prefer-inline')
187+
Float16 readFloat16() => Float16.fromBits(readUint16());
188+
189+
@pragma('vm:prefer-inline')
190+
Bfloat16 readBfloat16() => Bfloat16.fromBits(readUint16());
191+
192+
@pragma('vm:prefer-inline')
193+
double readFloat32() {
194+
final value = _view.getFloat32(_offset, Endian.little);
195+
_offset += 4;
196+
return value;
197+
}
198+
199+
@pragma('vm:prefer-inline')
200+
double readFloat64() {
201+
final value = _view.getFloat64(_offset, Endian.little);
202+
_offset += 8;
203+
return value;
204+
}
205+
206+
@pragma('vm:prefer-inline')
207+
int readVarUint32() {
208+
var shift = 0;
209+
var result = 0;
210+
while (true) {
211+
final byte = readUint8();
212+
result |= (byte & 0x7f) << shift;
213+
if ((byte & 0x80) == 0) {
214+
return result;
215+
}
216+
shift += 7;
217+
}
218+
}
219+
220+
@pragma('vm:prefer-inline')
221+
int readVarInt32() {
222+
final value = readVarUint32();
223+
return ((value >>> 1) ^ -(value & 1)).toSigned(32);
224+
}
225+
226+
Uint64 readVarUint64();
227+
}

0 commit comments

Comments
 (0)