summaryrefslogtreecommitdiff
path: root/test/language/expressions/optional-chaining/eval-optional-call.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/language/expressions/optional-chaining/eval-optional-call.js')
-rw-r--r--test/language/expressions/optional-chaining/eval-optional-call.js39
1 files changed, 39 insertions, 0 deletions
diff --git a/test/language/expressions/optional-chaining/eval-optional-call.js b/test/language/expressions/optional-chaining/eval-optional-call.js
new file mode 100644
index 000000000..3fa59bcbc
--- /dev/null
+++ b/test/language/expressions/optional-chaining/eval-optional-call.js
@@ -0,0 +1,39 @@
+// Copyright 2020 Toru Nagashima. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-optional-chaining-chain-evaluation
+description: optional call invoked on eval function should be indirect eval.
+info: |
+ Runtime Semantics: ChainEvaluation
+ OptionalChain: ?. Arguments
+ 1. Let thisChain be this OptionalChain.
+ 2. Let tailCall be IsInTailPosition(thisChain).
+ 3. Return ? EvaluateCall(baseValue, baseReference, Arguments, tailCall).
+
+ Runtime Semantics: EvaluateCall ( func, ref, arguments, tailPosition )
+
+ ...
+ 7. Let result be Call(func, thisValue, argList).
+ ...
+
+ eval ( x )
+
+ ...
+ 4. Return ? PerformEval(x, callerRealm, false, false).
+
+ Runtime Semantics: PerformEval ( x, callerRealm, strictCaller, direct )
+features: [optional-chaining]
+---*/
+
+const a = 'global';
+
+function fn() {
+ const a = 'local';
+ return eval?.('a');
+}
+
+assert.sameValue(fn(), 'global', 'fn() returns "global" value from indirect eval');
+
+const b = (a => eval?.('a'))('local');
+
+assert.sameValue(b, 'global', 'b is "global", from indirect eval not observing parameter');