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

Unified Diff: tests/stub-generator/src/MintMakerFullyIsolatedTest-generatedTest.dart

Issue 8403040: Don't wait unnecessarily. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 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: tests/stub-generator/src/MintMakerFullyIsolatedTest-generatedTest.dart
===================================================================
--- tests/stub-generator/src/MintMakerFullyIsolatedTest-generatedTest.dart (revision 734)
+++ tests/stub-generator/src/MintMakerFullyIsolatedTest-generatedTest.dart (working copy)
@@ -8,7 +8,7 @@
/* class = Purse (tests/stub-generator/src/MintMakerFullyIsolatedTest.dart/MintMakerFullyIsolatedTest.dart: 9) */
-interface Purse$Proxy {
+interface Purse$Proxy extends Proxy {
Promise<int> queryBalance();
Purse$Proxy sproutPurse();
@@ -56,13 +56,9 @@
int amount = message[1];
List<Promise<SendPort>> promises = new List<Promise<SendPort>>();
promises.add(new PromiseProxy<SendPort>(new Promise<SendPort>.fromValue(message[2])));
- Promise done = new Promise();
- done.waitFor(promises, 1);
- done.addCompleteHandler((_) {
- Purse$Proxy source = new Purse$ProxyImpl(promises[0]);
- Promise<int> deposit = target.deposit(amount, source);
- reply(deposit);
- });
+ Purse$Proxy source = new Purse$ProxyImpl(promises[0]);
+ Promise<int> deposit = target.deposit(amount, source);
+ reply(deposit);
} else {
// TODO(kasperl,benl): Somehow throw an exception instead.
reply("Exception: command '" + command + "' not understood by Purse.");
@@ -85,7 +81,7 @@
/* class = PowerfulPurse (tests/stub-generator/src/MintMakerFullyIsolatedTest.dart/MintMakerFullyIsolatedTest.dart: 18) */
-interface PowerfulPurse$Proxy {
+interface PowerfulPurse$Proxy extends Proxy {
void init(Mint$Proxy mint, int balance);
Promise<int> grab(int amount);
@@ -127,12 +123,8 @@
List<Promise<SendPort>> promises = new List<Promise<SendPort>>();
promises.add(new PromiseProxy<SendPort>(new Promise<SendPort>.fromValue(message[1])));
int balance = message[2];
- Promise done = new Promise();
- done.waitFor(promises, 1);
- done.addCompleteHandler((_) {
- Mint$Proxy mint = new Mint$ProxyImpl(promises[0]);
- target.init(mint, balance);
- });
+ Mint$Proxy mint = new Mint$ProxyImpl(promises[0]);
+ target.init(mint, balance);
} else if (command == "grab") {
int amount = message[1];
int grab = target.grab(amount);
@@ -163,10 +155,10 @@
/* class = Mint (tests/stub-generator/src/MintMakerFullyIsolatedTest.dart/MintMakerFullyIsolatedTest.dart: 28) */
-interface Mint$Proxy {
+interface Mint$Proxy extends Proxy {
Purse$Proxy createPurse(int balance);
- PowerfulPurse$Proxy promote(Purse$Proxy purse);
+ Promise<PowerfulPurse$Proxy> promote(Purse$Proxy purse);
}
class Mint$ProxyImpl extends ProxyImpl implements Mint$Proxy {
@@ -184,8 +176,8 @@
return new Purse$ProxyImpl(new PromiseProxy<SendPort>(this.call(["createPurse", balance])));
}
- PowerfulPurse$Proxy promote(Purse$Proxy purse) {
- return new PowerfulPurse$ProxyImpl(new PromiseProxy<SendPort>(this.call(["promote", purse])));
+ Promise<PowerfulPurse$Proxy> promote(Purse$Proxy purse) {
+ return new PromiseProxy<PowerfulPurse$Proxy>(this.call(["promote", purse]));
}
}
@@ -202,13 +194,9 @@
} else if (command == "promote") {
List<Promise<SendPort>> promises = new List<Promise<SendPort>>();
promises.add(new PromiseProxy<SendPort>(new Promise<SendPort>.fromValue(message[1])));
- Promise done = new Promise();
- done.waitFor(promises, 1);
- done.addCompleteHandler((_) {
- Purse$Proxy purse = new Purse$ProxyImpl(promises[0]);
- PowerfulPurse$Proxy promote = target.promote(purse);
- reply(promote);
- });
+ Purse$Proxy purse = new Purse$ProxyImpl(promises[0]);
+ Promise<PowerfulPurse$Proxy> promote = target.promote(purse);
+ reply(promote);
} else {
// TODO(kasperl,benl): Somehow throw an exception instead.
reply("Exception: command '" + command + "' not understood by Mint.");
@@ -251,7 +239,7 @@
Mint();
Purse$Proxy createPurse(int balance);
- PowerfulPurse$Proxy promote(Purse$Proxy purse);
+ Promise<PowerfulPurse$Proxy> promote(Purse$Proxy purse);
}
// Because promises can't be used as keys in maps until they have
@@ -259,13 +247,65 @@
// resolve, then get()'s return may also fail to resolve. Also,
// although the logic is fine, this can't be used for a
// ProxyMap. Perhaps both Proxy and Promise should inherit from
-// Completable?
-// NB: not tested and known to be buggy. Will fix in a future change.
-class PromiseMap<S extends Promise, T> {
+// Completable? Also, not sure if implementing Collection is really
+// sustainable, we shall see.
+class ProxySet<T extends Proxy> implements Collection<T> {
floitsch 2011/10/27 16:16:54 why not Set<T> ?
Ben Laurie (Google) 2011/10/27 16:34:57 Lazy :-) I will fix.
- PromiseMap() {
+ ProxySet() {
+ _set = new List<T>();
+ }
+
+ ProxySet.fromList(this._set);
+
+ void add (T t) {
floitsch 2011/10/27 16:16:54 remove space.
+ for (T x in _set)
floitsch 2011/10/27 16:16:54 use {}
Ben Laurie (Google) 2011/10/27 16:34:57 Sigh.
+ if (x === t)
+ return;
floitsch 2011/10/27 16:16:54 either put "return" on the same line, or put {} ar
Ben Laurie (Google) 2011/10/27 16:34:57 Really? Is that official? I _hate_ that style (bot
+ if (t.hasValue())
floitsch 2011/10/27 16:16:54 {}
+ for (T x in _set)
floitsch 2011/10/27 16:16:54 {}
+ if (x.hasValue() && x == t)
floitsch 2011/10/27 16:16:54 {} or same line.
+ return;
+ _set.add(t);
+ t.addCompleteHandler((_) {
+ _remove(t, 1);
+ });
+ }
+
+ void _remove(T t, int threshold) {
+ int count = 0;
+ for (int n = 0; n < _set.length; ++n)
floitsch 2011/10/27 16:16:54 {}
+ if (_set[n].hasValue() && _set[n] == t)
floitsch 2011/10/27 16:16:54 {}
+ if (++count > threshold) {
+ _set.removeRange(n, 1);
+ --n;
+ }
+ }
+
+ void remove(T t) {
+ t.addCompleteHandler((_) {
+ _remove(t, 0);
+ });
+ }
+
+ int get length() => _set.length;
+ void forEach(void f(T element)) { _set.forEach(f); }
+ ProxySet<T> filter(bool f(T element))
floitsch 2011/10/27 16:16:54 convention is that => is only allowed on the same
Ben Laurie (Google) 2011/10/27 16:34:57 Done.
+ => new ProxySet<T>.fromList(_set.filter(f));
+ bool every(bool f(T element)) => _set.every(f);
+ bool some(bool f(T element)) => _set.some(f);
+ bool isEmpty() => _set.isEmpty();
+ Iterator<T> iterator() => _set.iterator();
+
+ List<T> _set;
+
+}
+
+
+class ProxyMap<S extends Proxy, T> {
+
+ ProxyMap() {
_map = new Map<S, T>();
- _incomplete = new Set<S>();
+ _incomplete = new ProxySet<S>();
}
T add(S s, T t) {
@@ -278,9 +318,12 @@
}
Promise<T> find(S s) {
- T t = _map[s];
- if (t != null)
- return new Promise<T>.fromValue(t);
+ // premature optimisation?
+ if (s.hasValue()) {
+ T t = _map[s];
+ if (t != null)
floitsch 2011/10/27 16:16:54 {} or same line.
floitsch 2011/10/27 16:16:54 t !== null
Ben Laurie (Google) 2011/10/27 16:34:57 Really? I've been explcitly told === is not needed
+ return new Promise<T>.fromValue(t);
+ }
Promise<T> p = new Promise<T>();
int counter = _incomplete.length;
p.join(_incomplete, bool (S completed) {
@@ -297,17 +340,18 @@
return p;
}
- Set<S> _incomplete;
+ ProxySet<S> _incomplete;
Map<S, T> _map;
}
+
class MintImpl implements Mint {
MintImpl() {
//print('mint');
if (_power == null)
- _power = new Map<Purse$Proxy, PowerfulPurse$Proxy>();
+ _power = new ProxyMap<Purse$Proxy, PowerfulPurse$Proxy>();
}
Purse$Proxy createPurse(int balance) {
@@ -318,22 +362,22 @@
purse.init(thisProxy, balance);
Purse$Proxy weakPurse = purse.weak();
- weakPurse.addCompleteHandler(() {
+ weakPurse.addCompleteHandler((_) {
//print('cP1');
- _power[weakPurse] = purse;
+ _power.add(weakPurse, purse);
//print('cP2');
});
return weakPurse;
}
- PowerfulPurse$Proxy promote(Purse$Proxy purse) {
+ Promise<PowerfulPurse$Proxy> promote(Purse$Proxy purse) {
// FIXME(benl): we should be using a PromiseMap here. But we get
// away with it in this test for now.
//print('promote $purse/${_power[purse]}');
- return _power[purse];
+ return _power.find(purse);
}
- static Map<Purse$Proxy, PowerfulPurse$Proxy> _power;
+ static ProxyMap<Purse$Proxy, PowerfulPurse$Proxy> _power;
}
class PurseImpl implements PowerfulPurse {
@@ -359,14 +403,15 @@
Promise<int> deposit(int amount, Purse$Proxy proxy) {
//print('deposit');
- Promise<int> grabbed = _mint.promote(proxy).grab(amount);
- Promise<int> done = new Promise<int>();
- grabbed.then((int) {
- //print("deposit done");
+ Promise<PowerfulPurse$Proxy> powerful = _mint.promote(proxy);
+
+ return powerful.then(() {
+ powerful.value.grab(amount);
+ return amount;
+ }).then((int amount) {
_balance += amount;
- done.complete(_balance);
+ return _balance;
});
- return done;
}
int grab(int amount) {
« no previous file with comments | « tests/stub-generator/src/MintMakerFullyIsolatedTest.dart ('k') | tests/stub-generator/src/MintMakerPromiseWithStubsTest.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698