Add specialized classes for ZoneFunction<Function> to handle generics.
Type arguments cannot be generic functions, so we add specialized
classes for each generic function type we need to make ZoneFunctions for.
Fixes #41253.
BUG= http://dartbug.com/41253
Change-Id: Idf84f04576465ea9e5ea749ece4a7d843a037e46
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141884
Commit-Queue: Lasse R.H. Nielsen <lrn@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index fa77273..e200ad0 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -70,6 +70,42 @@
const _ZoneFunction(this.zone, this.function);
}
+class _RunNullaryZoneFunction {
+ final _Zone zone;
+ final RunHandler function;
+ const _RunNullaryZoneFunction(this.zone, this.function);
+}
+
+class _RunUnaryZoneFunction {
+ final _Zone zone;
+ final RunUnaryHandler function;
+ const _RunUnaryZoneFunction(this.zone, this.function);
+}
+
+class _RunBinaryZoneFunction {
+ final _Zone zone;
+ final RunBinaryHandler function;
+ const _RunBinaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterNullaryZoneFunction {
+ final _Zone zone;
+ final RegisterCallbackHandler function;
+ const _RegisterNullaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterUnaryZoneFunction {
+ final _Zone zone;
+ final RegisterUnaryCallbackHandler function;
+ const _RegisterUnaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterBinaryZoneFunction {
+ final _Zone zone;
+ final RegisterBinaryCallbackHandler function;
+ const _RegisterBinaryZoneFunction(this.zone, this.function);
+}
+
/**
* This class provides the specification for a forked zone.
*
@@ -820,12 +856,12 @@
// TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
// all fields.
- _ZoneFunction<Function> get _run;
- _ZoneFunction<Function> get _runUnary;
- _ZoneFunction<Function> get _runBinary;
- _ZoneFunction<Function> get _registerCallback;
- _ZoneFunction<Function> get _registerUnaryCallback;
- _ZoneFunction<Function> get _registerBinaryCallback;
+ _RunNullaryZoneFunction get _run;
+ _RunUnaryZoneFunction get _runUnary;
+ _RunBinaryZoneFunction get _runBinary;
+ _RegisterNullaryZoneFunction get _registerCallback;
+ _RegisterUnaryZoneFunction get _registerUnaryCallback;
+ _RegisterBinaryZoneFunction get _registerBinaryCallback;
_ZoneFunction<ErrorCallbackHandler> get _errorCallback;
_ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask;
_ZoneFunction<CreateTimerHandler> get _createTimer;
@@ -848,12 +884,12 @@
// inheritable zone functions.
// TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
// all fields.
- _ZoneFunction<Function> _run;
- _ZoneFunction<Function> _runUnary;
- _ZoneFunction<Function> _runBinary;
- _ZoneFunction<Function> _registerCallback;
- _ZoneFunction<Function> _registerUnaryCallback;
- _ZoneFunction<Function> _registerBinaryCallback;
+ _RunNullaryZoneFunction _run;
+ _RunUnaryZoneFunction _runUnary;
+ _RunBinaryZoneFunction _runBinary;
+ _RegisterNullaryZoneFunction _registerCallback;
+ _RegisterUnaryZoneFunction _registerUnaryCallback;
+ _RegisterBinaryZoneFunction _registerBinaryCallback;
_ZoneFunction<ErrorCallbackHandler> _errorCallback;
_ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask;
_ZoneFunction<CreateTimerHandler> _createTimer;
@@ -884,22 +920,23 @@
// specification, so it will never try to access the (null) parent.
// All other zones have a non-null parent.
_run = (specification.run != null)
- ? new _ZoneFunction<Function>(this, specification.run)
+ ? new _RunNullaryZoneFunction(this, specification.run)
: parent._run;
_runUnary = (specification.runUnary != null)
- ? new _ZoneFunction<Function>(this, specification.runUnary)
+ ? new _RunUnaryZoneFunction(this, specification.runUnary)
: parent._runUnary;
_runBinary = (specification.runBinary != null)
- ? new _ZoneFunction<Function>(this, specification.runBinary)
+ ? new _RunBinaryZoneFunction(this, specification.runBinary)
: parent._runBinary;
_registerCallback = (specification.registerCallback != null)
- ? new _ZoneFunction<Function>(this, specification.registerCallback)
+ ? new _RegisterNullaryZoneFunction(this, specification.registerCallback)
: parent._registerCallback;
_registerUnaryCallback = (specification.registerUnaryCallback != null)
- ? new _ZoneFunction<Function>(this, specification.registerUnaryCallback)
+ ? new _RegisterUnaryZoneFunction(
+ this, specification.registerUnaryCallback)
: parent._registerUnaryCallback;
_registerBinaryCallback = (specification.registerBinaryCallback != null)
- ? new _ZoneFunction<Function>(
+ ? new _RegisterBinaryZoneFunction(
this, specification.registerBinaryCallback)
: parent._registerBinaryCallback;
_errorCallback = (specification.errorCallback != null)
@@ -1262,18 +1299,18 @@
class _RootZone extends _Zone {
const _RootZone();
- _ZoneFunction<Function> get _run =>
- const _ZoneFunction<Function>(_rootZone, _rootRun);
- _ZoneFunction<Function> get _runUnary =>
- const _ZoneFunction<Function>(_rootZone, _rootRunUnary);
- _ZoneFunction<Function> get _runBinary =>
- const _ZoneFunction<Function>(_rootZone, _rootRunBinary);
- _ZoneFunction<Function> get _registerCallback =>
- const _ZoneFunction<Function>(_rootZone, _rootRegisterCallback);
- _ZoneFunction<Function> get _registerUnaryCallback =>
- const _ZoneFunction<Function>(_rootZone, _rootRegisterUnaryCallback);
- _ZoneFunction<Function> get _registerBinaryCallback =>
- const _ZoneFunction<Function>(_rootZone, _rootRegisterBinaryCallback);
+ _RunNullaryZoneFunction get _run =>
+ const _RunNullaryZoneFunction(_rootZone, _rootRun);
+ _RunUnaryZoneFunction get _runUnary =>
+ const _RunUnaryZoneFunction(_rootZone, _rootRunUnary);
+ _RunBinaryZoneFunction get _runBinary =>
+ const _RunBinaryZoneFunction(_rootZone, _rootRunBinary);
+ _RegisterNullaryZoneFunction get _registerCallback =>
+ const _RegisterNullaryZoneFunction(_rootZone, _rootRegisterCallback);
+ _RegisterUnaryZoneFunction get _registerUnaryCallback =>
+ const _RegisterUnaryZoneFunction(_rootZone, _rootRegisterUnaryCallback);
+ _RegisterBinaryZoneFunction get _registerBinaryCallback =>
+ const _RegisterBinaryZoneFunction(_rootZone, _rootRegisterBinaryCallback);
_ZoneFunction<ErrorCallbackHandler> get _errorCallback =>
const _ZoneFunction<ErrorCallbackHandler>(_rootZone, _rootErrorCallback);
_ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask =>
diff --git a/sdk_nnbd/lib/async/zone.dart b/sdk_nnbd/lib/async/zone.dart
index 3c50e19..b4e3994c 100644
--- a/sdk_nnbd/lib/async/zone.dart
+++ b/sdk_nnbd/lib/async/zone.dart
@@ -69,6 +69,42 @@
const _ZoneFunction(this.zone, this.function);
}
+class _RunNullaryZoneFunction {
+ final _Zone zone;
+ final RunHandler function;
+ const _RunNullaryZoneFunction(this.zone, this.function);
+}
+
+class _RunUnaryZoneFunction {
+ final _Zone zone;
+ final RunUnaryHandler function;
+ const _RunUnaryZoneFunction(this.zone, this.function);
+}
+
+class _RunBinaryZoneFunction {
+ final _Zone zone;
+ final RunBinaryHandler function;
+ const _RunBinaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterNullaryZoneFunction {
+ final _Zone zone;
+ final RegisterCallbackHandler function;
+ const _RegisterNullaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterUnaryZoneFunction {
+ final _Zone zone;
+ final RegisterUnaryCallbackHandler function;
+ const _RegisterUnaryZoneFunction(this.zone, this.function);
+}
+
+class _RegisterBinaryZoneFunction {
+ final _Zone zone;
+ final RegisterBinaryCallbackHandler function;
+ const _RegisterBinaryZoneFunction(this.zone, this.function);
+}
+
/**
* This class provides the specification for a forked zone.
*
@@ -814,12 +850,12 @@
// TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
// all fields.
- _ZoneFunction<Function> get _run;
- _ZoneFunction<Function> get _runUnary;
- _ZoneFunction<Function> get _runBinary;
- _ZoneFunction<Function> get _registerCallback;
- _ZoneFunction<Function> get _registerUnaryCallback;
- _ZoneFunction<Function> get _registerBinaryCallback;
+ _RunNullaryZoneFunction get _run;
+ _RunUnaryZoneFunction get _runUnary;
+ _RunBinaryZoneFunction get _runBinary;
+ _RegisterNullaryZoneFunction get _registerCallback;
+ _RegisterUnaryZoneFunction get _registerUnaryCallback;
+ _RegisterBinaryZoneFunction get _registerBinaryCallback;
_ZoneFunction<ErrorCallbackHandler> get _errorCallback;
_ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask;
_ZoneFunction<CreateTimerHandler> get _createTimer;
@@ -844,12 +880,12 @@
// inheritable zone functions.
// TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
// all fields, but we can't use generic function types as type arguments.
- _ZoneFunction<Function> _run;
- _ZoneFunction<Function> _runUnary;
- _ZoneFunction<Function> _runBinary;
- _ZoneFunction<Function> _registerCallback;
- _ZoneFunction<Function> _registerUnaryCallback;
- _ZoneFunction<Function> _registerBinaryCallback;
+ _RunNullaryZoneFunction _run;
+ _RunUnaryZoneFunction _runUnary;
+ _RunBinaryZoneFunction _runBinary;
+ _RegisterNullaryZoneFunction _registerCallback;
+ _RegisterUnaryZoneFunction _registerUnaryCallback;
+ _RegisterBinaryZoneFunction _registerBinaryCallback;
_ZoneFunction<ErrorCallbackHandler> _errorCallback;
_ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask;
_ZoneFunction<CreateTimerHandler> _createTimer;
@@ -891,29 +927,29 @@
// All other zones have a non-null parent.
var run = specification.run;
if (run != null) {
- _run = _ZoneFunction<Function>(this, run);
+ _run = _RunNullaryZoneFunction(this, run);
}
var runUnary = specification.runUnary;
if (runUnary != null) {
- _runUnary = _ZoneFunction<Function>(this, runUnary);
+ _runUnary = _RunUnaryZoneFunction(this, runUnary);
}
var runBinary = specification.runBinary;
if (runBinary != null) {
- _runBinary = _ZoneFunction<Function>(this, runBinary);
+ _runBinary = _RunBinaryZoneFunction(this, runBinary);
}
var registerCallback = specification.registerCallback;
if (registerCallback != null) {
- _registerCallback = _ZoneFunction<Function>(this, registerCallback);
+ _registerCallback = _RegisterNullaryZoneFunction(this, registerCallback);
}
var registerUnaryCallback = specification.registerUnaryCallback;
if (registerUnaryCallback != null) {
_registerUnaryCallback =
- _ZoneFunction<Function>(this, registerUnaryCallback);
+ _RegisterUnaryZoneFunction(this, registerUnaryCallback);
}
var registerBinaryCallback = specification.registerBinaryCallback;
if (registerBinaryCallback != null) {
_registerBinaryCallback =
- _ZoneFunction<Function>(this, registerBinaryCallback);
+ _RegisterBinaryZoneFunction(this, registerBinaryCallback);
}
var errorCallback = specification.errorCallback;
if (errorCallback != null) {
@@ -1274,18 +1310,18 @@
class _RootZone extends _Zone {
const _RootZone();
- _ZoneFunction<Function> get _run =>
- const _ZoneFunction<Function>(_rootZone, _rootRun);
- _ZoneFunction<Function> get _runUnary =>
- const _ZoneFunction<Function>(_rootZone, _rootRunUnary);
- _ZoneFunction<Function> get _runBinary =>
- const _ZoneFunction<Function>(_rootZone, _rootRunBinary);
- _ZoneFunction<Function> get _registerCallback =>
- const _ZoneFunction<Function>(_rootZone, _rootRegisterCallback);
- _ZoneFunction<Function> get _registerUnaryCallback =>
- const _ZoneFunction<Function>(_rootZone, _rootRegisterUnaryCallback);
- _ZoneFunction<Function> get _registerBinaryCallback =>
- const _ZoneFunction<Function>(_rootZone, _rootRegisterBinaryCallback);
+ _RunNullaryZoneFunction get _run =>
+ const _RunNullaryZoneFunction(_rootZone, _rootRun);
+ _RunUnaryZoneFunction get _runUnary =>
+ const _RunUnaryZoneFunction(_rootZone, _rootRunUnary);
+ _RunBinaryZoneFunction get _runBinary =>
+ const _RunBinaryZoneFunction(_rootZone, _rootRunBinary);
+ _RegisterNullaryZoneFunction get _registerCallback =>
+ const _RegisterNullaryZoneFunction(_rootZone, _rootRegisterCallback);
+ _RegisterUnaryZoneFunction get _registerUnaryCallback =>
+ const _RegisterUnaryZoneFunction(_rootZone, _rootRegisterUnaryCallback);
+ _RegisterBinaryZoneFunction get _registerBinaryCallback =>
+ const _RegisterBinaryZoneFunction(_rootZone, _rootRegisterBinaryCallback);
_ZoneFunction<ErrorCallbackHandler> get _errorCallback =>
const _ZoneFunction<ErrorCallbackHandler>(_rootZone, _rootErrorCallback);
_ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask =>