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

Unified Diff: tests/stub-generator/src/MintMakerFullyIsolatedTest.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.dart
===================================================================
--- tests/stub-generator/src/MintMakerFullyIsolatedTest.dart (revision 734)
+++ tests/stub-generator/src/MintMakerFullyIsolatedTest.dart (working copy)
@@ -29,7 +29,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
@@ -37,13 +37,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> {
- PromiseMap() {
+ ProxySet() {
+ _set = new List<T>();
+ }
+
+ ProxySet.fromList(this._set);
+
+ void add (T t) {
+ for (T x in _set)
+ if (x === t)
+ return;
+ if (t.hasValue())
+ for (T x in _set)
+ if (x.hasValue() && x == t)
+ 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)
+ if (_set[n].hasValue() && _set[n] == t)
+ 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))
+ => 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) {
@@ -56,9 +108,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)
+ return new Promise<T>.fromValue(t);
+ }
Promise<T> p = new Promise<T>();
int counter = _incomplete.length;
p.join(_incomplete, bool (S completed) {
@@ -75,17 +130,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) {
@@ -96,22 +152,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 {
@@ -137,14 +193,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) {

Powered by Google App Engine
This is Rietveld 408576698