| //------------------------------------------------------------------------------------------------------- | |
| // Copyright (C) Microsoft. All rights reserved. | |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
| //------------------------------------------------------------------------------------------------------- | |
| if (this.WScript && this.WScript.LoadScriptFile) { | |
| this.WScript.LoadScriptFile("LongCallStackThrow.js"); | |
| } | |
| Dump("-- Error.stackTraceLimit property descriptor"); | |
| var desc = Object.getOwnPropertyDescriptor(Error, "stackTraceLimit"); | |
| for(var p in desc) { | |
| Dump(p + ": " + desc[p]); | |
| } | |
| Dump(""); | |
| function testLongCallStack(limit, noHeader) { | |
| if (limit !== undefined) { | |
| Error.stackTraceLimit = 7; // if next assignment is rejected | |
| Error.stackTraceLimit = limit; | |
| } | |
| if (!noHeader) { Dump("-- Error.stackTraceLimit: " + String(Error.stackTraceLimit)); } | |
| runtest(30); | |
| Dump(""); | |
| } | |
| testLongCallStack(); | |
| testLongCallStack(4); | |
| testLongCallStack(Infinity); | |
| testLongCallStack(1); | |
| testLongCallStack(20); | |
| testLongCallStack(5.1); | |
| testLongCallStack(-1); | |
| testLongCallStack(-3.2); | |
| testLongCallStack(-Infinity); | |
| testLongCallStack(0); | |
| testLongCallStack(+0); | |
| testLongCallStack(-0); | |
| testLongCallStack(Number.NaN); | |
| testLongCallStack("not a number"); | |
| testLongCallStack(new Object()); | |
| Error.stackTraceLimit = 8; | |
| Dump("-- preset Error.stackTraceLimit: " + Error.stackTraceLimit); | |
| Dump(""); | |
| Dump("--Reconfigure to a getter"); | |
| Object.defineProperty(Error, "stackTraceLimit", { | |
| get: function () { | |
| Dump("** Custom stackTraceLimit getter Called, return 3"); | |
| return 3; | |
| }, | |
| configurable: true | |
| }); | |
| testLongCallStack(undefined, true); | |
| Dump("--Delete it"); | |
| delete Error.stackTraceLimit; | |
| testLongCallStack(); | |
| Dump("--Available on prototype"); | |
| Function.prototype.stackTraceLimit = 2; | |
| testLongCallStack(); | |
| Dump("--Set to data property again"); | |
| Error.stackTraceLimit = 5; | |
| testLongCallStack(); | |
| Dump("--Throw in getter"); | |
| Object.defineProperty(Error, "stackTraceLimit", { | |
| get: function () { | |
| Dump("** Custom stackTraceLimit getter Called, throw"); | |
| throw "My error in custom stackTraceLimit getter"; | |
| }, | |
| configurable: true | |
| }); | |
| testLongCallStack(undefined, true); | |
| Dump("--Throw new Error() in getter"); | |
| Object.defineProperty(Error, "stackTraceLimit", { | |
| get: function () { | |
| throw new Error("My error in custom stackTraceLimit getter"); | |
| }, | |
| configurable: true | |
| }); | |
| testLongCallStack(undefined, true); | |
| Dump("--Throw new Error() in getter for a number of times"); | |
| var throwErrorCount = 4; | |
| Object.defineProperty(Error, "stackTraceLimit", { | |
| get: function () { | |
| if (throwErrorCount-- > 0) { | |
| throw new Error("My error in custom stackTraceLimit getter"); | |
| } else { | |
| return -1; | |
| } | |
| }, | |
| configurable: true | |
| }); | |
| testLongCallStack(undefined, true); | |
| // Some more tests of different types (appending here to avoid affecting above tests' baseline) | |
| delete Error.stackTraceLimit; | |
| var moreTests = [ | |
| null, | |
| undefined, | |
| true, | |
| false, | |
| new Boolean(true), | |
| new Boolean(false), | |
| "4", | |
| new String("5"), | |
| new Number(6), | |
| new Number(Number.NaN), | |
| new Number(Number.Infinity), | |
| new Number(-2), | |
| [], | |
| [1, 2, 3], | |
| {}, | |
| { valueOf: function () { return 2; }, toString: function () { return "valueOf override"; } }, | |
| { valueOf: function () { throw new Error("evil"); }, toString: function () { return "valueOf override throw"; } }, | |
| ]; | |
| moreTests.forEach(function (x) { | |
| if (x === undefined) { | |
| Error.stackTraceLimit = undefined; | |
| } | |
| testLongCallStack(x); | |
| }); |