From 273796d321e4763859e39bc790c710e303822b90 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Sat, 25 Dec 2010 06:53:51 -0500 Subject: [PATCH] Fix reported file/line in failed assertions. --- common/content/options.js | 6 +----- common/modules/base.jsm | 22 +++++++++++++++++++++- common/modules/util.jsm | 9 ++------- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/common/content/options.js b/common/content/options.js index 843c413c..1f06f7e0 100644 --- a/common/content/options.js +++ b/common/content/options.js @@ -8,11 +8,7 @@ /** @scope modules */ -let ValueError = Class("ValueError", Error, { - init: function (message) { - update(this, Error(message)); - } -}); +let ValueError = Class("ValueError", ErrorBase); // do NOT create instances of this class yourself, use the helper method // options.add() instead diff --git a/common/modules/base.jsm b/common/modules/base.jsm index f0b4048c..35ff5875 100644 --- a/common/modules/base.jsm +++ b/common/modules/base.jsm @@ -176,7 +176,7 @@ function require(obj, name, from) { defineModule("base", { // sed -n 's/^(const|function) ([a-zA-Z0-9_]+).*/ "\2",/p' base.jsm | sort | fmt exports: [ - "Cc", "Ci", "Class", "Cr", "Cu", "Module", "Object", "Runnable", + "ErrorBase", "Cc", "Ci", "Class", "Cr", "Cu", "Module", "Object", "Runnable", "Struct", "StructBase", "Timer", "UTF8", "XPCOM", "XPCOMUtils", "array", "call", "callable", "ctypes", "curry", "debuggerProperties", "defineModule", "deprecated", "endModule", "forEach", "isArray", "isGenerator", @@ -857,6 +857,26 @@ function XPCOM(interfaces, superClass) { return res; } +/** + * An abstract base class for classes that wish to inherit from Error. + */ +const ErrorBase = Class("ErrorBase", Error, { + level: 2, + init: function (message, level) { + level = level || 0; + update(this, Error(message)) + this.message = message; + + let frame = Components.stack; + for (let i = 0; i < this.level + level; i++) { + frame = frame.caller; + this.stack = this.stack.replace(/^.*\n/, ""); + } + this.fileName = frame.filename; + this.lineNumber = frame.lineNumber; + } +}); + /** * Constructs a new Module class and instantiates an instance into the current * module global object. diff --git a/common/modules/util.jsm b/common/modules/util.jsm index a5c12827..83505ecb 100644 --- a/common/modules/util.jsm +++ b/common/modules/util.jsm @@ -28,12 +28,7 @@ memoize(this, "Commands", function () { return obj.Commands; }); -const FailedAssertion = Class("FailedAssertion", Error, { - init: function (message) { - update(this, Error(message)) - this.message = message; - } -}); +const FailedAssertion = Class("FailedAssertion", ErrorBase); function wrapCallback(fn) fn.wrapper = function wrappedCallback () { @@ -125,7 +120,7 @@ const Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]) */ assert: function (condition, message) { if (!condition) - throw FailedAssertion(message); + throw FailedAssertion(message, 1); }, get chromePackages() {