Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1746)

Unified Diff: sdk/lib/async/zone.dart

Issue 27112002: Make print interceptable. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comment. Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/async/zone.dart
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index 7dcff44164f65e0b291cd614ec71593f76a9e970..f419ca088ba6035a5fccc0e11cb1aa625de8ff50 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -31,6 +31,8 @@ typedef Timer CreateTimerHandler(
typedef Timer CreatePeriodicTimerHandler(
Zone self, ZoneDelegate parent, Zone zone,
Duration period, void f(Timer timer));
+typedef void PrintHandler(
+ Zone self, ZoneDelegate parent, Zone zone, String line);
typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone,
ZoneSpecification specification,
Map<Symbol, dynamic> zoneValues);
@@ -82,6 +84,7 @@ abstract class ZoneSpecification {
Duration duration, void f()): null,
Timer createPeriodicTimer(Zone self, ZoneDelegate parent, Zone zone,
Duration period, void f(Timer timer)): null,
+ void print(Zone self, ZoneDelegate parent, Zone zone, String line): null,
Zone fork(Zone self, ZoneDelegate parent, Zone zone,
ZoneSpecification specification, Map zoneValues): null
}) = _ZoneSpecification;
@@ -112,6 +115,7 @@ abstract class ZoneSpecification {
Duration duration, void f()): null,
Timer createPeriodicTimer(Zone self, ZoneDelegate parent, Zone zone,
Duration period, void f(Timer timer)): null,
+ void print(Zone self, ZoneDelegate parent, Zone zone, String line): null,
Zone fork(Zone self, ZoneDelegate parent, Zone zone,
ZoneSpecification specification,
Map<Symbol, dynamic> zoneValues): null
@@ -141,6 +145,7 @@ abstract class ZoneSpecification {
createPeriodicTimer: createPeriodicTimer != null
? createPeriodicTimer
: other.createPeriodicTimer,
+ print : print != null ? print : other.print,
fork: fork != null ? fork : other.fork);
}
@@ -156,6 +161,7 @@ abstract class ZoneSpecification {
RunAsyncHandler get runAsync;
CreateTimerHandler get createTimer;
CreatePeriodicTimerHandler get createPeriodicTimer;
+ PrintHandler get print;
ForkHandler get fork;
}
@@ -179,6 +185,7 @@ class _ZoneSpecification implements ZoneSpecification {
this.runAsync: null,
this.createTimer: null,
this.createPeriodicTimer: null,
+ this.print: null,
this.fork: null
});
@@ -195,6 +202,7 @@ class _ZoneSpecification implements ZoneSpecification {
final /*RunAsyncHandler*/ runAsync;
final /*CreateTimerHandler*/ createTimer;
final /*CreatePeriodicTimerHandler*/ createPeriodicTimer;
+ final /*PrintHandler*/ print;
final /*ForkHandler*/ fork;
}
@@ -224,6 +232,7 @@ abstract class ZoneDelegate {
void scheduleMicrotask(Zone zone, f());
Timer createTimer(Zone zone, Duration duration, void f());
Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer));
+ void print(Zone zone, String line);
Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues);
}
@@ -386,6 +395,11 @@ abstract class Zone {
Timer createPeriodicTimer(Duration period, void callback(Timer timer));
/**
+ * Prints the given [line].
+ */
+ void print(String line);
+
+ /**
* The error zone is the one that is responsible for dealing with uncaught
* errors. Errors are not allowed to cross zones with different error-zones.
*/
@@ -507,6 +521,15 @@ class _ZoneDelegate implements ZoneDelegate {
parent, new _ZoneDelegate(parent.parent), zone, period, f);
}
+ void print(Zone zone, String line) {
+ _CustomizedZone parent = _degelationTarget;
Ivan Posva 2013/10/16 07:19:51 Why is this a _CustomizedZone when all the other c
floitsch 2013/10/16 07:38:56 That was a bad merge and mistake. Had to do a foll
+ while (parent._specification.print == null) {
+ parent = parent.parent;
+ }
+ (parent._specification.print)(
+ parent, new _ZoneDelegate(parent.parent), zone, line);
Ivan Posva 2013/10/16 07:19:51 See question below about repeatedly allocating _Zo
+ }
+
Zone fork(Zone zone, ZoneSpecification specification,
Map<Symbol, dynamic> zoneValues) {
_BaseZone parent = _degelationTarget;
@@ -670,6 +693,10 @@ class _CustomizedZone extends _BaseZone {
Timer createPeriodicTimer(Duration duration, void f(Timer timer)) {
return new _ZoneDelegate(this).createPeriodicTimer(this, duration, f);
}
+
+ void print(String line) {
+ new _ZoneDelegate(this).print(this, line);
Ivan Posva 2013/10/16 07:19:51 I am wondering whether it is really necessary to a
floitsch 2013/10/16 07:38:56 It's not and on my TODO list.
+ }
}
void _rootHandleUncaughtError(
@@ -754,9 +781,22 @@ Timer _rootCreatePeriodicTimer(
return _createPeriodicTimer(duration, callback);
}
+void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) {
+ printToConsole(line);
+}
+
+void _printToZone(String line) {
+ Zone.current.print(line);
+}
+
Zone _rootFork(Zone self, ZoneDelegate parent, Zone zone,
ZoneSpecification specification,
Map<Symbol, dynamic> zoneValues) {
+ // TODO(floitsch): it would be nice if we could get rid of this hack.
+ // Change the static zoneOrDirectPrint function to go through zones
+ // from now on.
+ printToZone = _printToZone;
+
if (specification == null) {
specification = const ZoneSpecification();
} else if (specification is! _ZoneSpecification) {
@@ -794,6 +834,7 @@ class _RootZoneSpecification implements ZoneSpecification {
CreateTimerHandler get createTimer => _rootCreateTimer;
CreatePeriodicTimerHandler get createPeriodicTimer =>
_rootCreatePeriodicTimer;
+ PrintHandler get print => _rootPrint;
ForkHandler get fork => _rootFork;
}
@@ -846,6 +887,8 @@ class _RootZone extends _BaseZone {
Timer createPeriodicTimer(Duration duration, void f(Timer timer)) =>
_rootCreatePeriodicTimer(this, null, this, duration, f);
+
+ void print(String line) => _rootPrint(this, null, this, line);
}
const _ROOT_ZONE = const _RootZone();

Powered by Google App Engine
This is Rietveld 408576698