2019-04-15 13:16:57 +00:00
|
|
|
// 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.
|
|
|
|
})();
|
2019-06-11 07:36:18 +00:00
|
|
|
|
|
|
|
(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>");
|
|
|
|
})();
|