2 module.exports = function(Promise, INTERNAL, tryConvertToPromise) {
3 var rejectThis = function(_, e) {
7 var targetRejected = function(e, context) {
8 context.promiseRejectionQueued = true;
9 context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
12 var bindingResolved = function(thisArg, context) {
13 if (this._isPending()) {
14 this._resolveCallback(context.target);
18 var bindingRejected = function(e, context) {
19 if (!context.promiseRejectionQueued) this._reject(e);
22 Promise.prototype.bind = function (thisArg) {
23 var maybePromise = tryConvertToPromise(thisArg);
24 var ret = new Promise(INTERNAL);
25 ret._propagateFrom(this, 1);
26 var target = this._target();
28 ret._setBoundTo(maybePromise);
29 if (maybePromise instanceof Promise) {
31 promiseRejectionQueued: false,
34 bindingPromise: maybePromise
36 target._then(INTERNAL, targetRejected, ret._progress, ret, context);
38 bindingResolved, bindingRejected, ret._progress, ret, context);
40 ret._resolveCallback(target);
45 Promise.prototype._setBoundTo = function (obj) {
46 if (obj !== undefined) {
47 this._bitField = this._bitField | 131072;
50 this._bitField = this._bitField & (~131072);
54 Promise.prototype._isBound = function () {
55 return (this._bitField & 131072) === 131072;
58 Promise.bind = function (thisArg, value) {
59 var maybePromise = tryConvertToPromise(thisArg);
60 var ret = new Promise(INTERNAL);
62 ret._setBoundTo(maybePromise);
63 if (maybePromise instanceof Promise) {
64 maybePromise._then(function() {
65 ret._resolveCallback(value);
66 }, ret._reject, ret._progress, ret, null);
68 ret._resolveCallback(value);