google / google/protobuf.dart

Avoid unnecessary runtime type checks in the protobuf code

Open
#575 0 comments 0 reactions 0 assignees View on GitHub
perf
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.