| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | 
							- "use strict";
 
- module.exports = function(Promise, INTERNAL) {
 
- var util = require("./util");
 
- var errorObj = util.errorObj;
 
- var isObject = util.isObject;
 
- function tryConvertToPromise(obj, context) {
 
-     if (isObject(obj)) {
 
-         if (obj instanceof Promise) return obj;
 
-         var then = getThen(obj);
 
-         if (then === errorObj) {
 
-             if (context) context._pushContext();
 
-             var ret = Promise.reject(then.e);
 
-             if (context) context._popContext();
 
-             return ret;
 
-         } else if (typeof then === "function") {
 
-             if (isAnyBluebirdPromise(obj)) {
 
-                 var ret = new Promise(INTERNAL);
 
-                 obj._then(
 
-                     ret._fulfill,
 
-                     ret._reject,
 
-                     undefined,
 
-                     ret,
 
-                     null
 
-                 );
 
-                 return ret;
 
-             }
 
-             return doThenable(obj, then, context);
 
-         }
 
-     }
 
-     return obj;
 
- }
 
- function doGetThen(obj) {
 
-     return obj.then;
 
- }
 
- function getThen(obj) {
 
-     try {
 
-         return doGetThen(obj);
 
-     } catch (e) {
 
-         errorObj.e = e;
 
-         return errorObj;
 
-     }
 
- }
 
- var hasProp = {}.hasOwnProperty;
 
- function isAnyBluebirdPromise(obj) {
 
-     try {
 
-         return hasProp.call(obj, "_promise0");
 
-     } catch (e) {
 
-         return false;
 
-     }
 
- }
 
- function doThenable(x, then, context) {
 
-     var promise = new Promise(INTERNAL);
 
-     var ret = promise;
 
-     if (context) context._pushContext();
 
-     promise._captureStackTrace();
 
-     if (context) context._popContext();
 
-     var synchronous = true;
 
-     var result = util.tryCatch(then).call(x, resolve, reject);
 
-     synchronous = false;
 
-     if (promise && result === errorObj) {
 
-         promise._rejectCallback(result.e, true, true);
 
-         promise = null;
 
-     }
 
-     function resolve(value) {
 
-         if (!promise) return;
 
-         promise._resolveCallback(value);
 
-         promise = null;
 
-     }
 
-     function reject(reason) {
 
-         if (!promise) return;
 
-         promise._rejectCallback(reason, synchronous, true);
 
-         promise = null;
 
-     }
 
-     return ret;
 
- }
 
- return tryConvertToPromise;
 
- };
 
 
  |