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