[webkit-changes] [WebKit/WebKit] fca15e: [JSC] delete operator shouldn't perform TDZ checks
Commit Queue
noreply at github.com
Thu Jun 15 16:04:08 PDT 2023
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: fca15e410aef3a78d5f573612079c4692ac54faa
https://github.com/WebKit/WebKit/commit/fca15e410aef3a78d5f573612079c4692ac54faa
Author: Alexey Shvayka <ashvayka at apple.com>
Date: 2023-06-15 (Thu, 15 Jun 2023)
Changed paths:
M JSTests/ChakraCore/test/LetConst/tdz1.baseline-jsc
M JSTests/stress/const-not-strict-mode.js
M JSTests/stress/lexical-let-not-strict-mode.js
M Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
Log Message:
-----------
[JSC] delete operator shouldn't perform TDZ checks
https://bugs.webkit.org/show_bug.cgi?id=257697
<rdar://problem/110237888>
Reviewed by Yusuke Suzuki.
ReferenceError for an uninitialized binding is being originated in GetBindingValue [1], yet delete
operator [2] calls into DeleteBinding instead, which is a no-op [3] in case of a lexical binding.
This change removes TDZ check and calls into JSSymbolTableObject::deleteProperty() instead,
which does nothing but returning `false` that is being ignored by del_by_id opcode in sloppy mode,
precluding a runtime error from being thrown for code like `delete foo; let foo`.
As for the strict mode, TDZ check isn't even reached because a SyntaxError is thrown for any binding
that could possibly end up being unitialized [4].
In no way this change affects WithStatement since it can't produce a value deemed as
uninitialized binding (an empty JSValue).
Aligns JSC with V8 and SpiderMonkey.
[1]: https://tc39.es/ecma262/#sec-declarative-environment-records-getbindingvalue-n-s (step 2)
[2]: https://tc39.es/ecma262/#sec-delete-operator-runtime-semantics-evaluation (step 5.c)
[3]: https://tc39.es/ecma262/#sec-declarative-environment-records-deletebinding-n (step 2)
[4]: https://tc39.es/ecma262/#sec-delete-operator-static-semantics-early-errors
* JSTests/ChakraCore/test/LetConst/tdz1.baseline-jsc:
* JSTests/stress/const-not-strict-mode.js:
* JSTests/stress/lexical-let-not-strict-mode.js:
* Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:
(JSC::DeleteResolveNode::emitBytecode):
Canonical link: https://commits.webkit.org/265212@main
More information about the webkit-changes
mailing list