mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-31 11:44:31 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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 function 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() {
 | |
|   function f(n) {
 | |
|     "use strict";
 | |
|     if (n === 0) {
 | |
|       callCount += 1
 | |
|       return;
 | |
|     }
 | |
|     return eval(n - 1);
 | |
|   }
 | |
|   var eval = f;
 | |
|   f($MAX_ITERATIONS);
 | |
| })();
 | |
| 
 | |
| assert.sameValue(callCount, 1);
 |