diff --git a/spec.html b/spec.html
index acdd9d74e0..f1e6d53a36 100644
--- a/spec.html
+++ b/spec.html
@@ -19444,7 +19444,7 @@
Runtime Semantics: Evaluation
1. If _argList_ has no elements, return *undefined*.
1. Let _evalArg_ be the first element of _argList_.
1. If IsStrict(this |CallExpression|) is *true*, let _strictCaller_ be *true*; else let _strictCaller_ be *false*.
- 1. [id="step-callexpression-evaluation-direct-eval"] Return ? PerformEval(_evalArg_, _strictCaller_, *true*).
+ 1. [id="step-callexpression-evaluation-direct-eval"] Return ? PerformEval(_evalArg_, _strictCaller_, ~direct-eval~).
1. Let _thisCall_ be this |CallExpression|.
1. Let _tailCall_ be IsInTailPosition(_thisCall_).
1. Return ? EvaluateCall(_func_, _ref_, _arguments_, _tailCall_).
@@ -29808,7 +29808,7 @@ eval ( _source_ )
This function is the %eval% intrinsic object.
It performs the following steps when called:
- 1. Return ? PerformEval(_source_, *false*, *false*).
+ 1. Return ? PerformEval(_source_, *false*, ~indirect-eval~).
@@ -29816,22 +29816,29 @@
PerformEval (
_source_: an ECMAScript language value,
_strictCaller_: a Boolean,
- _direct_: a Boolean,
+ _direct_: ~direct-eval~ or ~indirect-eval~,
): either a normal completion containing an ECMAScript language value or a throw completion
- 1. Assert: If _direct_ is *false*, then _strictCaller_ is also *false*.
- 1. If _source_ is not a String, return _source_.
+ 1. Assert: If _direct_ is ~indirect-eval~, then _strictCaller_ is *false*.
+ 1. If _source_ is a String, then
+ 1. Let _sourceStr_ be _source_.
+ 1. Else if _source_ is an Object, then
+ 1. Let _code_ be HostGetCodeForEval(_source_).
+ 1. If _code_ is a String, let _sourceStr_ be _code_.
+ 1. Else, return _source_.
+ 1. Else,
+ 1. Return _source_.
1. Let _evalRealm_ be the current Realm Record.
1. NOTE: In the case of a direct eval, _evalRealm_ is the realm of both the caller of `eval` and of the `eval` function itself.
- 1. Perform ? HostEnsureCanCompileStrings(_evalRealm_, « », _source_, _direct_).
+ 1. Perform ? HostEnsureCanCompileStrings(_evalRealm_, « », _sourceStr_, _sourceStr_, _direct_, « », _source_).
1. Let _inFunction_ be *false*.
1. Let _inMethod_ be *false*.
1. Let _inDerivedConstructor_ be *false*.
1. Let _inClassFieldInitializer_ be *false*.
- 1. If _direct_ is *true*, then
+ 1. If _direct_ is ~direct-eval~, then
1. Let _thisEnvRec_ be GetThisEnvironment().
1. If _thisEnvRec_ is a Function Environment Record, then
1. Let _func_ be _thisEnvRec_.[[FunctionObject]].
@@ -29841,7 +29848,7 @@
1. Let _classFieldInitializerName_ be _func_.[[ClassFieldInitializerName]].
1. If _classFieldInitializerName_ is not ~empty~, set _inClassFieldInitializer_ to *true*.
1. Perform the following substeps in an implementation-defined order, possibly interleaving parsing and error detection:
- 1. Let _script_ be ParseText(_source_, |Script|).
+ 1. Let _script_ be ParseText(_sourceStr_, |Script|).
1. If _script_ is a List of errors, throw a *SyntaxError* exception.
1. If _script_ Contains |ScriptBody| is *false*, return *undefined*.
1. Let _body_ be the |ScriptBody| of _script_.
@@ -29852,8 +29859,8 @@
1. If _strictCaller_ is *true*, let _strictEval_ be *true*.
1. Else, let _strictEval_ be ScriptIsStrict of _script_.
1. Let _runningContext_ be the running execution context.
- 1. NOTE: If _direct_ is *true*, _runningContext_ will be the execution context that performed the direct eval. If _direct_ is *false*, _runningContext_ will be the execution context for the invocation of the `eval` function.
- 1. If _direct_ is *true*, then
+ 1. NOTE: If _direct_ is ~direct-eval~, _runningContext_ will be the execution context that performed the direct eval. If _direct_ is ~indirect-eval~, _runningContext_ will be the execution context for the invocation of the `eval` function.
+ 1. If _direct_ is ~direct-eval~, then
1. Let _lexEnv_ be NewDeclarativeEnvironment(_runningContext_'s LexicalEnvironment).
1. Let _varEnv_ be _runningContext_'s VariableEnvironment.
1. Let _privateEnv_ be _runningContext_'s PrivateEnvironment.
@@ -29891,7 +29898,10 @@
_calleeRealm_: a Realm Record,
_parameterStrings_: a List of Strings,
_bodyString_: a String,
- _direct_: a Boolean,
+ _codeString_: a String,
+ _compilationType_: ~direct-eval~, ~indirect-eval~, or ~function~,
+ _parameterArgs: a List of ECMAScript language values,
+ _bodyArg_: an ECMAScript language value,
): either a normal completion containing ~unused~ or a throw completion
- _parameterStrings_ represents the strings that, when using one of the function constructors, will be concatenated together to build the parameters list. _bodyString_ represents the function body or the string passed to an `eval` call.
- _direct_ signifies whether the evaluation is a direct eval.
+ _parameterStrings_ represents the strings that, when using one of the function constructors, will be concatenated together to build the parameters list.
+ _bodyString_ represents the function body or the string passed to an `eval` call.
+ _codeString_ represents the compiled string for a Function or the string passed to an `eval` call.
+ _parameterArgs_ are the values passed as the leading parameters to one of the Function constructors. _bodyArg_ is either the final parameter passed to one of the Function constructors or the value passed to an `eval` call.
The default implementation of HostEnsureCanCompileStrings is to return NormalCompletion(~unused~).
+
+
+ HostGetCodeForEval (
+ _argument_: an Object,
+ ): a String or ~no-code~
+
+
+ _argument_ represents the Object to be checked for code.
+ The default implementation of HostGetCodeForEval is to return ~no-code~.
+
+
EvalDeclarationInstantiation (
@@ -31179,7 +31205,6 @@
1. Append ? ToString(_arg_) to _parameterStrings_.
1. Let _bodyString_ be ? ToString(_bodyArg_).
1. Let _currentRealm_ be the current Realm Record.
- 1. Perform ? HostEnsureCanCompileStrings(_currentRealm_, _parameterStrings_, _bodyString_, *false*).
1. Let _parameterString_ be the empty String.
1. If _argCount_ > 0, then
1. Set _parameterString_ to _parameterStrings_[0].
@@ -31190,6 +31215,7 @@
1. Set _k_ to _k_ + 1.
1. Let _bodyParseString_ be the string-concatenation of 0x000A (LINE FEED), _bodyString_, and 0x000A (LINE FEED).
1. Let _sourceString_ be the string-concatenation of _prefix_, *" anonymous("*, _parameterString_, 0x000A (LINE FEED), *") {"*, _bodyParseString_, and *"}"*.
+ 1. Perform ? HostEnsureCanCompileStrings(_currentRealm_, _parameterStrings_, _bodyString_, _sourceString_, ~function~, _parameterArgs_, _bodyArg_).
1. Let _sourceText_ be StringToCodePoints(_sourceString_).
1. Let _parameters_ be ParseText(_parameterString_, _parameterSym_).
1. If _parameters_ is a List of errors, throw a *SyntaxError* exception.
@@ -53683,6 +53709,7 @@ Host Hooks
HostGetImportMetaProperties(...)
HostGrowSharedArrayBuffer(...)
HostHasSourceTextAvailable(...)
+ HostGetCodeForEval(...)
HostLoadImportedModule(...)
HostGetSupportedImportAttributes(...)
HostMakeJobCallback(...)