diff options
Diffstat (limited to 'js/src/tests/test262/language/expressions/call/tco-non-eval-global.js')
-rw-r--r-- | js/src/tests/test262/language/expressions/call/tco-non-eval-global.js | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/js/src/tests/test262/language/expressions/call/tco-non-eval-global.js b/js/src/tests/test262/language/expressions/call/tco-non-eval-global.js new file mode 100644 index 0000000000..9587c817b9 --- /dev/null +++ b/js/src/tests/test262/language/expressions/call/tco-non-eval-global.js @@ -0,0 +1,46 @@ +// |reftest| skip -- tail-call-optimization is not supported +// Copyright (C) 2017 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-function-calls-runtime-semantics-evaluation +description: > + Tail-call with identifier named "eval" in global environment. +info: | + 12.3.4.1 Runtime Semantics: Evaluation + ... + 6. If Type(ref) is Reference and IsPropertyReference(ref) is false and + GetReferencedName(ref) is "eval", then + a. If SameValue(func, %eval%) is true, then + ... + ... + 9. Return ? EvaluateCall(func, ref, arguments, tailCall). + + 12.3.4.2 Runtime Semantics: EvaluateCall( func, ref, arguments, tailPosition ) + ... + 7. If tailPosition is true, perform PrepareForTailCall(). + 8. Let result be Call(func, thisValue, argList). + ... + +flags: [noStrict] +features: [tail-call-optimization] +includes: [tcoHelper.js] +---*/ + +var callCount = 0; + +function f(n) { + "use strict"; + if (n === 0) { + callCount += 1 + return; + } + return eval(n - 1); +} +eval = f; + +f($MAX_ITERATIONS); + +assert.sameValue(callCount, 1); + +reportCompare(0, 0); |