8.6 RunJobs ( )
抽象操作 RunJobs 执行以下步骤:
- 执行 ? InitializeHostDefinedRealm()。
- 以一种内置系统依赖的方式,获取 ECMAScript源文本(见第10节)和零个或多个 ECMAScript 脚本 和/或 ECMAScript 模块的任何相关的主机定义的值。 对于每个这样的 sourceText 和 hostDefined,
a. 如果sourceText是脚本的源代码,那么 i. 执行 EnqueueJob("ScriptJobs", ScriptEvaluationJob, « sourceText, hostDefined »)。
b. 否则 sourceText是模块的源代码,
i. 执行 EnqueueJob("ScriptJobs", TopLevelModuleEvaluationJob, « sourceText, hostDefined »)。
3.重复
a. 中止(Suspend )正在运行的执行上下文并将其从执行上下文堆栈中删除。
b. 断言:执行上下文堆栈现在为空。
c. 让 nextQueue 是以内置系统定义的方式选择的非空作业队列。 如果所有作业队列为空,则结果为内置系统定义。
d. 让 nextPending 是 nextQueue 前面的 PendingJob 记录。 从 nextQueue 中删除该记录。
e. 让 newContext 成为一个新的执行上下文。
f. 设置 newContext's _Function 为 null_。
g. 设置 newContext's _Realm 为 _nextPending.[[Realm]]。
h. 设置 newContext's _ScriptOrModule 为 _nextPending.[[ScriptOrModule]]。
i. 将 newContext 推送到执行上下文堆栈; newContext 现在是运行的执行上下文。
j. 使用 nextPending 执行任何内置系统或主机环境定义的作业初始化。
k. 让 result 是执行由 nextPending 命名的抽象操作的结果 [[Job]],使用 nextPending 的元素 [[Arguments]] 作为其参数。
l. 如果 result 是 abrupt completion,请执行HostReportErrors(«result。[[Value]]»)。