Skip to content

Commit f10cde4

Browse files
committed
improve garbage collection
by shortening `.handle` reference chains Extending test suite to get coverage for such cases
1 parent 4a58229 commit f10cde4

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

src/Promise.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ export class Future extends Core {
168168
}
169169

170170
_become (p) {
171+
/* eslint complexity:[2,6] */
171172
if (p === this) {
172173
p = cycle()
173174
}
@@ -185,8 +186,11 @@ export class Future extends Core {
185186
// for not unnecessarily creating handles that never see any actions
186187
// works well because it has a near() method
187188
this.handle = p
189+
} else if (p.handle) {
190+
this.handle = p.handle
188191
} else {
189-
this.handle = new Handle(p)
192+
// explicit handle to avoid reference chain between multiple futures
193+
this.handle = p.handle = new Handle(p)
190194
}
191195
}
192196
}

test/future-test.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,29 @@ describe('future', () => {
4444
resolve(reject(expected))
4545
return promise.then(assert.ifError, x => assert.strictEqual(expected, x))
4646
})
47+
48+
it('should resolve with pending promise', () => {
49+
const { resolve: resolve1, promise: promise1 } = future()
50+
const { resolve: resolve2, promise: promise2 } = future()
51+
const { resolve: resolve3, promise: promise3 } = future()
52+
const expected = {}
53+
setTimeout(resolve2, 1, promise1)
54+
setTimeout(resolve1, 2, expected)
55+
setTimeout(resolve3, 2, promise2)
56+
return promise3.then(x => assert.strictEqual(expected, x))
57+
})
58+
59+
it('should resolve with pending promise that already has handle', () => {
60+
const { resolve: resolve1, promise: promise1 } = future()
61+
const { resolve: resolve2, promise: promise2 } = future()
62+
const { resolve: resolve3, promise: promise3 } = future()
63+
const expected = {}
64+
promise1.map(x => x === expected)
65+
setTimeout(resolve2, 1, promise1)
66+
setTimeout(resolve1, 2, expected)
67+
setTimeout(resolve3, 2, promise2)
68+
return promise3.then(x => assert.strictEqual(expected, x))
69+
})
4770
})
4871

4972
describe('when resolved to another promise', () => {

0 commit comments

Comments
 (0)