Avoid unnecessary runtime type checks in the protobuf code
- Dominant language
- Dart
- Stars
- 572
- Forks
- 196
- Avg merge
- 1h 59m
- Merged PRs (30d)
- 2
Description
The protobuf library code that adds fields to the metadata looks like:
```dart
class BuilderInfo {
...
void aOM(..., {T Function()? subBuilder, ...}) {
add(
...
GeneratedMessage._defaultMakerFor(subBuilder),
...
}
...
void add(..., dynamic defaultOrMaker, ...) {
...
FieldInfo(..., defaultOrMaker: defaultOrMaker, ...);
...
}
}
```
Notice that we loose the function type `T Function()?` of `subBuilder` by assigning it to `dynamic` in `add` and `FieldInfo`.
The constructor of `FieldInfo` then looks like this:
```dart
typedef MakeDefaultFunc = Function();
class FieldInfo {
...
final MakeDefaultFunc makeDefault;
...
FieldInfo(..., {dynamic defaultOrMaker, ...})
: makeDefault = findMakeDefault(type, defaultOrMaker), ...;
static MakeDefaultFunc? findMakeDefault(int type, dynamic defaultOrMaker) {
if (defaultOrMaker == null) return PbFieldType._defaultForType(type);
if (defaultOrMaker is MakeDefaultFunc) return defaultOrMaker;
return () => defaultOrMaker;
}
}
```
So now we do runtime type tests to recover the fact that `defaultOrMaker` is a `T Function()`.
This could be avoided by having different `FieldInfo` constructors one for the typed function and one for a default value.
Contributor guide
Assessment
This issue has not been assessed yet.