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

Reply via email to