// 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. (function() { const kErrorCount = 100000; let errorsCreatedBySetup; function CreateErrors(fn) { counter = 0; errorsCreatedBySetup = []; for (let i = 0; i < kErrorCount; ++i) { errorsCreatedBySetup[i] = fn(); } } function SimpleSetup() { CreateErrors(() => new Error("Simple Error")); } class CustomError extends Error {}; function CustomSetup() { CreateErrors(() => new CustomError("Custom Error")); } function InlineSetup() { function Inner() { return new Error("Throwing from inlined function!"); } function Middle() { return Inner(); } function Outer() { return Middle(); } %PrepareFunctionForOptimization(Outer); Outer(); Outer(); %OptimizeFunctionOnNextCall(Outer); Outer(); CreateErrors(() => Outer()); } const kInitialRecursionValue = 12; function RecursiveSetup() { counter = 0; errorsCreatedBySetup = []; function StepOne(val) { if (val <= 0) { errorsCreatedBySetup.push(new Error("Error in StepOne!")); return; } StepTwo(val - 3); StepTwo(val - 4); } function StepTwo(val) { if (val <= 0) { errorsCreatedBySetup.push(new Error("Error in StepTwo!")); return; } StepOne(val - 1); StepOne(val - 2); } while (errorsCreatedBySetup.length < kErrorCount) { StepOne(kInitialRecursionValue); } } let counter; function SerializeStack() { if (counter < errorsCreatedBySetup.length) { // Trigger serialization by accessing Error.stack. %FlattenString(errorsCreatedBySetup[counter++].stack); } else { // All errors are serialized. The stack trace string is now cached, so // re-iterating the array is a simple property lookup. Instead, // a simple Error object is created and serialized, otherwise the benchmark // result would fluctuate heavily if it reaches the end. %FlattenString(new Error().stack); } } createSuite('Simple-Serialize-Error.stack', 1000, SerializeStack, SimpleSetup); createSuite('Custom-Serialize-Error.stack', 1000, SerializeStack, CustomSetup); createSuite('Inline-Serialize-Error.stack', 1000, SerializeStack, InlineSetup); createSuite('Recursive-Serialize-Error.stack', 1000, SerializeStack, RecursiveSetup); })();