@@ -21,8 +21,8 @@ module Promises {
2121 func removeUnresolvedPromise[ResultType: type](p: SrdRef[Promise[ResultType]]) {
2222 unresolvedPromisesLocker();
2323 if not p.nextUnresolvedPromise.isNull() p.nextUnresolvedPromise.prevUnresolvedPromise = p.prevUnresolvedPromise;
24- if not p.prevUnresolvedPromise.isNull() p.prevUnresolvedPromise.nextUnresolvedPromise = p.nextUnresolvedPromise
25- else unresolvedPromises = p.nextUnresolvedPromise;
24+ if not p.prevUnresolvedPromise.isNull() p.prevUnresolvedPromise.nextUnresolvedPromise = p.nextUnresolvedPromise;
25+ if unresolvedPromises.obj~ptr == p.obj~ptr unresolvedPromises = p.nextUnresolvedPromise;
2626 p.prevUnresolvedPromise.release();
2727 p.nextUnresolvedPromise.release();
2828 unresolvedPromisesUnlocker();
@@ -42,7 +42,6 @@ module Promises {
4242
4343 handler this.resolve(res: ResultType) {
4444 if this.status != Status.NEW return;
45- removeUnresolvedPromise[ResultType](SrdRef[Promise[ResultType]](this.wkThis));
4645 this.result = res;
4746 this.status = Status.RESOLVED;
4847 def chain: ref[ChainNode[ResultType]](this.child);
@@ -53,6 +52,7 @@ module Promises {
5352 chain.onResolved(res);
5453 chain~no_deref = next;
5554 }
55+ removeUnresolvedPromise[ResultType](SrdRef[Promise[ResultType]](this.wkThis));
5656 }
5757
5858 handler this.resolve(p: SrdRef[Promise[ResultType]]) {
@@ -70,7 +70,6 @@ module Promises {
7070
7171 handler this.reject(err: SrdRef[Error]) {
7272 if this.status != Status.NEW return;
73- removeUnresolvedPromise[ResultType](SrdRef[Promise[ResultType]](this.wkThis));
7473 this.error = err;
7574 this.status = Status.REJECTED;
7675 def chain: ref[ChainNode[ResultType]](this.child);
@@ -81,6 +80,7 @@ module Promises {
8180 chain.onRejected(err);
8281 chain~no_deref = next;
8382 }
83+ removeUnresolvedPromise[ResultType](SrdRef[Promise[ResultType]](this.wkThis));
8484 }
8585
8686 function new (): SrdRef[Promise[ResultType]] {
@@ -277,7 +277,10 @@ module Promises {
277277 def callback: closure (input: InputType, promise: ref[Promise[ResultType]]);
278278 handler (this: ChainNode[InputType]).onResolved(result: InputType) set_ptr {
279279 unshiftThis[chainNode];
280- this.callback(result, this.promise);
280+ // Get a handle of the callback to make sure it never gets released before the call
281+ // is complete.
282+ def cb: callback~type = this.callback;
283+ cb(result, this.promise);
281284 }
282285 handler (this: ChainNode[InputType]).onRejected(err: SrdRef[Error]) set_ptr {
283286 unshiftThis[chainNode];
@@ -298,7 +301,10 @@ module Promises {
298301 }
299302 handler (this: ChainNode[InputType]).onRejected(err: SrdRef[Error]) set_ptr {
300303 unshiftThis[chainNode];
301- this.callback(err, this.promise);
304+ // Get a handle of the callback to make sure it never gets released before the call
305+ // is complete.
306+ def cb: callback~type = this.callback;
307+ cb(err, this.promise);
302308 }
303309 handler (this:Resolver[InputType]).getResolverType(): Int set_ptr {
304310 return ResolverType.CATCH_RESOLVER;
0 commit comments