• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"use strict";
2module.exports = function(Promise, INTERNAL) {
3var util = require("./util");
4var errorObj = util.errorObj;
5var isObject = util.isObject;
6
7function tryConvertToPromise(obj, context) {
8    if (isObject(obj)) {
9        if (obj instanceof Promise) return obj;
10        var then = getThen(obj);
11        if (then === errorObj) {
12            if (context) context._pushContext();
13            var ret = Promise.reject(then.e);
14            if (context) context._popContext();
15            return ret;
16        } else if (typeof then === "function") {
17            if (isAnyBluebirdPromise(obj)) {
18                var ret = new Promise(INTERNAL);
19                obj._then(
20                    ret._fulfill,
21                    ret._reject,
22                    undefined,
23                    ret,
24                    null
25                );
26                return ret;
27            }
28            return doThenable(obj, then, context);
29        }
30    }
31    return obj;
32}
33
34function doGetThen(obj) {
35    return obj.then;
36}
37
38function getThen(obj) {
39    try {
40        return doGetThen(obj);
41    } catch (e) {
42        errorObj.e = e;
43        return errorObj;
44    }
45}
46
47var hasProp = {}.hasOwnProperty;
48function isAnyBluebirdPromise(obj) {
49    try {
50        return hasProp.call(obj, "_promise0");
51    } catch (e) {
52        return false;
53    }
54}
55
56function doThenable(x, then, context) {
57    var promise = new Promise(INTERNAL);
58    var ret = promise;
59    if (context) context._pushContext();
60    promise._captureStackTrace();
61    if (context) context._popContext();
62    var synchronous = true;
63    var result = util.tryCatch(then).call(x, resolve, reject);
64    synchronous = false;
65
66    if (promise && result === errorObj) {
67        promise._rejectCallback(result.e, true, true);
68        promise = null;
69    }
70
71    function resolve(value) {
72        if (!promise) return;
73        promise._resolveCallback(value);
74        promise = null;
75    }
76
77    function reject(reason) {
78        if (!promise) return;
79        promise._rejectCallback(reason, synchronous, true);
80        promise = null;
81    }
82    return ret;
83}
84
85return tryConvertToPromise;
86};
87