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