This is actually pretty well covered already -- as I discovered when I started making changes to it.
On Mon, Mar 9, 2009 at 1:40 PM, Kasper Lund <[email protected]> wrote: > > Maybe we should have a few test cases to go along with this change? > > On Mon, Mar 9, 2009 at 1:39 PM, <[email protected]> wrote: >> >> Reviewers: Mads Ager, >> >> Description: >> Added .message accessor to messages. This gives you the same >> descriptive message as is used to construct the toString() for an >> error object. >> >> Please review this at http://codereview.chromium.org/40293 >> >> Affected files: >> M src/messages.js >> >> >> Index: src/messages.js >> diff --git a/src/messages.js b/src/messages.js >> index >> d5adbc931430b755112f7daecc275da9df7e7b47..6ef97504d828627f7051e254c4b1b6c02673a2b0 >> 100644 >> --- a/src/messages.js >> +++ b/src/messages.js >> @@ -153,7 +153,7 @@ function MakeGenericError(constructor, type, args) { >> args = []; >> } >> >> - var e = new constructor(); >> + var e = new constructor(kAddMessageAccessorsMarker); >> e.type = type; >> e.arguments = args; >> return e; >> @@ -589,6 +589,29 @@ function UnsafeGetStackTraceLine(recv, fun, pos, >> isTopLevel) { >> // >> ---------------------------------------------------------------------------- >> // Error implementation >> >> +// If this object gets passed to an error constructor the error will >> +// get an accessor for .message that constructs a descriptive error >> +// message on access. >> +var kAddMessageAccessorsMarker = { }; >> + >> +// Defines accessors for a property that is calculated the first time >> +// the property is read and then replaces the accessor with the value. >> +// Also, setting the property causes the accessors to be deleted. >> +function DefineOneShotAccessor(obj, name, fun) { >> + // Note that the accessors consistently operate on 'obj', not 'this'. >> + // Since the object may occur in someone else's prototype chain we >> + // can't rely on 'this' being the same as 'obj'. >> + obj.__defineGetter__(name, function () { >> + var value = fun(obj); >> + obj[name] = value; >> + return value; >> + }); >> + obj.__defineSetter__(name, function (v) { >> + delete obj[name]; >> + obj[name] = v; >> + }); >> +} >> + >> function DefineError(f) { >> // Store the error function in both the global object >> // and the runtime object. The function is fetched >> @@ -607,7 +630,13 @@ function DefineError(f) { >> f.prototype.name = name; >> %SetCode(f, function(m) { >> if (%IsConstructCall()) { >> - if (!IS_UNDEFINED(m)) this.message = ToString(m); >> + if (m === kAddMessageAccessorsMarker) { >> + DefineOneShotAccessor(this, 'message', function (obj) { >> + return FormatMessage({type: obj.type, args: obj.arguments}); >> + }); >> + } else if (!IS_UNDEFINED(m)) { >> + this.message = ToString(m); >> + } >> } else { >> return new f(m); >> } >> >> >> >> > >> > > > > --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
