// 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); }