Skip to content
This repository has been archived by the owner on Jan 22, 2025. It is now read-only.

Avoid throwing errors. Easier debugging when first-chance handling is tu... #556

Open
wants to merge 2 commits into
base: v1
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 51 additions & 39 deletions q.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,14 @@
"use strict";

var hasStacks = false;
try {
throw new Error();
} catch (e) {
hasStacks = !!e.stack;
if (new Error().stack) {
hasStacks = true;
} else {
try {
throw new Error();
} catch (e) {
hasStacks = !!e.stack;
}
}

// All code after this point will be filtered from stack traces reported
Expand Down Expand Up @@ -411,20 +415,24 @@ function captureLine() {
if (!hasStacks) {
return;
}

try {
throw new Error();
} catch (e) {
var lines = e.stack.split("\n");
var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
if (!fileNameAndLineNumber) {
return;
var ex = new Error();
if (!ex.stack) {
try {
throw new Error();
} catch (e) {
ex = e;
}
}

qFileName = fileNameAndLineNumber[0];
return fileNameAndLineNumber[1];
var lines = ex.stack.split("\n");
var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
if (!fileNameAndLineNumber) {
return;
}

qFileName = fileNameAndLineNumber[0];
return fileNameAndLineNumber[1];
}

function deprecate(callback, name, alternative) {
Expand Down Expand Up @@ -531,17 +539,21 @@ function defer() {
};

if (Q.longStackSupport && hasStacks) {
try {
throw new Error();
} catch (e) {
// NOTE: don't try to use `Error.captureStackTrace` or transfer the
// accessor around; that causes memory leaks as per GH-111. Just
// reify the stack trace as a string ASAP.
//
// At the same time, cut off the first line; it's always just
// "[object Promise]\n", as per the `toString`.
promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
var ex = new Error();
if (!ex.stack) {
try {
throw new Error();
} catch (e) {
// NOTE: don't try to use `Error.captureStackTrace` or transfer the
// accessor around; that causes memory leaks as per GH-111. Just
// reify the stack trace as a string ASAP.
//
// At the same time, cut off the first line; it's always just
// "[object Promise]\n", as per the `toString`.
ex = e;
}
}
promise.stack = ex.stack.substring(ex.stack.indexOf("\n") + 1);
}

// NOTE: we do the checks for `resolvedPromise` in each method, instead of
Expand Down Expand Up @@ -630,7 +642,7 @@ function promise(resolver) {
if (typeof resolver !== "function") {
throw new TypeError("resolver must be a function.");
}
var deferred = defer();
var deferred = Q.defer();
try {
resolver(deferred.resolve, deferred.reject, deferred.notify);
} catch (reason) {
Expand Down Expand Up @@ -778,7 +790,7 @@ Promise.prototype.toString = function () {

Promise.prototype.then = function (fulfilled, rejected, progressed) {
var self = this;
var deferred = defer();
var deferred = Q.defer();
var done = false; // ensure the untrusted promise makes at most a
// single call to one of the callbacks

Expand Down Expand Up @@ -1091,7 +1103,7 @@ function fulfill(value) {
* @returns a Q promise
*/
function coerce(promise) {
var deferred = defer();
var deferred = Q.defer();
nextTick(function () {
try {
promise.then(deferred.resolve, deferred.reject, deferred.notify);
Expand Down Expand Up @@ -1299,7 +1311,7 @@ function dispatch(object, op, args) {

Promise.prototype.dispatch = function (op, args) {
var self = this;
var deferred = defer();
var deferred = Q.defer();
nextTick(function () {
self.promiseDispatch(deferred.resolve, op, args);
});
Expand Down Expand Up @@ -1474,7 +1486,7 @@ Q.all = all;
function all(promises) {
return when(promises, function (promises) {
var countDown = 0;
var deferred = defer();
var deferred = Q.defer();
array_reduce(promises, function (undefined, promise, index) {
var snapshot;
if (
Expand Down Expand Up @@ -1679,7 +1691,7 @@ Q.timeout = function (object, ms, error) {
};

Promise.prototype.timeout = function (ms, error) {
var deferred = defer();
var deferred = Q.defer();
var timeoutId = setTimeout(function () {
if (!error || "string" === typeof error) {
error = new Error(error || "Timed out after " + ms + " ms");
Expand Down Expand Up @@ -1718,7 +1730,7 @@ Q.delay = function (object, timeout) {

Promise.prototype.delay = function (timeout) {
return this.then(function (value) {
var deferred = defer();
var deferred = Q.defer();
setTimeout(function () {
deferred.resolve(value);
}, timeout);
Expand All @@ -1740,7 +1752,7 @@ Q.nfapply = function (callback, args) {
};

Promise.prototype.nfapply = function (args) {
var deferred = defer();
var deferred = Q.defer();
var nodeArgs = array_slice(args);
nodeArgs.push(deferred.makeNodeResolver());
this.fapply(nodeArgs).fail(deferred.reject);
Expand All @@ -1763,7 +1775,7 @@ Q.nfcall = function (callback /*...args*/) {

Promise.prototype.nfcall = function (/*...args*/) {
var nodeArgs = array_slice(arguments);
var deferred = defer();
var deferred = Q.defer();
nodeArgs.push(deferred.makeNodeResolver());
this.fapply(nodeArgs).fail(deferred.reject);
return deferred.promise;
Expand All @@ -1782,7 +1794,7 @@ Q.denodeify = function (callback /*...args*/) {
var baseArgs = array_slice(arguments, 1);
return function () {
var nodeArgs = baseArgs.concat(array_slice(arguments));
var deferred = defer();
var deferred = Q.defer();
nodeArgs.push(deferred.makeNodeResolver());
Q(callback).fapply(nodeArgs).fail(deferred.reject);
return deferred.promise;
Expand All @@ -1800,7 +1812,7 @@ Q.nbind = function (callback, thisp /*...args*/) {
var baseArgs = array_slice(arguments, 2);
return function () {
var nodeArgs = baseArgs.concat(array_slice(arguments));
var deferred = defer();
var deferred = Q.defer();
nodeArgs.push(deferred.makeNodeResolver());
function bound() {
return callback.apply(thisp, arguments);
Expand Down Expand Up @@ -1833,7 +1845,7 @@ Q.npost = function (object, name, args) {
Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
Promise.prototype.npost = function (name, args) {
var nodeArgs = array_slice(args || []);
var deferred = defer();
var deferred = Q.defer();
nodeArgs.push(deferred.makeNodeResolver());
this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
return deferred.promise;
Expand All @@ -1853,7 +1865,7 @@ Q.nsend = // XXX Based on Mark Miller's proposed "send"
Q.nmcall = // XXX Based on "Redsandro's" proposal
Q.ninvoke = function (object, name /*...args*/) {
var nodeArgs = array_slice(arguments, 2);
var deferred = defer();
var deferred = Q.defer();
nodeArgs.push(deferred.makeNodeResolver());
Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
return deferred.promise;
Expand All @@ -1863,7 +1875,7 @@ Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
Promise.prototype.ninvoke = function (name /*...args*/) {
var nodeArgs = array_slice(arguments, 1);
var deferred = defer();
var deferred = Q.defer();
nodeArgs.push(deferred.makeNodeResolver());
this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
return deferred.promise;
Expand Down