@@ -40,13 +40,13 @@ try {
40
40
var qStartingLine = captureLine ( ) ;
41
41
var qFileName ;
42
42
43
- require ( "collections/shim" ) ;
44
- var WeakMap = require ( "collections/weak-map" ) ;
45
- var Iterator = require ( "collections/iterator" ) ;
43
+ var WeakMap = require ( "weak-map" ) ;
46
44
var asap = require ( "asap" ) ;
45
+ var iterate = require ( "./iterate" ) ;
47
46
47
+ var typeOfObject = "object" ;
48
48
function isObject ( value ) {
49
- return value === Object ( value ) ;
49
+ return value !== null && typeof value === typeOfObject ;
50
50
}
51
51
52
52
// long stack traces
@@ -64,7 +64,7 @@ function makeStackTraceLong(error, promise) {
64
64
error . stack . indexOf ( STACK_JUMP_SEPARATOR ) === - 1
65
65
) {
66
66
var stacks = [ ] ;
67
- for ( var p = promise ; ! ! p && handlers . get ( p ) ; p = handlers . get ( p ) . became ) {
67
+ for ( var p = promise ; p instanceof Promise && p . _handler ; p = p . _handler . became ) {
68
68
if ( p . stack ) {
69
69
stacks . unshift ( p . stack ) ;
70
70
}
@@ -179,33 +179,22 @@ function deprecate(callback, name, alternative) {
179
179
180
180
// end of long stack traces
181
181
182
- var handlers = new WeakMap ( ) ;
183
-
182
+ // When a deferred promise is forwarded to another promise, the old handler
183
+ // becomes the new handler and all messages past and present flow to the next
184
+ // handler.
184
185
function Q_getHandler ( promise ) {
185
- var handler = handlers . get ( promise ) ;
186
- if ( ! handler || ! handler . became ) {
187
- return handler ;
186
+ var handler = promise . _handler ;
187
+ while ( handler && handler . became ) {
188
+ handler = handler . became ;
188
189
}
189
- handler = follow ( handler ) ;
190
- handlers . set ( promise , handler ) ;
190
+ promise . _handler = handler ;
191
191
return handler ;
192
192
}
193
193
194
- function follow ( handler ) {
195
- if ( ! handler . became ) {
196
- return handler ;
197
- } else {
198
- handler . became = follow ( handler . became ) ;
199
- return handler . became ;
200
- }
201
- }
202
-
203
194
var theViciousCycleError = new Error ( "Can't resolve a promise with itself" ) ;
204
195
var theViciousCycleRejection = Q_reject ( theViciousCycleError ) ;
205
196
var theViciousCycle = Q_getHandler ( theViciousCycleRejection ) ;
206
197
207
- var thenables = new WeakMap ( ) ;
208
-
209
198
/**
210
199
* Coerces a value to a promise. If the value is a promise, pass it through
211
200
* unaltered. If the value has a `then` method, it is presumed to be a promise
@@ -224,10 +213,7 @@ function Q(value) {
224
213
if ( Q_isPromise ( value ) ) {
225
214
return value ;
226
215
} else if ( isThenable ( value ) ) {
227
- if ( ! thenables . has ( value ) ) {
228
- thenables . set ( value , new Promise ( new Thenable ( value ) ) ) ;
229
- }
230
- return thenables . get ( value ) ;
216
+ return new Promise ( new Thenable ( value ) ) ;
231
217
} else {
232
218
return new Promise ( new Fulfilled ( value ) ) ;
233
219
}
@@ -330,7 +316,7 @@ function Q_all(questions) {
330
316
} else {
331
317
++ countDown ;
332
318
promise = Q ( promise ) ;
333
- promise . then (
319
+ promise . done (
334
320
function Q_all_eachFulfilled ( value ) {
335
321
answers [ index ] = value ;
336
322
if ( -- countDown === 0 ) {
@@ -631,7 +617,7 @@ function Promise(handler) {
631
617
deferred . reject ( error ) ;
632
618
}
633
619
}
634
- handlers . set ( this , handler ) ;
620
+ this . _handler = handler ;
635
621
}
636
622
637
623
/**
@@ -678,7 +664,7 @@ Promise.reject = Q_reject;
678
664
*/
679
665
Q . isPromise = Q_isPromise ;
680
666
function Q_isPromise ( object ) {
681
- return isObject ( object ) && ! ! handlers . get ( object ) ;
667
+ return isObject ( object ) && object instanceof Promise ;
682
668
}
683
669
684
670
/**
@@ -1276,7 +1262,7 @@ Fulfilled.prototype.keys = function Fulfilled_keys() {
1276
1262
} ;
1277
1263
1278
1264
Fulfilled . prototype . iterate = function Fulfilled_iterate ( ) {
1279
- return new Iterator ( this . value ) ;
1265
+ return iterate ( this . value ) ;
1280
1266
} ;
1281
1267
1282
1268
Fulfilled . prototype . pull = function Fulfilled_pull ( ) {
@@ -1359,7 +1345,7 @@ Pending.prototype.become = function Pending_become(promise) {
1359
1345
var handler = Q_getHandler ( promise ) ;
1360
1346
this . became = handler ;
1361
1347
1362
- handlers . set ( promise , handler ) ;
1348
+ promise . _handler = handler ;
1363
1349
this . promise = void 0 ;
1364
1350
1365
1351
this . messages . forEach ( function Pending_become_eachMessage ( message ) {
0 commit comments