Skip to content

Commit 4ec984a

Browse files
authored
Replace FlatBuffers fork with upstream 2.0.5 (#349)
* refactor: replace flatbuffers fork with 2.0.5 * perf: use the new optimized FB binary-list readers * fix: perf regression after fb 2.0.5 update * fix: generate code for non-null-safe apps
1 parent 7667252 commit 4ec984a

File tree

8 files changed

+49
-1717
lines changed

8 files changed

+49
-1717
lines changed

generator/lib/src/code_chunks.dart

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,37 @@ class CodeChunks {
1010
ModelInfo model, List<String> imports, Pubspec? pubspec) =>
1111
"""
1212
// GENERATED CODE - DO NOT MODIFY BY HAND
13-
13+
1414
// ignore_for_file: camel_case_types
15-
15+
1616
import 'dart:typed_data';
17-
18-
import 'package:objectbox/flatbuffers/flat_buffers.dart' as fb;
17+
18+
import 'package:flat_buffers/flat_buffers.dart' as fb;
1919
import 'package:objectbox/internal.dart'; // generated code can access "internal" functionality
2020
import 'package:objectbox/objectbox.dart';${pubspec?.obxFlutterImport}
21-
21+
2222
import '${sorted(imports).join("';\n import '")}';
23-
23+
2424
export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file
25-
25+
2626
final _entities = <ModelEntity>[
2727
${model.entities.map(createModelEntity).join(',')}
2828
];
29-
29+
3030
/// Open an ObjectBox store with the model declared in this file.
3131
${openStore(model, pubspec)}
32-
33-
/// ObjectBox model definition, pass it to [Store] - Store(getObjectBoxModel())
32+
33+
/// ObjectBox model definition, pass it to [Store] - Store(getObjectBoxModel())
3434
ModelDefinition getObjectBoxModel() {
3535
${defineModel(model)}
36-
36+
3737
final bindings = <Type, EntityDefinition>{
3838
${model.entities.mapIndexed((i, entity) => "${entity.name}: ${entityBinding(i, entity)}").join(",\n")}
3939
};
40-
40+
4141
return ModelDefinition(model, bindings);
4242
}
43-
43+
4444
${model.entities.mapIndexed(_metaClass).join("\n")}
4545
""";
4646

@@ -94,16 +94,16 @@ class CodeChunks {
9494
static String createModelEntity(ModelEntity entity) {
9595
return '''
9696
ModelEntity(
97-
id: ${createIdUid(entity.id)},
98-
name: '${entity.name}',
99-
lastPropertyId: ${createIdUid(entity.lastPropertyId)},
100-
flags: ${entity.flags},
97+
id: ${createIdUid(entity.id)},
98+
name: '${entity.name}',
99+
lastPropertyId: ${createIdUid(entity.lastPropertyId)},
100+
flags: ${entity.flags},
101101
properties: <ModelProperty>[
102102
${entity.properties.map(createModelProperty).join(',')}
103-
],
103+
],
104104
relations: <ModelRelation>[
105105
${entity.relations.map(createModelRelation).join(',')}
106-
],
106+
],
107107
backlinks: <ModelBacklink>[
108108
${entity.backlinks.map(createModelBacklink).join(',')}
109109
]
@@ -122,9 +122,9 @@ class CodeChunks {
122122
}
123123
return '''
124124
ModelProperty(
125-
id: ${createIdUid(property.id)},
126-
name: '${property.name}',
127-
type: ${property.type},
125+
id: ${createIdUid(property.id)},
126+
name: '${property.name}',
127+
type: ${property.type},
128128
flags: ${property.flags}
129129
$additionalArgs
130130
)
@@ -134,8 +134,8 @@ class CodeChunks {
134134
static String createModelRelation(ModelRelation relation) {
135135
return '''
136136
ModelRelation(
137-
id: ${createIdUid(relation.id)},
138-
name: '${relation.name}',
137+
id: ${createIdUid(relation.id)},
138+
name: '${relation.name}',
139139
targetId: ${createIdUid(relation.targetId)}
140140
)
141141
''';
@@ -144,8 +144,8 @@ class CodeChunks {
144144
static String createModelBacklink(ModelBacklink backlink) {
145145
return '''
146146
ModelBacklink(
147-
name: '${backlink.name}',
148-
srcEntity: '${backlink.srcEntity}',
147+
name: '${backlink.name}',
148+
srcEntity: '${backlink.srcEntity}',
149149
srcField: '${backlink.srcField}'
150150
)
151151
''';
@@ -187,9 +187,9 @@ class CodeChunks {
187187
// Such ID must already be set, i.e. it could not have been assigned.
188188
return '''{
189189
if (object.${propertyFieldName(entity.idProperty)} != id) {
190-
throw ArgumentError('Field ${entity.name}.${propertyFieldName(entity.idProperty)} is read-only '
190+
throw ArgumentError('Field ${entity.name}.${propertyFieldName(entity.idProperty)} is read-only '
191191
'(final or getter-only) and it was declared to be self-assigned. '
192-
'However, the currently inserted object (.${propertyFieldName(entity.idProperty)}=\${object.${propertyFieldName(entity.idProperty)}}) '
192+
'However, the currently inserted object (.${propertyFieldName(entity.idProperty)}=\${object.${propertyFieldName(entity.idProperty)}}) '
193193
"doesn't match the inserted ID (ID \$id). "
194194
'You must assign an ID before calling [box.put()].');
195195
}
@@ -207,6 +207,10 @@ class CodeChunks {
207207
return "''";
208208
case 'List':
209209
return '[]';
210+
case 'Int8List':
211+
return 'Int8List(0)';
212+
case 'Uint8List':
213+
return 'Uint8List(0)';
210214
default:
211215
throw InvalidGenerationSourceError(
212216
'Cannot figure out default value for field: ${p.fieldType} ${p.name}');
@@ -331,24 +335,25 @@ class CodeChunks {
331335
switch (p.type) {
332336
case OBXPropertyType.ByteVector:
333337
if (['Int8List', 'Uint8List'].contains(p.fieldType)) {
334-
// No need for the eager reader here. We need to call fromList()
335-
// constructor anyway - there's no Int8List.generate() factory.
336-
fbReader = 'fb.ListReader<int>(fb.Int8Reader())';
337-
if (p.fieldIsNullable) {
338-
preLines.add('final $valueVar = ${readFieldOrNull()};');
339-
return '$valueVar == null ? null : ${p.fieldType}.fromList($valueVar)';
340-
} else {
341-
return '${p.fieldType}.fromList(${readFieldNonNull('[]')})';
342-
}
338+
fbReader = 'fb.${p.fieldType}Reader(lazy: false)';
339+
return '${readField()} as ${p.fieldType}${p.fieldIsNullable && p.entity!.nullSafetyEnabled ? "?" : ""}';
343340
} else {
344341
fbReader = 'fb.ListReader<int>(fb.Int8Reader(), lazy: false)';
345342
}
346343
break;
347344
case OBXPropertyType.Relation:
348345
fbReader = 'fb.${_propertyFlatBuffersType[p.type]}Reader()';
349346
return readFieldNonNull('0');
347+
case OBXPropertyType.String:
348+
// TODO `asciiOptimization: true` is for keeping the same behavior as the previous FB fork.
349+
// Check if it still makes sense with the latest Dart/Flutter.
350+
fbReader = 'fb.StringReader(asciiOptimization: true)';
351+
break;
350352
case OBXPropertyType.StringVector:
351-
fbReader = 'fb.ListReader<String>(fb.StringReader(), lazy: false)';
353+
// TODO `asciiOptimization: true` is for keeping the same behavior as the previous FB fork.
354+
// Check if it still makes sense with the latest Dart/Flutter.
355+
fbReader =
356+
'fb.ListReader<String>(fb.StringReader(asciiOptimization: true), lazy: false)';
352357
break;
353358
default:
354359
fbReader = 'fb.${_propertyFlatBuffersType[p.type]}Reader()';
@@ -607,7 +612,7 @@ class CodeChunks {
607612
}
608613

609614
return '''
610-
/// [${entity.name}] entity fields to define ObjectBox queries.
615+
/// [${entity.name}] entity fields to define ObjectBox queries.
611616
class ${entity.name}_ {${fields.join()}}
612617
''';
613618
}

0 commit comments

Comments
 (0)