blob: 566bca4324f0cb5d8db104a51450122fcb1dbae6 [file] [log] [blame]
// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Flags: --allow-natives-syntax
(function TestErrorObjectsRetainMap() {
const error1 = new Error("foo");
const error2 = new Error("bar");
assertTrue(%HaveSameMap(error1, error2));
// Trigger serialization of the stack-trace.
error1.stack;
assertTrue(%HaveSameMap(error1, error2));
error2.stack;
assertTrue(%HaveSameMap(error1, error2));
})();
(function TestPrepareStackTraceCallback() {
Error.prepareStackTrace = (error, frame) => {
return "custom stack trace No. 42";
};
const error = new Error("foo");
// Check it twice, so both code paths in the accessor are exercised.
assertEquals(error.stack, "custom stack trace No. 42");
assertEquals(error.stack, "custom stack trace No. 42");
})();
(function TestPrepareStackTraceCallbackMessesWithProperty() {
Error.prepareStackTrace = (error, frames) => {
error.stack = "Yes, we can write to this!";
return 42;
};
const error = new Error("foo");
// Check it twice. The first returns the formatting result,
// the second the value of the private symbol.
assertEquals(error.stack, 42);
assertEquals(error.stack, 42);
})();
(function TestPrepareStackTraceCallbackInstallsGetter() {
Error.prepareStackTrace = (error, frames) => {
Object.defineProperty(error, "stack", { get: () => 42 });
return "<formatted stack trace>";
};
const error = new Error("foo");
// Check it twice. The second time the accessor should be used.
assertEquals(error.stack, "<formatted stack trace>");
assertEquals(error.stack, 42);
})();
(function TestPrepareStackTraceCallbackInstallsSetter() {
Error.prepareStackTrace = (error, frames) => {
Object.defineProperty(error, "stack", { set: (x) => {
error[42] = x;
}});
return "<formatted stack trace>";
};
const error = new Error("foo");
// Cause the accessor to get installed.
error.stack;
error.stack = "Who needs stack traces anyway?";
assertEquals(error[42], "Who needs stack traces anyway?");
assertEquals(error.stack, undefined); // No getter.
})();
(function TestFormatStackPropertyInDictionaryMode() {
Error.prepareStackTrace = (error, frames) => {
return "<formatted stack trace>";
};
const error = new Error("foo");
error[%MaxSmi()] = 42;
assertTrue(%HasDictionaryElements(error));
// Check it twice.
assertEquals(error.stack, "<formatted stack trace>");
assertEquals(error.stack, "<formatted stack trace>");
})();
(function TestTransitionToDictionaryModeAfterFormatting() {
Error.prepareStackTrace = (error, frames) => {
return "<formatted stack trace>";
};
const error = new Error("foo");
assertFalse(%HasDictionaryElements(error));
assertEquals(error.stack, "<formatted stack trace>");
error[%MaxSmi()] = 42;
assertTrue(%HasDictionaryElements(error));
assertEquals(error.stack, "<formatted stack trace>");
})();