diff options
author | isaacs <i@izs.me> | 2012-05-15 19:53:16 -0700 |
---|---|---|
committer | isaacs <i@izs.me> | 2012-05-16 14:22:33 -0700 |
commit | 3f3f958c14cf4e963a73d6f037ac381c77fe78bb (patch) | |
tree | 391e35b59e76d038534fbd375f1bbe0dc55076cf /deps/v8/test/mjsunit/error-constructors.js | |
parent | 4099d1eebae4e78864a6879c0b9e08f31d48d8cb (diff) | |
download | node-new-3f3f958c14cf4e963a73d6f037ac381c77fe78bb.tar.gz |
Upgrade V8 to 3.11.1
Diffstat (limited to 'deps/v8/test/mjsunit/error-constructors.js')
-rw-r--r-- | deps/v8/test/mjsunit/error-constructors.js | 101 |
1 files changed, 68 insertions, 33 deletions
diff --git a/deps/v8/test/mjsunit/error-constructors.js b/deps/v8/test/mjsunit/error-constructors.js index 966a1629d7..107164df56 100644 --- a/deps/v8/test/mjsunit/error-constructors.js +++ b/deps/v8/test/mjsunit/error-constructors.js @@ -25,39 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -var e = new Error(); -assertFalse(e.hasOwnProperty('message')); -Error.prototype.toString = Object.prototype.toString; -assertEquals("[object Error]", Error.prototype.toString()); -assertEquals(Object.prototype, Error.prototype.__proto__); - -// Check that error construction does not call setters for the -// properties on error objects in prototypes. -function fail() { assertTrue(false); }; -ReferenceError.prototype.__defineSetter__('stack', fail); -ReferenceError.prototype.__defineSetter__('message', fail); -ReferenceError.prototype.__defineSetter__('type', fail); -ReferenceError.prototype.__defineSetter__('arguments', fail); -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')); - -// Check that the name property on error prototypes is read-only and -// dont-delete. This is not specified, but allowing overwriting the -// name property with a getter can leaks error objects from different -// script tags in the same context in a browser setting. We therefore -// disallow changes to the name property on error objects. -assertEquals("ReferenceError", ReferenceError.prototype.name); -delete ReferenceError.prototype.name; -assertEquals("ReferenceError", ReferenceError.prototype.name); -ReferenceError.prototype.name = "not a reference error"; -assertEquals("ReferenceError", ReferenceError.prototype.name); +// Flags: --allow-natives-syntax // Check that message and name are not enumerable on Error objects. var desc = Object.getOwnPropertyDescriptor(Error.prototype, 'name'); @@ -75,8 +43,75 @@ assertFalse(desc['enumerable']); desc = Object.getOwnPropertyDescriptor(e, 'stack'); assertFalse(desc['enumerable']); +var e = new Error(); +assertFalse(e.hasOwnProperty('message')); + // name is not tested above, but in addition we should have no enumerable // properties, so we simply assert that. for (var v in e) { assertUnreachable(); } + +// Check that error construction does not call setters for the +// properties on error objects in prototypes. +function fail() { assertUnreachable(); }; +ReferenceError.prototype.__defineSetter__('name', fail); +ReferenceError.prototype.__defineSetter__('message', fail); +ReferenceError.prototype.__defineSetter__('type', fail); +ReferenceError.prototype.__defineSetter__('arguments', fail); +ReferenceError.prototype.__defineSetter__('stack', fail); + +var e = new ReferenceError(); +assertTrue(e.hasOwnProperty('stack')); +assertTrue(e.hasOwnProperty('type')); +assertTrue(e.hasOwnProperty('arguments')); + +var e = new ReferenceError('123'); +assertTrue(e.hasOwnProperty('message')); +assertTrue(e.hasOwnProperty('stack')); +assertTrue(e.hasOwnProperty('type')); +assertTrue(e.hasOwnProperty('arguments')); + +var e = %MakeReferenceError("my_test_error", [0, 1]); +assertTrue(e.hasOwnProperty('stack')); +assertTrue(e.hasOwnProperty('type')); +assertTrue(e.hasOwnProperty('arguments')); +assertEquals("my_test_error", e.type) + +// Check that intercepting property access from toString is prevented for +// compiler errors. This is not specified, but allowing interception +// through a getter can leak error objects from different +// script tags in the same context in a browser setting. +var errors = [SyntaxError, ReferenceError, TypeError]; +for (var i in errors) { + var name = errors[i].prototype.toString(); + // Monkey-patch prototype. + var props = ["name", "message", "type", "arguments", "stack"]; + for (var j in props) { + errors[i].prototype.__defineGetter__(props[j], fail); + } + // String conversion should not invoke monkey-patched getters on prototype. + var e = new errors[i]; + assertEquals(name, e.toString()); + // Custom getters in actual objects are welcome. + e.__defineGetter__("name", function() { return "mine"; }); + assertEquals("mine", e.toString()); +} + +// Monkey-patching non-static errors should still be observable. +function MyError() {} +MyError.prototype = new Error; +var errors = [Error, RangeError, EvalError, URIError, MyError]; +for (var i in errors) { + errors[i].prototype.__defineGetter__("name", function() { return "my"; }); + errors[i].prototype.__defineGetter__("message", function() { return "moo"; }); + var e = new errors[i]; + assertEquals("my: moo", e.toString()); +} + + +Error.prototype.toString = Object.prototype.toString; +assertEquals("[object Error]", Error.prototype.toString()); +assertEquals(Object.prototype, Error.prototype.__proto__); +var e = new Error("foo"); +assertEquals("[object Error]", e.toString()); |