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 -~----------~----~----~----~------~----~------~--~---
