| 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) {
|
|
|