node/deps/v8/test/js-perf-test/ExpressionDepth/run.js
Michaël Zasso d8c97e4857
deps: update V8 to 11.9.169.7
PR-URL: https://github.com/nodejs/node/pull/50115
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Michael Dawson <midawson@redhat.com>
2024-01-04 09:30:13 +01:00

91 lines
2.5 KiB
JavaScript

// Copyright 2017 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.
// Logical Expressions
AddTest('Or-Value', '||', false);
AddTest('Or-Test', '||', true);
AddTest('And-Value', '&&', false);
AddTest('And-Test', '&&', true);
AddTest('Comma-Value', ',', false);
AddTest('Comma-Test', ',', true);
AddTest('Comma-Test', ',', true);
// Compare Expressions
AddTest('Equals-Value', '==', false);
AddTest('Equals-Test', '==', true);
AddTest('StrictEquals-Value', '===', false);
AddTest('StrictEquals-Test', '===', true);
AddTest('GreaterThan-Value', '>', false);
AddTest('GreaterThan-Test', '>', true);
// Binary Expressions
AddTest('Add', '+');
AddTest('Sub', '-');
AddTest('BitwiseOr', '|');
AddTestCustomPrologue('StringConcat', '+', '"string" +');
AddTestCustomPrologue('TemplateString', '} ${', '`${', '}`');
function TestExpressionDepth(depth, expression, prologue, epilogue) {
var func = '(function f(a) {\n' + prologue;
for (var i = 0; i < depth; i++) {
func += 'a ' + expression;
}
func += 'a' + epilogue + '})();'
eval(func);
}
function RunTest(name, expression, prologue, epilogue) {
var low_depth = 0;
var high_depth = 1;
// Find the upper limit where depth breaks down.
try {
while (high_depth <= 65536) {
TestExpressionDepth(high_depth, expression, prologue, epilogue);
low_depth = high_depth;
high_depth *= 4;
}
// Looks like we can't get the depth to break down, just report
// the maximum depth tested.
print(name + '-ExpressionDepth(Score): ' + low_depth);
return;
} catch (e) {
if (!(e instanceof RangeError)) {
print(name + '-ExpressionDepth(Score): ERROR');
return;
}
}
// Binary search the actual limit.
while (low_depth + 1 < high_depth) {
var mid_depth = Math.round((low_depth + high_depth) / 2);
try {
TestExpressionDepth(mid_depth, expression, prologue, epilogue);
low_depth = mid_depth;
} catch (e) {
if (!(e instanceof RangeError)) {
print(name + '-ExpressionDepth(Score): ERROR');
return;
}
high_depth = mid_depth;
}
}
print(name + '-ExpressionDepth(Score): ' + low_depth);
}
function AddTest(name, expression, in_test) {
prologue = '';
epilogue = '';
if (in_test) {
prologue = 'if (';
epilogue = ') { return 1; }';
}
RunTest(name, expression, prologue, epilogue);
}
function AddTestCustomPrologue(name, expression, prologue, epilogue='') {
RunTest(name, expression, prologue, epilogue);
}