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

Reply via email to