[webkit-changes] [WebKit/WebKit] a4c523: [JSC] Implement Annex B block-level function hoist...

Commit Queue noreply at github.com
Wed Sep 27 17:47:17 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: a4c5231dbae7cb9180fc5c02f8438bcce3f2cd52
      https://github.com/WebKit/WebKit/commit/a4c5231dbae7cb9180fc5c02f8438bcce3f2cd52
  Author: Alexey Shvayka <ashvayka at apple.com>
  Date:   2023-09-27 (Wed, 27 Sep 2023)

  Changed paths:
    M JSTests/mozilla/ecma_3/Function/scope-001.js
    M JSTests/mozilla/js1_5/Scope/regress-184107.js
    M JSTests/mozilla/mozilla-tests.yaml
    M JSTests/stress/can-declare-global-function-invoked-before-any-func-decl-is-hoisted-eval.js
    A JSTests/stress/can-declare-global-function-invoked-before-any-func-decl-is-hoisted-global.js
    M JSTests/stress/can-declare-global-var-invoked-before-any-func-decl-is-hoisted-eval.js
    A JSTests/stress/can-declare-global-var-invoked-before-any-func-decl-is-hoisted-global.js
    M JSTests/stress/can-declare-global-var-invoked-during-func-decl-hoisting-eval.js
    A JSTests/stress/can-declare-global-var-invoked-during-func-decl-hoisting-global.js
    A JSTests/stress/sloppy-mode-function-hoisting-global-code-2.js
    A JSTests/stress/sloppy-mode-function-hoisting-global-code.js
    M JSTests/stress/sloppy-mode-function-hoisting.js
    M JSTests/test262/expectations.yaml
    M LayoutTests/accessibility/insert-children-assert.html
    M LayoutTests/fast/dom/MutationObserver/disconnect-observer-while-mutation-records-are-enqueued-crash.html
    M LayoutTests/imported/w3c/web-platform-tests/html/semantics/popovers/popover-types-with-hints.tentative-expected.txt
    M Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
    M Source/JavaScriptCore/parser/Parser.cpp
    M Source/JavaScriptCore/parser/Parser.h
    M Source/JavaScriptCore/runtime/ProgramExecutable.cpp

  Log Message:
  -----------
  [JSC] Implement Annex B block-level function hoisting for global scope
https://bugs.webkit.org/show_bug.cgi?id=163209
<rdar://problem/53234438>

Reviewed by Yusuke Suzuki.

This change expands existing (and recently revamped) block-level function hoisting infrastructure
to global scope code, removing the extremely troublesome hack that used to unconditionally set the
scope of a block-level function declaration in global code to the top-level `var` scope instead of
lexical, which caused plenty of bug reports.

GlobalDeclarationInstantiation [1] implementation was tweaked to properly handle all the "phantom"
isSloppyModeHoistedFunction() variables, which are used merely to compute used / captured variables,
and not treat them like `var`s to avoid throwing spec-noncompliant errors.

Since there is no way to account for lexical declarations from another <script> in the parser [2],
nor for non-extensible global object, emitResolveScopeForHoistingFuncDeclInEval() for global code
has to emit same unresolved scope check as for declarations in eval().

Aligns JSC with the spec, V8, and SpiderMonkey.

[1]: https://tc39.es/ecma262/#sec-globaldeclarationinstantiation
[2]: https://tc39.es/ecma262/#sec-web-compat-globaldeclarationinstantiation (step 12.b.ii.2.a)

* JSTests/mozilla/ecma_3/Function/scope-001.js:
* JSTests/mozilla/js1_5/Scope/regress-184107.js:
* JSTests/mozilla/mozilla-tests.yaml:
* JSTests/stress/can-declare-global-function-invoked-before-any-func-decl-is-hoisted-eval.js:
* JSTests/stress/can-declare-global-function-invoked-before-any-func-decl-is-hoisted-global.js: Added.
* JSTests/stress/can-declare-global-var-invoked-before-any-func-decl-is-hoisted-eval.js:
* JSTests/stress/can-declare-global-var-invoked-before-any-func-decl-is-hoisted-global.js: Added.
* JSTests/stress/can-declare-global-var-invoked-during-func-decl-hoisting-eval.js:
* JSTests/stress/can-declare-global-var-invoked-during-func-decl-hoisting-global.js: Added.
* JSTests/stress/sloppy-mode-function-hoisting-global-code.js: Added.
* JSTests/stress/sloppy-mode-function-hoisting-global-code-2.js: Added.
Separate file is necessary to skip bytecode cache assertion for scripts that throw SyntaxError.
See https://commits.webkit.org/r244241.

* JSTests/stress/sloppy-mode-function-hoisting.js:
* JSTests/test262/expectations.yaml: Mark 172 tests as passing.
* LayoutTests/accessibility/insert-children-assert.html:
Adjust test that relied on previous incorrect behavior of block-level function declaration being
hoisted to top-level `var` scope before FunctionDeclaration is evaluated.

* LayoutTests/fast/dom/MutationObserver/disconnect-observer-while-mutation-records-are-enqueued-crash.html: Ditto.
* LayoutTests/imported/w3c/web-platform-tests/html/semantics/popovers/popover-types-with-hints.tentative-expected.txt:
* Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::hoistSloppyModeFunctionIfNecessary):
(JSC::BytecodeGenerator::emitResolveScopeForHoistingFuncDeclInEval): Hoist the common logic between FunctionCode and EvalCode.
* Source/JavaScriptCore/parser/Parser.cpp:
(JSC::Parser<LexerType>::parseFunctionDeclarationStatement):
(JSC::Parser<LexerType>::parseFunctionDeclaration):
* Source/JavaScriptCore/parser/Parser.h:
(JSC::Parser::declareFunction):
* Source/JavaScriptCore/runtime/ProgramExecutable.cpp:
(JSC::ProgramExecutable::initializeGlobalProperties):

Canonical link: https://commits.webkit.org/268553@main




More information about the webkit-changes mailing list