Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: e4042719d2be336648b0e8f374903c07727ee5eb
      
https://github.com/WebKit/WebKit/commit/e4042719d2be336648b0e8f374903c07727ee5eb
  Author: Alexey Shvayka <[email protected]>
  Date:   2023-09-29 (Fri, 29 Sep 2023)

  Changed paths:
    M JSTests/test262/expectations.yaml
    M LayoutTests/js/parser-syntax-check-expected.txt
    M LayoutTests/js/script-tests/parser-syntax-check.js
    M Source/JavaScriptCore/parser/Parser.h
    M Source/JavaScriptCore/parser/VariableEnvironment.h

  Log Message:
  -----------
  [JSC] Duplicate lexical bindings should only be allowed for 
FunctionDeclarations
https://bugs.webkit.org/show_bug.cgi?id=262394
<rdar://problem/116252189>

Reviewed by Yusuke Suzuki.

Per Annex B [1], duplicate lexical declarations are only allowed in sloppy mode 
and when bound by
FunctionDeclaration parse nodes. Async / generator functions are defined using 
different nodes [2].

This patch introduces IsFunctionDeclaration bit to VariableEnvironmentEntry to 
differentiate pre-ES6
functions from generator / async functions and throw early errors when 
duplicate declarations include
the latter ones.

While the only observable change is:

```diff
-     if (strictMode() || !addResult.iterator->value.isFunction())
+     if (strictMode() || !addResult.iterator->value.isFunctionDeclaration() || 
!isFunctionDeclaration)
          result |= DeclarationResult::InvalidDuplicateDeclaration;
  }

+ if (isFunctionDeclaration)
+     addResult.iterator->value.setIsFunctionDeclaration();
```

isFunctionDeclaration parameter is only revelant when declareFunction() if 
called on a lexical scope,
and the function has another boolean parameter that significantly impacts its 
behavior, so this patch
also splits declareFunction() into two methods rather than degrading code 
quality even further.

Aligns JSC with V8 and SpiderMonkey.

[1]: https://tc39.es/ecma262/#sec-block-duplicates-allowed-static-semantics
[2]: https://tc39.es/ecma262/#prod-GeneratorDeclaration

* JSTests/test262/expectations.yaml: Mark 30 tests as passing.
* LayoutTests/js/parser-syntax-check-expected.txt:
* LayoutTests/js/script-tests/parser-syntax-check.js:
* Source/JavaScriptCore/parser/Parser.h:
(JSC::Scope::declareFunctionAsVar):
(JSC::Scope::declareFunctionAsLet):
(JSC::Parser::declareFunction):
(JSC::Scope::declareFunction): Deleted.
* Source/JavaScriptCore/parser/VariableEnvironment.h:
(JSC::VariableEnvironmentEntry::isFunctionDeclaration const):
(JSC::VariableEnvironmentEntry::setIsFunctionDeclaration):

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


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to