
The previous handling of the name and message properties specifically was breaking websites that created their own error types and relied on the error prototype working correctly - not assuming an JS::Error this object, that is. The way it works now, and it is supposed to work, is: - Error.prototype.name and Error.prototype.message just have initial string values and are no longer getters/setters - When constructing an error with a message, we create a regular property on the newly created object, so a lookup of the message property will either get it from the object directly or go though the prototype chain - Internal m_name/m_message properties are no longer needed and removed This makes printing errors slightly more complicated, as we can no longer rely on the (safe) internal properties, and cannot trust a property lookup either - get_without_side_effects() is used to solve this, it's not perfect but something we can revisit later. I did some refactoring along the way, there was some really old stuff in there - accessing vm.call_frame().arguments[0] is not something we (have to) do anymore :^) Fixes #6245.
21 lines
603 B
JavaScript
21 lines
603 B
JavaScript
test("infinite recursion", () => {
|
|
function infiniteRecursion() {
|
|
infiniteRecursion();
|
|
}
|
|
|
|
try {
|
|
infiniteRecursion();
|
|
} catch (e) {
|
|
expect(e).toBeInstanceOf(Error);
|
|
expect(e.name).toBe("Error");
|
|
expect(e.message).toBe("Call stack size limit exceeded");
|
|
}
|
|
|
|
expect(() => {
|
|
JSON.stringify({}, () => ({ foo: "bar" }));
|
|
}).toThrowWithMessage(Error, "Call stack size limit exceeded");
|
|
|
|
expect(() => {
|
|
new Proxy({}, { get: (_, __, p) => p.foo }).foo;
|
|
}).toThrowWithMessage(Error, "Call stack size limit exceeded");
|
|
});
|