Reviewers: Søren Gjesse, Description: Do not allow accessors to intercept getting/setting properties on error objects under construction and string conversions.
Please review this at http://codereview.chromium.org/6146009/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/messages.js M test/mjsunit/error-constructors.js Index: src/messages.js =================================================================== --- src/messages.js (revision 6270) +++ src/messages.js (working copy) @@ -946,11 +946,19 @@ f.prototype.name = name; %SetCode(f, function(m) { if (%_IsConstructCall()) { + // Define all the expected properties directly on the error + // object. This avoids going through getters and setters defined + // on prototype objects. + %IgnoreAttributesAndSetProperty(this, 'stack', void 0); + %IgnoreAttributesAndSetProperty(this, 'arguments', void 0); + %IgnoreAttributesAndSetProperty(this, 'type', void 0); if (m === kAddMessageAccessorsMarker) { + %IgnoreAttributesAndSetProperty(this, 'message', void 0); DefineOneShotAccessor(this, 'message', function (obj) { return FormatMessage({type: obj.type, args: obj.arguments}); }); } else if (!IS_UNDEFINED(m)) { + %IgnoreAttributesAndSetProperty(this, 'message', void 0); this.message = ToString(m); } captureStackTrace(this, f); Index: test/mjsunit/error-constructors.js =================================================================== --- test/mjsunit/error-constructors.js (revision 6270) +++ test/mjsunit/error-constructors.js (working copy) @@ -1,4 +1,4 @@ -// Copyright 2009 the V8 project authors. All rights reserved. +// Copyright 2011 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -30,3 +30,29 @@ Error.prototype.toString = Object.prototype.toString; assertEquals("[object Error]", Error.prototype.toString()); assertEquals(Object.prototype, Error.prototype.__proto__); + +ReferenceError.prototype.__defineSetter__( + 'stack', + function(v) { assertTrue(false); }); +ReferenceError.prototype.__defineSetter__( + 'message', + function(v) { assertTrue(false); }); +ReferenceError.prototype.__defineSetter__( + 'type', + function(v) { assertTrue(false); }); +ReferenceError.prototype.__defineSetter__( + 'arguments', + function(v) { assertTrue(false); }); + +var e0 = new ReferenceError(); +var e1 = new ReferenceError('123'); +assertTrue(e1.hasOwnProperty('message')); + +assertTrue(e0.hasOwnProperty('stack')); +assertTrue(e1.hasOwnProperty('stack')); +assertTrue(e0.hasOwnProperty('type')); +assertTrue(e1.hasOwnProperty('type')); +assertTrue(e0.hasOwnProperty('arguments')); +assertTrue(e1.hasOwnProperty('arguments')); + + -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
